okami.mom/ultraviolet

git clone https://git.nkp.pet/okami.mom/ultraviolet

Ayman BagabasMerge Layout with Cassowary constraints (#88)2c67e98

upstream
2.1 KiB107 linesraw
1package casso
2
3import "testing"
4
5func assertEqual(t *testing.T, expected, actual float64) {
6	t.Helper()
7
8	if expected != actual {
9		t.Errorf("expected %v, got %v", expected, actual)
10	}
11}
12
13func assertNoError(t *testing.T, err error) {
14	t.Helper()
15
16	if err != nil {
17		t.Fatalf("unexpected error: %v", err)
18	}
19}
20
21func TestSymbol(t *testing.T) {
22	v := next(external)
23	if v.isZero() {
24		t.Fatal("external symbol should not be zero")
25	}
26	if v.kind() != external {
27		t.Fatalf("expected external, got %v", v.kind())
28	}
29
30	v = next(slack)
31	if v.isZero() {
32		t.Fatal("slack symbol should not be zero")
33	}
34	if v.kind() != slack {
35		t.Fatalf("expected slack, got %v", v.kind())
36	}
37
38	v = next(errorSym)
39	if v.isZero() {
40		t.Fatal("error symbol should not be zero")
41	}
42	if v.kind() != errorSym {
43		t.Fatalf("expected errorSym, got %v", v.kind())
44	}
45
46	v = next(dummy)
47	if v.isZero() {
48		t.Fatal("dummy symbol should not be zero")
49	}
50	if v.kind() != dummy {
51		t.Fatalf("expected dummy, got %v", v.kind())
52	}
53}
54
55func TestConstraint(t *testing.T) {
56	l := New()
57	m := New()
58	r := New()
59
60	a := NewConstraint(EQ, 0, r.T(1), l.T(1), m.T(-2))
61	b := NewConstraint(GTE, -100, r.T(1), l.T(-1))
62	c := NewConstraint(GTE, 0, l.T(1))
63
64	s := NewSolver()
65
66	_, err := s.Add(1e9, a)
67	assertNoError(t, err)
68
69	_, err = s.Add(1e9, b)
70	assertNoError(t, err)
71
72	_, err = s.Add(1e9, c)
73	assertNoError(t, err)
74
75	assertEqual(t, 0, s.Val(l))
76	assertEqual(t, 50, s.Val(m))
77	assertEqual(t, 100, s.Val(r))
78}
79
80func TestConstraintRequiringArtificialVariable(t *testing.T) {
81	s := NewSolver()
82
83	p1 := New()
84	p2 := New()
85	p3 := New()
86	container := New()
87
88	_, err := s.Add(1e9, NewConstraint(EQ, -100, container.T(1)))
89	assertNoError(t, err)
90
91	_, err = s.Add(1e6, NewConstraint(GTE, -30, p1.T(1)))
92	assertNoError(t, err)
93
94	_, err = s.Add(1e3, NewConstraint(EQ, 0, p1.T(1), p3.T(-1)))
95	assertNoError(t, err)
96
97	_, err = s.Add(1e9, NewConstraint(EQ, 0, p2.T(1), p1.T(-2)))
98	assertNoError(t, err)
99
100	_, err = s.Add(1e9, NewConstraint(EQ, 0, container.T(1), p1.T(-1), p2.T(-1), p3.T(-1)))
101	assertNoError(t, err)
102
103	assertEqual(t, 30, s.Val(p1))
104	assertEqual(t, 60, s.Val(p2))
105	assertEqual(t, 10, s.Val(p3))
106	assertEqual(t, 100, s.Val(container))
107}