github.com/grahambrereton-form3/tilt@v0.10.18/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 = 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 i InteractiveTester 94 } 95 96 func newElementScrollTestFixture(t *testing.T) *elementScrollTestFixture { 97 return &elementScrollTestFixture{ 98 i: NewInteractiveTester(t, screen), 99 } 100 } 101 102 func (f *elementScrollTestFixture) layout() Component { 103 var childrenNames []string 104 for i := 0; i < 20; i++ { 105 childrenNames = append(childrenNames, strconv.FormatInt(int64(i+1), 10)) 106 } 107 108 l, selectedName := f.i.rty.RegisterElementScroll("items", childrenNames) 109 110 var components []Component 111 for _, n := range childrenNames { 112 c := NewLines() 113 if selectedName == n { 114 c.Add(TextString("SELECTED---->")) 115 } 116 for j := 0; j < 3; j++ { 117 c.Add(TextString(strings.Repeat(n, 9))) 118 } 119 components = append(components, c) 120 } 121 122 for _, c := range components { 123 l.Add(c) 124 } 125 126 return l 127 } 128 129 func (f *elementScrollTestFixture) scroller() ElementScroller { 130 return f.i.rty.ElementScroller("items") 131 } 132 133 func (f *elementScrollTestFixture) run(name string) { 134 f.i.Run(name, 20, 10, f.layout()) 135 } 136 137 func (f *elementScrollTestFixture) down() { 138 f.i.render(20, 10, f.layout()) 139 f.scroller().Down() 140 } 141 142 func (f *elementScrollTestFixture) up() { 143 f.i.render(20, 10, f.layout()) 144 f.scroller().Up() 145 } 146 147 func (f *elementScrollTestFixture) bottom() { 148 f.i.render(20, 10, f.layout()) 149 f.scroller().Bottom() 150 }