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 / merge_undo_test.go
merge_undo_test.go 2.8K
1package sheet23import "testing"45func TestMergeFormattingUndo(t *testing.T) {6 s := New()7 s.Set(at("A1"), "5")8 r := NewRect(at("A1"), at("A2"))9 s.SetFormat(r, Preset(FmtCurrency))10 s.Batch(Change{Label: "bold A1:A2", Focus: r}, func() error {11 s.SetStyle(r, func(st *Style) { st.Bold = true })12 return nil13 })14 s.EraseRange(r)15 if c := s.Cell(at("A1")); c == nil || !c.Blank() || !c.Style.Bold {16 t.Fatalf("after clear %+v", c)17 }18 for _, want := range []string{"clear A1:A2", "bold A1:A2", "format A1:A2 as currency"} {19 ch, ok := s.Undo()20 if !ok || ch.Label != want {21 t.Fatalf("undo = %q %v, want %q", ch.Label, ok, want)22 }23 }24 if c := s.Cell(at("A1")); c.Format != (Format{}) || c.Style.Bold || c.Input != "5" {25 t.Errorf("A1 after undos %+v", c)26 }27 if s.Cell(at("A2")) != nil {28 t.Errorf("A2 after undos %+v", s.Cell(at("A2")))29 }30 s.Redo()31 if s.Cell(at("A2")) == nil || s.Cell(at("A2")).Format.Kind != FmtCurrency {32 t.Error("redo lost the blank's format")33 }34 // Copying and pasting carries formatting.35 s.Redo()36 s.Paste(s.Copy(NewRect(at("A1"), at("A1"))), NewRect(at("C1"), at("C1")), false)37 if c := s.Cell(at("C1")); c == nil || !c.Style.Bold || c.Format.Kind != FmtCurrency {38 t.Errorf("pasted C1 %+v", c)39 }40}4142// A merge that deleting rows takes away frees the array it blocked.43func TestDeletedMergeFreesArray(t *testing.T) {44 s := New()45 s.Merge(NewRect(at("B18"), at("C20")), MergeVertically)46 s.Set(at("B17"), "=SEQUENCE(2)")47 if v := s.Value(at("B17")); v != ErrRef {48 t.Fatalf("B17 over a merge = %v", v)49 }50 s.DeleteRows(18, 3)51 if v := s.Value(at("B18")); v != num(2) {52 t.Errorf("B18 once the merge went = %v", v)53 }54}5556// Unmerging frees the arrays blocked by the merges it takes away, where57// they reach past the range unmerged.58func TestUnmergeFreesArrayPastTheRange(t *testing.T) {59 s := New()60 s.Merge(NewRect(at("H11"), at("H13")), MergeVertically)61 s.Set(at("H11"), "=SEQUENCE(2)")62 if v := s.Value(at("H11")); v != ErrRef {63 t.Fatalf("H11 over a merge = %v", v)64 }65 if n := s.Unmerge(NewRect(at("G13"), at("H15"))); n != 1 {66 t.Fatalf("unmerged %d", n)67 }68 if v := s.Value(at("H12")); v != num(2) {69 t.Errorf("H12 once the merge went = %v", v)70 }71}7273// A paste carrying merges replaces those it lands over, whole: an array74// that one blocked past the paste spills again.75func TestPastedMergeFreesAnArrayPastIt(t *testing.T) {76 s := New()77 if err := s.Merge(NewRect(at("A1"), at("A2")), MergeAll); err != nil {78 t.Fatal(err)79 }80 if err := s.Merge(NewRect(at("B14"), at("C14")), MergeAll); err != nil {81 t.Fatal(err)82 }83 s.Set(at("B14"), "=SEQUENCE(2)")84 wantShown(t, s, map[string]string{"B14": "#REF!"})85 if _, err := s.Paste(s.Copy(NewRect(at("A1"), at("A2"))), NewRect(at("C13"), at("C14")), false); err != nil {86 t.Fatal(err)87 }88 wantShown(t, s, map[string]string{"B14": "1", "B15": "2"})89}