aboutsummaryrefslogtreecommitdiff
path: root/plugins/base/src/test/kotlin
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/base/src/test/kotlin')
-rw-r--r--plugins/base/src/test/kotlin/content/functions/ContentForBriefTest.kt330
-rw-r--r--plugins/base/src/test/kotlin/filter/KotlinArrayDocumentableReplacerTest.kt199
2 files changed, 529 insertions, 0 deletions
diff --git a/plugins/base/src/test/kotlin/content/functions/ContentForBriefTest.kt b/plugins/base/src/test/kotlin/content/functions/ContentForBriefTest.kt
new file mode 100644
index 00000000..7d8a169b
--- /dev/null
+++ b/plugins/base/src/test/kotlin/content/functions/ContentForBriefTest.kt
@@ -0,0 +1,330 @@
+package content.functions
+
+import org.junit.Assert.assertEquals
+import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
+import org.jetbrains.dokka.links.TypeConstructor
+import org.jetbrains.dokka.model.DClass
+import org.jetbrains.dokka.model.dfs
+import org.jetbrains.dokka.pages.*
+import org.junit.jupiter.api.Test
+import kotlin.test.assertNull
+
+
+class ContentForBriefTest : BaseAbstractTest() {
+ private val testConfiguration = dokkaConfiguration {
+ sourceSets {
+ sourceSet {
+ sourceRoots = listOf("src/")
+ analysisPlatform = "jvm"
+ }
+ }
+ }
+
+ private val codeWithSecondaryAndPrimaryConstructorsDocumented =
+ """
+ |/src/main/kotlin/test/source.kt
+ |package test
+ |
+ |/**
+ | * Dummy text.
+ | *
+ | * @constructor constructor docs
+ | * @param exampleParameter dummy parameter.
+ | */
+ |class Example(val exampleParameter: Int) {
+ |
+ | /**
+ | * secondary constructor
+ | * @param param1 param1 docs
+ | */
+ | constructor(param1: String) : this(1)
+ |}
+ """.trimIndent()
+
+ private val codeWithDocumentedParameter =
+ """
+ |/src/main/kotlin/test/source.kt
+ |package test
+ |
+ |/**
+ | * Dummy text.
+ | *
+ | * @param exampleParameter dummy parameter.
+ | */
+ |class Example(val exampleParameter: Int) {
+ |}
+ """.trimIndent()
+
+ @Test
+ fun `primary constructor should not inherit docs from its parameter`() {
+ testInline(codeWithSecondaryAndPrimaryConstructorsDocumented, testConfiguration) {
+ pagesTransformationStage = { module ->
+ val classPage =
+ module.dfs { it.name == "Example" && (it as ContentPage).documentable is DClass } as ContentPage
+ val constructorsTable =
+ classPage.content.dfs { it is ContentTable && it.dci.kind == ContentKind.Constructors } as ContentTable
+
+ assertEquals(2, constructorsTable.children.size)
+ val primary = constructorsTable.children.first {
+ it.dci.dri.first().callable?.params?.first() == TypeConstructor(
+ "kotlin.Int",
+ emptyList()
+ )
+ }
+ val primaryConstructorDocs =
+ primary.dfs { it is ContentText && it.dci.kind == ContentKind.Comment } as ContentText
+
+ assertEquals("constructor docs", primaryConstructorDocs.text)
+ }
+ }
+ }
+
+ @Test
+ fun `secondary constructor should not inherit docs from its parameter`() {
+ testInline(codeWithSecondaryAndPrimaryConstructorsDocumented, testConfiguration) {
+ pagesTransformationStage = { module ->
+ val classPage =
+ module.dfs { it.name == "Example" && (it as ContentPage).documentable is DClass } as ContentPage
+ val constructorsTable =
+ classPage.content.dfs { it is ContentTable && it.dci.kind == ContentKind.Constructors } as ContentTable
+
+ assertEquals(2, constructorsTable.children.size)
+ val primary = constructorsTable.children.first {
+ it.dci.dri.first().callable?.params?.first() == TypeConstructor(
+ "kotlin.String",
+ emptyList()
+ )
+ }
+ val primaryConstructorDocs =
+ primary.dfs { it is ContentText && it.dci.kind == ContentKind.Comment } as ContentText
+
+ assertEquals("secondary constructor", primaryConstructorDocs.text)
+ }
+ }
+ }
+
+ @Test
+ fun `primary constructor should not inherit docs from its parameter when no specific docs are provided`() {
+ testInline(codeWithDocumentedParameter, testConfiguration) {
+ pagesTransformationStage = { module ->
+ val classPage =
+ module.dfs { it.name == "Example" && (it as ContentPage).documentable is DClass } as ContentPage
+ val constructorsTable =
+ classPage.content.dfs { it is ContentTable && it.dci.kind == ContentKind.Constructors } as ContentTable
+
+ assertEquals(1, constructorsTable.children.size)
+ val primary = constructorsTable.children.first()
+ val primaryConstructorDocs = primary.dfs { it is ContentText && it.dci.kind == ContentKind.Comment }
+
+ assertNull(primaryConstructorDocs, "Expected no primary constructor docs to be present")
+ }
+ }
+ }
+
+ @Test
+ fun `brief for functions should work with html`() {
+ testInline(
+ """
+ |/src/main/kotlin/test/source.kt
+ |package test
+ |
+ |class Example(val exampleParameter: Int) {
+ | /**
+ | * This is an example <!-- not visible --> of html
+ | *
+ | * This is definitely not a brief
+ | */
+ | fun test(): String = "TODO"
+ |}
+ """.trimIndent(),
+ testConfiguration
+ ) {
+ pagesTransformationStage = { module ->
+ val functionBriefDocs = module.singleFunctionDescription("Example")
+
+ assertEquals(
+ "This is an example <!-- not visible --> of html",
+ functionBriefDocs.children.joinToString("") { (it as ContentText).text })
+ }
+ }
+ }
+
+ @Test
+ fun `brief for functions should work with ie`() {
+ testInline(
+ """
+ |/src/main/kotlin/test/source.kt
+ |package test
+ |
+ |class Example(val exampleParameter: Int) {
+ | /**
+ | * The user token, i.e. "Bearer xyz". Throw an exception if not available.
+ | *
+ | * This is definitely not a brief
+ | */
+ | fun test(): String = "TODO"
+ |}
+ """.trimIndent(),
+ testConfiguration
+ ) {
+ pagesTransformationStage = { module ->
+ val functionBriefDocs = module.singleFunctionDescription("Example")
+
+ assertEquals(
+ "The user token, i.e. \"Bearer xyz\". Throw an exception if not available.",
+ functionBriefDocs.children.joinToString("") { (it as ContentText).text })
+ }
+ }
+ }
+
+ @Test
+ fun `brief for functions should work with eg`() {
+ testInline(
+ """
+ |/src/main/kotlin/test/source.kt
+ |package test
+ |
+ |class Example(val exampleParameter: Int) {
+ | /**
+ | * The user token, e.g. "Bearer xyz". Throw an exception if not available.
+ | *
+ | * This is definitely not a brief
+ | */
+ | fun test(): String = "TODO"
+ |}
+ """.trimIndent(),
+ testConfiguration
+ ) {
+ pagesTransformationStage = { module ->
+ val functionBriefDocs = module.singleFunctionDescription("Example")
+
+ assertEquals(
+ "The user token, e.g. \"Bearer xyz\". Throw an exception if not available.",
+ functionBriefDocs.children.joinToString("") { (it as ContentText).text })
+ }
+ }
+ }
+
+ @Test
+ fun `brief for functions should be first sentence for Java`() {
+ testInline(
+ """
+ |/src/main/java/test/Example.java
+ |package test;
+ |
+ |public class Example {
+ | /**
+ | * The user token, or not. This is definitely not a brief in java
+ | */
+ | public static String test() {
+ | return "TODO";
+ | }
+ |}
+ """.trimIndent(),
+ testConfiguration
+ ) {
+ pagesTransformationStage = { module ->
+ val functionBriefDocs = module.singleFunctionDescription("Example")
+
+ assertEquals(
+ "The user token, or not.",
+ functionBriefDocs.children.joinToString("") { (it as ContentText).text })
+ }
+ }
+ }
+
+ @Test
+ fun `brief for functions should work with ie for Java`() {
+ testInline(
+ """
+ |/src/main/java/test/Example.java
+ |package test;
+ |
+ |public class Example {
+ | /**
+ | * The user token, e.g.&nbsp;"Bearer xyz". This is definitely not a brief in java
+ | */
+ | public static String test() {
+ | return "TODO";
+ | }
+ |}
+ """.trimIndent(),
+ testConfiguration
+ ) {
+ pagesTransformationStage = { module ->
+ val functionBriefDocs = module.singleFunctionDescription("Example")
+
+ assertEquals(
+ "The user token, e.g. \"Bearer xyz\".",
+ functionBriefDocs.children.joinToString("") { (it as ContentText).text })
+ }
+ }
+ }
+
+ //Source: https://www.oracle.com/technical-resources/articles/java/javadoc-tool.html#exampleresult
+ @Test
+ fun `brief for functions should work with html comment for Java`() {
+ testInline(
+ """
+ |/src/main/java/test/Example.java
+ |package test;
+ |
+ |public class Example {
+ | /**
+ | * This is a simulation of Prof.<!-- --> Knuth's MIX computer. This is definitely not a brief in java
+ | */
+ | public static String test() {
+ | return "TODO";
+ | }
+ |}
+ """.trimIndent(),
+ testConfiguration
+ ) {
+ pagesTransformationStage = { module ->
+ val functionBriefDocs = module.singleFunctionDescription("Example")
+
+ assertEquals(
+ "This is a simulation of Prof.<!-- --> Knuth's MIX computer.",
+ functionBriefDocs.children.joinToString("") { (it as ContentText).text })
+ }
+ }
+ }
+
+ @Test
+ fun `brief for functions should work with html comment at the end for Java`() {
+ testInline(
+ """
+ |/src/main/java/test/Example.java
+ |package test;
+ |
+ |public class Example {
+ | /**
+ | * This is a simulation of Prof.<!-- --> Knuth's MIX computer. This is definitely not a brief in java <!-- -->
+ | */
+ | public static String test() {
+ | return "TODO";
+ | }
+ |}
+ """.trimIndent(),
+ testConfiguration
+ ) {
+ pagesTransformationStage = { module ->
+ val functionBriefDocs = module.singleFunctionDescription("Example")
+
+ assertEquals(
+ "This is a simulation of Prof.<!-- --> Knuth's MIX computer.",
+ functionBriefDocs.children.joinToString("") { (it as ContentText).text })
+ }
+ }
+ }
+
+ private fun RootPageNode.singleFunctionDescription(className: String): ContentGroup {
+ val classPage = dfs { it.name == className && (it as ContentPage).documentable is DClass } as ContentPage
+ val functionsTable =
+ classPage.content.dfs { it is ContentTable && it.dci.kind == ContentKind.Functions } as ContentTable
+
+ assertEquals(1, functionsTable.children.size)
+ val function = functionsTable.children.first()
+ return function.dfs { it is ContentGroup && it.dci.kind == ContentKind.Comment && it.children.all { it is ContentText } } as ContentGroup
+ }
+} \ No newline at end of file
diff --git a/plugins/base/src/test/kotlin/filter/KotlinArrayDocumentableReplacerTest.kt b/plugins/base/src/test/kotlin/filter/KotlinArrayDocumentableReplacerTest.kt
new file mode 100644
index 00000000..b9b1dc1e
--- /dev/null
+++ b/plugins/base/src/test/kotlin/filter/KotlinArrayDocumentableReplacerTest.kt
@@ -0,0 +1,199 @@
+package filter
+
+import com.jetbrains.rd.util.firstOrNull
+import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
+import org.jetbrains.dokka.links.DRI
+import org.jetbrains.dokka.model.*
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Test
+
+class KotlinArrayDocumentableReplacerTest : BaseAbstractTest() {
+ private val configuration = dokkaConfiguration {
+ sourceSets {
+ sourceSet {
+ sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
+ }
+ }
+ }
+
+ @Test
+ fun `function with array type params`() {
+ testInline(
+ """
+ |/src/main/kotlin/basic/Test.kt
+ |package example
+ |
+ |fun testFunction(param1: Array<Int>, param2: Array<Boolean>,
+ | param3: Array<Float>, param4: Array<Double>,
+ | param5: Array<Long>, param6: Array<Short>,
+ | param7: Array<Char>, param8: Array<Byte>) { }
+ |
+ |
+ |
+ """.trimMargin(),
+ configuration
+ ) {
+ preMergeDocumentablesTransformationStage = {
+ val params = it.firstOrNull()?.packages?.firstOrNull()?.functions?.firstOrNull()?.parameters
+
+ val typeArrayNames = listOf("IntArray", "BooleanArray", "FloatArray", "DoubleArray", "LongArray", "ShortArray",
+ "CharArray", "ByteArray")
+
+ Assertions.assertEquals(typeArrayNames.size, params?.size)
+ params?.forEachIndexed{ i, param ->
+ Assertions.assertEquals(GenericTypeConstructor(DRI("kotlin", typeArrayNames[i]), emptyList()),
+ param.type)
+ }
+ }
+ }
+ }
+ @Test
+ fun `function with specific parameters of array type`() {
+ testInline(
+ """
+ |/src/main/kotlin/basic/Test.kt
+ |package example
+ |
+ |fun testFunction(param1: Array<Array<Int>>, param2: (Array<Int>) -> Array<Int>) { }
+ |
+ |
+ |
+ """.trimMargin(),
+ configuration
+ ) {
+ preMergeDocumentablesTransformationStage = {
+ val params = it.firstOrNull()?.packages?.firstOrNull()?.functions?.firstOrNull()?.parameters
+ Assertions.assertEquals(
+ Invariance(GenericTypeConstructor(DRI("kotlin", "IntArray"), emptyList())),
+ (params?.firstOrNull()?.type as? GenericTypeConstructor)?.projections?.firstOrNull())
+ Assertions.assertEquals(
+ Invariance(GenericTypeConstructor(DRI("kotlin", "IntArray"), emptyList())),
+ (params?.get(1)?.type as? FunctionalTypeConstructor)?.projections?.get(0))
+ Assertions.assertEquals(
+ Invariance(GenericTypeConstructor(DRI("kotlin", "IntArray"), emptyList())),
+ (params?.get(1)?.type as? FunctionalTypeConstructor)?.projections?.get(1))
+ }
+ }
+ }
+ @Test
+ fun `property with array type`() {
+ testInline(
+ """
+ |/src/main/kotlin/basic/Test.kt
+ |package example
+ |
+ |class MyTest {
+ | val isEmpty: Array<Boolean>
+ | get() = emptyList
+ | set(value) {
+ | field = value
+ | }
+ |}
+ |
+ |
+ """.trimMargin(),
+ configuration
+ ) {
+ preMergeDocumentablesTransformationStage = {
+ val myTestClass = it.firstOrNull()?.packages?.firstOrNull()?.classlikes?.firstOrNull()
+ val property = myTestClass?.properties?.firstOrNull()
+
+ Assertions.assertEquals(GenericTypeConstructor(DRI("kotlin", "BooleanArray"), emptyList()),
+ property?.type)
+ Assertions.assertEquals(GenericTypeConstructor(DRI("kotlin", "BooleanArray"), emptyList()),
+ property?.getter?.type)
+ Assertions.assertEquals(GenericTypeConstructor(DRI("kotlin", "BooleanArray"), emptyList()),
+ property?.setter?.parameters?.firstOrNull()?.type)
+ }
+ }
+ }
+ @Test
+ fun `typealias with array type`() {
+ testInline(
+ """
+ |/src/main/kotlin/basic/Test.kt
+ |package example
+ |
+ |typealias arr = Array<Int>
+ |
+ |
+ """.trimMargin(),
+ configuration
+ ) {
+ preMergeDocumentablesTransformationStage = {
+ val arrTypealias = it.firstOrNull()?.packages?.firstOrNull()?.typealiases?.firstOrNull()
+
+ Assertions.assertEquals(GenericTypeConstructor(DRI("kotlin", "IntArray"), emptyList()),
+ arrTypealias?.underlyingType?.firstOrNull()?.value)
+ }
+ }
+ }
+ @Test
+ fun `generic fun and class`() {
+ testInline(
+ """
+ |/src/main/kotlin/basic/Test.kt
+ |package example
+ |
+ |fun<T : Array<Int>> testFunction() { }
+ |class<T : Array<Int>> myTestClass{ }
+ |
+ |
+ """.trimMargin(),
+ configuration
+ ) {
+ preMergeDocumentablesTransformationStage = {
+ val testFun = it.firstOrNull()?.packages?.firstOrNull()?.functions?.firstOrNull()
+ val myTestClass = it.firstOrNull()?.packages?.firstOrNull()?.classlikes?.firstOrNull() as? DClass
+
+ Assertions.assertEquals(GenericTypeConstructor(DRI("kotlin","IntArray"), emptyList()),
+ testFun?.generics?.firstOrNull()?.bounds?.firstOrNull())
+ Assertions.assertEquals(GenericTypeConstructor(DRI("kotlin","IntArray"), emptyList()),
+ myTestClass?.generics?.firstOrNull()?.bounds?.firstOrNull())
+ }
+ }
+ }
+ @Test
+ fun `no jvm source set`() {
+ val configurationWithNoJVM = dokkaConfiguration {
+ sourceSets {
+ sourceSet {
+ sourceRoots = listOf("src/main/kotlin/basic/Test.kt")
+ analysisPlatform = "jvm"
+ }
+ sourceSet {
+ sourceRoots = listOf("src/main/kotlin/basic/TestJS.kt")
+ analysisPlatform = "js"
+ }
+ }
+ }
+
+ testInline(
+ """
+ |/src/main/kotlin/basic/Test.kt
+ |package example
+ |
+ |fun testFunction(param: Array<Int>)
+ |
+ |
+ |/src/main/kotlin/basic/TestJS.kt
+ |package example
+ |
+ |fun testFunction(param: Array<Int>)
+ """.trimMargin(),
+ configurationWithNoJVM
+ ) {
+ preMergeDocumentablesTransformationStage = {
+ val paramsJS = it[1].packages.firstOrNull()?.functions?.firstOrNull()?.parameters
+ Assertions.assertNotEquals(
+ GenericTypeConstructor(DRI("kotlin", "IntArray"), emptyList()),
+ paramsJS?.firstOrNull()?.type)
+
+ val paramsJVM = it.firstOrNull()?.packages?.firstOrNull()?.functions?.firstOrNull()?.parameters
+ Assertions.assertEquals(
+ GenericTypeConstructor(DRI("kotlin", "IntArray"), emptyList()),
+ paramsJVM?.firstOrNull()?.type)
+ }
+ }
+ }
+} \ No newline at end of file