diff options
Diffstat (limited to 'scripts/theme-studio/test-colormath.mjs')
| -rw-r--r-- | scripts/theme-studio/test-colormath.mjs | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/scripts/theme-studio/test-colormath.mjs b/scripts/theme-studio/test-colormath.mjs index 992d35bcc..a1ec9264e 100644 --- a/scripts/theme-studio/test-colormath.mjs +++ b/scripts/theme-studio/test-colormath.mjs @@ -13,14 +13,13 @@ 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; const here = fileURLToPath(new URL('.', import.meta.url)); -// Same export-strip generate.py applies before inlining (drop `export` lines, rstrip). -const stripExports = (s) => - s.split('\n').filter((l) => !l.startsWith('export')).join('\n').replace(/\s+$/, ''); +// Same strip generate.py applies before inlining (drop export/import lines, rstrip). +import { stripInlinedBody } from './inline-strip.mjs'; test('srgb2oklab achromatic anchors', () => { const w = srgb2oklab('#ffffff'); @@ -266,7 +265,36 @@ test('reliefColors: malformed hex returns null pair (Error)', () => { // body (sans exports) verbatim, so the inlined copy and the tested module cannot // drift. Requires `python3 generate.py` to have run first. test('inline-integrity: theme-studio.html contains the colormath.js body verbatim', () => { - const body = stripExports(readFileSync(here + 'colormath.js', 'utf8')); + const body = stripInlinedBody(readFileSync(here + 'colormath.js', 'utf8')); 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); +}); |
