97 lines
3.7 KiB
Python
97 lines
3.7 KiB
Python
from pathlib import Path
|
|
from tempfile import TemporaryDirectory
|
|
from unittest import TestCase
|
|
|
|
from flatness_suite_run import _cleanup_temporary_artifacts, _config_bool
|
|
from flatness_suite_measurements import (
|
|
measurements_from_batch_result,
|
|
read_legacy_batch_rows,
|
|
)
|
|
|
|
|
|
TEMPLATE = (
|
|
Path(__file__).parents[3]
|
|
/ "alg"
|
|
/ "平整度、平面度、轮廓测量v1.5"
|
|
/ "excel"
|
|
/ "测量结果.xlsx"
|
|
)
|
|
|
|
|
|
class FlatnessSuiteRetentionConfigTest(TestCase):
|
|
def test_combined_contour_defaults_to_disabled(self) -> None:
|
|
self.assertFalse(_config_bool({}, "keepCombinedContour", False))
|
|
|
|
def test_explicit_boolean_or_string_can_enable_retention(self) -> None:
|
|
self.assertTrue(_config_bool({"keepCombinedContour": True}, "keepCombinedContour"))
|
|
self.assertTrue(_config_bool({"keepCombinedContour": "true"}, "keepCombinedContour"))
|
|
self.assertFalse(_config_bool({"keepCombinedContour": "false"}, "keepCombinedContour"))
|
|
|
|
def test_cleanup_removes_only_known_temporary_artifacts(self) -> None:
|
|
with TemporaryDirectory() as temp:
|
|
out_dir = Path(temp)
|
|
temporary = out_dir / "_roi_cropped.ply"
|
|
result = out_dir / "contour.ply"
|
|
temporary.touch()
|
|
result.touch()
|
|
|
|
_cleanup_temporary_artifacts(out_dir)
|
|
|
|
self.assertFalse(temporary.exists())
|
|
self.assertTrue(result.exists())
|
|
|
|
|
|
class FlatnessSuiteBatchMeasurementTest(TestCase):
|
|
def test_uses_top_level_rows_instead_of_nested_sample_results(self) -> None:
|
|
result = {
|
|
"rows": [{"task_id": "11", "mean": 1.25, "status": "成功"}],
|
|
"results": {
|
|
"11": {
|
|
"11": {"distance_stats": {"mean": 999}},
|
|
},
|
|
},
|
|
}
|
|
|
|
measurements = measurements_from_batch_result(result, TEMPLATE)
|
|
|
|
self.assertEqual(len(measurements), 1)
|
|
self.assertEqual(measurements[0]["name"], "任务11 · 车钩面板的平整度")
|
|
self.assertEqual(measurements[0]["value"], 1.25)
|
|
self.assertEqual(measurements[0]["toleranceLabel"], "0.5mm")
|
|
|
|
def test_maps_success_partial_success_failure_and_empty_value(self) -> None:
|
|
result = {
|
|
"rows": [
|
|
{"task_id": 11, "mean": 0.1, "status": "成功"},
|
|
{"task_id": 13, "mean": 0.2, "status": "部分成功"},
|
|
{"task_id": 17, "mean": None, "status": "失败"},
|
|
],
|
|
"results": {},
|
|
}
|
|
|
|
measurements = measurements_from_batch_result(result, TEMPLATE)
|
|
|
|
self.assertEqual([item["status"] for item in measurements], ["pass", "warning", "fail"])
|
|
self.assertEqual(measurements[0]["passLabel"], "成功")
|
|
self.assertEqual(measurements[1]["warningLabel"], "部分成功")
|
|
self.assertEqual(measurements[2]["failLabel"], "失败")
|
|
self.assertIsNone(measurements[2]["value"])
|
|
|
|
def test_missing_template_has_explicit_error(self) -> None:
|
|
with self.assertRaisesRegex(FileNotFoundError, "Excel 文件不存在"):
|
|
measurements_from_batch_result(
|
|
{"rows": [{"task_id": 11, "mean": 0.1, "status": "成功"}]},
|
|
Path("missing-template.xlsx"),
|
|
)
|
|
|
|
def test_new_template_is_not_misread_as_legacy_summary(self) -> None:
|
|
with self.assertRaisesRegex(ValueError, "平均值"):
|
|
read_legacy_batch_rows(TEMPLATE)
|
|
|
|
def test_malformed_excel_has_explicit_error(self) -> None:
|
|
with TemporaryDirectory() as temp:
|
|
invalid = Path(temp) / "contour.xlsx"
|
|
invalid.write_text("not an xlsx", encoding="utf-8")
|
|
with self.assertRaisesRegex(ValueError, "无法解析 Excel"):
|
|
read_legacy_batch_rows(invalid)
|