package idn
import (
"regexp"
"strconv"
"strings"
"testing"
)
func TestChromaIsABandAndDeterministic(t *testing.T) {
seen := map[int]bool{}
for _, n := range []string{"drh", "dan", "stephan", "mistachkin", "andygoth", "wyoung", "jan", "larry"} {
c := Chroma(n)
if c != 0 && c != 1 {
t.Fatalf("Chroma(%q) = %d, want 0 or 1", n, c)
}
if Chroma(n) != c {
t.Fatalf("Chroma(%q) not deterministic", n)
}
seen[c] = true
}
if len(seen) != 2 {
t.Fatalf("only band %v used across the sample; want both", seen)
}
}
func TestFillCarriesHueAndChromaHook(t *testing.T) {
f := Fill("drh", "var(--idn-l)")
for _, want := range []string{"oklch(", "var(--idn-l)", "var(--idn-c" + strconv.Itoa(Chroma("drh")) + ")", " " + strconv.Itoa(Hue("drh")) + ")"} {
if !strings.Contains(f, want) {
t.Fatalf("Fill = %q, missing %q", f, want)
}
}
if tone := Tone("drh"); !strings.Contains(tone, "--uh: "+strconv.Itoa(Hue("drh"))) || !strings.Contains(tone, "--uc: var(--idn-c") {
t.Fatalf("Tone = %q", tone)
}
}
func TestMarkCarriesTheToneAndIsMemoised(t *testing.T) {
m := Mark("drh")
for _, want := range []string{`class="idn"`, markTone("drh"), `class="idn-w"`} {
if !strings.Contains(m, want) {
t.Fatalf("Mark missing %q", want)
}
}
if strings.Contains(m, "oklch(") {
t.Fatal("the colour belongs to the stylesheet's .idn-* rules, once, not to each mark")
}
if Mark("drh") != m {
t.Fatal("Mark not stable across calls")
}
if _, ok := memo.Load("drh"); !ok {
t.Fatal("Mark not memoised")
}
}
func TestGridIsTheFaceMarkDraws(t *testing.T) {
for _, n := range []string{"drh", "quarry", "dantest-sandbox", "x"} {
g := Grid(n)
on, deep := 0, 0
for _, row := range g {
for c := 0; c < 2; c++ {
if row[c] != row[4-c] {
t.Fatalf("%s: row not mirrored: %v", n, row)
}
}
for _, c := range row {
if c > 0 {
on++
}
if c == 2 {
deep++
}
}
}
m := Mark(n)
// Each cell is one subpath; the deeper ones are in the idn-b path.
if got := strings.Count(m, "M"); got != on {
t.Errorf("%s: Mark draws %d cells, Grid has %d", n, got, on)
}
got := 0
if i := strings.Index(m, `class="idn-b" d="`); i >= 0 {
d := m[i+len(`class="idn-b" d="`):]
got = strings.Count(d[:strings.IndexByte(d, '"')], "M")
}
if got != deep {
t.Errorf("%s: Mark has %d deep cells, Grid %d", n, got, deep)
}
}
}
func TestHexIsSRGBAndFollowsLightness(t *testing.T) {
re := regexp.MustCompile(`^#[0-9a-f]{6}$`)
for _, n := range []string{"drh", "quarry", "a", "b"} {
lo, hi := Hex(n, 0.44), Hex(n, 0.56)
if !re.MatchString(lo) || !re.MatchString(hi) || lo == hi {
t.Errorf("%s: %s %s", n, lo, hi)
}
}
}