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  }