| // TARGET_BACKEND: JS_IR, JS_IR_ES6 | |
| // KJS_WITH_FULL_RUNTIME | |
| 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() | |
| object Object | |
| interface Interface | |
| enum class EnumFoo { A, B } | |
| abstract class AbstractClass | |
| sealed class SealedClass | |
| // ----------- | |
| inline fun <reified T : Any> test() { | |
| val instance = T::class.createInstance() | |
| assertTrue(instance is T) | |
| } | |
| inline fun <reified T : Any> testFail() { | |
| try { | |
| T::class.createInstance() | |
| fail("createInstance should have failed on ${T::class}") | |
| } catch (e: Exception) { | |
| // OK | |
| } | |
| } | |
| fun box(): String { | |
| test<Any>() | |
| test<Simple>() | |
| test<PrimaryWithDefaults>() | |
| test<Secondary>() | |
| test<SecondaryWithDefaults>() | |
| test<SecondaryWithDefaultsNoPrimary>() | |
| testFail<NoNoArgConstructor>() | |
| testFail<NoArgAndDefault>() | |
| testFail<DefaultPrimaryAndDefaultSecondary>() | |
| testFail<SeveralDefaultSecondaries>() | |
| testFail<PrivateConstructor>() | |
| testFail<Object>() | |
| testFail<Interface>() | |
| testFail<EnumFoo>() | |
| testFail<AbstractClass>() | |
| testFail<SealedClass>() | |
| return "OK" | |
| } |