252 lines
5.4 KiB
Go
252 lines
5.4 KiB
Go
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"os"
|
||
"testing"
|
||
)
|
||
|
||
func TestNewXLSXReader(t *testing.T) {
|
||
testFile := "yst郑州惠兴财务报表2021(3).xlsx"
|
||
|
||
if _, err := os.Stat(testFile); os.IsNotExist(err) {
|
||
t.Skip("测试文件不存在,跳过测试")
|
||
}
|
||
|
||
reader, err := NewXLSXReader(testFile)
|
||
if err != nil {
|
||
t.Fatalf("创建XLSX读取器失败: %v", err)
|
||
}
|
||
|
||
if reader.files == nil {
|
||
t.Error("文件映射为空")
|
||
}
|
||
|
||
t.Logf("成功读取 %d 个文件", len(reader.files))
|
||
}
|
||
|
||
func TestGetSheetNames(t *testing.T) {
|
||
testFile := "yst郑州惠兴财务报表2021(3).xlsx"
|
||
|
||
if _, err := os.Stat(testFile); os.IsNotExist(err) {
|
||
t.Skip("测试文件不存在,跳过测试")
|
||
}
|
||
|
||
reader, err := NewXLSXReader(testFile)
|
||
if err != nil {
|
||
t.Fatalf("创建XLSX读取器失败: %v", err)
|
||
}
|
||
|
||
sheets, err := reader.GetSheetNames()
|
||
if err != nil {
|
||
t.Fatalf("获取工作表名称失败: %v", err)
|
||
}
|
||
|
||
t.Logf("工作表列表: %v", sheets)
|
||
|
||
if len(sheets) == 0 {
|
||
t.Error("未找到任何工作表")
|
||
}
|
||
}
|
||
|
||
func TestGetSheetData(t *testing.T) {
|
||
testFile := "yst郑州惠兴财务报表2021(3).xlsx"
|
||
|
||
if _, err := os.Stat(testFile); os.IsNotExist(err) {
|
||
t.Skip("测试文件不存在,跳过测试")
|
||
}
|
||
|
||
reader, err := NewXLSXReader(testFile)
|
||
if err != nil {
|
||
t.Fatalf("创建XLSX读取器失败: %v", err)
|
||
}
|
||
|
||
sheets, err := reader.GetSheetNames()
|
||
if err != nil || len(sheets) == 0 {
|
||
t.Skip("未找到工作表,跳过测试")
|
||
}
|
||
|
||
targetSheet := ""
|
||
for _, sheet := range sheets {
|
||
if sheet == "资产负债表" || sheet == "利润表" || sheet == "现金流量表" {
|
||
targetSheet = sheet
|
||
break
|
||
}
|
||
}
|
||
|
||
if targetSheet == "" {
|
||
targetSheet = sheets[0]
|
||
}
|
||
|
||
data, err := reader.GetSheetData(targetSheet)
|
||
if err != nil {
|
||
t.Fatalf("获取工作表数据失败: %v", err)
|
||
}
|
||
|
||
t.Logf("工作表 %s 有 %d 行数据", targetSheet, len(data))
|
||
|
||
if len(data) == 0 {
|
||
t.Error("工作表数据为空")
|
||
} else {
|
||
t.Logf("第一行数据: %v", data[0])
|
||
}
|
||
}
|
||
|
||
func TestGetCellValue(t *testing.T) {
|
||
testFile := "yst郑州惠兴财务报表2021(3).xlsx"
|
||
|
||
if _, err := os.Stat(testFile); os.IsNotExist(err) {
|
||
t.Skip("测试文件不存在,跳过测试")
|
||
}
|
||
|
||
reader, err := NewXLSXReader(testFile)
|
||
if err != nil {
|
||
t.Fatalf("创建XLSX读取器失败: %v", err)
|
||
}
|
||
|
||
sheets, err := reader.GetSheetNames()
|
||
if err != nil || len(sheets) == 0 {
|
||
t.Skip("未找到工作表,跳过测试")
|
||
}
|
||
|
||
value, err := reader.GetCellValue(sheets[0], "A1")
|
||
if err != nil {
|
||
t.Fatalf("获取单元格值失败: %v", err)
|
||
}
|
||
|
||
t.Logf("单元格 A1 的值: %s", value)
|
||
}
|
||
|
||
func TestParseCellRef(t *testing.T) {
|
||
tests := []struct {
|
||
input string
|
||
wantRow int
|
||
wantCol int
|
||
}{
|
||
{"A1", 0, 0},
|
||
{"B2", 1, 1},
|
||
{"Z10", 9, 25},
|
||
{"AA1", 0, 26},
|
||
{"AB100", 99, 27},
|
||
}
|
||
|
||
for _, tt := range tests {
|
||
t.Run(tt.input, func(t *testing.T) {
|
||
row, col := parseCellRef(tt.input)
|
||
if row != tt.wantRow {
|
||
t.Errorf("parseCellRef(%q) row = %d, want %d", tt.input, row, tt.wantRow)
|
||
}
|
||
if col != tt.wantCol {
|
||
t.Errorf("parseCellRef(%q) col = %d, want %d", tt.input, col, tt.wantCol)
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
func TestParseFinancialValue(t *testing.T) {
|
||
tests := []struct {
|
||
input string
|
||
want float64
|
||
wantErr bool
|
||
}{
|
||
{"100", 100, false},
|
||
{"100.5", 100.5, false},
|
||
{"100万", 1000000, false},
|
||
{"100.5万", 1005000, false},
|
||
{"1,234.56万", 12345600, false},
|
||
{"-", 0, false},
|
||
{"", 0, false},
|
||
{"无", 0, false},
|
||
{"100元", 100, false},
|
||
{"100万元", 1000000, false},
|
||
}
|
||
|
||
for _, tt := range tests {
|
||
t.Run(fmt.Sprintf("%q", tt.input), func(t *testing.T) {
|
||
got, err := parseFinancialValue(tt.input)
|
||
if (err != nil) != tt.wantErr {
|
||
t.Errorf("parseFinancialValue(%q) error = %v, wantErr %v", tt.input, err, tt.wantErr)
|
||
return
|
||
}
|
||
if got != tt.want {
|
||
t.Errorf("parseFinancialValue(%q) = %v, want %v", tt.input, got, tt.want)
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
func TestExtractFinancialDataPureGo(t *testing.T) {
|
||
testFile := "yst郑州惠兴财务报表2021(3).xlsx"
|
||
|
||
if _, err := os.Stat(testFile); os.IsNotExist(err) {
|
||
t.Skip("测试文件不存在,跳过测试")
|
||
}
|
||
|
||
reader, err := NewXLSXReader(testFile)
|
||
if err != nil {
|
||
t.Fatalf("创建XLSX读取器失败: %v", err)
|
||
}
|
||
|
||
sheets, err := reader.GetSheetNames()
|
||
if err != nil || len(sheets) == 0 {
|
||
t.Skip("未找到工作表,跳过测试")
|
||
}
|
||
|
||
var targetSheet string
|
||
for _, sheet := range sheets {
|
||
if sheet == "资产负债表" {
|
||
targetSheet = sheet
|
||
break
|
||
}
|
||
}
|
||
|
||
if targetSheet == "" {
|
||
t.Skip("未找到资产负债表,跳过测试")
|
||
}
|
||
|
||
data, err := reader.GetSheetData(targetSheet)
|
||
if err != nil {
|
||
t.Fatalf("获取工作表数据失败: %v", err)
|
||
}
|
||
|
||
if len(data) > 0 && len(data[0]) > 0 {
|
||
t.Logf("成功读取工作表 %s,共 %d 行", targetSheet, len(data))
|
||
t.Logf("表头: %v", data[0])
|
||
}
|
||
}
|
||
|
||
func BenchmarkXLSXReader(b *testing.B) {
|
||
testFile := "yst郑州惠兴财务报表2021(3).xlsx"
|
||
|
||
if _, err := os.Stat(testFile); os.IsNotExist(err) {
|
||
b.Skip("测试文件不存在")
|
||
}
|
||
|
||
b.ResetTimer()
|
||
for i := 0; i < b.N; i++ {
|
||
reader, _ := NewXLSXReader(testFile)
|
||
if reader != nil {
|
||
reader.GetSheetNames()
|
||
}
|
||
}
|
||
}
|
||
|
||
func BenchmarkGetSheetData(b *testing.B) {
|
||
testFile := "yst郑州惠兴财务报表2021(3).xlsx"
|
||
|
||
if _, err := os.Stat(testFile); os.IsNotExist(err) {
|
||
b.Skip("测试文件不存在")
|
||
}
|
||
|
||
reader, _ := NewXLSXReader(testFile)
|
||
sheets, _ := reader.GetSheetNames()
|
||
if len(sheets) == 0 {
|
||
b.Skip("未找到工作表")
|
||
}
|
||
|
||
b.ResetTimer()
|
||
for i := 0; i < b.N; i++ {
|
||
reader.GetSheetData(sheets[0])
|
||
}
|
||
}
|