game2 / client / test / themes.test.mjs
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Golden-vector tests for the palettes. A Palette is ELEVEN keys — past the
// eight-pair limit where #js / js-obj stops preserving literal key order — so
// the KEY ORDER is asserted too, not just the values.
import test from "node:test";
import assert from "node:assert/strict";
import { readFileSync } from "node:fs";
import * as lib from "../test-dist/testlib.js";

const v = JSON.parse(readFileSync(new URL("./vectors/themes.json", import.meta.url), "utf8"));

test("Palette key order survived the eight-pair threshold", () => {
  const p = lib.paletteForLevel(1, false);
  assert.equal(v.paletteKeys.length, 11, "the fixture should record eleven keys");
  assert.deepEqual(Object.keys(p), v.paletteKeys);
  assert.deepEqual(Object.keys(p.blocks), v.blockKeys);
});

test("paletteForLevel: every level x light/dark matches the TS byte for byte", () => {
  for (const { level, dark, p } of v.paletteForLevel) {
    const got = lib.paletteForLevel(level, dark);
    assert.deepEqual({ ...got, blocks: { ...got.blocks } }, p, `level ${level} dark=${dark}`);
  }
});

test("the theme cycle wraps every ten levels (5 themes x 2 levels)", () => {
  for (let level = 1; level <= 20; level++) {
    assert.equal(lib.paletteForLevel(level, false).name, lib.paletteForLevel(level + 10, false).name,
                 `level ${level} vs ${level + 10}`);
  }
});

test("shade() reproduces every recorded value", () => {
  for (const { hex, amt, out } of v.shade) {
    assert.equal(lib.shade(hex, amt), out, `shade(${hex}, ${amt})`);
  }
});

static mirror of HEAD · about · clone: git clone https://git.ardegazu.ro/game2.git