diff options
| author | Danny Lin <danny@kdrag0n.dev> | 2021-08-31 00:08:32 -0700 |
|---|---|---|
| committer | Danny Lin <danny@kdrag0n.dev> | 2021-08-31 00:46:05 -0700 |
| commit | 1df94faa5a5dc857ffefa502485f8a74d1ca5a96 (patch) | |
| tree | d30ea845b88def6f5ebcde05fbc25d004a22d715 | |
| parent | 0e4b2e4ce09533827d43e439ee24bbb7a7490551 (diff) | |
tests: gamut: Add sanity checks for all clip methods
| -rw-r--r-- | src/commonTest/kotlin/dev/kdrag0n/colorkt/tests/GamutTests.kt | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/commonTest/kotlin/dev/kdrag0n/colorkt/tests/GamutTests.kt b/src/commonTest/kotlin/dev/kdrag0n/colorkt/tests/GamutTests.kt index c4328be..46ded09 100644 --- a/src/commonTest/kotlin/dev/kdrag0n/colorkt/tests/GamutTests.kt +++ b/src/commonTest/kotlin/dev/kdrag0n/colorkt/tests/GamutTests.kt @@ -13,8 +13,14 @@ import dev.kdrag0n.colorkt.tristimulus.CieXyzAbs.Companion.toAbs import dev.kdrag0n.colorkt.ucs.lab.CieLab import dev.kdrag0n.colorkt.ucs.lch.Oklch import dev.kdrag0n.colorkt.conversion.ConversionGraph.convert +import dev.kdrag0n.colorkt.gamut.LchGamut +import dev.kdrag0n.colorkt.gamut.OklabGamut +import dev.kdrag0n.colorkt.rgb.LinearSrgb import kotlin.test.Test import kotlin.test.assertFalse +import kotlin.test.assertTrue + +private const val EPSILON = 0.001 class GamutTests { private val cond = Zcam.ViewingConditions( @@ -32,13 +38,19 @@ class GamutTests { val srcLinear = src.toLinear() val lch = src.convert<Oklch>() - // Boost the chroma + // Boost the chroma and clip lightness val clipped = lch.copy(chroma = lch.chroma * 5).toOklab().clipToLinearSrgb() // Now check assertApprox(clipped.r, srcLinear.r) assertApprox(clipped.g, srcLinear.g) assertApprox(clipped.b, srcLinear.b) + + // Now test all the methods and make sure they're reasonable: not NaN, 0, or out-of-gamut + OklabGamut.ClipMethod.values().forEach { method -> + val clippedM = lch.copy(chroma = lch.chroma * 5).toOklab().clipToLinearSrgb(method) + assertInGamut(clippedM) + } } } @@ -57,6 +69,12 @@ class GamutTests { assertApprox(clipped.r, srcLinear.r) assertApprox(clipped.g, srcLinear.g) assertApprox(clipped.b, srcLinear.b) + + // Now test all the methods and make sure they're reasonable: not NaN, 0, or out-of-gamut + LchGamut.ClipMethod.values().forEach { method -> + val clippedM = zcam.copy(chroma = zcam.chroma * 5).clipToLinearSrgb(method) + assertInGamut(clippedM) + } } } @@ -74,4 +92,14 @@ class GamutTests { assertFalse { clipped.g.isNaN() } assertFalse { clipped.b.isNaN() } } + + private fun assertInGamut(rgb: LinearSrgb) { + assertInGamut(rgb.r) + assertInGamut(rgb.g) + assertInGamut(rgb.b) + } + + private fun assertInGamut(component: Double) { + assertTrue(component in (0.0 - EPSILON)..(1.0 + EPSILON), "$component is out of gamut") + } } |
