github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/rty/scroll_test.go (about) 1 package rty 2 3 import ( 4 "fmt" 5 "strconv" 6 "strings" 7 "testing" 8 ) 9 10 func TestElementScroll(t *testing.T) { 11 f := newElementScrollTestFixture(t) 12 13 f.run("initial scroll state") 14 15 f.down() 16 f.run("scrolled down one") 17 18 for i := 0; i < 9; i++ { 19 f.down() 20 } 21 f.run("scrolled down ten") 22 23 for i := 0; i < 20; i++ { 24 f.down() 25 } 26 f.run("scrolled all the way down") 27 28 for i := 0; i < 3; i++ { 29 f.up() 30 } 31 f.run("scrolled 3 up from bottom") 32 33 for i := 0; i < 100; i++ { 34 f.up() 35 } 36 f.run("scrolled all the way back up") 37 38 f.bottom() 39 f.run("jumped to bottom") 40 } 41 42 func TestElementScrollWrap(t *testing.T) { 43 i := NewInteractiveTester(t, screen) 44 45 sl, _ := i.rty.RegisterElementScroll("baz", []string{"hi"}) 46 sl.Add(TextString(strings.Repeat("abcdefgh", 20))) 47 i.Run("line wrapped element scroll", 10, 10, sl) 48 } 49 50 func TestElementScrollPerfectlyFilled(t *testing.T) { 51 i := NewInteractiveTester(t, screen) 52 53 var names []string 54 for j := 0; j < 10; j++ { 55 names = append(names, fmt.Sprintf("%d", j+1)) 56 } 57 58 sl, _ := i.rty.RegisterElementScroll("qux", names) 59 for range names { 60 sl.Add(TextString("abcd")) 61 } 62 i.Run("element scroll perfectly filled", 10, len(names), sl) 63 } 64 65 func TestTextScroll(t *testing.T) { 66 i := NewInteractiveTester(t, screen) 67 68 sl := NewTextScrollLayout("foo") 69 sl.Add(TextString(strings.Repeat("abcd\n", 200))) 70 i.Run("vertically overflowed text scroll", 10, 10, sl) 71 72 sl = NewTextScrollLayout("bar") 73 sl.Add(TextString(strings.Repeat("abcd", 200))) 74 i.Run("line wrapped text scroll", 10, 10, sl) 75 76 sl = NewTextScrollLayout("bar2") 77 s := "" 78 for i := 1; i <= 20; i++ { 79 s += fmt.Sprintf("%d\n", i) 80 } 81 sl.Add(TextString(s)) 82 ts := i.rty.TextScroller(sl.name) 83 ts.Bottom() 84 ts.Up() 85 for i := 0; i < 5; i++ { 86 ts.Down() 87 ts.Down() 88 } 89 i.Run("textscroll stop scrolling at bottom", 10, 10, sl) 90 } 91 92 type elementScrollTestFixture struct { 93 t *testing.T 94 i InteractiveTester 95 } 96 97 func newElementScrollTestFixture(t *testing.T) *elementScrollTestFixture { 98 return &elementScrollTestFixture{ 99 t: t, 100 i: NewInteractiveTester(t, screen), 101 } 102 } 103 104 func (f *elementScrollTestFixture) layout() Component { 105 var childrenNames []string 106 for i := 0; i < 20; i++ { 107 childrenNames = append(childrenNames, strconv.FormatInt(int64(i+1), 10)) 108 } 109 110 l, selectedName := f.i.rty.RegisterElementScroll("items", childrenNames) 111 112 var components []Component 113 for _, n := range childrenNames { 114 c := NewLines() 115 if selectedName == n { 116 c.Add(TextString("SELECTED---->")) 117 } 118 for j := 0; j < 3; j++ { 119 c.Add(TextString(strings.Repeat(n, 9))) 120 } 121 components = append(components, c) 122 } 123 124 for _, c := range components { 125 l.Add(c) 126 } 127 128 return l 129 } 130 131 func (f *elementScrollTestFixture) scroller() ElementScroller { 132 return f.i.rty.ElementScroller("items") 133 } 134 135 func (f *elementScrollTestFixture) run(name string) { 136 f.i.Run(name, 20, 10, f.layout()) 137 } 138 139 func (f *elementScrollTestFixture) down() { 140 _ = f.i.render(20, 10, f.layout()) 141 f.scroller().Down() 142 } 143 144 func (f *elementScrollTestFixture) up() { 145 _ = f.i.render(20, 10, f.layout()) 146 f.scroller().Up() 147 } 148 149 func (f *elementScrollTestFixture) bottom() { 150 _ = f.i.render(20, 10, f.layout()) 151 f.scroller().Bottom() 152 }