cat / 012
clone

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

main
012 / internal / ui / trace_test.go
trace_test.go 1.9K
1package ui23import (4 "strings"5 "testing"67 tea "charm.land/bubbletea/v2"8)910func traceModel(t *testing.T) *Model {11 m := newModel()12 for a, in := range map[string]string{"A1": "1", "A2": "2", "A3": "3", "B1": "=A1+SUM(A2:A3)", "C1": "=B1*2", "C2": "=B1"} {13 m.sheet.Set(addr(a), in)14 }15 return m16}1718func TestTracePrecedents(t *testing.T) {19 m := traceModel(t)20 m.cur = addr("B1")21 press(t, m, "<alt+,>")22 if m.cur != addr("A1") || !(m.trace.role(&m.th, m.sheet, addr("A3")) != nil) || (m.trace.role(&m.th, m.sheet, addr("B1")) != nil) {23 t.Fatalf("cur %v", m.cur)24 }25 if l := line(m, contextLine); !strings.HasPrefix(l, "2 precedents of B1: A1, A2:A3") || !strings.Contains(l, "Alt+, next") {26 t.Errorf("context %q", l)27 }28 press(t, m, "<alt+,>")29 if m.cur != addr("A2") {30 t.Errorf("next: %v", m.cur)31 }32 press(t, m, "<alt+,>")33 if m.cur != addr("A1") {34 t.Errorf("wrap: %v", m.cur)35 }36 // Esc returns to the traced cell and ends the trace.37 press(t, m, "<esc>")38 if m.cur != addr("B1") || m.trace != nil {39 t.Errorf("esc: %v %v", m.cur, m.trace)40 }41}4243func TestTraceDependents(t *testing.T) {44 m := traceModel(t)45 m.cur = addr("B1")46 press(t, m, "<alt+.>")47 if m.cur != addr("C1") || !(m.trace.role(&m.th, m.sheet, addr("C2")) != nil) {48 t.Fatalf("cur %v", m.cur)49 }50 // Any other key ends the trace and does its own thing.51 press(t, m, "<down>")52 if m.trace != nil || m.cur != addr("C2") {53 t.Errorf("down: %v %v", m.trace, m.cur)54 }55 // A click ends it too.56 m.cur = addr("B1")57 press(t, m, "<alt+.>")58 send(m, tea.MouseClickMsg{X: minRowHdrW + 1, Y: gridTop + 4, Button: tea.MouseLeft})59 if m.trace != nil {60 t.Error("click kept the trace")61 }62 m.cur = addr("C1")63 press(t, m, "<alt+.>")64 if m.trace != nil || !strings.Contains(line(m, contextLine), "No formulas read C1") {65 t.Errorf("no dependents: %q", line(m, contextLine))66 }67 press(t, m, "<alt+,>", "<alt+,>")68 if m.cur != addr("B1") || m.trace == nil {69 t.Errorf("from C1 back: %v", m.cur)70 }71}