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
+26
View File
@@ -0,0 +1,26 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
import kotlin.reflect.KProperty
class Project {
fun <T> getInstance(cls: Class<T>): T =
when (cls.getName()) {
"java.lang.Integer" -> 1 as T
"java.lang.String" -> "OK" as T
else -> null!!
}
}
inline operator fun <reified T : Any> Project.getValue(t: Any?, p: KProperty<*>): T = getInstance(T::class.java)
val project = Project()
val x1: Int by project
val x2: String by project
fun box(): String {
assertEquals(1, x1)
assertEquals("OK", x2)
return "OK"
}
@@ -0,0 +1,21 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
abstract class A {
abstract fun f(): String
}
inline fun<reified T : Any> foo(): A {
return object : A() {
override fun f(): String {
return T::class.java.getName()
}
}
}
fun box(): String {
val y = foo<String>();
assertEquals("java.lang.String", y.f())
return "OK"
}
@@ -0,0 +1,38 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
interface A {
fun f1(): String
fun f2(): String
fun f3(): String
}
fun doWork(block: () -> String) = block()
inline fun doWorkInline(block: () -> String) = block()
fun box(): String {
val x = object {
inline fun <reified T : Any> bar1(): A = object : A {
override fun f1(): String = T::class.java.getName()
override fun f2(): String = doWork { T::class.java.getName() }
override fun f3(): String = doWorkInline { T::class.java.getName() }
}
inline fun <reified T : Any> bar2() = T::class.java.getName()
inline fun <reified T : Any> bar3() = doWork { T::class.java.getName() }
inline fun <reified T : Any> bar4() = doWorkInline { T::class.java.getName() }
}
val y: A = x.bar1<String>()
assertEquals("java.lang.String", y.f1())
assertEquals("java.lang.String", y.f2())
assertEquals("java.lang.String", y.f3())
assertEquals("java.lang.Integer", x.bar2<Int>())
assertEquals("java.lang.Double", x.bar3<Double>())
assertEquals("java.lang.Long", x.bar4<Long>())
return "OK"
}
@@ -0,0 +1,22 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
abstract class A<R> {
abstract fun f(): String
}
inline fun<reified T> foo(): A<T> {
return object : A<T>() {
override fun f(): String {
return "OK"
}
}
}
fun box(): String {
val y = foo<String>();
assertEquals("OK", y.f())
assertEquals("A<java.lang.String>", y.javaClass.getGenericSuperclass()?.toString())
return "OK"
}
@@ -0,0 +1,22 @@
// WITH_RUNTIME
// Basically this test checks that no captured type used as argument for signature mapping
class SwOperator<T>: Operator<List<T>, T>
interface Operator<R, T>
open class Inv<T>
class Obs<Y> {
inline fun <reified X> lift(lift: Operator<out X, in Y>) = object : Inv<X>() {}
}
fun box(): String {
val o: Obs<CharSequence> = Obs()
val inv = o.lift(SwOperator())
val signature = inv.javaClass.genericSuperclass.toString()
if (signature != "Inv<java.util.List<?>>") return "fail 1: $signature"
return "OK"
}
@@ -0,0 +1,24 @@
// WITH_RUNTIME
inline fun <reified T> foo(x: Any?) = Pair(x is T, x is T?)
fun box(): String {
val x1 = foo<Array<String>>(arrayOf(""))
if (x1.toString() != "(true, true)") return "fail 1"
val x2 = foo<Array<String>?>(arrayOf(""))
if (x2.toString() != "(true, true)") return "fail 2"
val x3 = foo<Array<String>>(null)
if (x3.toString() != "(false, true)") return "fail 3"
val x4 = foo<Array<String>?>(null)
if (x4.toString() != "(true, true)") return "fail 4"
val x5 = foo<Array<Double>?>(arrayOf(""))
if (x5.toString() != "(false, false)") return "fail 5"
val x6 = foo<Array<Double>?>(null)
if (x6.toString() != "(true, true)") return "fail 6"
return "OK"
}
@@ -0,0 +1,37 @@
// WITH_RUNTIME
inline fun <reified T> foo(x: Any?) = Pair(x is T, x is T?)
inline fun <reified F> bar(y: Any?) = foo<Array<F>>(y)
inline fun <reified F> barNullable(y: Any?) = foo<Array<F>?>(y)
fun box(): String {
val x1 = bar<String>(arrayOf(""))
if (x1.toString() != "(true, true)") return "fail 1"
val x3 = bar<String>(null)
if (x3.toString() != "(false, true)") return "fail 3"
val x4 = bar<String?>(null)
if (x4.toString() != "(false, true)") return "fail 4"
val x5 = bar<Double?>(arrayOf(""))
if (x5.toString() != "(false, false)") return "fail 5"
val x6 = bar<Double?>(null)
if (x6.toString() != "(false, true)") return "fail 6"
// barNullable
val x7 = barNullable<String>(arrayOf(""))
if (x7.toString() != "(true, true)") return "fail 7"
val x9 = barNullable<String>(null)
if (x9.toString() != "(true, true)") return "fail 9"
val x10 = barNullable<Double?>(arrayOf(""))
if (x10.toString() != "(false, false)") return "fail 11"
val x12 = barNullable<Double?>(null)
if (x12.toString() != "(true, true)") return "fail 12"
return "OK"
}
@@ -0,0 +1,15 @@
// WITH_RUNTIME
inline fun <reified T : Any> jClass() = T::class.java
inline fun <reified T : Any> jClassArray() = jClass<Array<T>>()
fun box(): String {
if (jClass<Array<String>>().simpleName != "String[]") return "fail 1"
if (jClass<IntArray>().simpleName != "int[]") return "fail 2"
if (jClassArray<String>().simpleName != "String[]") return "fail 3"
if (jClassArray<Array<String>>().simpleName != "String[][]") return "fail 4"
if (jClassArray<IntArray>().simpleName != "int[][]") return "fail 5"
return "OK"
}
@@ -0,0 +1,15 @@
// WITH_RUNTIME
inline fun <reified T> jaggedArrayOfNulls(): Array<Array<T>?> = arrayOfNulls<Array<T>>(1)
fun box(): String {
val x1 = jaggedArrayOfNulls<String>().javaClass.simpleName
if (x1 != "String[][]") return "fail1: $x1"
val x2 = jaggedArrayOfNulls<Array<String>>().javaClass.simpleName
if (x2 != "String[][][]") return "fail2: $x2"
val x3 = jaggedArrayOfNulls<IntArray>().javaClass.simpleName
if (x3 != "int[][][]") return "fail3: $x3"
return "OK"
}
+22
View File
@@ -0,0 +1,22 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
inline fun<reified T> checkcast(x: Any?): T {
return x as T
}
fun box(): String {
val x = checkcast<String>("abc")
assertEquals("abc", x)
val y = checkcast<Int>(1)
assertEquals(1, y)
try {
val z = checkcast<Int>("abc")
} catch (e: Exception) {
return "OK"
}
return "Fail"
}
+17
View File
@@ -0,0 +1,17 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
inline fun <reified T> copy(c: Collection<T>): Array<T> {
return c.toTypedArray()
}
fun box(): String {
val a: Array<String> = copy(listOf("a", "b", "c"))
assertEquals("abc", a.joinToString(""))
val b: Array<Int> = copy(listOf(1,2,3))
assertEquals("123", b.map { it.toString() }.joinToString(""))
return "OK"
}
@@ -0,0 +1,19 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
inline fun <reified T : Any> foo(x: Class<T> = T::class.java): String = x.getName()
inline fun <reified R : Any> bar(x: R): String = foo<R>()
fun box(): String {
assertEquals("java.lang.String", foo<String>())
assertEquals("java.lang.Integer", foo<Int>())
assertEquals("java.lang.Object", foo<Any>())
assertEquals("java.lang.String", bar("abc"))
assertEquals("java.lang.Integer", bar(1))
assertEquals("java.lang.Object", bar(Any()))
return "OK"
}
@@ -0,0 +1,18 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
inline fun<reified T> Array<Any>.filterIsInstance(): List<T> {
return this.filter { it is T }.map { it as T }
}
fun box(): String {
val src: Array<Any> = arrayOf(1,2,3.toDouble(), "abc", "cde")
assertEquals(arrayListOf(1,2), src.filterIsInstance<Int>())
assertEquals(arrayListOf(3.0), src.filterIsInstance<Double>())
assertEquals(arrayListOf("abc", "cde"), src.filterIsInstance<String>())
assertEquals(src.toList(), src.filterIsInstance<Any>())
return "OK"
}
@@ -0,0 +1,29 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
abstract class A<R> {
abstract fun f(): String
override fun toString() = f()
}
abstract class G {
abstract fun bar(): Any
}
inline fun<reified T> foo(): G {
return object : G() {
override fun bar(): Any {
return object : A<T>() {
override fun f(): String = "OK"
}
}
}
}
fun box(): String {
val y = foo<String>().bar();
assertEquals("OK", y.toString())
assertEquals("A<java.lang.String>", y.javaClass.getGenericSuperclass()?.toString())
return "OK"
}
+13
View File
@@ -0,0 +1,13 @@
// WITH_RUNTIME
inline fun<reified T> isinstance(x: Any?): Boolean {
return x is T
}
fun box(): String {
assert(isinstance<String>("abc"))
assert(isinstance<Int>(1))
assert(!isinstance<Int>("abc"))
return "OK"
}
+14
View File
@@ -0,0 +1,14 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
inline fun<reified T : Any> javaClassName(): String {
return T::class.java.getName()
}
fun box(): String {
assertEquals("java.lang.String", javaClassName<String>())
assertEquals("java.lang.Integer", javaClassName<Int>())
assertEquals("java.lang.Object", javaClassName<Any>())
return "OK"
}
+44
View File
@@ -0,0 +1,44 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
inline fun <reified T : Any, reified R : Any> foo(): Array<String> {
val x = object {
inline fun <reified T1 : Any, reified T : Any> bar(): Array<String> = arrayOf(
T1::class.java.getName(), T::class.java.getName(), R::class.java.getName()
)
fun f1() = bar<T, R>()
fun f2() = bar<R, T>()
fun f3() = bar<Boolean, T>()
fun f4() = bar<T, Boolean>()
}
val x1 = x.f1()
val x2 = x.f2()
val x3 = x.f3()
val x4 = x.f4()
return arrayOf(
x1[0], x1[1], x1[2],
x2[0], x2[1], x2[2],
x3[0], x3[1], x3[2],
x4[0], x4[1], x4[2]
)
}
fun box(): String {
val result = foo<Double, Int>()
val expected = arrayOf(
"java.lang.Double", "java.lang.Integer", "java.lang.Integer",
"java.lang.Integer", "java.lang.Double", "java.lang.Integer",
"java.lang.Boolean", "java.lang.Double", "java.lang.Integer",
"java.lang.Double", "java.lang.Boolean", "java.lang.Integer"
)
for (i in expected.indices) {
assertEquals(expected[i], result[i], "$i-th element")
}
return "OK"
}
@@ -0,0 +1,34 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
open class A<T1, T2, T3>
inline fun <reified T, reified R> foo(): Array<A<*,*,*>> {
val x = object {
inline fun <reified T1, reified T> bar(): A<*,*,*> = object : A<T1,T,R>() {}
fun f1() = bar<T, R>()
fun f2() = bar<R, T>()
fun f3() = bar<Boolean, T>()
fun f4() = bar<T, Boolean>()
}
return arrayOf(x.f1(), x.f2(), x.f3(), x.f4())
}
fun box(): String {
val result = foo<Double, Int>()
val expected = arrayOf(
Triple("java.lang.Double", "java.lang.Integer", "java.lang.Integer"),
Triple("java.lang.Integer", "java.lang.Double", "java.lang.Integer"),
Triple("java.lang.Boolean", "java.lang.Double", "java.lang.Integer"),
Triple("java.lang.Double", "java.lang.Boolean", "java.lang.Integer")
).map { "A<${it.first}, ${it.second}, ${it.third}>" }
for (i in expected.indices) {
assertEquals(expected[i], result[i].javaClass.getGenericSuperclass()?.toString(), "$i-th element")
}
return "OK"
}
+13
View File
@@ -0,0 +1,13 @@
// WITH_RUNTIME
inline fun<reified T> createArray(n: Int, crossinline block: () -> T): Array<T> {
return Array<T>(n) { block() }
}
fun box(): String {
val x = createArray<Int>(5) { 3 }
assert(x.all { it == 3 })
return "OK"
}
@@ -0,0 +1,19 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun foo(block: () -> String) = block()
inline fun<reified T : Any> bar1(x: T): String = foo() {
T::class.java.getName()
}
inline fun<reified T : Any> bar2(x: T, y: String): String = foo() {
T::class.java.getName() + "#" + y
}
fun box(): String {
assertEquals("java.lang.Integer", bar1(1))
assertEquals("java.lang.String#OK", bar2("abc", "OK"))
return "OK"
}
@@ -0,0 +1,37 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
abstract class A<R> {
abstract fun f(): String
override fun toString() = f()
}
abstract class G {
abstract fun bar(): Any
}
inline fun<reified T> baz(): G {
return object : G() {
override fun bar(): Any {
return object : A<T>() {
override fun f(): String = "OK"
}
}
}
}
inline fun<T1, T2, T3, T4, T5, T6, reified R1, reified R2> foo(): Pair<G, G> {
return Pair(baz<R1>(), baz<R2>())
}
fun box(): String {
val res = foo<Int, Int, Int, Int, Int, Int, Int, String>();
val x1 = res.first.bar()
val x2 = res.second.bar()
assertEquals("OK", x1.toString())
assertEquals("OK", x2.toString())
assertEquals("A<java.lang.Integer>", x1.javaClass.getGenericSuperclass()?.toString())
assertEquals("A<java.lang.String>", x2.javaClass.getGenericSuperclass()?.toString())
return "OK"
}
@@ -0,0 +1,18 @@
// WITH_RUNTIME
inline fun<reified T> createArray(n: Int, crossinline block: () -> T): Array<T> {
return Array<T>(n) { block() }
}
inline fun<T1, T2, T3, T4, T5, T6, reified R> recursive(
crossinline block: () -> R
): Array<R> {
return createArray(5) { block() }
}
fun box(): String {
val x = recursive<Int, Int, Int, Int, Int, Int, String>(){ "abc" }
assert(x.all { it == "abc" })
return "OK"
}
@@ -0,0 +1,24 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun foo(block: () -> String) = block()
inline fun<reified T : Any> bar1(): String = foo() {
T::class.java.getName()
}
inline fun<reified T : Any> bar2(y: String): String = foo() {
T::class.java.getName() + "#" + y
}
inline fun<T1, T2, reified R1 : Any, reified R2 : Any> bar3(y: String) =
Pair(bar1<R1>(), bar2<R2>(y))
fun box(): String {
val x = bar3<Any, Double, Int, String>("OK")
assertEquals("java.lang.Integer", x.first)
assertEquals("java.lang.String#OK", x.second)
return "OK"
}
@@ -0,0 +1,23 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun foo(block: () -> String) = block()
interface A {
fun f(): String
fun g(): String
}
fun box(): String {
val x: A = object : A {
private inline fun <reified T : Any> localClassName(): String = T::class.java.getName()
override fun f(): String = foo { localClassName<String>() }
override fun g(): String = foo { localClassName<Int>() }
}
assertEquals("java.lang.String", x.f())
assertEquals("java.lang.Integer", x.g())
return "OK"
}
@@ -0,0 +1,30 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun foo(block: () -> String) = block()
inline fun <reified T : Any> className(): String = T::class.java.getName()
inline fun <reified T : Any> lambdaShouldBeReified(): String = foo { className<T>() }
interface A {
fun f(): String
fun g(): String
}
inline fun<reified T1 : Any, reified T2 : Any> AFactory(): A = object : A {
override fun f(): String = className<T1>()
override fun g(): String = foo { className<T2>() }
}
fun box(): String {
assertEquals("java.lang.String", lambdaShouldBeReified<String>())
assertEquals("java.lang.Integer", lambdaShouldBeReified<Int>())
val x: A = AFactory<String, Int>()
assertEquals("java.lang.String", x.f())
assertEquals("java.lang.Integer", x.g())
return "OK"
}
@@ -0,0 +1,30 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun foo(block: () -> String) = block()
inline fun<reified T : Any> className(): String = T::class.java.getName()
interface A {
fun f(): String
fun g(): String
}
fun box(): String {
val x = foo() {
className<String>()
}
assertEquals("java.lang.String", x)
val y: A = object : A {
override fun f(): String = foo { className<String>() }
override fun g(): String = foo { className<Int>() }
}
assertEquals("java.lang.String", y.f())
assertEquals("java.lang.Integer", y.g())
return "OK"
}
+19
View File
@@ -0,0 +1,19 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
inline fun<reified T> safecast(x: Any?): T? {
return x as? T
}
fun box(): String {
val x = safecast<String>("abc")
assertEquals("abc", x)
val y = safecast<Int>(1)
assertEquals(1, y)
val z = safecast<Int>("abc")
assertEquals(null, z)
return "OK"
}
@@ -0,0 +1,22 @@
// WITH_RUNTIME
inline fun<reified T1, reified T2> createArray(n: Int, crossinline block: () -> Pair<T1, T2>): Pair<Array<T1>, Array<T2>> {
return Pair(Array(n) { block().first }, Array(n) { block().second })
}
inline fun<T1, T2, T3, T4, T5, T6, reified R> recursive(
crossinline block: () -> R
): Pair<Array<R>, Array<R>> {
return createArray(5) { Pair(block(), block()) }
}
fun box(): String {
val y = createArray(5) { Pair(1, "test") }
val x = recursive<Int, Int, Int, Int, Int, Int, String>(){ "abc" }
assert(y.first.all { it == 1 } )
assert(y.second.all { it == "test" })
assert(x.first.all { it == "abc" })
assert(x.second.all { it == "abc" })
return "OK"
}
+26
View File
@@ -0,0 +1,26 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun <T> foo(vararg a: T) = a.size
inline fun <reified T> bar(a: Array<T>, block: () -> T): Array<T> {
assertEquals(4, foo(*a, block(), block()))
return arrayOf(*a, block(), block())
}
inline fun <reified T> empty() = arrayOf<T>()
fun box(): String {
var i = 0
val a: Array<String> = bar(arrayOf("1", "2")) { i++; i.toString() }
assertEquals("1234", a.joinToString(""))
i = 0
val b: Array<Int> = bar(arrayOf(0, 1)) { i++ }
assertEquals("0123", b.map { it.toString() }.joinToString(""))
return "OK"
}
+28
View File
@@ -0,0 +1,28 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun <T> foo(vararg a: T) = a.size
inline fun <reified T> bar(block: () -> T): Array<T> {
assertEquals(2, foo(block(), block()))
return arrayOf(block(), block(), block())
}
inline fun <reified T> empty() = arrayOf<T>()
fun box(): String {
var i = 0
val a: Array<String> = bar() { i++; i.toString() }
assertEquals("345", a.joinToString(""))
i = 0
val b: Array<Int> = bar() { i++ }
assertEquals("234", b.map { it.toString() }.joinToString(""))
val c: Array<String> = empty()
assertEquals(0, c.size)
return "OK"
}