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 / notes_test.go
notes_test.go 3.0K
1package sheet23import (4 "bytes"5 "strings"6 "testing"7)89func TestNotes(t *testing.T) {10 s := New()11 s.Set(at("B2"), "10")12 if err := s.SetNote(at("B2"), "Checked\r\nwith \x1bthe bank "); err != nil {13 t.Fatal(err)14 }15 if got := s.Note(at("B2")); got != "Checked\nwith the bank" {16 t.Errorf("note %q", got)17 }18 // Typing over the cell and clearing it keep the note, as in Sheets.19 s.Set(at("B2"), "12")20 s.EraseRange(rng("A1:C3"))21 if got := s.Note(at("B2")); got != "Checked\nwith the bank" {22 t.Errorf("after clearing: note %q", got)23 }24 // A note on a blank cell is a cell of its own, without contents.25 s.SetNote(at("D5"), "Later")26 if c := s.Cell(at("D5")); c == nil || !c.Blank() || c.Note != "Later" {27 t.Errorf("blank noted cell %+v", c)28 }29 // Notes move with their rows.30 s.InsertRows(0, 2)31 if s.Note(at("B4")) == "" || s.Note(at("D7")) != "Later" {32 t.Errorf("after inserting rows: %q %q", s.Note(at("B4")), s.Note(at("D7")))33 }34 if got := s.NotesIn(rng("A1:Z99")); len(got) != 2 || got[0] != at("B4") {35 t.Errorf("NotesIn %v", got)36 }37 // Undo steps back one change at a time.38 s.Undo()39 if s.Note(at("D5")) != "Later" {40 t.Errorf("undo insert: %q", s.Note(at("D5")))41 }42 s.Undo()43 if s.Cell(at("D5")) != nil {44 t.Errorf("undo note: %+v", s.Cell(at("D5")))45 }46 // Deleting the last note of a blank, plain cell removes the cell.47 if n := s.ClearNotes(rng("A1:C3")); n != 1 || s.Cell(at("B2")) != nil {48 t.Errorf("ClearNotes = %d, cell %+v", n, s.Cell(at("B2")))49 }50}5152func TestNotesCopyAndFill(t *testing.T) {53 s := New()54 s.Set(at("A1"), "1")55 s.SetNote(at("A1"), "Source")56 s.SetNote(at("B1"), "Mine")57 if _, err := s.Paste(s.Copy(rng("A1")), rng("A2"), false); err != nil {58 t.Fatal(err)59 }60 if s.Note(at("A2")) != "Source" {61 t.Errorf("pasted note %q", s.Note(at("A2")))62 }63 // Ctrl+Enter fills contents, each cell keeping its own note.64 s.FillEntry(rng("A1:B1"), at("A1"), "7")65 if s.Note(at("A1")) != "Source" || s.Note(at("B1")) != "Mine" || s.Value(at("B1")).Num != 7 {66 t.Errorf("fill: %q %q %v", s.Note(at("A1")), s.Note(at("B1")), s.Value(at("B1")))67 }68}6970func TestNotesInPivotRefused(t *testing.T) {71 s := New()72 for a, v := range map[string]string{"A1": "Region", "B1": "Sales", "A2": "East", "B2": "5"} {73 s.Set(at(a), v)74 }75 p, err := s.Book().CreatePivot(s, rng("A1:B2"), "", NewPivot(s, rng("A1:B2")))76 if err != nil {77 t.Fatal(err)78 }79 out, _ := p.PivotRange()80 if err := p.SetNote(out.From, "x"); err != ErrPivotEdit {81 t.Errorf("note on pivot results: %v", err)82 }83}8485func TestNotesFile(t *testing.T) {86 s := New()87 s.Set(at("A1"), "Rent")88 s.SetNote(at("A1"), "Due on\nthe 1st")89 s.SetNote(at("C3"), "Blank")90 var b bytes.Buffer91 if err := s.Write(&b); err != nil {92 t.Fatal(err)93 }94 if !strings.Contains(b.String(), `"A1": {"input":"Rent","note":"Due on\nthe 1st"}`) {95 t.Errorf("file:\n%s", b.String())96 }97 got, err := Read(&b)98 if err != nil {99 t.Fatal(err)100 }101 if got.Note(at("A1")) != "Due on\nthe 1st" || got.Note(at("C3")) != "Blank" || got.Value(at("A1")).Str != "Rent" {102 t.Errorf("read back %q %q", got.Note(at("A1")), got.Note(at("C3")))103 }104}