package org.jetbrains.dokka.tests import com.google.inject.Guice import com.google.inject.Injector import com.google.inject.Module import com.google.inject.name.Names import org.jetbrains.dokka.DocumentationNode import org.jetbrains.dokka.DocumentationOptions import org.jetbrains.dokka.DokkaLogger import org.jetbrains.dokka.Formats.JavaLayoutHtmlFormatDescriptorBase import org.jetbrains.dokka.Formats.JavaLayoutHtmlFormatGenerator import org.jetbrains.dokka.Generator import org.jetbrains.dokka.Utilities.bind import org.junit.Rule import org.junit.rules.TemporaryFolder import java.io.File import java.net.URI abstract class JavaLayoutHtmlFormatTestCase { abstract val formatDescriptor: JavaLayoutHtmlFormatDescriptorBase @get:Rule var folder = TemporaryFolder() var options = DocumentationOptions( "", "java-layout-html", apiVersion = null, languageVersion = null, generateClassIndexPage = false, generatePackageIndexPage = false, noStdlibLink = false, noJdkLink = false, collectInheritedExtensionsFromLibraries = true ) val injector: Injector by lazy { Guice.createInjector(Module { binder -> binder.bind().annotatedWith(Names.named("outputDir")).toInstance(folder.apply { create() }.root) binder.bind().toProvider { options } binder.bind().toInstance(object : DokkaLogger { override fun info(message: String) { println(message) } override fun warn(message: String) { println("WARN: $message") } override fun error(message: String) { println("ERROR: $message") } }) formatDescriptor.configureOutput(binder) }) } protected fun buildPagesAndReadInto(model: DocumentationNode, nodes: List, sb: StringBuilder) = with(injector.getInstance(Generator::class.java)) { this as JavaLayoutHtmlFormatGenerator buildPages(listOf(model)) val byLocations = nodes.groupBy { mainUri(it) } byLocations.forEach { (loc, _) -> sb.appendln("") sb.append(folder.root.toURI().resolve(URI("/").relativize(loc)).toURL().readText()) } } protected fun verifyNode( fileName: String, noStdlibLink: Boolean = false, fileExtension: String = ".html", select: (model: DocumentationNode) -> List ) { verifyOutput( "testdata/format/java-layout-html/$fileName", fileExtension, format = "java-layout-html", withKotlinRuntime = true, noStdlibLink = noStdlibLink, collectInheritedExtensionsFromLibraries = true ) { model, output -> buildPagesAndReadInto( model, select(model), output ) } } protected fun verifyNode(fileName: String, noStdlibLink: Boolean = false) { verifyNode(fileName, noStdlibLink) { model -> listOf(model.members.single().members.single()) } } protected fun verifyPackageNode(fileName: String, noStdlibLink: Boolean = false) { verifyOutput( "testdata/format/java-layout-html/$fileName", ".package-summary.html", format = "java-layout-html", withKotlinRuntime = true, noStdlibLink = noStdlibLink ) { model, output -> buildPagesAndReadInto( model, listOf(model.members.single()), output ) } } }