aboutsummaryrefslogtreecommitdiff
path: root/plugins/javadoc/src/test
diff options
context:
space:
mode:
authorIgnat Beresnev <ignat.beresnev@jetbrains.com>2023-02-10 17:49:53 +0100
committerGitHub <noreply@github.com>2023-02-10 17:49:53 +0100
commit5c30c62eba6ab79df147d7f4625a0a928674591a (patch)
treec3131e03acdc0b292e81cb249d06a3fac5847884 /plugins/javadoc/src/test
parentf515abc3118143f1cac62616c02970b2926427a2 (diff)
downloaddokka-5c30c62eba6ab79df147d7f4625a0a928674591a.tar.gz
dokka-5c30c62eba6ab79df147d7f4625a0a928674591a.tar.bz2
dokka-5c30c62eba6ab79df147d7f4625a0a928674591a.zip
Do not leak implementation details in generated Javadoc links (#2813)
Fixes #2803
Diffstat (limited to 'plugins/javadoc/src/test')
-rw-r--r--plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationTest.kt187
1 files changed, 144 insertions, 43 deletions
diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationTest.kt
index fe944794..f0e2b49d 100644
--- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationTest.kt
+++ b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationTest.kt
@@ -11,53 +11,22 @@ import org.jetbrains.dokka.plugability.DokkaContext
import org.jetbrains.dokka.plugability.plugin
import org.jetbrains.dokka.plugability.querySingle
import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest
+import org.jetbrains.dokka.javadoc.pages.JavadocFunctionNode
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.assertEquals
class JavadocLocationTest : BaseAbstractTest() {
- private fun locationTestInline(testHandler: (RootPageNode, DokkaContext) -> Unit) {
- val config = dokkaConfiguration {
- format = "javadoc"
- sourceSets {
- sourceSet {
- sourceRoots = listOf("jvmSrc/")
- externalDocumentationLinks = listOf(
- DokkaConfiguration.ExternalDocumentationLink.jdk(8),
- DokkaConfiguration.ExternalDocumentationLink.kotlinStdlib()
- )
- analysisPlatform = "jvm"
- }
- }
- }
- testInline(
- """
+ @Test
+ fun `resolved signature with external links`() {
+ val query = """
|/jvmSrc/javadoc/test/Test.kt
|package javadoc.test
|import java.io.Serializable
- |class Test<A>() : Serializable, Cloneable {
- | fun test() {}
- | fun test2(s: String) {}
- | fun <T> test3(a: A, t: T) {}
- |}
- |
- |/jvmSrc/another/javadoc/example/Referenced.kt
- |package javadoc.example.another
- |/**
- | * Referencing element from another package: [javadoc.test.Test]
- | */
- |class Referenced {}
- """.trimIndent(),
- config,
- cleanupOutput = false,
- pluginOverrides = listOf(JavadocPlugin())
- ) { renderingStage = testHandler }
- }
+ |class Test : Serializable, Cloneable {}
+ """.trimIndent()
- @Test
- fun `resolved signature with external links`() {
-
- locationTestInline { rootPageNode, dokkaContext ->
+ locationTestInline(query) { rootPageNode, dokkaContext ->
val transformer = htmlTranslator(rootPageNode, dokkaContext)
val testClass = rootPageNode.firstChildOfType<JavadocPackagePageNode> { it.name == "javadoc.test" }
.firstChildOfType<JavadocClasslikePageNode>()
@@ -70,8 +39,15 @@ class JavadocLocationTest : BaseAbstractTest() {
@Test
fun `resolved signature to no argument function`() {
+ val query = """
+ |/jvmSrc/javadoc/test/Test.kt
+ |package javadoc.test
+ |class Test {
+ | fun test() {}
+ |}
+ """.trimIndent()
- locationTestInline { rootPageNode, dokkaContext ->
+ locationTestInline(query) { rootPageNode, dokkaContext ->
val transformer = htmlTranslator(rootPageNode, dokkaContext)
val testClassNode = rootPageNode.firstChildOfType<JavadocPackagePageNode> { it.name == "javadoc.test" }
.firstChildOfType<JavadocClasslikePageNode> { it.name == "Test" }
@@ -88,8 +64,15 @@ class JavadocLocationTest : BaseAbstractTest() {
@Test
fun `resolved signature to one argument function`() {
+ val query = """
+ |/jvmSrc/javadoc/test/Test.kt
+ |package javadoc.test
+ |class Test {
+ | fun test2(s: String) {}
+ |}
+ """.trimIndent()
- locationTestInline { rootPageNode, dokkaContext ->
+ locationTestInline(query) { rootPageNode, dokkaContext ->
val transformer = htmlTranslator(rootPageNode, dokkaContext)
val testClassNode = rootPageNode.firstChildOfType<JavadocPackagePageNode> { it.name == "javadoc.test" }
.firstChildOfType<JavadocClasslikePageNode> { it.name == "Test" }
@@ -106,8 +89,15 @@ class JavadocLocationTest : BaseAbstractTest() {
@Test
fun `resolved signature to generic function`() {
+ val query = """
+ |/jvmSrc/javadoc/test/Test.kt
+ |package javadoc.test
+ |class Test<A>() {
+ | fun <T> test3(a: A, t: T) {}
+ |}
+ """.trimIndent()
- locationTestInline { rootPageNode, dokkaContext ->
+ locationTestInline(query) { rootPageNode, dokkaContext ->
val transformer = htmlTranslator(rootPageNode, dokkaContext)
val testClassNode = rootPageNode.firstChildOfType<JavadocPackagePageNode> { it.name == "javadoc.test" }
.firstChildOfType<JavadocClasslikePageNode> { it.name == "Test" }
@@ -124,8 +114,13 @@ class JavadocLocationTest : BaseAbstractTest() {
@Test
fun `resolved package path`() {
+ val query = """
+ |/jvmSrc/javadoc/test/Test.kt
+ |package javadoc.test
+ |class Test {}
+ """.trimIndent()
- locationTestInline { rootPageNode, dokkaContext ->
+ locationTestInline(query) { rootPageNode, dokkaContext ->
val locationProvider = dokkaContext.plugin<JavadocPlugin>().querySingle { locationProviderFactory }
.getLocationProvider(rootPageNode)
val packageNode = rootPageNode.firstChildOfType<JavadocPackagePageNode> { it.name == "javadoc.test" }
@@ -137,7 +132,21 @@ class JavadocLocationTest : BaseAbstractTest() {
@Test
fun `resolve link from another package`(){
- locationTestInline { rootPageNode, dokkaContext ->
+ val query = """
+ |/jvmSrc/javadoc/test/Test.kt
+ |package javadoc.test
+ |class Test {}
+ |
+ |/jvmSrc/another/javadoc/example/Referenced.kt
+ |package javadoc.example.another
+ |
+ |/**
+ | * Referencing element from another package: [javadoc.test.Test]
+ | */
+ |class Referenced {}
+ """.trimIndent()
+
+ locationTestInline(query) { rootPageNode, dokkaContext ->
val transformer = htmlTranslator(rootPageNode, dokkaContext)
val testClassNode = rootPageNode.firstChildOfType<JavadocPackagePageNode> { it.name == "javadoc.example.another" }
.firstChildOfType<JavadocClasslikePageNode> { it.name == "Referenced" }
@@ -151,6 +160,98 @@ class JavadocLocationTest : BaseAbstractTest() {
}
}
+ @Test
+ fun `should resolve typealias function parameter`() {
+ val query = """
+ |/jvmSrc/javadoc/test/FunctionParameters.kt
+ |package javadoc.test.functionparams
+ |
+ |typealias StringTypealias = String
+ |
+ |class FunctionParameters {
+ | fun withTypealias(typeAliasParam: StringTypealias) {}
+ |}
+ """.trimIndent()
+
+ locationTestInline(query) { rootPageNode, dokkaContext ->
+ val transformer = htmlTranslator(rootPageNode, dokkaContext)
+ val methodWithTypealiasParam = rootPageNode.findFunctionNodeWithin(
+ packageName = "javadoc.test.functionparams",
+ className = "FunctionParameters",
+ methodName = "withTypealias"
+ )
+ val methodSignatureHtml = transformer.htmlForContentNode(methodWithTypealiasParam.signature, null)
+
+ val expectedSignatureHtml = "final <a href=https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html>Unit</a> " +
+ "<a href=javadoc/test/functionparams/FunctionParameters.html#withTypealias(javadoc.test.functionparams.StringTypealias)>withTypealias</a>" +
+ "(<a href=https://docs.oracle.com/javase/8/docs/api/java/lang/String.html>String</a> typeAliasParam)"
+
+ assertEquals(expectedSignatureHtml, methodSignatureHtml)
+ }
+ }
+
+ @Test
+ fun `should resolve definitely non nullable function parameter`() {
+ val query = """
+ |/jvmSrc/javadoc/test/FunctionParameters.kt
+ |package javadoc.test.functionparams
+ |
+ |class FunctionParameters {
+ | fun <T> withDefinitelyNonNullableType(definitelyNonNullable: T & Any) {}
+ |}
+ """.trimIndent()
+
+ locationTestInline(query) { rootPageNode, dokkaContext ->
+ val transformer = htmlTranslator(rootPageNode, dokkaContext)
+ val methodWithVoidParam = rootPageNode.findFunctionNodeWithin(
+ packageName = "javadoc.test.functionparams",
+ className = "FunctionParameters",
+ methodName = "withDefinitelyNonNullableType"
+ )
+ val methodSignatureHtml = transformer.htmlForContentNode(methodWithVoidParam.signature, null)
+
+ val expectedSignatureHtml = "final &lt;T extends <a href=https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html>Any</a>&gt; " +
+ "<a href=https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html>Unit</a> " +
+ "<a href=javadoc/test/functionparams/FunctionParameters.html#withDefinitelyNonNullableType(T)>withDefinitelyNonNullableType</a>" +
+ "(<a href=javadoc/test/functionparams/FunctionParameters.html#withDefinitelyNonNullableType(T)>T</a> definitelyNonNullable)"
+
+ assertEquals(expectedSignatureHtml, methodSignatureHtml)
+ }
+ }
+
+ private fun RootPageNode.findFunctionNodeWithin(
+ packageName: String,
+ className: String,
+ methodName: String
+ ): JavadocFunctionNode {
+ return this
+ .firstChildOfType<JavadocPackagePageNode> { it.name == packageName }
+ .firstChildOfType<JavadocClasslikePageNode> { it.name == className }
+ .methods.single { it.name == methodName }
+ }
+
+ private fun locationTestInline(query: String, testHandler: (RootPageNode, DokkaContext) -> Unit) {
+ val config = dokkaConfiguration {
+ format = "javadoc"
+ sourceSets {
+ sourceSet {
+ sourceRoots = listOf("jvmSrc/")
+ externalDocumentationLinks = listOf(
+ DokkaConfiguration.ExternalDocumentationLink.jdk(8),
+ DokkaConfiguration.ExternalDocumentationLink.kotlinStdlib()
+ )
+ analysisPlatform = "jvm"
+ }
+ }
+ }
+ testInline(
+ query = query,
+ configuration = config,
+ cleanupOutput = false,
+ pluginOverrides = listOf(JavadocPlugin())
+ ) { renderingStage = testHandler }
+ }
+
private fun htmlTranslator(rootPageNode: RootPageNode, dokkaContext: DokkaContext): JavadocContentToHtmlTranslator {
val locationProvider = dokkaContext.plugin<JavadocPlugin>().querySingle { locationProviderFactory }
.getLocationProvider(rootPageNode) as JavadocLocationProvider