cat / 012
clone

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

main
012 / e2e / data_test.go
data_test.go 3.0K
1package e2e23import (4 "fmt"5 "os"6 "path/filepath"7 "strings"8 "testing"9)1011// writeTable saves a sheet with a header row (Item, Qty) over n rows:12// Row 1..n with the row number mod 4.13func writeTable(t *testing.T, dir, name string, n int) {14 t.Helper()15 var cells []string16 cells = append(cells, `"A1": "Item"`, `"B1": "Qty"`)17 for i := 1; i <= n; i++ {18 cells = append(cells, fmt.Sprintf(`"A%d": "Row %d"`, i+1, i), fmt.Sprintf(`"B%d": "%d"`, i+1, i%4))19 }20 body := `{"version": 2, "cells": {` + strings.Join(cells, ", ") + `}}`21 if err := os.WriteFile(filepath.Join(dir, name), []byte(body), 0o644); err != nil {22 t.Fatal(err)23 }24}2526func TestFreezeFilterAndSort(t *testing.T) {27 t.Parallel()28 dir := t.TempDir()29 writeTable(t, dir, "data.012", 60)30 s := start(t, dir, "data.012")3132 // View > Freeze > 1 row keeps the headers while scrolling.33 s.keys("<alt+v>", "<enter>", "1", "<enter>")34 s.waitFor("Froze 1 row")35 s.keys("<ctrl+end>")36 s.waitForName("B61")37 s.eventually("frozen header row", func() bool {38 return strings.HasPrefix(s.line(gridRow1), " 1 Item") && strings.HasPrefix(s.line(gridRow1+1), "──────────")39 })4041 // Data > Create a filter, then uncheck 0 in the Qty column.42 s.keys("<ctrl+home>", "<right>", "<alt+d>", "c")43 s.waitFor("Created a filter on A1:B61")44 s.keys("<alt+down>")45 s.waitFor("Filter B Qty")46 s.keys("<down>", "<space>", "<enter>")47 s.waitFor("Filter hides 15 rows")48 s.eventually("row numbers skip hidden rows", func() bool {49 return strings.HasPrefix(s.line(gridRow1+4), " 4 Row 3") && strings.HasPrefix(s.line(gridRow1+5), " 6 Row 5")50 })5152 // Data > Sort sheet > Z to A sorts below the frozen row.53 s.keys("<alt+d>", "<enter>", "z")54 s.waitFor("Sorted A2:B61 by B Z→A")55 s.keys("<down>")56 s.waitForBar("B2", "3")5758 // Everything survives saving and opening again.59 s.keys("<ctrl+s>")60 s.eventually("saved", func() bool { return !strings.Contains(s.line(29), "modified") })61 s2 := start(t, dir, "data.012")62 s2.waitFor("Filter hides 15 rows")63 s2.eventually("frozen divider", func() bool { return strings.HasPrefix(s2.line(gridRow1+1), "──────────") })64}6566func TestSortBarAndFillHandle(t *testing.T) {67 t.Parallel()68 s := start(t, "")69 s.keys("Month", "<tab>", "Sales", "<enter>", "Jan", "<tab>", "30", "<enter>", "Feb", "<tab>", "10", "<enter>")70 s.keys("<up>")71 s.waitForName("A3")7273 // Drag the fill handle at A3's corner down two rows: Mar, Apr.74 s.drag([2]int{6 + 9, gridRow1 + 2}, [2]int{colX(0), gridRow1 + 3}, [2]int{colX(0), gridRow1 + 4})75 s.eventually("filled Mar, Apr", func() bool { return strings.HasPrefix(s.line(gridRow1+4), " 5 Apr") })76 s.keys("<ctrl+z>")77 s.eventually("undone", func() bool { return !strings.Contains(s.line(gridRow1+4), "Apr") })7879 // Data > Sort range > Advanced: sort by Sales, header row found.80 s.keys("<ctrl+home>", "<alt+d>", "<down>", "<enter>", "a", "<enter>")81 s.waitFor("Sort A2:B3 by A Month A→Z")82 s.keys("<right>", "<enter>")83 s.waitFor("Sorted A2:B3 by B A→Z")84 s.waitForLine(gridRow1+1, " 2 Feb 10")85}