diff --git a/test-data/src/commonMain/kotlin/helloworld/-hello-world.md b/test-data/src/commonMain/kotlin/helloworld/-hello-world.md new file mode 100644 index 0000000..d691c25 --- /dev/null +++ b/test-data/src/commonMain/kotlin/helloworld/-hello-world.md @@ -0,0 +1,25 @@ +--- +tags: + - common +title: "HelloWorld" +--- + +# HelloWorld + +
+ +
+ +
const val HelloWorld: String
+
+
+ + +
+ +This is the simplest possible Kotlin file: just a top-level constant with its documentation. + + +
+ +
diff --git a/test-runner/src/jvmTest/kotlin/GenerateDocs.kt b/test-runner/src/jvmTest/kotlin/GenerateDocs.kt new file mode 100644 index 0000000..42fe146 --- /dev/null +++ b/test-runner/src/jvmTest/kotlin/GenerateDocs.kt @@ -0,0 +1,62 @@ +package opensavvy.dokka.material.mkdocs.test + +import opensavvy.prepared.compat.filesystem.div +import opensavvy.prepared.suite.shared +import org.gradle.testkit.runner.GradleRunner +import java.io.File +import java.nio.file.Files + +val generateDocs by shared { + val workDir = Files.createTempDirectory("dokka-gradle-test").toFile() + println("Working directory: $workDir") + + val originalWorkDir = File("..") + + (originalWorkDir / "test-data").copyRecursively(workDir / "test-data") + (originalWorkDir / "gradle").copyRecursively(workDir / "gradle") + + (workDir / "settings.gradle.kts").writeText(""" + rootProject.name = "example-test" + + dependencyResolutionManagement { + repositories { + mavenCentral() + } + + versionCatalogs { + create("libsCommon") { + from(files("gradle/common.versions.toml")) + } + } + } + + include("test-data") + include("website") + includeBuild("${File("..").absoluteFile}") + """.trimIndent()) + + (workDir / "build.gradle.kts").writeText(""" + plugins { + kotlin("multiplatform") version libsCommon.versions.kotlin.get() apply false + } + """.trimIndent()) + + (workDir / "website").mkdir() + (workDir / "website" / "build.gradle.kts").writeText(""" + plugins { + id("dev.opensavvy.dokka-mkdocs") + } + + dependencies { + dokka(project(":test-data")) + } + """.trimIndent()) + + GradleRunner.create() + .withGradleVersion("9.4.1") + .withProjectDir(workDir) + .withArguments(":website:dokkaCopyIntoMkDocs") + .build() + + workDir / "website" / "docs" / "api" +} diff --git a/test-runner/src/jvmTest/kotlin/Runner.kt b/test-runner/src/jvmTest/kotlin/Runner.kt index 12b4732..54b0a70 100644 --- a/test-runner/src/jvmTest/kotlin/Runner.kt +++ b/test-runner/src/jvmTest/kotlin/Runner.kt @@ -1,6 +1,10 @@ package opensavvy.dokka.material.mkdocs.test +import opensavvy.prepared.compat.filesystem.div import opensavvy.prepared.runner.testballoon.preparedSuite +import opensavvy.prepared.suite.config.CoroutineTimeout +import kotlin.test.assertEquals +import kotlin.time.Duration.Companion.minutes val IntegrationTests by preparedSuite { @@ -10,9 +14,36 @@ val IntegrationTests by preparedSuite { check(cases.isNotEmpty()) { "No integration tests were found, maybe something went wrong?" } } + test("Generate the documentation", CoroutineTimeout(10.minutes)) { + val docs = generateDocs() + + check(docs.isDirectory) { "No documentation directory was generated." } + check(docs.listFiles() != null) { "No documentation files were generated." } + } + for (case in cases) { test("Test case: ${case.name}") { check(case.isDirectory) + + val outputDirectory = generateDocs() / "test-data" / "opensavvy.dokka.material.mkdocs.test.${case.name}" + check(outputDirectory.isDirectory) { "No output directory was generated for test case" } + println("» Generated in: ${outputDirectory.absolutePath}") + + val markdownFiles = case.listFiles { _, name -> name.endsWith(".md") } + + for (file in markdownFiles) { + println("» Checking: ${file.name}") + + val expected = file.readText() + val actualFile = outputDirectory / file.name + val actual = actualFile.readText() + + assertEquals( + expected = expected, + actual = actual, + message = "Found a difference between the reference file file://${file.absolutePath} and the generated file file://${actualFile.absolutePath}" + ) + } } } }