Ctrl K
ComunidadGuías…

tests/themeToggle.test.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
// THE ☾/☀ BUTTON ON A DESIGNED SITE IS A ROUND TRIP. The counterpart map in
// client/themes.ts is deliberately not involutive (several dark rooms share
// one lit partner), so a toggle that only ever asked "what is the counterpart
// of what I am on" walked away from the design in two presses: phosphor →
// porcelain → verdigris. `toggleChoice` pins the trip to the DESIGN's pair and
// leaves a reader's own choice on the stock rule; this test is the promise
// stated as arithmetic, for every built-in room.

import assert from "node:assert/strict";
import { describe, it } from "node:test";
import { THEMES, themeGroup } from "../shared/themes.ts";
import { counterpartChoice, toggleChoice } from "../client/themes.ts";

describe("toggleChoice", () => {
  it("returns to the design's theme exactly after two presses, for every room", () => {
    for (const theme of THEMES) {
      const away = toggleChoice(theme, theme);
      assert.notEqual(themeGroup(away as never), themeGroup(theme), `${theme}: lit differently`);
      assert.equal(toggleChoice(away, theme), theme, `${theme} → ${away} → back`);
    }
  });

  it("is the stock rule when the site has no theme of its own", () => {
    for (const theme of THEMES) {
      assert.equal(toggleChoice(theme, null), counterpartChoice(theme));
      assert.equal(toggleChoice(theme, ""), counterpartChoice(theme));
    }
  });

  it("reaches the design's room from anywhere in two presses", () => {
    // A reader stranded on a stored room the broken walk left behind —
    // verdigris on a phosphor site, the owner's "just shows black" — is one
    // press from the design's lit partner and two from the design itself.
    // The first cut kept their stored room out of the pair and lit verdigris
    // differently forever; phosphor was unreachable without clearing storage.
    for (const stranded of THEMES) {
      const one = toggleChoice(stranded, "phosphor");
      const two = toggleChoice(one, "phosphor");
      assert.ok(one === "porcelain" || one === "phosphor", `${stranded} → ${one}`);
      assert.ok(two === "phosphor" || two === "porcelain", `${stranded} → ${one} → ${two}`);
      assert.ok([one, two].includes("phosphor"), `${stranded}: phosphor reached`);
    }
  });

  it("names the walk that used to happen", () => {
    // The bug, kept as a fact about the map so a future retune that makes it
    // involutive will retire this line rather than silently keep the guard.
    assert.equal(counterpartChoice(counterpartChoice("phosphor")), "verdigris");
  });
});