aboutsummaryrefslogtreecommitdiff
path: root/core/src/test/kotlin/format/JavaLayoutHtmlFormatTestCase.kt
blob: 656829904eaaac576bf6253291c352ce7bef6ee8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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,
            generateIndexPages = false,
            noStdlibLink = false,
            collectInheritedExtensionsFromLibraries = true
        )

    val injector: Injector by lazy {
        Guice.createInjector(Module { binder ->
            binder.bind<File>().annotatedWith(Names.named("outputDir")).toInstance(folder.apply { create() }.root)

            binder.bind<DocumentationOptions>().toProvider { options }
            binder.bind<DokkaLogger>().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<DocumentationNode>, 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("<!-- File: $loc -->")
                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<DocumentationNode>
    ) {
        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) {
        verifyNode(fileName) { 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
            )
        }
    }
}