| // TARGET_BACKEND: JS_IR, JS_IR_ES6 |
| // KJS_WITH_FULL_RUNTIME |
| |
| // FILE: lib.kt |
| import kotlin.reflect.createInstance |
| import kotlin.test.assertTrue |
| import kotlin.test.fail |
| |
| // Good classes |
| |
| class Simple |
| class PrimaryWithDefaults(val d1: String = "d1", val d2: Int = 2) |
| class Secondary(val s: String) { |
| constructor() : this("s") |
| } |
| class SecondaryWithDefaults(val s: String) { |
| constructor(x: Int = 0) : this(x.toString()) |
| } |
| class SecondaryWithDefaultsNoPrimary { |
| constructor(x: Int) {} |
| constructor(s: String = "") {} |
| } |
| |
| // Bad classes |
| |
| class NoNoArgConstructor(val s: String) { |
| constructor(x: Int) : this(x.toString()) |
| } |
| class NoArgAndDefault() { |
| constructor(x: Int = 0) : this() |
| } |
| class DefaultPrimaryAndDefaultSecondary(val s: String = "") { |
| constructor(x: Int = 0) : this(x.toString()) |
| } |
| class SeveralDefaultSecondaries { |
| constructor(x: Int = 0) {} |
| constructor(s: String = "") {} |
| constructor(d: Double = 3.14) {} |
| } |
| class PrivateConstructor private constructor() { |
| companion object { |
| fun create() = PrivateConstructor() |
| } |
| } |
| object Object |
| enum class EnumFoo { A, B } |
| |
| // ----------- |
| |
| inline fun <T : Any> testInstance(x: T) { |
| val kclass = x::class |
| val anotherInstance = kclass.createInstance() |
| assertTrue(kclass.isInstance(x) && kclass.isInstance(anotherInstance)) |
| } |
| |
| inline fun <T : Any> testInstanceFail(x: T) { |
| try { |
| val kclass = x::class |
| kclass.createInstance() |
| fail("createInstance should have failed on $kclass") |
| } catch (e: Exception) { |
| // OK |
| } |
| } |
| |
| // FILE: main.kt |
| import kotlin.reflect.createInstance |
| import kotlin.test.assertTrue |
| import kotlin.test.fail |
| |
| fun box(): String { |
| testInstance(Simple()) |
| testInstance(PrimaryWithDefaults("d2")) |
| testInstance(Secondary("test")) |
| testInstance(SecondaryWithDefaults("test")) |
| testInstance(SecondaryWithDefaultsNoPrimary(2)) |
| |
| testInstanceFail(NoNoArgConstructor(4)) |
| testInstanceFail(NoArgAndDefault()) |
| testInstanceFail(DefaultPrimaryAndDefaultSecondary(4)) |
| testInstanceFail(SeveralDefaultSecondaries(4)) |
| testInstanceFail(PrivateConstructor.create()) |
| testInstanceFail(Object) |
| testInstanceFail(EnumFoo.A) |
| |
| return "OK" |
| } |