list_test.go raw
1 // SPDX-License-Identifier: Unlicense OR MIT
2
3 package layout
4
5 import (
6 "image"
7 "testing"
8
9 "github.com/p9c/p9/pkg/gel/gio/f32"
10 "github.com/p9c/p9/pkg/gel/gio/io/event"
11 "github.com/p9c/p9/pkg/gel/gio/io/pointer"
12 "github.com/p9c/p9/pkg/gel/gio/io/router"
13 "github.com/p9c/p9/pkg/gel/gio/op"
14 )
15
16 func TestListPosition(t *testing.T) {
17 _s := func(e ...event.Event) []event.Event { return e }
18 r := new(router.Router)
19 gtx := Context{
20 Ops: new(op.Ops),
21 Constraints: Constraints{
22 Max: image.Pt(20, 10),
23 },
24 Queue: r,
25 }
26 el := func(gtx Context, idx int) Dimensions {
27 return Dimensions{Size: image.Pt(10, 10)}
28 }
29 for _, tc := range []struct {
30 label string
31 num int
32 scroll []event.Event
33 first int
34 count int
35 offset int
36 last int
37 }{
38 {label: "no item", last: 20},
39 {label: "1 visible 0 hidden", num: 1, count: 1, last: 10},
40 {label: "2 visible 0 hidden", num: 2, count: 2},
41 {label: "2 visible 1 hidden", num: 3, count: 2},
42 {label: "3 visible 0 hidden small scroll", num: 3, count: 3, offset: 5, last: -5,
43 scroll: _s(
44 pointer.Event{
45 Source: pointer.Mouse,
46 Buttons: pointer.ButtonPrimary,
47 Type: pointer.Press,
48 Position: f32.Pt(0, 0),
49 },
50 pointer.Event{
51 Source: pointer.Mouse,
52 Type: pointer.Scroll,
53 Scroll: f32.Pt(5, 0),
54 },
55 pointer.Event{
56 Source: pointer.Mouse,
57 Buttons: pointer.ButtonPrimary,
58 Type: pointer.Release,
59 Position: f32.Pt(5, 0),
60 },
61 )},
62 {label: "3 visible 0 hidden small scroll 2", num: 3, count: 3, offset: 3, last: -7,
63 scroll: _s(
64 pointer.Event{
65 Source: pointer.Mouse,
66 Buttons: pointer.ButtonPrimary,
67 Type: pointer.Press,
68 Position: f32.Pt(0, 0),
69 },
70 pointer.Event{
71 Source: pointer.Mouse,
72 Type: pointer.Scroll,
73 Scroll: f32.Pt(3, 0),
74 },
75 pointer.Event{
76 Source: pointer.Mouse,
77 Buttons: pointer.ButtonPrimary,
78 Type: pointer.Release,
79 Position: f32.Pt(5, 0),
80 },
81 )},
82 {label: "2 visible 1 hidden large scroll", num: 3, count: 2, first: 1,
83 scroll: _s(
84 pointer.Event{
85 Source: pointer.Mouse,
86 Buttons: pointer.ButtonPrimary,
87 Type: pointer.Press,
88 Position: f32.Pt(0, 0),
89 },
90 pointer.Event{
91 Source: pointer.Mouse,
92 Type: pointer.Scroll,
93 Scroll: f32.Pt(10, 0),
94 },
95 pointer.Event{
96 Source: pointer.Mouse,
97 Buttons: pointer.ButtonPrimary,
98 Type: pointer.Release,
99 Position: f32.Pt(15, 0),
100 },
101 )},
102 } {
103 t.Run(tc.label, func(t *testing.T) {
104 gtx.Ops.Reset()
105
106 var list List
107 // Initialize the list.
108 list.Layout(gtx, tc.num, el)
109 // Generate the scroll events.
110 r.Frame(gtx.Ops)
111 r.Queue(tc.scroll...)
112 // Let the list process the events.
113 list.Layout(gtx, tc.num, el)
114
115 pos := list.Position
116 if got, want := pos.First, tc.first; got != want {
117 t.Errorf("List: invalid first position: got %v; want %v", got, want)
118 }
119 if got, want := pos.Count, tc.count; got != want {
120 t.Errorf("List: invalid number of visible children: got %v; want %v", got, want)
121 }
122 if got, want := pos.Offset, tc.offset; got != want {
123 t.Errorf("List: invalid first visible offset: got %v; want %v", got, want)
124 }
125 if got, want := pos.OffsetLast, tc.last; got != want {
126 t.Errorf("List: invalid last visible offset: got %v; want %v", got, want)
127 }
128 })
129 }
130 }
131