1package headless23import (4 "bytes"5 "encoding/json"6 "strings"7 "testing"89 "src.rest/cat/012/internal/sheet"10)1112// TestDescribeFixture describes the workbook of every feature the13// release fixtures keep.14func TestDescribeFixture(t *testing.T) {15 f, err := Open("../sheet/testdata/fixtures/new/workbook.012", false)16 if err != nil {17 t.Fatal(err)18 }19 d := Describe(f.Book)20 var text bytes.Buffer21 if err := WriteDescription(&text, d); err != nil {22 t.Fatal(err)23 }24 for _, want := range []string{25 "Sales (shown) A1:J13, 13 rows x 10 columns",26 " header row 1: Date, Region, Units, Price, Total",27 " chart 1 Units by date column of A1:C9 at K2",28 "Lists (hidden)",29 " table Targets D1:E3 Region, Target",30 " pivot table of Sales!A1:E9",31 " output files A1:B3",32 " linked app F2 following logs/app.csv",33 "Notebook (notebook) 5 cells",34 " 4 code $files | nope (failed: Command `nope` not found)",35 " Units Sales!C2:C9",36 } {37 if !strings.Contains(text.String(), want) {38 t.Errorf("text lacks %q:\n%s", want, text.String())39 }40 }41 var js bytes.Buffer42 if err := Encode(&js, "json", d); err != nil {43 t.Fatal(err)44 }45 var back Description46 if err := json.Unmarshal(js.Bytes(), &back); err != nil {47 t.Fatal(err)48 }49 if len(back.Sheets) != len(d.Sheets) || back.Sheets[0].Charts[2].Type != "pie" || back.Sheets[6].Notebook[1].Name != "files" {50 t.Errorf("JSON round trip lost something: %+v", back.Sheets[0])51 }52 var nu bytes.Buffer53 if err := Encode(&nu, "nuon", d); err != nil || !strings.HasPrefix(nu.String(), "{sheets: [") {54 t.Errorf("NUON: %v %.40s", err, nu.String())55 }56}5758// TestGuessHeader takes a first row of text over typed rows, or a bold59// one, as a header, and not a table of text.60func TestGuessHeader(t *testing.T) {61 for _, c := range []struct {62 rows [][]string63 bold bool64 want int65 }{66 {[][]string{{"Item", "Price"}, {"Apple", "1.5"}}, false, 1},67 {[][]string{{"Item", "Kind"}, {"Apple", "fruit"}}, false, 0},68 {[][]string{{"Item", "Kind"}, {"Apple", "fruit"}}, true, 1},69 {[][]string{{"2024", "2025"}, {"1", "2"}}, false, 0},70 {[][]string{{"Only", "row"}}, true, 0},71 } {72 s := sheet.New()73 for r, row := range c.rows {74 for col, in := range row {75 s.Set(sheet.Addr{Col: col, Row: r}, in)76 }77 }78 if c.bold {79 s.SetStyle(sheet.Rect{To: sheet.Addr{Col: 1}}, func(st *sheet.Style) { st.Bold = true })80 }81 used, _ := s.UsedRange()82 if got, _ := guessHeader(s, used); got != c.want {83 t.Errorf("%v bold %v: header %d, want %d", c.rows, c.bold, got, c.want)84 }85 }86}