Skip to content

LinalgSerializationSmokeTest.kt

src/jvmMain/kotlin/afield/examples/LinalgSerializationSmokeTest.kt · 93 lines

package afield.examples

import afield.document.persistence.FieldJson
import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import afield.math.linalg.Quaternionf
import afield.math.linalg.Vector2f
import afield.math.linalg.Vector3f
import afield.math.linalg.Vector4f
import kotlin.math.abs

object LinalgSerializationSmokeTest

FIELD_TEST id: examples.linalg-serialization.smoke runner: jvm-main entrypoint: afield.examples.LinalgSerializationSmokeTest tags: [smoke, examples, serialization, linalg, json] timeoutSec: 20 expect: exitCode: 0 stdoutContains: - "Linalg serialization smoke tests passed"

object LinalgSerializationSmokeTest {

    @Serializable
    private data class Pose(
        @Contextual val v2: Vector2f,
        @Contextual val v3: Vector3f,
        @Contextual val v4: Vector4f,
        @Contextual val q: Quaternionf
    )

fun main(args: Array<String>)

    @JvmStatic
    fun main(args: Array<String>) {
        check(runTests()) { "Linalg serialization smoke tests failed" }
    }

fun runTests(): Boolean

body — 52 lines, from line 41
    fun runTests(): Boolean {
        return try {
            testRoundTrip()
            println("Linalg serialization smoke tests passed")
            true
        } catch (t: Throwable) {
            t.printStackTrace()
            false
        }
    }

    private fun testRoundTrip() {
        val pose = Pose(
            v2 = Vector2f(1f, 2f),
            v3 = Vector3f(3f, 4f, 5f),
            v4 = Vector4f(6f, 7f, 8f, 9f),
            q = Quaternionf(0.1f, 0.2f, 0.3f, 0.4f)
        )

        val json = FieldJson.encodeToString(pose)
        val decoded = FieldJson.decodeFromString<Pose>(json)

        requireVec2(decoded.v2, 1f, 2f, "v2")
        requireVec3(decoded.v3, 3f, 4f, 5f, "v3")
        requireVec4(decoded.v4, 6f, 7f, 8f, 9f, "v4")
        requireQuat(decoded.q, 0.1f, 0.2f, 0.3f, 0.4f, "q")
    }

    private fun requireVec2(value: Vector2f, x: Float, y: Float, label: String) {
        require(abs(value.x - x) < 1e-6f && abs(value.y - y) < 1e-6f) {
            "Unexpected $label: (${value.x}, ${value.y})"
        }
    }

    private fun requireVec3(value: Vector3f, x: Float, y: Float, z: Float, label: String) {
        require(abs(value.x - x) < 1e-6f && abs(value.y - y) < 1e-6f && abs(value.z - z) < 1e-6f) {
            "Unexpected $label: (${value.x}, ${value.y}, ${value.z})"
        }
    }

    private fun requireVec4(value: Vector4f, x: Float, y: Float, z: Float, w: Float, label: String) {
        require(abs(value.x - x) < 1e-6f && abs(value.y - y) < 1e-6f && abs(value.z - z) < 1e-6f && abs(value.w - w) < 1e-6f) {
            "Unexpected $label: (${value.x}, ${value.y}, ${value.z}, ${value.w})"
        }
    }

    private fun requireQuat(value: Quaternionf, x: Float, y: Float, z: Float, w: Float, label: String) {
        require(abs(value.x - x) < 1e-6f && abs(value.y - y) < 1e-6f && abs(value.z - z) < 1e-6f && abs(value.w - w) < 1e-6f) {
            "Unexpected $label: (${value.x}, ${value.y}, ${value.z}, ${value.w})"
        }
    }
}