aboutsummaryrefslogtreecommitdiff
path: root/scripts/theme-studio/test-colormath.mjs
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-19 11:42:52 -0400
committerCraig Jennings <c@cjennings.net>2026-06-19 11:42:52 -0400
commit7ef4737d3a06fb8b39eab3342658be76219ac6dc (patch)
tree5c90acb2d69a809ff970b4055ea654ff37df2b49 /scripts/theme-studio/test-colormath.mjs
parent3bdf9b23204f4f908d3ef0353b2fe2eb5f9f3d2c (diff)
downloaddotemacs-7ef4737d3a06fb8b39eab3342658be76219ac6dc.tar.gz
dotemacs-7ef4737d3a06fb8b39eab3342658be76219ac6dc.zip
test(theme-studio): cover defensive branches and the palette generator
Added the uncovered fallback branches in app-core (migrateLegacyFace null input, normalizePkgFace's source fallback chain, mergePackagesInto's null/new-app guards, boxCss shading a relief from the bg when no box color is set) and in colormath (apca's equal-luminance return-0 and low-contrast clamp, isPureEndpointHex). New test-palette-generator-core.mjs drives planPaletteGenerator across every scheme, vibe, source mode, and the fill-gaps intents, since those internals are only reachable through the public planner. colormath branch 96 -> 99%, palette-generator-core funcs 97 -> 100%, node suite 237 tests. The remaining gaps are the deep palette-column edge branches, deferred as diminishing returns on already line-covered code.
Diffstat (limited to 'scripts/theme-studio/test-colormath.mjs')
-rw-r--r--scripts/theme-studio/test-colormath.mjs31
1 files changed, 30 insertions, 1 deletions
diff --git a/scripts/theme-studio/test-colormath.mjs b/scripts/theme-studio/test-colormath.mjs
index 992d35bcc..ee40e3437 100644
--- a/scripts/theme-studio/test-colormath.mjs
+++ b/scripts/theme-studio/test-colormath.mjs
@@ -13,7 +13,7 @@ import {
srgb2oklab, oklab2oklch, oklch2oklab, oklch2hex, apca, deltaE,
hex2rgb, rl, contrast, rating, hsv2rgb, rgb2hsv, rgb2hex,
oklab2lrgb, inGamut, lrgb2hex, planeCell, paletteWarnings,
- reliefColors,
+ reliefColors, isPureEndpointHex,
} from './colormath.js';
const close = (a, b, eps = 0.005) => Math.abs(a - b) <= eps;
@@ -270,3 +270,32 @@ test('inline-integrity: theme-studio.html contains the colormath.js body verbati
const html = readFileSync(here + 'theme-studio.html', 'utf8');
assert.ok(html.includes(body), 'generated page is missing the colormath.js body verbatim');
});
+
+// --- apca contrast branches + isPureEndpointHex ------------------------------
+
+test('apca: Boundary — equal luminance returns 0 (below the delta-Y floor)', () => {
+ assert.equal(apca('#808080', '#808080'), 0);
+});
+test('apca: Normal — dark text on light background is positive (Ybg > Ytxt)', () => {
+ assert.ok(apca('#000000', '#ffffff') > 0);
+});
+test('apca: Normal — light text on dark background is negative (else branch)', () => {
+ assert.ok(apca('#ffffff', '#000000') < 0);
+});
+test('apca: Boundary — near-equal colors below the floor clamp to 0', () => {
+ assert.equal(apca('#808080', '#828282'), 0);
+});
+
+test('isPureEndpointHex: Normal — pure black and white are endpoints', () => {
+ assert.equal(isPureEndpointHex('#ffffff'), true);
+ assert.equal(isPureEndpointHex('#000000'), true);
+ assert.equal(isPureEndpointHex('#FFFFFF'), true);
+});
+test('isPureEndpointHex: Boundary — any other color is not an endpoint', () => {
+ assert.equal(isPureEndpointHex('#010101'), false);
+ assert.equal(isPureEndpointHex('#123456'), false);
+});
+test('isPureEndpointHex: Error — null/empty is not an endpoint', () => {
+ assert.equal(isPureEndpointHex(null), false);
+ assert.equal(isPureEndpointHex(''), false);
+});