feat: preserve flatness suite measurement outputs
This commit is contained in:
96
server/plugins/adapters/test_flatness_suite_retention.py
Normal file
96
server/plugins/adapters/test_flatness_suite_retention.py
Normal file
@@ -0,0 +1,96 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user