gogcli/internal/cmd/sheets_a1_test.go
Alex Naidis 1da21969a8 feat(sheets): add named ranges support
Adds a new `sheets named-ranges` command group to list/get/add/update/delete
named ranges via Sheets batchUpdate.

Extends range handling so `sheets format` and data-validation copy can target
named ranges, improves A1 parsing for GridRange-backed operations, and includes
reviewed safety/regression updates for range resolution and SheetId force-send.
2026-03-08 02:21:07 +00:00

82 lines
2.2 KiB
Go

package cmd
import "testing"
func TestParseA1Range(t *testing.T) {
t.Run("simple", func(t *testing.T) {
r, err := parseA1Range("Sheet1!A2:B3")
if err != nil {
t.Fatalf("parseA1Range: %v", err)
}
if r.SheetName != "Sheet1" || r.StartRow != 2 || r.EndRow != 3 || r.StartCol != 1 || r.EndCol != 2 {
t.Fatalf("unexpected range: %#v", r)
}
})
t.Run("quoted sheet", func(t *testing.T) {
r, err := parseA1Range("'My Sheet'!C1:D2")
if err != nil {
t.Fatalf("parseA1Range: %v", err)
}
if r.SheetName != "My Sheet" || r.StartRow != 1 || r.EndRow != 2 || r.StartCol != 3 || r.EndCol != 4 {
t.Fatalf("unexpected range: %#v", r)
}
})
t.Run("escaped quote in sheet", func(t *testing.T) {
r, err := parseA1Range("'Bob''s Sheet'!AA10:AB11")
if err != nil {
t.Fatalf("parseA1Range: %v", err)
}
if r.SheetName != "Bob's Sheet" || r.StartRow != 10 || r.EndRow != 11 || r.StartCol != 27 || r.EndCol != 28 {
t.Fatalf("unexpected range: %#v", r)
}
})
t.Run("reordered", func(t *testing.T) {
r, err := parseA1Range("Sheet1!C3:A1")
if err != nil {
t.Fatalf("parseA1Range: %v", err)
}
if r.StartRow != 1 || r.EndRow != 3 || r.StartCol != 1 || r.EndCol != 3 {
t.Fatalf("unexpected range: %#v", r)
}
})
t.Run("invalid cell", func(t *testing.T) {
if _, err := parseA1Range("Sheet1!A"); err == nil {
t.Fatalf("expected error")
}
})
t.Run("columns", func(t *testing.T) {
r, err := parseA1Range("Sheet1!A:C")
if err != nil {
t.Fatalf("parseA1Range: %v", err)
}
if r.SheetName != "Sheet1" || r.StartCol != 1 || r.EndCol != 3 || r.StartRow != 0 || r.EndRow != 0 {
t.Fatalf("unexpected range: %#v", r)
}
})
t.Run("rows", func(t *testing.T) {
r, err := parseA1Range("Sheet1!2:10")
if err != nil {
t.Fatalf("parseA1Range: %v", err)
}
if r.SheetName != "Sheet1" || r.StartRow != 2 || r.EndRow != 10 || r.StartCol != 0 || r.EndCol != 0 {
t.Fatalf("unexpected range: %#v", r)
}
})
t.Run("open-ended rows", func(t *testing.T) {
r, err := parseA1Range("Sheet1!B5:D")
if err != nil {
t.Fatalf("parseA1Range: %v", err)
}
if r.SheetName != "Sheet1" || r.StartRow != 5 || r.EndRow != 0 || r.StartCol != 2 || r.EndCol != 4 {
t.Fatalf("unexpected range: %#v", r)
}
})
}