cat / 012
clone

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

main
012 / internal / sheet / rangeindex_test.go
rangeindex_test.go 1.5K
1package sheet23import "testing"45// Range users are found by column; a formula must follow a change in any6// column its ranges cover, and stop following a range it no longer has.7func TestRangeUsersByColumn(t *testing.T) {8 tests := []struct {9 name string10 setup []string // cell=input pairs, in order11 change string // cell=input12 cell string13 want float6414 }{15 {"middle column of a block", []string{"A1=1", "B2=2", "C3=3", "E1==SUM(A1:C3)"}, "B3=10", "E1", 16},16 {"two ranges", []string{"A1=1", "D1=4", "E1==SUM(A1:A2,D1:D2)"}, "D2=5", "E1", 10},17 {"range replaced by another", []string{"A1=1", "B1=2", "E1==SUM(A1:A5)", "E1==SUM(B1:B5)"}, "B2=3", "E1", 5},18 {"through a chain", []string{"A1=1", "B1==SUM(A1:A3)", "C1==B1*2"}, "A3=4", "C1", 10},19 {"row range", []string{"A1=1", "E2==SUM(A1:D1)"}, "D1=2", "E2", 3},20 }21 for _, tt := range tests {22 t.Run(tt.name, func(t *testing.T) {23 s := New()24 set := func(pair string) {25 t.Helper()26 for i := range pair {27 if pair[i] == '=' {28 if err := s.Set(at(pair[:i]), pair[i+1:]); err != nil {29 t.Fatal(err)30 }31 return32 }33 }34 }35 for _, p := range tt.setup {36 set(p)37 }38 set(tt.change)39 if got := s.Value(at(tt.cell)); got.Num != tt.want {40 t.Errorf("%s = %v, want %v", tt.cell, got, tt.want)41 }42 })43 }44 // Replacing E1's formula leaves nothing indexed under column A.45 s := New()46 s.Set(at("E1"), "=SUM(A1:A5)")47 s.Set(at("E1"), "=SUM(B1:B5)")48 if iv := s.rangeUsers.byCol[0]; iv != nil {49 t.Errorf("%d stale range users in column A", len(iv.users))50 }51}