cat / 012
clone

a spreadsheet for the terminal: lotus 1-2-3 looks, google sheets keys and formulas, one go binary

cat/module-path
012 / internal / ui / tabstrip / tabstrip_test.go
tabstrip_test.go 2.6K
1package tabstrip23import (4 "strconv"5 "strings"6 "testing"78 "github.com/charmbracelet/x/ansi"910 "src.rest/cat/012/internal/sheet"11 "src.rest/cat/012/internal/ui/theme"12)1314// book returns a workbook of n sheets named Sheet1, Sheet2, ...15func book(t *testing.T, n int) []*sheet.Sheet {16 t.Helper()17 s := sheet.New()18 for i := 2; i <= n; i++ {19 if _, err := s.Book().AddSheet("Sheet"+strconv.Itoa(i), i-1); err != nil {20 t.Fatal(err)21 }22 }23 return s.Book().Sheets()24}2526func kinds(spans []Span) string {27 names := map[Kind]string{Tab: "tab", Add: "+", Prev: "‹", Next: "›"}28 var out []string29 for _, sp := range spans {30 out = append(out, names[sp.Kind])31 }32 return strings.Join(out, " ")33}3435func TestEveryTabFits(t *testing.T) {36 th := theme.New(true)37 var s Strip38 v := View{Sheets: book(t, 3), Active: 1}39 line, spans := s.Layout(&th, v, 80)40 if got := ansi.Strip(line); got != " Sheet1 Sheet2 Sheet3 + " {41 t.Errorf("strip %q", got)42 }43 if kinds(spans) != "tab tab tab +" || ansi.StringWidth(line) != v.FullWidth() {44 t.Errorf("spans %s, width %d of %d", kinds(spans), ansi.StringWidth(line), v.FullWidth())45 }46 for _, sp := range spans {47 if got := ansi.Strip(line)[sp.X : sp.X+sp.W]; sp.Kind == Tab && got != Label(v.Sheets[sp.Index]) {48 t.Errorf("span %+v covers %q", sp, got)49 }50 }51}5253func TestScrollKeepsTheActiveTab(t *testing.T) {54 th := theme.New(true)55 var s Strip56 v := View{Sheets: book(t, 8), Active: 0}57 room := v.MinWidth() + 1258 _, spans := s.Layout(&th, v, room)59 if k := kinds(spans); !strings.HasPrefix(k, "tab") || !strings.Contains(k, "›") {60 t.Errorf("first tab shown: %s", k)61 }62 v.Active = 763 line, spans := s.Layout(&th, v, room)64 if k := kinds(spans); !strings.HasPrefix(k, "‹") || strings.Contains(k, "›") {65 t.Errorf("last tab shown: %s", k)66 }67 if !strings.Contains(ansi.Strip(line), "Sheet8") || ansi.StringWidth(line) > room {68 t.Errorf("strip %q in %d", ansi.Strip(line), room)69 }70 // Going back one tab keeps the strip where it is.71 v.Active = 672 again, _ := s.Layout(&th, v, room)73 if ansi.Strip(again) != ansi.Strip(line) {74 t.Errorf("strip moved: %q then %q", ansi.Strip(line), ansi.Strip(again))75 }76}7778func TestHoverStyles(t *testing.T) {79 th := theme.New(true)80 var s Strip81 v := View{Sheets: book(t, 2), Active: 0, Hover: Tab, HoverIndex: 1}82 hovered, _ := s.Layout(&th, v, 80)83 v.Busy = true84 busy, _ := s.Layout(&th, v, 80)85 if hovered == busy {86 t.Error("hovering a tab looks the same while dragging something else")87 }88 if want := th.TabHover.Render(Label(v.Sheets[1])); !strings.Contains(hovered, want) {89 t.Errorf("hovered tab not highlighted: %q", hovered)90 }91}