from __future__ import annotations import importlib.util import json import sys import tempfile import unittest from pathlib import Path from build123d import Box, export_step ADAPTER_PATH = ( Path(__file__).resolve().parents[4] / "skills" / "cad-router" / "scripts" / "reconstruct_step.py" ) SPEC = importlib.util.spec_from_file_location( "cad_router_reconstruct_step", ADAPTER_PATH ) assert SPEC is not None and SPEC.loader is not None adapter = importlib.util.module_from_spec(SPEC) sys.modules[SPEC.name] = adapter SPEC.loader.exec_module(adapter) class UploadedStepRuntimeTests(unittest.TestCase): def test_uploaded_step_reconstructs_and_publishes_validated_parameter(self) -> None: with tempfile.TemporaryDirectory() as temporary: root = Path(temporary) upload_dir = root / "upload" task_dir = root / "task" upload_dir.mkdir() source = upload_dir / "box.step" export_step(Box(10, 20, 30), source) result = adapter.reconstruct_uploaded_step( source, task_dir, request="重建上传的 STEP", maximum_parameters=0, timeout_seconds=60, ) self.assertEqual("accepted", result["status"]) self.assertTrue(result["geometry_accepted"]) self.assertEqual("passed", result["brep_comparison"]["status"]) self.assertTrue( result["brep_comparison"]["hard_gate_passed"] ) self.assertEqual("brep_exact", result["quality_tier"]) self.assertTrue(Path(result["brep_report"]).is_file()) self.assertFalse( result["source_independence"][ "rebuild_command_received_teacher_path" ] ) self.assertTrue( result["source_independence"]["anti_cheat_pass"] ) self.assertIn( "failure_repair.surface_topology.bind_face_pcurves_and_group_shells", result["experience"]["methods_applied"], ) self.assertTrue(Path(result["rebuilt_step"]).is_file()) self.assertTrue(Path(result["designir"]).is_file()) self.assertFalse( (task_dir / "validation" / ".geometry-work").exists() ) self.assertFalse( (task_dir / "validation" / ".strategy-work").exists() ) strategy_report = json.loads( (task_dir / "validation" / "strategies.json").read_text( encoding="utf-8" ) ) self.assertEqual( "exact_3d_pcurve", strategy_report["selected_strategy"] ) self.assertGreaterEqual(len(strategy_report["attempts"]), 2) parameters = json.loads( Path(result["parameters"]).read_text(encoding="utf-8") ) self.assertEqual(1, parameters["parameter_count"]) self.assertEqual( "overall_scale", parameters["parameters"][0]["name"] ) geometry = json.loads( Path(result["geometry_report"]).read_text(encoding="utf-8") ) self.assertEqual(1, geometry["geometry_pass_count"]) self.assertEqual(0, geometry["geometry_fail_count"]) task_manifest = json.loads( Path(result["task_manifest"]).read_text(encoding="utf-8") ) self.assertIn( "simplecadapi_brep_compare", task_manifest["route"]["validation_adapters"], ) if __name__ == "__main__": unittest.main()