1
2
7import { describe, expect, it } from "vitest";
8import { PRESENCE_PALETTE } from "@factory/shared/presence";
9import { presenceColors, presenceHue } from "../presence-color";
10
11describe("presenceHue", () => {
12 it("is deterministic (same name → same hue)", () => {
13 expect(presenceHue("blue")).toBe(presenceHue("blue"));
14 expect(presenceHue("red")).toBe(presenceHue("red"));
15 });
16
17 it("assigns each palette slot index * 18°", () => {
18 expect(presenceHue("red")).toBe(0);
19 expect(presenceHue("orange")).toBe(18);
20 expect(presenceHue("blue")).toBe(9 * 18);
21 expect(presenceHue("stone")).toBe(19 * 18);
22 });
23
24 it("falls back to slot 0 for unknown names", () => {
25 expect(presenceHue("chartreuse-7")).toBe(0);
26 expect(presenceHue("")).toBe(0);
27 });
28
29 it("keeps all 20 palette names on distinct hues", () => {
30 const hues = new Set(PRESENCE_PALETTE.map((n) => presenceHue(n)));
31 expect(hues.size).toBe(PRESENCE_PALETTE.length);
32 expect(hues.size).toBe(20);
33 });
34});
35
36describe("presenceColors", () => {
37 it("returns deterministic, hex-free hsl() strings", () => {
38 const a = presenceColors("violet");
39 expect(a.solid).toBe(presenceColors("violet").solid);
40 for (const v of [a.solid, a.soft, a.labelBg, a.softBg]) {
41 expect(v.startsWith("hsl(")).toBe(true);
42 expect(v).not.toContain("#");
43 }
44 });
45
46 it("makes each palette name render distinctly (solid differs)", () => {
47 const solids = new Set(PRESENCE_PALETTE.map((n) => presenceColors(n).solid));
48 expect(solids.size).toBe(20);
49 });
50
51 it("derives soft/labelBg/softBg from the same hue as solid", () => {
52 const c = presenceColors("teal");
53 const hue = String(presenceHue("teal"));
54 for (const v of [c.solid, c.soft, c.labelBg, c.softBg]) {
55 expect(v).toContain(hue);
56 }
57 });
58});
59