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)