import { describe, expect, test } from "bun:test";
import { isValidProjectColor, sanitizeHexColor } from "./color";
describe("sanitizeHexColor", () => {
test("accepts strict hex colors (3/4/6/8 digits, any case)", () => {
for (const value of ["#fff", "#FFFF", "#22d3ee", "#000000ff", "#AbCdEf"]) {
expect(sanitizeHexColor(value)).toBe(value);
}
});
test("trims surrounding whitespace on a valid hex", () => {
expect(sanitizeHexColor(" #22d3ee ")).toBe("#22d3ee");
});
test("fails closed (undefined) for non-hex / poisoned values", () => {
for (const value of [
"red",
"red; color: evil",
"red;}",
"rgb(1,2,3)",
"var(--evil)",
"#xyz",
"#12",
"",
null,
undefined,
]) {
expect(sanitizeHexColor(value)).toBeUndefined();
}
});
test("returns the provided fallback for invalid values", () => {
expect(sanitizeHexColor("red; color: evil", "var(--rep-muted)")).toBe(
"var(--rep-muted)",
);
expect(sanitizeHexColor(null, "#000")).toBe("#000");
});
});
describe("isValidProjectColor", () => {
test("accepts hex colors", () => {
for (const value of ["#fff", "#FFFF", "#22d3ee", "#000000ff", "#AbCdEf"]) {
expect(isValidProjectColor(value)).toBe(true);
}
});
test("accepts numeric oklch() colors (the palette format)", () => {
for (const value of [
"oklch(0.6 0.15 137)",
"oklch(0.55 0.02 260)",
"oklch(0.6 0.15 137.508)",
"oklch(60% 0.15 137)",
"oklch(0.6 0.15 137 / 0.5)",
" oklch(0.6 0.15 137) ",
]) {
expect(isValidProjectColor(value)).toBe(true);
}
});
test("rejects non-color / CSS-breakout / non-string values", () => {
for (const value of [
"red",
"red; color: evil",
"red;}",
"rgb(1,2,3)",
"var(--evil)",
"oklch(0.6 0.15 137); color: evil",
"oklch(0.7 var(--accent-sat) var(--accent-hue))",
"#xyz",
"",
null,
undefined,
42,
]) {
expect(isValidProjectColor(value)).toBe(false);
}
});
});