Files
wordZero/test/template_inheritance_test.go
zero 3114980412 - 增加基准测试
- 修复模板继承问题
- 优化wiki文档
2025-06-02 15:00:06 +08:00

464 lines
11 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Package test 模板继承功能测试
package test
import (
"os"
"testing"
"github.com/ZeroHawkeye/wordZero/pkg/document"
)
// TestTemplateInheritanceComplete 完整的模板继承测试
func TestTemplateInheritanceComplete(t *testing.T) {
// 确保输出目录存在
outputDir := "output"
if _, err := os.Stat(outputDir); os.IsNotExist(err) {
err = os.Mkdir(outputDir, 0755)
if err != nil {
t.Fatalf("Failed to create output directory: %v", err)
}
}
engine := document.NewTemplateEngine()
// 测试1: 基础模板继承
t.Run("基础模板继承", func(t *testing.T) {
testBasicInheritance(t, engine)
})
// 测试2: 块重写功能
t.Run("块重写功能", func(t *testing.T) {
testBlockOverride(t, engine)
})
// 测试3: 多级继承
t.Run("多级继承", func(t *testing.T) {
testMultiLevelInheritance(t, engine)
})
// 测试4: 块默认内容
t.Run("块默认内容", func(t *testing.T) {
testBlockDefaultContent(t, engine)
})
}
// testBasicInheritance 测试基础模板继承功能
func testBasicInheritance(t *testing.T, engine *document.TemplateEngine) {
// 创建基础模板
baseTemplate := `{{companyName}} 官方文档
版本:{{version}}
创建时间:{{createTime}}
{{#block "content"}}
默认内容区域
{{/block}}
{{#block "footer"}}
版权所有 © {{year}} {{companyName}}
{{/block}}`
_, err := engine.LoadTemplate("base", baseTemplate)
if err != nil {
t.Fatalf("Failed to load base template: %v", err)
}
// 创建子模板
childTemplate := `{{extends "base"}}
{{#block "content"}}
用户手册
第一章:快速开始
欢迎使用我们的产品!
第二章:功能介绍
详细的功能说明...
{{/block}}`
_, err = engine.LoadTemplate("user_manual", childTemplate)
if err != nil {
t.Fatalf("Failed to load child template: %v", err)
}
// 准备数据
data := document.NewTemplateData()
data.SetVariable("companyName", "WordZero科技")
data.SetVariable("version", "v1.0.0")
data.SetVariable("createTime", "2024-12-01")
data.SetVariable("year", "2024")
// 渲染模板
doc, err := engine.RenderToDocument("user_manual", data)
if err != nil {
t.Fatalf("Failed to render template: %v", err)
}
// 保存文档
err = doc.Save("output/test_basic_inheritance.docx")
if err != nil {
t.Fatalf("Failed to save document: %v", err)
}
// 验证文档内容
if len(doc.Body.Elements) == 0 {
t.Error("Expected document to have content")
}
}
// testBlockOverride 测试块重写功能
func testBlockOverride(t *testing.T, engine *document.TemplateEngine) {
// 创建基础模板
baseTemplate := `企业报告模板
{{#block "header"}}
标准报告头部
{{/block}}
{{#block "main_content"}}
标准内容区域
{{/block}}
{{#block "sidebar"}}
标准侧边栏
{{/block}}
{{#block "footer"}}
标准页脚
{{/block}}`
_, err := engine.LoadTemplate("report_base", baseTemplate)
if err != nil {
t.Fatalf("Failed to load base template: %v", err)
}
// 创建特定报告模板,重写部分块
salesReportTemplate := `{{extends "report_base"}}
{{#block "header"}}
销售业绩报告
报告期间:{{reportPeriod}}
{{/block}}
{{#block "main_content"}}
销售数据分析
总销售额:{{totalSales}}
增长率:{{growthRate}}%
{{#each regions}}
- {{name}}: {{sales}}
{{/each}}
{{/block}}
{{#block "sidebar"}}
快速统计
- 新客户:{{newCustomers}}
- 回头客:{{returningCustomers}}
- 平均订单:{{averageOrder}}
{{/block}}`
_, err = engine.LoadTemplate("sales_report", salesReportTemplate)
if err != nil {
t.Fatalf("Failed to load sales report template: %v", err)
}
// 准备数据
data := document.NewTemplateData()
data.SetVariable("reportPeriod", "2024年11月")
data.SetVariable("totalSales", "1,250,000")
data.SetVariable("growthRate", "15.8")
data.SetVariable("newCustomers", "158")
data.SetVariable("returningCustomers", "432")
data.SetVariable("averageOrder", "2,890")
regions := []interface{}{
map[string]interface{}{"name": "华东区", "sales": "450,000"},
map[string]interface{}{"name": "华北区", "sales": "380,000"},
map[string]interface{}{"name": "华南区", "sales": "420,000"},
}
data.SetList("regions", regions)
// 渲染模板
doc, err := engine.RenderToDocument("sales_report", data)
if err != nil {
t.Fatalf("Failed to render template: %v", err)
}
// 保存文档
err = doc.Save("output/test_block_override.docx")
if err != nil {
t.Fatalf("Failed to save document: %v", err)
}
// 验证文档内容
if len(doc.Body.Elements) == 0 {
t.Error("Expected document to have content")
}
}
// testMultiLevelInheritance 测试多级继承
func testMultiLevelInheritance(t *testing.T, engine *document.TemplateEngine) {
// 第一级:基础文档模板
baseDocTemplate := `{{#block "document_header"}}
文档标题:{{title}}
{{/block}}
{{#block "main_body"}}
主要内容区域
{{/block}}
{{#block "document_footer"}}
页脚信息
{{/block}}`
_, err := engine.LoadTemplate("base_doc", baseDocTemplate)
if err != nil {
t.Fatalf("Failed to load base doc template: %v", err)
}
// 第二级:技术文档模板
techDocTemplate := `{{extends "base_doc"}}
{{#block "document_header"}}
技术文档:{{title}}
版本:{{version}}
作者:{{author}}
{{/block}}
{{#block "main_body"}}
{{#block "abstract"}}
文档摘要
{{/block}}
{{#block "technical_content"}}
技术内容
{{/block}}
{{#block "references"}}
参考资料
{{/block}}
{{/block}}`
_, err = engine.LoadTemplate("tech_doc", techDocTemplate)
if err != nil {
t.Fatalf("Failed to load tech doc template: %v", err)
}
// 第三级API文档模板
apiDocTemplate := `{{extends "tech_doc"}}
{{#block "abstract"}}
API接口文档摘要
本文档描述了{{apiName}}的使用方法和接口规范。
{{/block}}
{{#block "technical_content"}}
API接口列表
{{#each endpoints}}
### {{method}} {{path}}
描述:{{description}}
参数:{{parameters}}
{{/each}}
{{/block}}
{{#block "references"}}
相关文档:
- API设计规范
- 认证机制说明
- 错误码参考
{{/block}}`
_, err = engine.LoadTemplate("api_doc", apiDocTemplate)
if err != nil {
t.Fatalf("Failed to load API doc template: %v", err)
}
// 准备数据
data := document.NewTemplateData()
data.SetVariable("title", "WordZero API文档")
data.SetVariable("version", "v2.1.0")
data.SetVariable("author", "技术团队")
data.SetVariable("apiName", "WordZero API")
endpoints := []interface{}{
map[string]interface{}{
"method": "POST",
"path": "/api/documents",
"description": "创建新文档",
"parameters": "title, content, format",
},
map[string]interface{}{
"method": "GET",
"path": "/api/documents/{id}",
"description": "获取文档详情",
"parameters": "id (路径参数)",
},
}
data.SetList("endpoints", endpoints)
// 渲染模板
doc, err := engine.RenderToDocument("api_doc", data)
if err != nil {
t.Fatalf("Failed to render template: %v", err)
}
// 保存文档
err = doc.Save("output/test_multi_level_inheritance.docx")
if err != nil {
t.Fatalf("Failed to save document: %v", err)
}
// 验证文档内容
if len(doc.Body.Elements) == 0 {
t.Error("Expected document to have content")
}
}
// testBlockDefaultContent 测试块默认内容
func testBlockDefaultContent(t *testing.T, engine *document.TemplateEngine) {
// 创建有默认内容的基础模板
baseTemplate := `产品文档
{{#block "intro"}}
默认介绍内容
这是产品的基本介绍。
{{/block}}
{{#block "features"}}
默认功能列表
- 基础功能1
- 基础功能2
{{/block}}
{{#block "contact"}}
默认联系方式
邮箱default@example.com
电话000-0000-0000
{{/block}}`
_, err := engine.LoadTemplate("product_base", baseTemplate)
if err != nil {
t.Fatalf("Failed to load base template: %v", err)
}
// 创建子模板,只重写部分块
productTemplate := `{{extends "product_base"}}
{{#block "intro"}}
WordZero产品介绍
WordZero是一个强大的Word文档处理库。
{{/block}}
{{#block "features"}}
WordZero功能特性
- 文档创建和编辑
- 模板渲染
- 表格处理
- 图片插入
- 样式管理
{{/block}}`
_, err = engine.LoadTemplate("wordzero_product", productTemplate)
if err != nil {
t.Fatalf("Failed to load product template: %v", err)
}
// 准备数据
data := document.NewTemplateData()
// 渲染模板
doc, err := engine.RenderToDocument("wordzero_product", data)
if err != nil {
t.Fatalf("Failed to render template: %v", err)
}
// 保存文档
err = doc.Save("output/test_block_default_content.docx")
if err != nil {
t.Fatalf("Failed to save document: %v", err)
}
// 验证文档内容
if len(doc.Body.Elements) == 0 {
t.Error("Expected document to have content")
}
// 验证默认内容保持不变contact块应该使用默认内容
// 这里我们可以通过渲染的内容来验证
renderedContent, err := engine.GetTemplate("wordzero_product")
if err != nil {
t.Fatalf("Failed to get template: %v", err)
}
// 验证模板结构
if renderedContent.Parent == nil {
t.Error("Expected template to have parent")
}
if len(renderedContent.DefinedBlocks) != 2 {
t.Errorf("Expected 2 defined blocks, got %d", len(renderedContent.DefinedBlocks))
}
}
// TestTemplateInheritanceValidation 测试模板继承验证
func TestTemplateInheritanceValidation(t *testing.T) {
engine := document.NewTemplateEngine()
// 测试块语法验证
t.Run("块语法验证", func(t *testing.T) {
// 正确的块语法
validTemplate := `{{#block "test"}}内容{{/block}}`
template, err := engine.LoadTemplate("valid_block", validTemplate)
if err != nil {
t.Fatalf("Failed to load valid template: %v", err)
}
err = engine.ValidateTemplate(template)
if err != nil {
t.Errorf("Valid template should pass validation: %v", err)
}
// 错误的块语法 - 缺少结束标签
invalidTemplate := `{{#block "test"}}内容`
template2, err := engine.LoadTemplate("invalid_block", invalidTemplate)
if err != nil {
t.Fatalf("Failed to load invalid template: %v", err)
}
err = engine.ValidateTemplate(template2)
if err == nil {
t.Error("Invalid template should fail validation")
}
})
// 测试继承链验证
t.Run("继承链验证", func(t *testing.T) {
// 创建基础模板
baseTemplate := `{{#block "content"}}基础内容{{/block}}`
_, err := engine.LoadTemplate("inheritance_base", baseTemplate)
if err != nil {
t.Fatalf("Failed to load base template: %v", err)
}
// 创建子模板
childTemplate := `{{extends "inheritance_base"}}
{{#block "content"}}子模板内容{{/block}}`
child, err := engine.LoadTemplate("inheritance_child", childTemplate)
if err != nil {
t.Fatalf("Failed to load child template: %v", err)
}
// 验证继承关系
if child.Parent == nil {
t.Error("Child template should have parent")
}
if child.Parent.Name != "inheritance_base" {
t.Errorf("Expected parent name 'inheritance_base', got '%s'", child.Parent.Name)
}
})
}