// TODO: muted automatically, investigate should it be ran for JS or not // IGNORE_BACKEND: JS, NATIVE // WITH_REFLECT // FULL_JDK import kotlin.reflect.KClass import kotlin.reflect.jvm.* import kotlin.test.assertEquals class A { companion object {} inner class Inner class Nested private class PrivateNested } fun nestedNames(c: KClass<*>) = c.nestedClasses.map { it.simpleName ?: throw AssertionError("Unnamed class: ${it.java}") }.sorted() fun box(): String { // Kotlin class without nested classes assertEquals(emptyList(), nestedNames(A.Inner::class)) // Kotlin class with nested classes assertEquals(listOf("Companion", "Inner", "Nested", "PrivateNested"), nestedNames(A::class)) // Java class without nested classes assertEquals(emptyList(), nestedNames(Error::class)) // Java interface with nested classes assertEquals(listOf("Entry"), nestedNames(java.util.Map::class)) // Java class with nested classes assertEquals(listOf("SimpleEntry", "SimpleImmutableEntry"), nestedNames(java.util.AbstractMap::class)) // Built-ins assertEquals(emptyList(), nestedNames(Array::class)) assertEquals(emptyList(), nestedNames(CharSequence::class)) assertEquals(listOf("Companion"), nestedNames(String::class)) assertEquals(emptyList(), nestedNames(Collection::class)) assertEquals(emptyList(), nestedNames(MutableCollection::class)) assertEquals(emptyList(), nestedNames(List::class)) assertEquals(emptyList(), nestedNames(MutableList::class)) assertEquals(listOf("Entry"), nestedNames(Map::class)) assertEquals(emptyList(), nestedNames(Map.Entry::class)) assertEquals(emptyList(), nestedNames(MutableMap.MutableEntry::class)) // TODO: should be MutableEntry. Currently we do not distinguish between Map and MutableMap. assertEquals(listOf("Entry"), nestedNames(MutableMap::class)) // Primitives for (primitive in listOf(Byte::class, Double::class, Float::class, Int::class, Long::class, Short::class, Char::class)) { assertEquals(listOf("Companion"), nestedNames(primitive)) } assertEquals(emptyList(), nestedNames(Boolean::class)) // Primitive arrays for (primitiveArray in listOf( ByteArray::class, DoubleArray::class, FloatArray::class, IntArray::class, LongArray::class, ShortArray::class, CharArray::class, BooleanArray::class )) { assertEquals(emptyList(), nestedNames(primitiveArray)) } return "OK" }