Skip to content

Commit

Permalink
Reuse common resource access infra for YAML test suite (#372)
Browse files Browse the repository at this point in the history
Thanks to this change, we reuse what was built to access common
resources to also access YAML test suite data, allowing us to simplify
the build logic and have a more uniform way of accessing both kinds of
common resources.
  • Loading branch information
krzema12 authored Jan 20, 2025
1 parent b8ebf34 commit a447f09
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 259 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ val yamlTestSuite by configurations.registering {
asConsumer()

withDependencies {
// See [YAML Test Suite](https://github.com/yaml/yaml-test-suite
add(project.dependencies.create("yaml:yaml-test-suite:data-2022-01-17@zip"))
}
}
Expand All @@ -47,13 +48,14 @@ val downloadYamlTestSuite by tasks.registering(Sync::class) {
into(temporaryDir)
}

val generateYamlTestSuiteData by tasks.registering(buildsrc.tasks.GenerateYamlTestSuiteData::class) {
val generateYamlTestSuiteData by tasks.registering(buildsrc.tasks.ConvertCommonTestResourcesToKotlin::class) {
description =
"generate Kotlin code for accessing the YAML Test Suite data in multiplatform code"
group = YAML_TEST_TASK_GROUP

destination.set(temporaryDir)
yamlTestSuiteFilesDir.fileProvider(downloadYamlTestSuite.map { it.destinationDir })
commonResourcesDir.fileProvider(downloadYamlTestSuite.map { it.destinationDir })
accessorFileAndClassName.set("YamlTestSuiteResources")
}

val yamlTestSuiteDataSources by tasks.registering(Sync::class) {
Expand Down
253 changes: 0 additions & 253 deletions buildSrc/src/main/kotlin/buildsrc/tasks/GenerateYamlTestSuiteData.kt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldContain
import it.krzeminski.snakeyaml.engine.kmp.api.lowlevel.Compose
import it.krzeminski.snakeyaml.engine.kmp.exceptions.ParserException
import it.krzeminski.snakeyaml.engine.kmp.test_suite.DATA_2AUY
import it.krzeminski.snakeyaml.engine.kmp.test_suite.YamlTestData
import it.krzeminski.snakeyaml.engine.kmp.test_suite.YamlTestSuiteData

class OptionalMarksTest: FunSpec({
test("Compose: no marks") {
val data = YamlTestSuiteData[DATA_2AUY.id]!!
val data = YamlTestSuiteData[YamlTestData.Id("2AUY")]!!
val settings = LoadSettings.builder()
.setLabel(data.label)
.setUseMarks(false)
Expand All @@ -23,7 +23,7 @@ class OptionalMarksTest: FunSpec({
}

test("Compose: failure with marks") {
val data = YamlTestSuiteData[DATA_2AUY.id]!!
val data = YamlTestSuiteData[YamlTestData.Id("2AUY")]!!
val settings = LoadSettings.builder()
.setLabel(data.label)
.setUseMarks(true)
Expand All @@ -38,7 +38,7 @@ class OptionalMarksTest: FunSpec({
}

test("Compose: failure without marks") {
val data = YamlTestSuiteData[DATA_2AUY.id]!!
val data = YamlTestSuiteData[YamlTestData.Id("2AUY")]!!
val settings = LoadSettings.builder()
.setLabel(data.label)
.setUseMarks(false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import okio.FileSystem
import okio.Path
import okio.Path.Companion.toPath
import okio.Source
import okio.buffer
import okio.use

/**
* Represents a [FileSystem]-aware [Path]. Thanks to this, there's no need
Expand Down Expand Up @@ -35,9 +37,23 @@ class FSPath(val path: Path, val fs: FileSystem) {
fun resolve(child: String): FSPath =
FSPath(path.resolve(child), fs)

operator fun div(child: String): FSPath =
this.resolve(child)

fun source(): Source =
fs.source(path)

fun readUtf8(): String =
source().use {
it.buffer().readUtf8()
}

/**
* Returns `null` if the file doesn't exist.
*/
fun readUtf8OrNull(): String? =
if (this.exists) this.readUtf8() else null

override fun toString(): String =
path.toString()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package it.krzeminski.snakeyaml.engine.kmp.test_suite

import it.krzeminski.snakeyaml.engine.kmp.buildFileSystem
import it.krzeminski.snakeyaml.engine.kmp.internal.FSPath
import it.krzeminski.snakeyaml.engine.kmp.internal.fsPath
import kotlin.jvm.JvmInline


Expand Down Expand Up @@ -31,3 +34,38 @@ internal sealed interface YamlTestData {
override val testEvent: String
}
}

val YamlTestResourcesFileSystem = buildFileSystem(YamlTestSuiteResources.resourcesMap)

internal val YamlTestSuiteData: Map<YamlTestData.Id, YamlTestData> =
YamlTestResourcesFileSystem.fsPath("/").listRecursively()
.filter { it.isDirectory && (it / "===").exists }
.associate { dir ->
val id = YamlTestData.Id(dir.path.segments.joinToString(":"))
id to generateYamlTestDataObject(id, dir)
}

private fun generateYamlTestDataObject(
id: YamlTestData.Id,
path: FSPath,
): YamlTestData {
val isError = (path / "error").exists
return if (isError) {
object : YamlTestData.Error {
override val id: YamlTestData.Id = id
override val label: String = (path / "===").readUtf8()
override val inYaml: String = (path / "in.yaml").readUtf8()

}
} else {
object : YamlTestData.Success {
override val id: YamlTestData.Id = id
override val label: String = (path / "===").readUtf8()
override val inYaml: String = (path / "in.yaml").readUtf8()
override val testEvent: String = (path / "test.event").readUtf8()
override val outYaml: String? = (path / "out.yaml").readUtf8OrNull()
override val emitYaml: String? = (path / "emit.yaml").readUtf8OrNull()
override val inJson: String? = (path / "in.json").readUtf8OrNull()
}
}
}

0 comments on commit a447f09

Please sign in to comment.