Files
cadSet/SimpleCADAPI/test/test_solidworks_translator.py

98 lines
3.8 KiB
Python

"""Host-independent tests for the SolidWorks translator backend."""
from __future__ import annotations
import importlib
import sys
import unittest
import simplecadapi as scad
from simplecadapi import GraphSession
from simplecadapi.translator.errors import TranslationRequestError
def _rectangle_extrusion_model() -> str:
with GraphSession() as session:
profile = scad.make_rectangle_rface(width=2.0, height=1.0)
scad.extrude_rsolid(
profile=profile,
direction=(0.0, 0.0, 1.0),
distance=3.0,
)
return scad.export_model_json(session=session)
class TestSolidWorksTranslator(unittest.TestCase):
def test_backend_imports_without_target_runtime_modules(self):
before = set(sys.modules)
solidworks = importlib.import_module(
"simplecadapi.translator.solidworks_translator"
)
self.assertNotIn("pythoncom", set(sys.modules) - before)
self.assertNotIn("win32com.client", set(sys.modules) - before)
self.assertEqual(solidworks.CAPABILITIES.backend_id, "solidworks")
def test_supported_graph_emits_deterministic_compilable_script(self):
model_json = _rectangle_extrusion_model()
from simplecadapi.translator.solidworks_translator import SolidWorksTranslator
translator = SolidWorksTranslator(document_name="ContractSolidWorks")
first = translator.translate_model_json(model_json)
second = translator.translate_model_json(model_json)
self.assertEqual(first.content, second.content)
compile(first.content, "<solidworks-script>", "exec")
self.assertFalse(first.metadata["target_runtime_validated"])
self.assertTrue(translator.capabilities.targets[0].requires_external_runtime)
def test_fallback_scripts_are_deterministic(self):
with GraphSession() as session:
profile = scad.make_rectangle_rface(3.0, 3.0)
solid = scad.extrude_rsolid(profile, (0.0, 0.0, 1.0), 3.0)
scad.fillet_rsolid(solid, [solid.get_edges(0)], 0.2)
model_json = scad.export_model_json(session)
from simplecadapi.translator.solidworks_translator import SolidWorksTranslator
translator = SolidWorksTranslator(source_kernel_fallback=True)
first = translator.translate_model_json(model_json).content
second = translator.translate_model_json(model_json).content
self.assertEqual(first, second)
compile(first, "<solidworks-fallback-script>", "exec")
def test_script_owns_com_and_only_its_created_document(self):
from simplecadapi.translator.solidworks_translator import SolidWorksTranslator
script = (
SolidWorksTranslator(visible=True)
.translate_model_json(_rectangle_extrusion_model())
.content
)
main_offset = script.index("def main():")
coinit_offset = script.index("pythoncom.CoInitialize()", main_offset)
runtime_offset = script.index(
"runtime = SimpleCADSolidWorksRuntime", main_offset
)
self.assertLess(coinit_offset, runtime_offset)
self.assertEqual(script.count("pythoncom.CoInitialize()"), 1)
self.assertIn("self.sw.CloseDoc(str(_maybe_call(self.model.GetTitle)))", script)
self.assertIn("if not self.visible:", script)
self.assertIn("self.sw.ExitApp()", script)
def test_unsupported_result_operation_is_rejected_before_host_execution(self):
with GraphSession() as session:
scad.make_box_rsolid(width=1.0, height=2.0, depth=3.0)
from simplecadapi.translator.solidworks_translator import SolidWorksTranslator
with self.assertRaises(TranslationRequestError):
SolidWorksTranslator().translate_model_json(scad.export_model_json(session))
if __name__ == "__main__":
unittest.main()