aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanny Lin <danny@kdrag0n.dev>2021-08-31 00:08:32 -0700
committerDanny Lin <danny@kdrag0n.dev>2021-08-31 00:46:05 -0700
commit1df94faa5a5dc857ffefa502485f8a74d1ca5a96 (patch)
treed30ea845b88def6f5ebcde05fbc25d004a22d715
parent0e4b2e4ce09533827d43e439ee24bbb7a7490551 (diff)
tests: gamut: Add sanity checks for all clip methods
-rw-r--r--src/commonTest/kotlin/dev/kdrag0n/colorkt/tests/GamutTests.kt30
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")
+ }
}