1
0
Files
PPTX/tests/integration/test_font_system.py
lanyuanxiaoyao 98098dc911 feat: 实现模板库metadata和跨域字体引用系统
实现了统一的metadata结构和字体作用域系统,支持文档和模板库之间的单向字体引用。

主要变更:
- 模板库必须包含metadata字段(包括size、fonts、fonts_default)
- 实现文档和模板库的size一致性校验
- 实现字体作用域系统(文档可引用模板库字体,反之不可)
- 实现跨域循环引用检测
- 实现fonts_default级联规则(模板库→文档→系统默认)
- 添加错误代码常量(SIZE_MISMATCH、FONT_NOT_FOUND等)
- 更新文档和开发者指南

测试覆盖:
- 新增33个测试(单元测试20个,集成测试13个)
- 所有457个测试通过

Breaking Changes:
- 模板库文件必须包含metadata字段
- 模板库metadata.size为必填字段
- 文档和模板库的size必须一致

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-05 18:12:05 +08:00

153 lines
4.1 KiB
Python
Raw Permalink 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.
"""
字体系统集成测试
本测试文件包含字体主题系统的集成测试,验证完整的工作流程:
1. 多行文本扩展属性应用
- 验证扩展属性line_spacing、space_before、space_after应用到所有段落
- 测试从 YAML 加载到渲染的完整流程
2. 模板字体继承
- 验证模板元素继承 fonts_default
- 测试内联模板的字体配置
3. 引用循环错误
- 验证循环引用在渲染时被检测并抛出错误
- 测试错误信息的准确性
测试策略:
- 使用临时 YAML 文件模拟真实场景
- 测试完整的加载 → 解析 → 渲染流程
- 验证错误处理和边界情况
注意:
- 这些测试验证字体系统与其他模块的集成
- 单元测试在 test_font_system.py 中
- 渲染器测试在 test_pptx_renderer.py 中
"""
import pytest
from pathlib import Path
from core.presentation import Presentation
from renderers.pptx_renderer import PptxGenerator
from loaders.yaml_loader import YAMLError
class TestMultilineTextExtendedProperties:
"""多行文本扩展属性应用集成测试"""
def test_multiline_text_with_extended_properties(self, tmp_path):
"""测试多行文本应用扩展属性到所有段落"""
# 创建测试 YAML 文件
yaml_content = """
metadata:
size: "16:9"
fonts:
body:
family: "Arial"
size: 18
line_spacing: 1.5
space_before: 12
space_after: 6
slides:
- elements:
- type: text
content: "第一行\\n第二行\\n第三行"
box: [1, 1, 8, 2]
font: "@body"
"""
yaml_file = tmp_path / "test.yaml"
yaml_file.write_text(yaml_content)
# 加载并渲染
pres = Presentation(yaml_file)
gen = PptxGenerator(pres.size, fonts=pres.fonts, fonts_default=pres.fonts_default)
slide_data = pres.data.get('slides', [])[0]
rendered = pres.render_slide(slide_data)
# 验证元素被正确解析
assert len(rendered['elements']) == 1
elem = rendered['elements'][0]
# YAML 会将 \n 解析为实际的换行符
assert elem.content == "第一行\n第二行\n第三行"
class TestTemplateFontInheritance:
"""模板字体继承集成测试"""
def test_template_inherits_fonts_default(self, tmp_path):
"""测试模板元素继承 fonts_default"""
# 创建测试 YAML 文件
yaml_content = """
metadata:
size: "16:9"
fonts:
body:
family: "Arial"
size: 18
color: "#333333"
fonts_default: "@body"
templates:
simple:
elements:
- type: text
content: "模板文本"
box: [1, 1, 8, 1]
slides:
- template: simple
"""
yaml_file = tmp_path / "test.yaml"
yaml_file.write_text(yaml_content)
# 加载并渲染
pres = Presentation(yaml_file)
gen = PptxGenerator(pres.size, fonts=pres.fonts, fonts_default=pres.fonts_default)
slide_data = pres.data.get('slides', [])[0]
rendered = pres.render_slide(slide_data)
# 验证模板元素被渲染
assert len(rendered['elements']) == 1
class TestCircularReferenceError:
"""引用循环错误集成测试"""
def test_circular_reference_in_yaml_raises_error(self, tmp_path):
"""测试 YAML 中的循环引用抛出错误"""
# 创建包含循环引用的 YAML 文件
yaml_content = """
metadata:
size: "16:9"
fonts:
a:
parent: "@b"
size: 44
b:
parent: "@a"
size: 18
slides:
- elements:
- type: text
content: "测试"
box: [1, 1, 8, 1]
font: "@a"
"""
yaml_file = tmp_path / "test.yaml"
yaml_file.write_text(yaml_content)
# 加载演示文稿
pres = Presentation(yaml_file)
gen = PptxGenerator(pres.size, fonts=pres.fonts, fonts_default=pres.fonts_default)
slide_data = pres.data.get('slides', [])[0]
# 渲染时应该抛出循环引用错误(包装为 YAMLError
with pytest.raises(YAMLError, match="字体解析失败.*检测到字体引用循环"):
rendered = pres.render_slide(slide_data)