Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions gradle/elide.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -526,6 +526,7 @@ j4rs = { group = "io.github.astonbitecode", name = "j4rs", version.ref = "j4rs"
jacoco-agent = { group = "org.jacoco", name = "org.jacoco.agent", version.ref = "jacoco" }
jackson-core = { group = "com.fasterxml.jackson.core", name = "jackson-core", version.ref = "jackson" }
jackson-databind = { group = "com.fasterxml.jackson.core", name = "jackson-databind", version.ref = "jackson" }
jackson-dataformat-xml = { group = "com.fasterxml.jackson.dataformat", name = "jackson-dataformat-xml", version.ref = "jackson" }
jackson-jsr310 = { group = "com.fasterxml.jackson.datatype", name = "jackson-datatype-jsr310", version.ref = "jsr310" }
jackson-module-blackbird = { group = "com.fasterxml.jackson.module", name = "jackson-module-blackbird", version.ref = "jackson" }
jackson-module-kotlin = { group = "com.fasterxml.jackson.module", name = "jackson-module-kotlin", version.ref = "jackson" }
Expand Down
2 changes: 2 additions & 0 deletions packages/builder/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,8 @@ dependencies {
implementation(libs.kotlinx.serialization.core)
implementation(libs.kotlinx.serialization.json)
implementation(libs.kotlinx.serialization.protobuf)
implementation(libs.jackson.dataformat.xml)
implementation(libs.jackson.module.kotlin)
implementation(libs.kotlinx.html)
implementation(libs.kotlinx.wrappers.css)
implementation(libs.minifyHtml)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,15 @@ import elide.tooling.Tool
import elide.tooling.testing.TestPostProcessingOptions
import elide.tooling.testing.TestPostProcessor
import elide.tooling.testing.TestPostProcessorFactory
import elide.tooling.testing.TestResult
import elide.tooling.testing.TestRunResult

// Implements coverage reporting steps which take place after tests have run.
internal class CoverageReportProcessor : TestPostProcessor {
override suspend fun invoke(options: TestPostProcessingOptions, results: TestRunResult): Tool.Result {
override suspend fun invoke(
options: TestPostProcessingOptions,
results: TestRunResult
): Tool.Result {
// @TODO coverage report processor is not implemented yet
return Tool.Result.Success
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,65 @@
package elide.tooling.reporting

import elide.tooling.Tool
import elide.tooling.reporting.html.HtmlTestReporter
import elide.tooling.reporting.xml.JUnitXmlReporter
import elide.tooling.testing.TestPostProcessingOptions
import elide.tooling.testing.TestPostProcessor
import elide.tooling.testing.TestPostProcessorFactory
import elide.tooling.testing.TestReportFormat
import elide.tooling.testing.TestRunResult
import elide.tooling.testing.TestResult
import java.nio.file.Files

// Test post-processor which produces test result reports.
internal class TestReportProcessor : TestPostProcessor {
override suspend fun invoke(options: TestPostProcessingOptions, results: TestRunResult): Tool.Result {
// @TODO not yet implemented
return Tool.Result.Success
override suspend fun invoke(
options: TestPostProcessingOptions,
results: TestRunResult
): Tool.Result {
return runCatching {
when (options.reportFormat) {
TestReportFormat.XML -> generateXmlReport(options, results)
TestReportFormat.HTML -> generateHtmlReport(options, results)
}
}.fold(
onSuccess = { Tool.Result.Success },
onFailure = { e ->
System.err.println("Failed to generate test report: ${e.message}")
Tool.Result.UnspecifiedFailure
}
)
}

private fun generateXmlReport(
options: TestPostProcessingOptions,
results: TestRunResult
) {
val xmlReporter = JUnitXmlReporter()
val xmlContent = xmlReporter.generateReport(results, suiteName = options.reportSuiteName)

Files.createDirectories(options.reportOutputPath)

val outputFile = options.reportOutputPath.resolve("TEST-elide-results.xml")
Files.write(outputFile, xmlContent.toByteArray())

println("Generated XML test report: ${outputFile.toAbsolutePath()}")
}

private fun generateHtmlReport(
options: TestPostProcessingOptions,
results: TestRunResult
) {
val htmlReporter = HtmlTestReporter()
val htmlContent = htmlReporter.generateReport(results, suiteName = options.reportSuiteName)

Files.createDirectories(options.reportOutputPath)

val outputFile = options.reportOutputPath.resolve("test-report.html")
Files.write(outputFile, htmlContent.toByteArray())

println("Generated HTML test report: ${outputFile.toAbsolutePath()}")
}

// Create a coverage report processor if coverage is enabled.
class Factory : TestPostProcessorFactory<TestReportProcessor> {
override fun create(options: TestPostProcessingOptions): TestPostProcessor? = when (options.reportingEnabled) {
false -> null
Expand Down
Loading
Loading