| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- """Exercise the relocated Office payload with its own isolated interpreter."""
- import importlib.metadata
- import json
- from pathlib import Path
- import re
- import subprocess
- import sys
- import tempfile
- import numpy
- import pandas
- from docx import Document
- from docx.shared import Inches as DocxInches
- from openpyxl import Workbook, load_workbook
- from openpyxl.styles import Font
- from PIL import Image
- from pptx import Presentation
- from pptx.chart.data import CategoryChartData
- from pptx.enum.chart import XL_CHART_TYPE
- from pptx.util import Inches
- def main():
- """Check installed versions and read back editable Office documents."""
- assert sys.version_info[:3] == tuple(map(int, sys.argv[2].split("."))), sys.version
- versions = json.loads(sys.argv[1])
- # Only pip belongs to the interpreter baseline; all other distributions must be declared.
- # Each target's native release-host smoke must confirm this baseline.
- expected_names = {re.sub(r"[-_.]+", "-", name).lower() for name in versions} | {"pip"}
- installed_names = {
- re.sub(r"[-_.]+", "-", distribution.metadata["Name"]).lower()
- for distribution in importlib.metadata.distributions()
- }
- assert installed_names == expected_names, {"unexpected": sorted(installed_names - expected_names), "missing": sorted(expected_names - installed_names)}
- for name, expected in versions.items():
- actual = importlib.metadata.version(name)
- assert actual == expected, (name, actual, expected)
- assert numpy.arange(4).sum() == 6
- assert pandas.DataFrame({"n": [1, 2]}).n.sum() == 3
- with tempfile.TemporaryDirectory(prefix="dsh-office-smoke-") as directory:
- root = Path(directory)
- image = root / "chart.png"
- Image.new("RGB", (80, 40), "#2878bc").save(image)
- with Image.open(image) as restored:
- assert restored.size == (80, 40)
- document = Document()
- document.add_heading("Office 文档", 0)
- document.add_paragraph("Editable text")
- document.add_table(rows=2, cols=2).cell(1, 1).text = "42"
- document.add_picture(str(image), width=DocxInches(1))
- document.save(root / "document.docx")
- reopened_document = Document(root / "document.docx")
- assert reopened_document.tables[0].cell(1, 1).text == "42"
- assert reopened_document.paragraphs[0].text == "Office 文档"
- presentation = Presentation()
- slide = presentation.slides.add_slide(presentation.slide_layouts[6])
- slide.shapes.add_textbox(Inches(1), Inches(1), Inches(4), Inches(1)).text = "Office 演示"
- slide.shapes.add_picture(str(image), Inches(1), Inches(2))
- chart_data = CategoryChartData()
- chart_data.categories = ["A", "B"]
- chart_data.add_series("Values", [2, 4])
- slide.shapes.add_chart(XL_CHART_TYPE.COLUMN_CLUSTERED, Inches(3), Inches(2), Inches(4), Inches(3), chart_data)
- presentation.save(root / "presentation.pptx")
- reopened_presentation = Presentation(root / "presentation.pptx")
- assert len(reopened_presentation.slides) == 1
- chart = next(shape.chart for shape in reopened_presentation.slides[0].shapes if shape.has_chart)
- assert list(chart.series[0].values) == [2.0, 4.0]
- workbook = Workbook()
- sheet = workbook.active
- sheet.append(["Value", "Formula"])
- sheet.append([42, "=A2*2"])
- sheet["A1"].font = Font(bold=True)
- workbook.save(root / "workbook.xlsx")
- reopened_workbook = load_workbook(root / "workbook.xlsx")
- try:
- assert reopened_workbook.active["A2"].value == 42
- assert reopened_workbook.active["B2"].value == "=A2*2"
- assert reopened_workbook.active["A1"].font.bold
- finally:
- reopened_workbook.close()
- assert pandas.read_excel(root / "workbook.xlsx")["Value"].iloc[0] == 42
- for file, arguments in [
- ("document.docx", ["--contains", "Office 文档"]),
- ("presentation.pptx", ["--contains", "Office 演示", "--count", "1"]),
- ("workbook.xlsx", ["--contains", "Value", "--count", "1"]),
- ]:
- checked = subprocess.run([sys.executable, "-I", "-B", sys.argv[3], str(root / file), *arguments],
- check=False, capture_output=True, text=True, timeout=30)
- assert checked.returncode == 0 and json.loads(checked.stdout)["verdict"] == "pass", checked.stdout + checked.stderr
- print("Office runtime versions and document round trips passed.")
- if __name__ == "__main__":
- main()
|