""" 字体系统集成测试 本测试文件包含字体主题系统的集成测试,验证完整的工作流程: 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)