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 / hidden_test.go
hidden_test.go 4.8K
1package ui23import (4 "strings"5 "testing"67 "src.rest/cat/012/internal/ui/picker"8)910// hiddenBook is a model of three sheets, Sheet1 reading Data, showing11// Data.12func hiddenBook(t *testing.T) *Model {13 t.Helper()14 m := newModel()15 press(t, m, "=", "D", "a", "t", "a", "!", "A", "1", "*", "2", "<enter>")16 press(t, m, "<shift+f11>")17 run(m, m.runCommand("sheet.rename"))18 m.line.Set("Data")19 press(t, m, "<enter>", "2", "1", "<enter>", "<shift+f11>", "<ctrl+pgup>")20 if sheetNames(m) != "Sheet1,Data,Sheet3" || m.sheet.Name() != "Data" {21 t.Fatalf("sheets %s, on %s", sheetNames(m), m.sheet.Name())22 }23 return m24}2526func TestHideSheetCommand(t *testing.T) {27 m := hiddenBook(t)28 run(m, m.runCommand("sheet.hide"))29 if m.sheet.Name() != "Sheet3" || !m.book().Lookup("Data").Hidden() {30 t.Fatalf("after hiding: on %s", m.sheet.Name())31 }32 if s := status(m); strings.Contains(s, "Data") || !strings.HasPrefix(s, " Sheet1 Sheet3 +") {33 t.Errorf("tabs %q", s)34 }35 if !strings.Contains(line(m, contextLine), "Hid Data; View > Hidden sheets shows it again") {36 t.Errorf("context %q", line(m, contextLine))37 }38 press(t, m, "<ctrl+pgup>") // skips Data39 if m.sheet.Name() != "Sheet1" || m.sheet.Value(addr("A1")).Num != 42 {40 t.Errorf("previous: %s, A1 = %v", m.sheet.Name(), m.sheet.Value(addr("A1")))41 }42 press(t, m, "<ctrl+pgdown>")43 if m.sheet.Name() != "Sheet3" {44 t.Errorf("next: %s", m.sheet.Name())45 }46 // Move left goes past the hidden sheet to the visible neighbour.47 run(m, m.runCommand("sheet.move_left"))48 if sheetNames(m) != "Sheet3,Sheet1,Data" {49 t.Errorf("moved left: %s", sheetNames(m))50 }51 run(m, m.runCommand("edit.undo"))5253 // The last visible sheet can't be hidden or deleted.54 run(m, m.runCommand("sheet.hide"))55 if m.sheet.Name() != "Sheet1" || commands["sheet.hide"].available(m) || commands["sheet.delete"].available(m) {56 t.Fatalf("one visible sheet left: on %s", m.sheet.Name())57 }58 if !strings.HasPrefix(status(m), " Sheet1 +") {59 t.Errorf("tabs %q", status(m))60 }6162 // Going to a cell on a hidden sheet says it's hidden.63 run(m, m.runCommand("goto"))64 m.line.Set("Data!A1")65 press(t, m, "<enter>")66 if m.sheet.Name() != "Sheet1" || m.mode != modeError || m.errMsg != "Data is hidden; View > Hidden sheets shows it again" {67 t.Errorf("goto: on %s, %q", m.sheet.Name(), m.errMsg)68 }69 press(t, m, "<esc>")7071 // Undo shows the sheet again; redo hides it and shows another.72 press(t, m, "<ctrl+z>")73 if m.sheet.Name() != "Sheet3" || m.sheet.Hidden() {74 t.Errorf("undo: on %s", m.sheet.Name())75 }76 press(t, m, "<ctrl+y>")77 if m.sheet.Hidden() || m.sheet.Name() != "Sheet1" {78 t.Errorf("redo: on %s (hidden %v)", m.sheet.Name(), m.sheet.Hidden())79 }80}8182func TestHiddenSheetsPicker(t *testing.T) {83 m := hiddenBook(t)84 if commands["sheet.unhide"].available(m) {85 t.Error("Hidden sheets available with none hidden")86 }87 run(m, m.runCommand("sheet.hide"))88 run(m, m.runCommand("sheet.unhide"))89 p, ok := m.overlay.(*picker.Picker)90 if !ok || p.Title() != "Hidden sheets" || len(p.Items) != 1 || p.Items[0].Title != "Data" {91 t.Fatalf("overlay %#v", m.overlay)92 }93 if !strings.Contains(screen(m), "Hidden sheets") || !strings.Contains(screen(m), "A1, 1 cell") {94 t.Errorf("picker:\n%s", screen(m))95 }96 press(t, m, "<enter>")97 if m.overlay != nil || m.sheet.Name() != "Data" || m.sheet.Hidden() {98 t.Fatalf("unhid: on %s", m.sheet.Name())99 }100 if !strings.HasPrefix(status(m), " Sheet1 Data Sheet3") || !strings.Contains(line(m, contextLine), "Unhid Data") {101 t.Errorf("status %q, context %q", status(m), line(m, contextLine))102 }103 press(t, m, "<ctrl+z>")104 if !m.book().Lookup("Data").Hidden() || m.sheet.Name() == "Data" {105 t.Errorf("undo unhide: on %s", m.sheet.Name())106 }107}108109// Hiding is recorded as a command, unhiding with the sheet picked as110// its answer, and both replay.111func TestRecordHideAndUnhide(t *testing.T) {112 m := hiddenBook(t)113 send(m, nil)114 run(m, m.runCommand("macro.record"))115 run(m, m.runCommand("sheet.hide"))116 run(m, m.runCommand("sheet.unhide"))117 press(t, m, "<enter>")118 run(m, m.runCommand("macro.stop"))119 m.line.Set("Toggle")120 press(t, m, "<enter>")121 m.line.Set("")122 press(t, m, "<enter>")123 mc, ok := m.book().Macro("Toggle")124 if !ok {125 t.Fatalf("no macro: %q", m.errMsg)126 }127 want := "run(\"sheet.hide\")\nrun(\"sheet.unhide\", answer=\"Data\")"128 if !strings.Contains(mc.Source, want) {129 t.Errorf("script:\n%s\nwant it to contain\n%s", mc.Source, want)130 }131132 m = hiddenBook(t)133 script(t, m, `134run("sheet.hide")135set("A2", active_sheet())136run("sheet.unhide", answer="data")137`)138 if m.sheet.Name() != "Data" || m.sheet.Hidden() || m.book().Lookup("Sheet3").Value(addr("A2")).Str != "Sheet3" {139 t.Errorf("replay: on %s, %q", m.sheet.Name(), m.errMsg)140 }141 script(t, m, `run("sheet.hide")142run("sheet.unhide", answer="Nope")`)143 if !strings.Contains(m.warn, `Hidden sheets asks for one of Data: give run("sheet.unhide", answer=...)`) {144 t.Errorf("bad answer: %q", m.warn)145 }146}