1package layout
2
3import (
4 "testing"
5
6 "github.com/bnema/nefergui/internal/css"
7)
8
9func TestAutoFlexColumnReservesChildrenAndGaps(t *testing.T) {
10 leaf := func(id string) *Node {
11 return node(id, Box, css.Style{Display: css.KeywordBlock, Height: px(20), Width: px(80)})
12 }
13 column := node("column", Column, css.Style{Display: css.KeywordFlex, FlexDirection: css.KeywordColumn, RowGap: px(8)}, leaf("one"), leaf("two"))
14 out, err := Layout(node("root", Box, css.Style{Display: css.KeywordBlock, Width: px(300), Height: px(200)}, column), Options{Width: 300, Height: 200})
15 if err != nil {
16 t.Fatal(err)
17 }
18 got := out.Tree.Children[0]
19 if got.Content.H != 48 || got.Children[1].Border.Y != 28 {
20 t.Fatalf("column geometry: %+v", got)
21 }
22}
23
24func TestNestedFlexPercentWidthUsesNaturalSize(t *testing.T) {
25 leaf := node("leaf", Box, css.Style{Display: css.KeywordBlock, Width: px(80), Height: px(24)})
26 percent := node("percent", Box, css.Style{Display: css.KeywordBlock, Width: css.Length{Value: 100, Unit: "%"}}, leaf)
27 nested := node("nested", Column, css.Style{Display: css.KeywordFlex, FlexDirection: css.KeywordColumn}, percent)
28 out, err := Layout(node("root", Row, css.Style{Display: css.KeywordFlex, Width: px(300), Height: px(100)}, nested), Options{Width: 300, Height: 100})
29 if err != nil {
30 t.Fatal(err)
31 }
32 if got := out.Tree.Children[0].Border.W; got != 80 {
33 t.Fatalf("nested width=%g", got)
34 }
35}
36
37func TestAutoFlexHeightBoundsBeforeDistribution(t *testing.T) {
38 for _, tc := range []struct {
39 name string
40 min, max css.Length
41 child, want float64
42 }{{"minimum", px(200), css.Length{}, 0, 200}, {"maximum", css.Length{}, px(40), 100, 40}} {
43 t.Run(tc.name, func(t *testing.T) {
44 child := node("child", Box, css.Style{Display: css.KeywordBlock, Height: px(tc.child), FlexGrow: 1, FlexShrink: 1})
45 column := node("column", Column, css.Style{Display: css.KeywordFlex, FlexDirection: css.KeywordColumn, MinHeight: tc.min, MaxHeight: tc.max}, child)
46 out, err := Layout(node("root", Box, css.Style{Display: css.KeywordBlock, Width: px(300), Height: px(300)}, column), Options{Width: 300, Height: 300})
47 if err != nil {
48 t.Fatal(err)
49 }
50 got := out.Tree.Children[0]
51 if got.Border.H != tc.want || got.Children[0].Border.H != tc.want {
52 t.Fatalf("container=%g child=%g want=%g", got.Border.H, got.Children[0].Border.H, tc.want)
53 }
54 })
55 }
56}