aboutsummaryrefslogtreecommitdiff
path: root/plugins/base/src/test/kotlin/model/FunctionsTest.kt
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/base/src/test/kotlin/model/FunctionsTest.kt')
-rw-r--r--plugins/base/src/test/kotlin/model/FunctionsTest.kt315
1 files changed, 315 insertions, 0 deletions
diff --git a/plugins/base/src/test/kotlin/model/FunctionsTest.kt b/plugins/base/src/test/kotlin/model/FunctionsTest.kt
new file mode 100644
index 00000000..9554ad02
--- /dev/null
+++ b/plugins/base/src/test/kotlin/model/FunctionsTest.kt
@@ -0,0 +1,315 @@
+package model
+
+import org.jetbrains.dokka.model.Function
+import org.jetbrains.dokka.model.Package
+import org.junit.Test
+import utils.*
+
+class FunctionTest : AbstractModelTest("/src/main/kotlin/function/Test.kt", "function") {
+
+ @Test
+ fun function() {
+ inlineModelTest(
+ """
+ |/**
+ | * Function fn
+ | */
+ |fun fn() {}
+ """
+ ) {
+ with((this / "function" / "fn").cast<Function>()) {
+ name equals "fn"
+ type.constructorFqName equals "kotlin.Unit"
+ this.children.assertCount(0, "Function children: ")
+ }
+ }
+ }
+
+ @Test
+ fun overloads() {
+ inlineModelTest(
+ """
+ |/**
+ | * Function fn
+ | */
+ |fun fn() {}
+ | /**
+ | * Function fn(Int)
+ | */
+ |fun fn(i: Int) {}
+ """
+ ) {
+ with((this / "function").cast<Package>()) {
+ val fn1 = functions.find {
+ it.name == "fn" && it.parameters.isNullOrEmpty()
+ }.assertNotNull("fn()")
+ val fn2 = functions.find {
+ it.name == "fn" && it.parameters.isNotEmpty()
+ }.assertNotNull("fn(Int)")
+
+ with(fn1) {
+ name equals "fn"
+ parameters.assertCount(0)
+ }
+
+ with(fn2) {
+ name equals "fn"
+ parameters.assertCount(1)
+ parameters.first().type.constructorFqName equals "kotlin.Int"
+ }
+ }
+ }
+ }
+
+ @Test
+ fun functionWithReceiver() {
+ inlineModelTest(
+ """
+ |/**
+ | * Function with receiver
+ | */
+ |fun String.fn() {}
+ |
+ |/**
+ | * Function with receiver
+ | */
+ |fun String.fn(x: Int) {}
+ """
+ ) {
+ with((this / "function").cast<Package>()) {
+ val fn1 = functions.find {
+ it.name == "fn" && it.parameters.isNullOrEmpty()
+ }.assertNotNull("fn()")
+ val fn2 = functions.find {
+ it.name == "fn" && it.parameters.count() == 1
+ }.assertNotNull("fn(Int)")
+
+ with(fn1) {
+ name equals "fn"
+ parameters counts 0
+ receiver.assertNotNull("fn() receiver")
+ }
+
+ with(fn2) {
+ name equals "fn"
+ parameters counts 1
+ receiver.assertNotNull("fn(Int) receiver")
+ parameters.first().type.constructorFqName equals "kotlin.Int"
+ }
+ }
+ }
+ }
+
+ @Test
+ fun functionWithParams() {
+ inlineModelTest(
+ """
+ |/**
+ | * Multiline
+ | *
+ | * Function
+ | * Documentation
+ | */
+ |fun function(/** parameter */ x: Int) {
+ |}
+ """
+ ) {
+ with((this / "function" / "function").cast<Function>()) {
+ comments() equals "Multiline\nFunction Documentation"
+
+ name equals "function"
+ parameters counts 1
+ parameters.firstOrNull().assertNotNull("Parameter: ").also {
+ it.name equals "x"
+ it.type.constructorFqName equals "kotlin.Int"
+ it.comments() equals "parameter"
+ }
+
+ type.assertNotNull("Return type: ").constructorFqName equals "kotlin.Unit"
+ }
+ }
+ }
+
+// TODO add modifiers - start
+
+ @Test
+ fun functionWithNotDocumentedAnnotation() {
+ inlineModelTest(
+ """
+ |@Suppress("FOO") fun f() {}
+ """
+ ) {
+ // TODO add annotations
+
+ with((this / "function" / "f").cast<Function>()) {
+ assert(false) { "No annotation data" }
+ }
+ }
+ }
+
+// @Test fun functionWithNotDocumentedAnnotation() {
+// verifyPackageMember("testdata/functions/functionWithNotDocumentedAnnotation.kt", defaultModelConfig) { func ->
+// assertEquals(0, func.annotations.count())
+// }
+// }
+
+ @Test
+ fun inlineFunction() {
+ inlineModelTest(
+ """
+ |inline fun f(a: () -> String) {}
+ """
+ ) {
+ // TODO add data about inline
+
+ with((this / "function" / "f").cast<Function>()) {
+ assert(false) { "No inline data" }
+ }
+ }
+ }
+
+// @Test fun inlineFunction() {
+// verifyPackageMember("testdata/functions/inlineFunction.kt", defaultModelConfig) { func ->
+// val modifiers = func.details(NodeKind.Modifier).map { it.name }
+// assertTrue("inline" in modifiers)
+// }
+// }
+
+ @Test
+ fun suspendFunction() {
+ inlineModelTest(
+ """
+ |suspend fun f() {}
+ """
+ ) {
+ // TODO add data about suspend
+
+ with((this / "function" / "f").cast<Function>()) {
+ assert(false) { "No suspend data" }
+ }
+ }
+ }
+
+// @Test fun suspendFunction() {
+// verifyPackageMember("testdata/functions/suspendFunction.kt") { func ->
+// val modifiers = func.details(NodeKind.Modifier).map { it.name }
+// assertTrue("suspend" in modifiers)
+// }
+// }
+
+// @Test fun suspendInlineFunctionOrder() {
+// verifyPackageMember("testdata/functions/suspendInlineFunction.kt") { func ->
+// val modifiers = func.details(NodeKind.Modifier).map { it.name }.filter {
+// it == "suspend" || it == "inline"
+// }
+//
+// assertEquals(listOf("suspend", "inline"), modifiers)
+// }
+// }
+//
+// @Test fun inlineSuspendFunctionOrderChanged() {
+// verifyPackageMember("testdata/functions/inlineSuspendFunction.kt") { func ->
+// val modifiers = func.details(NodeKind.Modifier).map { it.name }.filter {
+// it == "suspend" || it == "inline"
+// }
+//
+// assertEquals(listOf("suspend", "inline"), modifiers)
+// }
+// }
+//
+// @Test fun functionWithAnnotatedParam() {
+// checkSourceExistsAndVerifyModel("testdata/functions/functionWithAnnotatedParam.kt", defaultModelConfig) { model ->
+// with(model.members.single().members.single { it.name == "function" }) {
+// with(details(NodeKind.Parameter).first()) {
+// assertEquals(1, annotations.count())
+// with(annotations[0]) {
+// assertEquals("Fancy", name)
+// assertEquals(Content.Empty, content)
+// assertEquals(NodeKind.Annotation, kind)
+// }
+// }
+// }
+// }
+// }
+//
+// @Test fun functionWithNoinlineParam() {
+// verifyPackageMember("testdata/functions/functionWithNoinlineParam.kt", defaultModelConfig) { func ->
+// with(func.details(NodeKind.Parameter).first()) {
+// val modifiers = details(NodeKind.Modifier).map { it.name }
+// assertTrue("noinline" in modifiers)
+// }
+// }
+// }
+//
+// @Test fun annotatedFunctionWithAnnotationParameters() {
+// checkSourceExistsAndVerifyModel(
+// "testdata/functions/annotatedFunctionWithAnnotationParameters.kt",
+// defaultModelConfig
+// ) { model ->
+// with(model.members.single().members.single { it.name == "f" }) {
+// assertEquals(1, annotations.count())
+// with(annotations[0]) {
+// assertEquals("Fancy", name)
+// assertEquals(Content.Empty, content)
+// assertEquals(NodeKind.Annotation, kind)
+// assertEquals(1, details.count())
+// with(details[0]) {
+// assertEquals(NodeKind.Parameter, kind)
+// assertEquals(1, details.count())
+// with(details[0]) {
+// assertEquals(NodeKind.Value, kind)
+// assertEquals("1", name)
+// }
+// }
+// }
+// }
+// }
+// }
+
+// TODO add modifiers - end
+
+// @Test
+// fun functionWithDefaultParameter() {
+// inlineModelTest(
+// """
+// |/src/main/kotlin/function/Test.kt
+// |package function
+// |fun f(x: String = "") {}
+// """
+// ) {
+// // TODO add default value data
+//
+// with(this / "function" / "f" cast Function::class) {
+// parameters.forEach { p ->
+// p.name equals "x"
+// p.type.constructorFqName.assertNotNull("Parameter type: ") equals "kotlin.String"
+// assert(false) { "Add default value data" }
+// }
+// }
+// }
+// }
+
+// @Test fun functionWithDefaultParameter() {
+// checkSourceExistsAndVerifyModel("testdata/functions/functionWithDefaultParameter.kt", defaultModelConfig) { model ->
+// with(model.members.single().members.single()) {
+// with(details.elementAt(3)) {
+// val value = details(NodeKind.Value)
+// assertEquals(1, value.count())
+// with(value[0]) {
+// assertEquals("\"\"", name)
+// }
+// }
+// }
+// }
+// }
+//
+// @Test fun sinceKotlin() {
+// checkSourceExistsAndVerifyModel("testdata/functions/sinceKotlin.kt", defaultModelConfig) { model ->
+// with(model.members.single().members.single()) {
+// assertEquals("1.1", sinceKotlin)
+// }
+// }
+// }
+//}
+
+} \ No newline at end of file