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