Merge boxWithStdlib testData into box, delete BoxWithStdlib test

This commit is contained in:
Alexander Udalov
2016-03-07 13:36:14 +03:00
committed by Alexander Udalov
parent 22bfc9786a
commit 06a67e6602
535 changed files with 3520 additions and 3871 deletions
+21
View File
@@ -0,0 +1,21 @@
// WITH_RUNTIME
package test.regressions.kt1149
import java.util.ArrayList
public interface SomeTrait {
fun foo()
}
fun box(): String {
val list = ArrayList<SomeTrait>()
var res = ArrayList<String>()
list.add(object : SomeTrait {
override fun foo() {
res.add("anonymous.foo()")
}
})
list.forEach{ it.foo() }
return if ("anonymous.foo()" == res[0]) "OK" else "fail"
}
+19
View File
@@ -0,0 +1,19 @@
// WITH_RUNTIME
package regressions
class Kt1619Test {
fun doSomething(list: List<String?>): Int {
return list.size
}
fun testCollectionNotNullCanBeUsedForNullables(): Int {
val list: List<String> = arrayListOf("foo", "bar")
return doSomething(list)
}
}
fun box(): String {
return if (Kt1619Test().testCollectionNotNullCanBeUsedForNullables() == 2) "OK" else "fail"
}
+17
View File
@@ -0,0 +1,17 @@
// WITH_RUNTIME
package regressions
fun f(xs: Iterator<Int>): Int {
var answer = 0
for (x in xs) {
answer += x
}
return answer
}
fun box(): String {
val list = arrayListOf(1, 2, 3)
val result = f(list.iterator())
return if (6 == result) "OK" else "fail"
}
+151
View File
@@ -0,0 +1,151 @@
// WITH_RUNTIME
// FULL_JDK
package collections
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertTrue
import java.security.KeyPair
fun <T> testCollectionSize(c: Collection<T>) = assertEquals(0, c.size)
fun <T> testCollectionIsEmpty(c: Collection<T>) = assertTrue(c.isEmpty())
fun <T> testCollectionContains(c: Collection<T>) = assertTrue(c.contains(1 as Any?))
fun <T> testCollectionIterator(c: Collection<T>) {
val it = c.iterator()
while (it.hasNext()) {
assertEquals(1, it.next() as Any?)
}
}
fun <T> testCollectionContainsAll(c: Collection<T>) = assertTrue(c.containsAll(c))
fun <T> testMutableCollectionAdd(c: MutableCollection<T>, t: T) {
c.add(t)
assertEquals(1, c.size)
assertTrue(c.contains(t))
}
fun <T> testMutableCollectionRemove(c: MutableCollection<T>, t: T) {
c.remove(t)
assertEquals(0, c.size)
assertFalse(c.contains(t))
}
fun <T> testMutableCollectionIterator(c: MutableCollection<T>, t: T) {
c.add(t)
val it = c.iterator()
while (it.hasNext()) {
it.next()
it.remove()
}
assertEquals(0, c.size)
}
fun <T> testMutableCollectionAddAll(c: MutableCollection<T>, t1: T, t2: T) {
c.addAll(arrayListOf(t1, t2))
assertEquals(arrayListOf(t1, t2), c)
}
fun <T> testMutableCollectionRemoveAll(c: MutableCollection<T>, t1: T, t2: T) {
c.addAll(arrayListOf(t1, t2))
c.removeAll(arrayListOf(t1))
assertEquals(arrayListOf(t2), c)
}
fun <T> testMutableCollectionRetainAll(c: MutableCollection<T>, t1: T, t2: T) {
c.addAll(arrayListOf(t1, t2))
c.retainAll(arrayListOf(t1))
assertEquals(arrayListOf(t1), c)
}
fun <T> testMutableCollectionClear(c: MutableCollection<T>) {
c.clear()
assertTrue(c.isEmpty())
}
fun testCollection() {
testCollectionSize(arrayListOf<Int>())
testCollectionIsEmpty(arrayListOf<String>())
testCollectionContains(arrayListOf(1))
testCollectionIterator(arrayListOf(1))
testCollectionContainsAll(arrayListOf("a", "b"))
testMutableCollectionAdd(arrayListOf(), "")
testMutableCollectionRemove(arrayListOf("a"), "a")
testMutableCollectionIterator(arrayListOf(), 1)
testMutableCollectionAddAll(arrayListOf(), 1, 2)
testMutableCollectionRemoveAll(arrayListOf(), 1, 2)
testMutableCollectionRetainAll(arrayListOf(), 1, 2)
testMutableCollectionClear(arrayListOf(1, 2))
}
fun <T> testListGet(l: List<T>, t: T) = assertEquals(t, l.get(0))
fun <T> testListIndexOf(l: List<T>, t: T) = assertEquals(0, l.indexOf(t))
fun <T> testListIterator(l: List<T>, t1 : T, t2 : T) {
val indexes = arrayListOf<Int>()
val result = arrayListOf<T>()
val it = l.listIterator()
while (it.hasNext()) {
indexes.add(it.nextIndex())
result.add(it.next())
}
while (it.hasPrevious()) {
indexes.add(it.previousIndex())
result.add(it.previous())
}
assertEquals(arrayListOf(0, 1, 1, 0), indexes)
assertEquals(arrayListOf(t1, t2, t2, t1), result)
}
fun <T> testListSublist(l: List<T>, t: T) = assertEquals(arrayListOf(t), l.subList(0, 1))
fun <T> testMutableListSet(l: MutableList<T>, t: T) {
l.set(0, t)
assertEquals(arrayListOf(t), l)
}
fun <T> testMutableListIterator(l: MutableList<T>, t1: T, t2: T, t3: T) {
val it = l.listIterator()
while (it.hasNext()) {
it.next()
it.add(t3)
}
assertEquals(arrayListOf(t1, t3, t2, t3), l)
}
fun testList() {
testListGet(arrayListOf(1), 1)
testListIndexOf(arrayListOf(1), 1)
testListIterator(arrayListOf("a", "b"), "a", "b")
testListSublist(arrayListOf(1, 2), 1)
testMutableListSet(arrayListOf(2), 4)
testMutableListIterator(arrayListOf(1, 2), 1, 2, 3)
}
fun <K, V> testMapContainsKey(map: Map<K, V>, k: K) = assertTrue(map.containsKey(k))
fun <K, V> testMapKeys(map: Map<K, V>, k1: K, k2: K) = assertEqualCollections(hashSetOf(k1, k2), map.keys)
fun <K, V> testMapValues(map: Map<K, V>, v1: V, v2: V) = assertEqualCollections(hashSetOf(v1, v2), map.values)
fun <K, V> testMapEntrySet(map: Map<K, V>, k : K, v: V) {
for (entry in map.entries) {
assertEquals(k, entry.key)
assertEquals(v, entry.value)
}
}
fun <K, V> testMutableMapEntry(map: MutableMap<K, V>, k1 : K, v: V) {
for (entry in map.entries) {
entry.setValue(v)
}
assertEquals(hashMapOf(k1 to v), map)
}
fun testMap() {
testMapContainsKey(hashMapOf(1 to 'a', 2 to 'b'), 2)
testMapKeys(hashMapOf(1 to 'a', 2 to 'b'), 1, 2)
testMapValues(hashMapOf(1 to 'a', 2 to 'b'), 'a', 'b')
testMapEntrySet(hashMapOf(1 to 'a'), 1, 'a')
testMutableMapEntry(hashMapOf(1 to 'a'), 1, 'b')
}
fun box() : String {
testCollection()
testList()
testMap()
return "OK"
}
fun <T> assertEqualCollections(c1: Collection<T>, c2: Collection<T>) = assertEquals(c1.toCollection(hashSetOf<T>()), c2.toCollection(hashSetOf<T>()))
+23
View File
@@ -0,0 +1,23 @@
// WITH_RUNTIME
import java.util.*
fun <T> ArrayList<T>.findAll(predicate: (T) -> Boolean): ArrayList<T> {
val result = ArrayList<T>()
for(t in this) {
if (predicate(t)) result.add(t)
}
return result
}
fun box(): String {
val list: ArrayList<String> = ArrayList<String>()
list.add("Prague")
list.add("St.Petersburg")
list.add("Moscow")
list.add("Munich")
val m: ArrayList<String> = list.findAll<String>({ name: String -> name.startsWith("M")})
return if (m.size == 2) "OK" else "fail"
}
@@ -0,0 +1,25 @@
// WITH_RUNTIME
// KT-4485 getGenericInterfaces vs getInterfaces for kotlin classes
class SimpleClass
class ClassWithNonGenericSuperInterface: Cloneable
class ClassWithGenericSuperInterface: java.util.Comparator<String> {
override fun compare(a: String, b: String): Int = 0
}
fun check(klass: Class<*>) {
val interfaces = klass.getInterfaces().toList()
val genericInterfaces = klass.getGenericInterfaces().toList()
if (interfaces.size != genericInterfaces.size) {
throw AssertionError("interfaces=$interfaces, genericInterfaces=$genericInterfaces")
}
}
fun box(): String {
check(SimpleClass::class.java)
check(ClassWithNonGenericSuperInterface::class.java)
check(ClassWithGenericSuperInterface::class.java)
return "OK"
}
+15
View File
@@ -0,0 +1,15 @@
// WITH_RUNTIME
package test.regressions.kt1172
import kotlin.concurrent.*
import java.util.*
public fun scheduleRefresh(vararg files : Object) {
java.util.ArrayList<Object>(files.map{ it })
}
fun box(): String {
scheduleRefresh()
return "OK"
}
+119
View File
@@ -0,0 +1,119 @@
// WITH_RUNTIME
// FULL_JDK
package testeval
import java.util.*
interface Expression
class Num(val value : Int) : Expression
class Sum(val left : Expression, val right : Expression) : Expression
class Mult(val left : Expression, val right : Expression) : Expression
fun eval(e : Expression) : Int {
return when (e) {
is Num -> e.value
is Sum -> eval(e.left) + eval (e.right)
is Mult -> eval(e.left) * eval (e.right)
else -> throw AssertionError("Unknown expression")
}
}
interface ParseResult<out T> {
val success : Boolean
val value : T
}
class Success<T>(override val value : T) : ParseResult<T> {
public override val success : Boolean = true
}
class Failure(val message : String) : ParseResult<Nothing> {
override val success = false
override val value : Nothing = throw UnsupportedOperationException("Don't call value on a Failure")
}
open class Token(val text : String) {
override fun toString() = text
}
object LPAR : Token("(")
object RPAR : Token(")")
object PLUS : Token("+")
object TIMES : Token("*")
object EOF : Token("EOF")
class Number(text : String) : Token(text)
class Error(text : String) : Token("[Error: $text]")
fun tokenize(text : String) : Deque<Token> {
val result = LinkedList<Token>()
for (c in text) {
result.add(when (c) {
'(' -> LPAR
')' -> RPAR
'+' -> PLUS
'*' -> TIMES
in '0'..'9' -> Number(c.toString())
else -> Error(c.toString())
})
}
result.add(EOF)
return result
}
fun parseSum(tokens : Deque<Token>) : ParseResult<Expression> {
val left = parseMult(tokens)
if (!left.success) return left
if (tokens.peek() == PLUS) {
tokens.pop()
val right = parseSum(tokens)
if (!right.success) return right
return Success(Sum(left.value, right.value))
}
return left
}
fun parseMult(tokens : Deque<Token>) : ParseResult<Expression> {
val left = parseAtomic(tokens)
if (!left.success) return left
if (tokens.peek() == PLUS) {
tokens.pop()
val right = parseMult(tokens)
if (!right.success) return right
return Success(Mult(left.value, right.value))
}
return left
}
fun parseAtomic(tokens : Deque<Token>) : ParseResult<Expression> {
val token = tokens.poll()
return when (token) {
LPAR -> {
val result = parseSum(tokens)
val rpar = tokens.poll()
if (rpar == RPAR)
result
else
Failure("Expecting ')'")
}
is Number -> Success(Num(Integer.parseInt((token as Token).text)))
else -> Failure("Unexpected EOF")
}
}
fun parse(text : String) : ParseResult<Expression> = parseSum(tokenize(text))
fun box(): String {
if (1 != eval(Num(1))) return "fail 1"
if (2 != eval(Sum(Num(1), Num(1)))) return "fail 2"
if (3 != eval(Mult(Num(3), Num(1)))) return "fail 3"
if (6 != eval(Mult(Num(3), Sum(Num(1), Num(1))))) return "fail 4"
if (1 != eval(parse("1").value)) return "fail 5"
return "OK"
}
+28
View File
@@ -0,0 +1,28 @@
// WITH_RUNTIME
// FULL_JDK
package pack
import java.util.ArrayList
import java.util.regex.Pattern
class C{
public fun foo(){
val items : Collection<Item> = java.util.Collections.singleton(Item())!!
val result = ArrayList<Item>()
val pattern: Pattern? = Pattern.compile("...")
items.filterTo(result) {
pattern!!.matcher(it.name())!!.matches()
}
}
private fun Item.name() : String = ""
}
class Item{
}
fun box() : String {
C().foo()
return "OK"
}
+6
View File
@@ -0,0 +1,6 @@
// WITH_RUNTIME
fun box() : String {
val i = 1
return if(i.javaClass.getSimpleName() == "int") "OK" else "fail"
}
+20
View File
@@ -0,0 +1,20 @@
// WITH_RUNTIME
import kotlin.collections.AbstractIterator
class MyIterator : AbstractIterator<String>() {
var i = 0
public override fun computeNext() {
if(i < 5)
setNext((i++).toString())
}
}
fun box() : String {
var k = ""
for (x in MyIterator()) {
k+=x
}
return if(k=="01234") "OK" else k
}
+32
View File
@@ -0,0 +1,32 @@
// WITH_RUNTIME
//KT-1800 error/NonExistentClass generated on runtime
package i
import java.util.ArrayList
public class User(val firstName: String,
val lastName: String,
val age: Int) {
override fun toString() = "$firstName $lastName, age $age"
}
public fun <T: Comparable<T>> Collection<T>.testMin(): T? {
var minValue: T? = null
for(value in this) {
if (minValue == null || value.compareTo(minValue!!) < 0) {
minValue = value
}
}
return minValue
}
fun box() : String {
val users = arrayListOf(
User("John", "Doe", 30),
User("Jane", "Doe", 27))
val ages = users.map { it.age }
val minAge = ages.testMin()
return if (minAge == 27) "OK" else "fail"
}
+25
View File
@@ -0,0 +1,25 @@
// WITH_RUNTIME
import java.lang.annotation.Annotation
@Retention(AnnotationRetention.RUNTIME)
annotation class foo(val name : String)
class Test() {
@foo("OK") fun hello(input : String) {
}
}
fun box(): String {
val test = Test()
for (method in Test::class.java.getMethods()!!) {
val anns = method?.getAnnotations() as Array<Annotation>
if (!anns.isEmpty()) {
for (ann in anns) {
val fooAnn = ann as foo
return fooAnn.name
}
}
}
return "fail"
}
+6
View File
@@ -0,0 +1,6 @@
// WITH_RUNTIME
fun box(): String {
val sorted = arrayListOf("1", "3", "2").sorted()
return if (sorted != arrayListOf("1", "2", "3")) "$sorted" else "OK"
}
+6
View File
@@ -0,0 +1,6 @@
// WITH_RUNTIME
fun box(): String {
kotlin.assert(true)
return "OK"
}
+13
View File
@@ -0,0 +1,13 @@
// WITH_RUNTIME
fun box(): String {
Boolean::class.java
Byte::class.java
Short::class.java
Char::class.java
Int::class.java
Long::class.java
Float::class.java
Double::class.java
return "OK"
}
+10
View File
@@ -0,0 +1,10 @@
// WITH_RUNTIME
fun foo() {
if (1==1) {
1.javaClass
} else {
}
}
fun box() = "OK"
+15
View File
@@ -0,0 +1,15 @@
// WITH_RUNTIME
// FULL_JDK
fun box() : String {
val vector = java.util.Vector<Int>()
vector.add(1)
vector.add(2)
vector.add(3)
var sum = 0
for(e in vector.elements()) {
sum += e
}
return if(sum == 6) "OK" else "fail"
}
+22
View File
@@ -0,0 +1,22 @@
// WITH_RUNTIME
fun box(): String {
val bool = true
if (bool.javaClass != Boolean::class.java) return "javaClass function on boolean fails"
val b = 1.toByte()
if (b.javaClass != Byte::class.java) return "javaClass function on byte fails"
val s = 1.toShort()
if (s.javaClass != Short::class.java) return "javaClass function on short fails"
val c = 'c'
if (c.javaClass != Char::class.java) return "javaClass function on char fails"
val i = 1
if (i.javaClass != Int::class.java) return "javaClass function on int fails"
val l = 1.toLong()
if (l.javaClass != Long::class.java) return "javaClass function on long fails"
val f = 1.toFloat()
if (f.javaClass != Float::class.java) return "javaClass function on float fails"
val d = 1.0
if (d.javaClass != Double::class.java) return "javaClass function on double fails"
return "OK"
}
+197
View File
@@ -0,0 +1,197 @@
// WITH_RUNTIME
fun s0() : Boolean {
val y = "222"
val foo = {
val bar = { y }
bar ()
}
return foo() == "222"
}
fun s1() : Boolean {
var x = "222"
val foo = {
val bar = {
x = "aaa"
}
bar ()
}
foo()
return x == "aaa"
}
fun t1() : Boolean {
var x = "111"
val y = x + "22"
val foo = {
x = x + "45" + y
x = x.substring(3)
x += "aaa"
Unit
}
foo()
x += "bbb"
System.out?.println(x)
return x == "4511122aaabbb"
}
fun t2() : Boolean {
var x = 111
val y = x + 22
val foo = {
x = x + 5 + y
x += 5
x++
Unit
}
foo()
x -= 55
System.out?.println(x)
return x == 200
}
fun t3() : Boolean {
var x = true
val foo = {
x = false
Unit
}
foo()
return !x
}
fun t4() : Boolean {
var x = 100.toFloat()
val y = x + 22
val foo = {
x = x + 200.toFloat() + y
x += 18
Unit
}
foo()
System.out?.println(x)
return x == 440.toFloat()
}
fun t5() : Boolean {
var x = 100.toDouble()
val y = x + 22
val foo = {
x = x + 200.toDouble() + y
x -= 22
Unit
}
foo()
System.out?.println(x)
return x == 400.toDouble()
}
fun t6() : Boolean {
var x = 20.toByte()
val y = x + 22
val foo = {
x = (x + 20.toByte() + y).toByte()
x = (x + 2).toByte()
x--
Unit
}
foo()
System.out?.println(x)
return x == 83.toByte()
}
fun t7() : Boolean {
var x : Char = 'a'
val foo = {
x = 'b'
Unit
}
foo()
System.out?.println(x)
return x == 'b'
}
fun t8() : Boolean {
var x = 20.toShort()
val foo = {
val bar = {
x = 30.toShort()
Unit
}
bar()
Unit
}
foo()
return x == 30.toShort()
}
fun t9(x0: Int) : Boolean {
var x = x0
while(x < 100) {
x++
}
return x == 100
}
fun t10() : Boolean {
var y = 1
val foo = {
val bar = {
y = y + 1
}
bar()
}
foo()
return y == 2
}
fun t11(x0: Int) : Int {
var x = x0
val foo = {
x = x + 1
val bar = {
x = x + 1
x += 3
}
bar()
}
while(x < 100) {
foo()
}
return x
}
fun t12(x: Int) : Int {
var y = x
val runnable = object : Runnable {
override fun run () {
y = y + 1
}
}
while(y < 100) {
runnable.run()
}
return y
}
fun box(): String {
if (!s0()) return "s0 fail"
if (!s1()) return "s1 fail"
if (!t1()) return "t1 fail"
if (!t2()) return "t2 fail"
if (!t3()) return "t3 fail"
if (!t4()) return "t4 fail"
if (!t5()) return "t5 fail"
if (!t6()) return "t6 fail"
if (!t7()) return "t7 fail"
if (!t8()) return "t8 fail"
if (!t9(0)) return "t9 fail"
if (!t10()) return "t10 fail"
if (t11(1) != 101) return "t11 fail"
if (t12(0) != 100) return "t12 fail"
return "OK"
}
+8
View File
@@ -0,0 +1,8 @@
// WITH_RUNTIME
fun box(): String {
val m = hashMapOf<String, String?>()
m.put("b", null)
val oldValue = m.getOrPut("b", { "Foo" })
return if (oldValue == "Foo") "OK" else "fail: $oldValue"
}
+8
View File
@@ -0,0 +1,8 @@
// WITH_RUNTIME
fun box(): String {
val s: String? = "a"
val o: Char? = s?.get(0)
val c: Any? = o?.javaClass
return if (c != null) "OK" else "fail"
}
+12
View File
@@ -0,0 +1,12 @@
// WITH_RUNTIME
fun <E : Enum<E>> Byte.toEnum(clazz : Class<E>) : E =
(clazz.getMethod("values").invoke(null) as Array<E>)[this.toInt()]
enum class Letters { A, B, C }
fun box(): String {
val clazz = Letters::class.java
val r = 1.toByte().toEnum(clazz)
return if (r == Letters.B) "OK" else "Fail: $r"
}
+6
View File
@@ -0,0 +1,6 @@
// WITH_RUNTIME
fun box(): String {
val list = arrayOf("a", "c", "b").sorted()
return if (list.toString() == "[a, b, c]") "OK" else "Fail: $list"
}
+129
View File
@@ -0,0 +1,129 @@
// WITH_RUNTIME
// FULL_JDK
package mask
import java.io.*
import java.util.*
fun box() : String {
val input = StringReader("/aaa/bbb/ccc/ddd")
val luhny = Luhny()
input.forEachChar {
luhny.charIn(it)
}
luhny.printAll()
return "OK"
}
class Luhny() {
val buffer = LinkedList<Char>()
val digits = LinkedList<Int>()
var toBeMasked = 0
fun charIn(it : Char) {
buffer.addLast(it)
// Commented for KT-621
// when (it) {
// .isDigit() => digits.addLast(it.toInt() - '0'.toInt())
// ' ', '-' => {}
// else => {
// printAll()
// digits.clear()
// }
// }
if (it.isDigit()) {
digits.addLast(it - '0')
} else if (it == ' ' || it == '-') {
} else {
printAll()
digits.clear()
}
if (digits.size > 16)
printOneDigit()
check()
}
fun check() {
if (digits.size < 14) return
print("check")
val sum = digits.sum { i, d ->
// println("$i -> $d")
if (i % 2 == digits.size) {
val f = d * 2 / 10
val s = d * 2 % 10
// println("$d: f = $f, s = $s")
(f + s).pr {
// println("to be doubled: $i -> $d : $it")
}
} else d
}
// println(sum)
if (sum % 10 == 0) {print("s"); toBeMasked = digits.size}
}
fun printOneDigit() {
while (!buffer.isEmpty()) {
val c = buffer.removeFirst()
out(c)
if (c.isDigit()) {
digits.removeFirst()
return
}
}
}
fun printAll() {
while (!buffer.isEmpty())
out(buffer.removeFirst())
}
fun out(c : Char) {
if (toBeMasked > 0) {
print('X')
toBeMasked--
}
else {
// print(c)
}
}
}
fun <T> T.pr(f : (T) -> Unit) : T {
f(this)
return this
}
fun LinkedList<Int>.sum(f : (Int, Int )-> Int): Int {
var sum = 0
for (i in 1..size) {
val j = size - i
sum += f(j, get(j))
}
return sum
}
//fun <T> List<T>.backwards() : Itl<T> = object : Itl<T> {
// override fun iterator() : It<T> =
// object : It<T> {
// var current = size()
// override fun next() : T = get(--current)
// override fun hasNext() : Boolean = current > 0
// override fun remove() {throw UnsupportedOperationException()}
// }
//}
// fun Char.isDigit() = Character.isDigit(this)
fun Reader.forEachChar(body : (Char) -> Unit) {
do {
var i = read();
if (i == -1) break
body(i.toChar())
} while(true)
}
+110
View File
@@ -0,0 +1,110 @@
// WITH_RUNTIME
// FULL_JDK
package mask
import java.io.*
import java.util.*
fun box() : String {
val input = StringReader("/aaa/bbb/ccc/ddd")
val luhny = Luhny()
input.forEachChar {
luhny.process(it)
}
luhny.printAll()
return "OK"
}
class Luhny() {
private val buffer = ArrayDeque<Char>()
private val digits = ArrayDeque<Int>(16)
private var toBeMasked = 0
fun process(it : Char) {
buffer.addLast(it)
// Commented for KT-621
// when (it) {
// .isDigit() => digits.addLast(it.toInt() - '0'.toInt())
// ' ', '-' => {}
// else => printAll()
// }
if (it.isDigit()) {
digits.addLast(it - '0')
} else if (it == ' ' || it == '-') {
} else {
printAll()
}
if (digits.size > 16)
printOneDigit()
check()
}
private fun check() {
val size = digits.size
if (size < 14) return
val sum = digits.sum {i, d ->
if (i % 2 == size % 2) double(d) else d
}
// var sum = 0
// var i = 0
// for (d in digits) {
// sum += if (i % 2 == size % 2) double(d) else d
// i++
// }
if (sum % 10 == 0) toBeMasked = digits.size
}
private fun double(d : Int) = d * 2 / 10 + d * 2 % 10
private fun printOneDigit() {
while (!buffer.isEmpty()) {
val c = buffer.removeFirst()!!
print(c)
if (c.isDigit()) {
digits.removeFirst()
return
}
}
}
fun printAll() {
while (!buffer.isEmpty())
print(buffer.removeFirst())
digits.clear()
}
private fun print(c : Char) {
if (c.isDigit() && toBeMasked > 0) {
kotlin.io.print('X')
toBeMasked--
} else {
// kotlin.io.print(c)
}
}
}
// fun Char.isDigit() = Character.isDigit(this)
fun Iterable<Int>.sum(f : (index : Int, value : Int) -> Int) : Int {
var sum = 0
var i = 0
for (d in this) {
sum += f(i, d)
i++
}
return sum
}
fun Reader.forEachChar(body : (Char) -> Unit) {
do {
var i = read();
if (i == -1) break
body(i.toChar())
} while(true)
}
+147
View File
@@ -0,0 +1,147 @@
// WITH_RUNTIME
// FULL_JDK
package mask
import java.io.*
import java.util.*
fun box() : String {
val input = StringReader("/aaa/bbb/ccc/ddd")
val luhny = Luhny()
input.forEachChar {
luhny.charIn(it)
}
luhny.printAll()
return "OK"
}
class Luhny() {
val buffer = LinkedList<Char>()
val digits = LinkedList<Int>()
var toBeMasked = 0
fun charIn(it : Char) {
buffer.push(it)
// Commented for KT-621
// when (it) {
// .isDigit() => digits.push(it.toInt() - '0'.toInt())
// ' ', '-' => {}
// else => {
// printAll()
// digits.clear()
// }
// }
if (it.isDigit()) {
digits.push(it - '0')
} else if (it == ' ' || it == '-') {
} else {
printAll()
digits.clear()
}
if (digits.size > 16)
printOneDigit()
check()
}
fun check() {
if (digits.size < 14) return
val sum = digits.sum { i, d ->
if (i % 2 != 0)
d * 2 / 10 + d * 2 % 10
else d
}
if (sum % 10 == 0) toBeMasked = digits.size
}
fun printOneDigit() {
while (!buffer.isEmpty()) {
val c = buffer.pop()
out(c)
if (c.isDigit()) {
digits.pop()
return
}
}
}
fun printAll() {
while (!buffer.isEmpty())
out(buffer.pop())
}
fun out(c : Char) {
if (toBeMasked > 0) {
print('X')
toBeMasked--
}
else {
// print(c)
}
}
}
fun LinkedList<Int>.sum(f : (Int, Int) -> Int) : Int {
var sum = 0
var i = 0
for (d in backwards()) {
sum += f(i, d)
i++
}
return sum
}
fun <T> List<T>.backwards() : Iterable<T> = object : Iterable<T> {
override fun iterator() : Iterator<T> =
object : Iterator<T> {
var current = size
override fun next() : T = get(--current)
override fun hasNext() : Boolean = current > 0
}
}
// fun Char.isDigit() = Character.isDigit(this)
//class Queue<T>(initialBufSize : Int) {
//
// private var bufSize = initialBufSize
// private val buf = Array<T>(initialBufSize)
// private var head = 0
// private var tail = 0
// private var size = 0
//
// val empty : Boolean get() = size == 0
//
// private fun prev(i : Int) = (bufSize + i - 1) % bufSize
// private fun next(i : Int) = (i + 1) % bufSize
//
// fun push(c : T) {
// buf[tail] = c
// tail = prev(tail)
// size++
// }
//
// fun pop() : T {
// if (size == 0) throw IllegalStateException()
// size--
// val result = buf[head]
// head = prev(head)
// return result
// }
//
// fun clear() {}
//}
fun Reader.forEachChar(body : (Char) -> Unit) {
do {
var i = read();
if (i == -1) break
body(i.toChar())
} while(true)
}
@@ -0,0 +1,14 @@
// WITH_RUNTIME
fun box(): String {
run {
test("ok")
test("ok", 200)
}
test("ok")
test("ok", 300)
return "OK"
}
private fun test(arg1: String, default: Int = 0) = Unit
+13
View File
@@ -0,0 +1,13 @@
// WITH_RUNTIME
fun box(): String {
val res = (1..3).map { it ->
if (it == 1)
2
};
var result = ""
for (i in res)
result += " "
return if (result == " ") "OK" else result
}
+30
View File
@@ -0,0 +1,30 @@
// WITH_RUNTIME
enum class E {
VALUE,
VALUE2
}
class C(val nums: Map<E, Int>) {
val normalizedNums = loadNormalizedNums()
private fun loadNormalizedNums(): Map<E, Float> {
val vals = nums.values
val min = vals.min()!!
val max = vals.max()!!
val rangeDiff = (max - min).toFloat()
val normalizedNums = nums.map { kvp ->
val (e, num) = kvp
//val e = kvp.key
//val num = kvp.value
val normalized = (num - min) / rangeDiff
Pair(e, normalized)
}.toMap()
return normalizedNums
}
}
fun box(): String {
val res = C(hashMapOf(E.VALUE to 11, E.VALUE2 to 12)).normalizedNums.values.sorted().joinToString()
return if ("0.0, 1.0" == res) "OK" else "fail $res"
}
+9
View File
@@ -0,0 +1,9 @@
// WITH_RUNTIME
fun box(): String {
val p = 1 to 1
val (e, num) = p
val a = 1f
return "OK"
}
+22
View File
@@ -0,0 +1,22 @@
// WITH_RUNTIME
// FULL_JDK
import kotlin.test.assertEquals
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type
open class TypeLiteral<T> {
val type: Type
get() = (javaClass.getGenericSuperclass() as ParameterizedType).getActualTypeArguments()[0]
}
inline fun <reified T> typeLiteral(): TypeLiteral<T> = object : TypeLiteral<T>() {}
fun box(): String {
assertEquals("class java.lang.String", typeLiteral<String>().type.toString())
assertEquals("java.util.List<?>", typeLiteral<List<*>>().type.toString())
assertEquals("java.lang.String[]", typeLiteral<Array<String>>().type.toString())
assertEquals("java.lang.Integer[]", typeLiteral<Array<Int>>().type.toString())
assertEquals("java.lang.String[][]", typeLiteral<Array<Array<String>>>().type.toString())
return "OK"
}
+16
View File
@@ -0,0 +1,16 @@
// WITH_RUNTIME
import kotlin.*
@Suppress("REIFIED_TYPE_PARAMETER_NO_INLINE")
inline fun <reified T: Any> javaClass(): Class<T> = T::class.java
val test = "lala".javaClass
val test2 = javaClass<Iterator<Int>> ()
fun box(): String {
if(test.getCanonicalName() != "java.lang.String") return "fail"
if(test2.getCanonicalName() != "java.util.Iterator") return "fail"
return "OK"
}
+23
View File
@@ -0,0 +1,23 @@
// WITH_RUNTIME
// FULL_JDK
import java.io.*
import java.util.*
fun sample() : Reader {
return StringReader("""Hello
World""");
}
fun box() : String {
// NOTE: Also tested in stdlib: LineIteratorTest.useLines
// TODO compiler error
// both these expressions causes java.lang.NoClassDefFoundError: collections/CollectionPackage
val list1 = sample().useLines { it.toList() }
val list2 = sample().useLines<ArrayList<String>>{ it.toCollection(arrayListOf()) }
if(arrayListOf("Hello", "World") != list1) return "fail"
if(arrayListOf("Hello", "World") != list2) return "fail"
return "OK"
}
+36
View File
@@ -0,0 +1,36 @@
// WITH_RUNTIME
fun findPairless(a : IntArray) : Int {
loop@ for (i in a.indices) {
for (j in a.indices) {
if (i != j && a[i] == a[j]) continue@loop
}
return a[i]
}
return -1
}
fun hasDuplicates(a : IntArray) : Boolean {
var duplicate = false
loop@ for (i in a.indices) {
for (j in a.indices) {
if (i != j && a[i] == a[j]) {
duplicate = true
break@loop
}
}
}
return duplicate
}
fun box() : String {
val a = IntArray(5)
a[0] = 0
a[1] = 0
a[2] = 1
a[3] = 1
a[4] = 5
if(findPairless(a) != 5) return "fail"
return if(hasDuplicates(a)) "OK" else "fail"
}
@@ -0,0 +1,29 @@
// WITH_RUNTIME
interface Stream<T> {
fun iterator(): Iterator<T>
}
class ZippingStream<T1, T2>(val stream1: Stream<T1>, val stream2: Stream<T2>) : Stream<Pair<T1,T2>> {
override fun iterator(): Iterator<Pair<T1,T2>> = object : AbstractIterator<Pair<T1,T2>>() {
val iterator1 = stream1.iterator()
val iterator2 = stream2.iterator()
override fun computeNext() {
if (iterator1.hasNext() && iterator2.hasNext()) {
setNext(iterator1.next() to iterator2.next())
} else {
done()
}
}
}
}
object EmptyStream : Stream<Nothing> {
override fun iterator() = listOf<Nothing>().iterator()
}
fun box(): String {
ZippingStream(EmptyStream, EmptyStream).iterator().hasNext()
return "OK"
}
@@ -0,0 +1,19 @@
// WITH_RUNTIME
// KT-4351 Cannot resolve reference to self in init of class local to function
fun box(): String {
var accessedFromConstructor: Class<*>? = null
class MyClass() {
init {
accessedFromConstructor = MyClass::class.java
}
}
MyClass()
if (accessedFromConstructor!!.getName().endsWith("MyClass")) {
return "OK"
} else {
return accessedFromConstructor.toString()
}
}
@@ -0,0 +1,30 @@
// WITH_RUNTIME
import java.util.ArrayList
// KT-2823 TypeCastException has no message
// KT-5121 Better error message in on casting null to non-null type
fun box(): String {
try {
val a: Any? = null
a as Array<String>
}
catch (e: TypeCastException) {
if (e.message != "null cannot be cast to non-null type kotlin.Array<kotlin.String>") {
return "Fail 1: $e"
}
}
try {
val x: String? = null
x as String
}
catch (e: TypeCastException) {
if (e.message != "null cannot be cast to non-null type kotlin.String") {
return "Fail 2: $e"
}
}
return "OK"
}