160 lines
3.1 KiB
Go
160 lines
3.1 KiB
Go
package document
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"apigo.cc/go/cast"
|
|
"apigo.cc/go/file"
|
|
)
|
|
|
|
func TestExcel_Basic(t *testing.T) {
|
|
filename := "test_basic.xlsx"
|
|
defer file.Remove(filename)
|
|
|
|
xls := NewExcel()
|
|
table := [][]any{
|
|
{"Name", "Age", "City"},
|
|
{"Alice", 25, "New York"},
|
|
{"Bob", 30, "London"},
|
|
}
|
|
|
|
err := xls.Set("Sheet1", table, "A1", "")
|
|
if err != nil {
|
|
t.Fatalf("Set failed: %v", err)
|
|
}
|
|
|
|
err = xls.Save(filename)
|
|
if err != nil {
|
|
t.Fatalf("Save failed: %v", err)
|
|
}
|
|
|
|
doc2, err := Open(filename)
|
|
if err != nil {
|
|
t.Fatalf("Open failed: %v", err)
|
|
}
|
|
xls2 := doc2.(*Excel)
|
|
|
|
data, err := xls2.Get("Sheet1", "A1", "C3")
|
|
if err != nil {
|
|
t.Fatalf("Get failed: %v", err)
|
|
}
|
|
|
|
if len(data) != 3 || len(data[1]) != 3 {
|
|
t.Errorf("Unexpected data length: %v", data)
|
|
}
|
|
|
|
if cast.To[string](data[1][0]) != "Alice" {
|
|
t.Errorf("Expected Alice, got %v", data[1][0])
|
|
}
|
|
}
|
|
|
|
func TestExcel_Data(t *testing.T) {
|
|
filename := "test_data.xlsx"
|
|
defer file.Remove(filename)
|
|
|
|
xls := NewExcel()
|
|
data := []map[string]any{
|
|
{"ID": 1, "Value": "A"},
|
|
{"ID": 2, "Value": "B"},
|
|
}
|
|
|
|
err := xls.SetData("Data", data, "A1", "")
|
|
if err != nil {
|
|
t.Fatalf("SetData failed: %v", err)
|
|
}
|
|
|
|
err = xls.Save(filename)
|
|
if err != nil {
|
|
t.Fatalf("Save failed: %v", err)
|
|
}
|
|
|
|
doc2, err := Open(filename)
|
|
if err != nil {
|
|
t.Fatalf("Open failed: %v", err)
|
|
}
|
|
xls2 := doc2.(*Excel)
|
|
|
|
readData, err := xls2.GetData("Data", "A1", "")
|
|
if err != nil {
|
|
t.Fatalf("GetData failed: %v", err)
|
|
}
|
|
|
|
if len(readData) != 2 {
|
|
t.Errorf("Expected 2 rows, got %d", len(readData))
|
|
}
|
|
|
|
if cast.To[string](readData[0]["Value"]) != "A" {
|
|
t.Errorf("Expected A, got %v", readData[0]["Value"])
|
|
}
|
|
}
|
|
|
|
func TestUnifiedAPI(t *testing.T) {
|
|
// Test Excel with Unified API
|
|
filename := "test_unified.xlsx"
|
|
defer file.Remove(filename)
|
|
|
|
doc, err := Open(filename)
|
|
if err != nil {
|
|
t.Fatalf("Open failed: %v", err)
|
|
}
|
|
|
|
if xls, ok := doc.(*Excel); ok {
|
|
xls.SetData("Sheet1", []map[string]any{{"Name": "Unified", "Value": 100}}, "A1", "")
|
|
}
|
|
|
|
err = doc.Save()
|
|
if err != nil {
|
|
t.Fatalf("Save failed: %v", err)
|
|
}
|
|
|
|
// Verify JSON/Markdown
|
|
jsonStr := doc.ToJSON()
|
|
if !strings.Contains(jsonStr, "Unified") {
|
|
t.Errorf("ToJSON failed: %s", jsonStr)
|
|
}
|
|
|
|
mdStr := doc.ToMarkdown()
|
|
if !strings.Contains(mdStr, "Unified") {
|
|
t.Errorf("ToMarkdown failed: %s", mdStr)
|
|
}
|
|
}
|
|
|
|
func TestIDGeneration(t *testing.T) {
|
|
tests := []struct {
|
|
col, row int
|
|
expected string
|
|
}{
|
|
{0, 0, "A1"},
|
|
{25, 0, "Z1"},
|
|
{26, 0, "AA1"},
|
|
{0, 9, "A10"},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
got := MakeCellID(tt.col, tt.row)
|
|
if got != tt.expected {
|
|
t.Errorf("MakeCellID(%d, %d) = %s; want %s", tt.col, tt.row, got, tt.expected)
|
|
}
|
|
|
|
c, r := ParseCellID(tt.expected)
|
|
if c != tt.col || r != tt.row {
|
|
t.Errorf("ParseCellID(%s) = (%d, %d); want (%d, %d)", tt.expected, c, r, tt.col, tt.row)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Helper for test assertions
|
|
func BenchmarkExcel_SetData(b *testing.B) {
|
|
xls := NewExcel()
|
|
data := make([]map[string]any, 100)
|
|
for i := 0; i < 100; i++ {
|
|
data[i] = map[string]any{"ID": i, "Name": "User", "Value": i * 10}
|
|
}
|
|
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
_ = xls.SetData("Bench", data, "A1", "")
|
|
}
|
|
}
|