package translators import com.intellij.openapi.application.PathManager import kotlinx.coroutines.Job import org.jetbrains.dokka.base.DokkaBase import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest import org.jetbrains.dokka.base.translators.descriptors.ExternalDocumentablesProvider import org.jetbrains.dokka.model.DClass import org.jetbrains.dokka.model.DInterface import org.jetbrains.dokka.plugability.plugin import org.jetbrains.dokka.plugability.querySingle import org.jetbrains.dokka.utilities.cast import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test class ExternalDocumentablesTest : BaseAbstractTest() { @Test fun `external documentable from java stdlib`() { val configuration = dokkaConfiguration { sourceSets { sourceSet { sourceRoots = listOf("src") analysisPlatform = "jvm" classpath += jvmStdlibPath!! } } } testInline( """ /src/com/sample/MyList.kt package com.sample class MyList: ArrayList() """.trimIndent(), configuration ) { lateinit var provider: ExternalDocumentablesProvider pluginsSetupStage = { provider = it.plugin().querySingle { externalDocumentablesProvider } } documentablesTransformationStage = { mod -> val entry = mod.packages.single().classlikes.single().cast().supertypes.entries.single() val res = provider.findClasslike( entry.value.single().typeConstructor.dri, entry.key) assertEquals("ArrayList", res?.name) assertEquals("java.util/ArrayList///PointingToDeclaration/", res?.dri?.toString()) val supertypes = res?.cast()?.supertypes?.values?.single() ?.map { it.typeConstructor.dri.classNames } assertEquals( listOf("AbstractList", "RandomAccess", "Cloneable", "Serializable", "MutableList"), supertypes ) } } } @Test fun `external documentable from dependency`() { val coroutinesPath = PathManager.getResourceRoot(Job::class.java, "/kotlinx/coroutines/Job.class") val configuration = dokkaConfiguration { sourceSets { sourceSet { sourceRoots = listOf("src") analysisPlatform = "jvm" classpath += listOf(jvmStdlibPath!!, coroutinesPath!!) } } } testInline( """ /src/com/sample/MyJob.kt package com.sample import kotlinx.coroutines.Job abstract class MyJob: Job """.trimIndent(), configuration ) { lateinit var provider: ExternalDocumentablesProvider pluginsSetupStage = { provider = it.plugin().querySingle { externalDocumentablesProvider } } documentablesTransformationStage = { mod -> val entry = mod.packages.single().classlikes.single().cast().supertypes.entries.single() val res = provider.findClasslike( entry.value.single().typeConstructor.dri, entry.key) assertEquals("Job", res?.name) assertEquals("kotlinx.coroutines/Job///PointingToDeclaration/", res?.dri?.toString()) val supertypes = res?.cast()?.supertypes?.values?.single() ?.map { it.typeConstructor.dri.classNames } assertEquals( listOf("CoroutineContext.Element"), supertypes ) } } } @Test fun `external documentable for nested class`() { val configuration = dokkaConfiguration { sourceSets { sourceSet { sourceRoots = listOf("src") analysisPlatform = "jvm" classpath += jvmStdlibPath!! } } } testInline( """ /src/com/sample/MyList.kt package com.sample abstract class MyEntry: Map.Entry """.trimIndent(), configuration ) { lateinit var provider: ExternalDocumentablesProvider pluginsSetupStage = { provider = it.plugin().querySingle { externalDocumentablesProvider } } documentablesTransformationStage = { mod -> val entry = mod.packages.single().classlikes.single().cast().supertypes.entries.single() val res = provider.findClasslike( entry.value.single().typeConstructor.dri, entry.key) assertEquals("Entry", res?.name) assertEquals("kotlin.collections/Map.Entry///PointingToDeclaration/", res?.dri?.toString()) } } } }