|
5 | 5 | [eido.gen.voronoi :as voronoi] |
6 | 6 | [eido.gen.subdivide :as subdivide])) |
7 | 7 |
|
8 | | -(deftest solve-triangle-test |
9 | | - (testing "triangle (K3) needs 3 colors" |
10 | | - (let [adj #{[0 1] [1 2] [0 2]}] |
11 | | - (is (= 3 (count (distinct (coloring/solve 3 adj 3))))) |
12 | | - (is (nil? (coloring/solve 3 adj 2)))))) |
13 | | - |
14 | | -(deftest solve-bipartite-test |
15 | | - (testing "cycle of 4 (bipartite) needs only 2 colors" |
16 | | - (let [result (coloring/solve 4 #{[0 1] [1 2] [2 3] [0 3]} 2)] |
17 | | - (is (some? result)) |
18 | | - (is (every? #{0 1} result)) |
19 | | - (doseq [[i j] #{[0 1] [1 2] [2 3] [0 3]}] |
20 | | - (is (not= (nth result i) (nth result j))))))) |
21 | | - |
22 | | -(deftest solve-no-adjacency-test |
23 | | - (testing "no edges means all regions get a valid color" |
24 | | - (is (= [0 0 0 0 0] (coloring/solve 5 #{} 3))))) |
25 | | - |
26 | | -(deftest solve-empty-test |
27 | | - (testing "zero regions returns nil" |
28 | | - (is (nil? (coloring/solve 0 #{} 3))))) |
29 | | - |
30 | | -(deftest solve-deterministic-test |
31 | | - (testing "same input gives same output" |
32 | | - (let [adj #{[0 1] [1 2] [2 3] [0 3] [0 2]}] |
33 | | - (is (= (coloring/solve 4 adj 4) |
34 | | - (coloring/solve 4 adj 4)))))) |
35 | | - |
36 | | -(deftest solve-with-pin-test |
37 | | - (testing "pinned regions get their assigned color" |
38 | | - (let [result (coloring/solve 4 #{[0 1] [1 2] [2 3] [0 3]} 3 |
39 | | - {:pin {0 2, 2 1}})] |
40 | | - (is (some? result)) |
41 | | - (is (= 2 (nth result 0))) |
42 | | - (is (= 1 (nth result 2))) |
43 | | - (doseq [[i j] #{[0 1] [1 2] [2 3] [0 3]}] |
44 | | - (is (not= (nth result i) (nth result j))))))) |
| 8 | +(def ^:private palette |
| 9 | + [[:color/rgb 255 0 0] [:color/rgb 0 255 0] |
| 10 | + [:color/rgb 0 0 255] [:color/rgb 255 255 0]]) |
45 | 11 |
|
46 | 12 | (deftest cells-adjacency-test |
47 | 13 | (testing "4-point Voronoi produces correct adjacency" |
|
60 | 26 | (is (pos? (count adj))) |
61 | 27 | (is (every? (fn [[i j]] (< i j)) adj))))) |
62 | 28 |
|
63 | | -(deftest color-regions-voronoi-test |
| 29 | +(deftest color-regions-basic-test |
64 | 30 | (testing "colors Voronoi cells with no adjacent same-color" |
65 | | - (let [points [[50 50] [150 50] [100 150] [50 150] [150 150]] |
66 | | - cells (voronoi/voronoi-cells points [0 0 200 200]) |
67 | | - adj (coloring/cells-adjacency cells) |
68 | | - palette [[:color/rgb 255 0 0] [:color/rgb 0 255 0] |
69 | | - [:color/rgb 0 0 255] [:color/rgb 255 255 0]] |
70 | | - result (coloring/color-regions cells adj palette {:seed 42})] |
| 31 | + (let [points [[50 50] [150 50] [100 150] [50 150] [150 150]] |
| 32 | + cells (voronoi/voronoi-cells points [0 0 200 200]) |
| 33 | + adj (coloring/cells-adjacency cells) |
| 34 | + result (coloring/color-regions cells adj palette {:seed 42})] |
71 | 35 | (is (some? result)) |
72 | 36 | (is (= (count cells) (count result))) |
73 | 37 | (is (every? :style/fill result)) |
|
77 | 41 |
|
78 | 42 | (deftest color-regions-seed-variety-test |
79 | 43 | (testing "different seeds produce different colorings" |
80 | | - (let [points [[50 50] [150 50] [100 150] [50 150] [150 150]] |
81 | | - cells (voronoi/voronoi-cells points [0 0 200 200]) |
82 | | - adj (coloring/cells-adjacency cells) |
83 | | - palette [[:color/rgb 255 0 0] [:color/rgb 0 255 0] |
84 | | - [:color/rgb 0 0 255] [:color/rgb 255 255 0]] |
| 44 | + (let [points [[50 50] [150 50] [100 150] [50 150] [150 150]] |
| 45 | + cells (voronoi/voronoi-cells points [0 0 200 200]) |
| 46 | + adj (coloring/cells-adjacency cells) |
85 | 47 | r1 (mapv :style/fill (coloring/color-regions cells adj palette {:seed 1})) |
86 | 48 | r2 (mapv :style/fill (coloring/color-regions cells adj palette {:seed 2}))] |
87 | 49 | (is (not= r1 r2))))) |
88 | 50 |
|
| 51 | +(deftest color-regions-deterministic-test |
| 52 | + (testing "same seed produces same result" |
| 53 | + (let [points [[50 50] [150 50] [100 150]] |
| 54 | + cells (voronoi/voronoi-cells points [0 0 200 200]) |
| 55 | + adj (coloring/cells-adjacency cells)] |
| 56 | + (is (= (coloring/color-regions cells adj palette {:seed 42}) |
| 57 | + (coloring/color-regions cells adj palette {:seed 42})))))) |
| 58 | + |
89 | 59 | (deftest color-regions-with-pin-test |
90 | 60 | (testing "pinning specific regions to colors" |
91 | | - (let [points [[50 50] [150 50] [100 150] [50 150] [150 150]] |
92 | | - cells (voronoi/voronoi-cells points [0 0 200 200]) |
93 | | - adj (coloring/cells-adjacency cells) |
94 | | - palette [[:color/rgb 255 0 0] [:color/rgb 0 255 0] |
95 | | - [:color/rgb 0 0 255] [:color/rgb 255 255 0]] |
96 | | - red [:color/rgb 255 0 0] |
97 | | - result (coloring/color-regions cells adj palette {:seed 1 :pin {0 red}})] |
| 61 | + (let [points [[50 50] [150 50] [100 150] [50 150] [150 150]] |
| 62 | + cells (voronoi/voronoi-cells points [0 0 200 200]) |
| 63 | + adj (coloring/cells-adjacency cells) |
| 64 | + red [:color/rgb 255 0 0] |
| 65 | + result (coloring/color-regions cells adj palette {:seed 1 :pin {0 red}})] |
98 | 66 | (is (some? result)) |
99 | | - (is (= red (:style/fill (nth result 0))))))) |
| 67 | + (is (= red (:style/fill (nth result 0)))) |
| 68 | + ;; Adjacency still respected |
| 69 | + (doseq [[i j] adj] |
| 70 | + (is (not= (:style/fill (nth result i)) |
| 71 | + (:style/fill (nth result j)))))))) |
| 72 | + |
| 73 | +(deftest color-regions-impossible-test |
| 74 | + (testing "triangle with 2 colors returns nil" |
| 75 | + (let [points [[50 50] [150 50] [100 150]] |
| 76 | + cells (voronoi/voronoi-cells points [0 0 200 200]) |
| 77 | + adj (coloring/cells-adjacency cells) |
| 78 | + pal2 [[:color/rgb 255 0 0] [:color/rgb 0 255 0]]] |
| 79 | + (is (nil? (coloring/color-regions cells adj pal2 {:seed 42})))))) |
0 commit comments