Add layout components 001-020 with demos and behavior tests

This commit is contained in:
ZacharyZhang-NY committed 2026-10-11 18:02:26 -04:00
1 parent 08e19833a2
commit 9a7f593892
29 files changed
+2110 -9

No files matched your search

+90
View File
@@ -0,0 +1,90 @@
package layout
import (
"reflect"
"testing"
"git.zacharyzhang.com/ZacharyZhang-NY/8bitMyGoUI/pixel"
)
func panics(t *testing.T, name string, fn func()) {
t.Helper()
defer func() {
if recover() == nil {
t.Fatalf("%s did not panic", name)
}
}()
fn()
}
func TestOrDef(t *testing.T) {
if orDef("x", 0, 7) != 7 || orDef("x", 3, 7) != 3 {
t.Fatal("orDef did not default zero or keep a value")
}
panics(t, "negative option", func() { orDef("x", -1, 7) })
panics(t, "unknown frame style", func() { border(pixel.FrameStyle(99)) })
}
func TestEdges(t *testing.T) {
type e struct{ right, below bool }
want := []e{{true, true}, {true, true}, {false, true}, {true, false}, {false, false}}
for i, w := range want {
if r, b := edges(i, 5, 3); r != w.right || b != w.below {
t.Errorf("cell %d of 5 in 3 columns: right %v below %v", i, r, b)
}
}
}
func TestLanes(t *testing.T) {
got := lanes([]int{40, 24, 56, 32, 24, 48, 32, 40}, 3, 4)
want := [][]int{{0, 4, 7}, {1, 3, 6}, {2, 5}}
if !reflect.DeepEqual(got, want) {
t.Fatalf("lanes %v, want %v", got, want)
}
panics(t, "zero height", func() { lanes([]int{8, 0}, 2, 4) })
}
func TestShares(t *testing.T) {
for _, tc := range []struct {
total, n int
want []int
}{{10, 3, []int{4, 3, 3}}, {9, 3, []int{3, 3, 3}}, {-5, 2, []int{0, 0}}} {
if got := shares(tc.total, tc.n); !reflect.DeepEqual(got, tc.want) {
t.Errorf("shares(%d, %d) = %v", tc.total, tc.n, got)
}
}
}
func TestThumb(t *testing.T) {
for _, tc := range []struct {
h, view, y, maxY, size, at float32
}{
{60, 100, 0, 1180, 16, 0},
{60, 100, 1180, 1180, 16, 44},
{10, 50, 30, 1000, 10, 0},
{60, 100, 0, 0, 60, 0},
{100, 100, 50, 100, 50, 24},
} {
if size, at := thumb(tc.h, tc.view, tc.y, tc.maxY, 2); size != tc.size || at != tc.at {
t.Errorf("thumb(h %v view %v y %v max %v) = %v at %v, want %v at %v", tc.h, tc.view, tc.y, tc.maxY, size, at, tc.size, tc.at)
}
}
}
func TestFit(t *testing.T) {
for _, tc := range []struct {
w, h int
roomW, roomH float32
base, want int
}{
{64, 40, 256, 200, 2, 4},
{64, 40, 200, 200, 2, 2},
{10, 10, 0, 0, 1, 1},
{160, 144, 1000, 1000, 1, 4},
{160, 144, 400, 300, 1, 2},
} {
if got := fit(tc.w, tc.h, tc.roomW, tc.roomH, tc.base); got != tc.want {
t.Errorf("fit(%d×%d in %v×%v from %d) = %d, want %d", tc.w, tc.h, tc.roomW, tc.roomH, tc.base, got, tc.want)
}
}
}