from __future__ import annotations import unittest from cadfs_to_cdsl.featurescript_lexer import lex from cadfs_to_cdsl.featurescript_parser import parse_featurescript from cadfs_to_cdsl.ir import Call from cadfs_to_cdsl.query_parser import parse_query from cadfs_to_cdsl.units import length_mm SOURCE = r''' FeatureScript 1511; export const f = defineFeature(function(context, id, definition) { { var Q0; Q0=qCreatedBy(makeId("Top.planeOp"), FACE); var sketch = newSketch(context, id + "F0", {"sketchPlane":qUnion([Q0])}); skCircle(sketch, "E0", {"center":v(0, 0) * mm, "radius":9.53 * mm}); skSolve(sketch); } { var Q0; Q0=qSketchRegion(id + "F0", true); extrude(context, id + "F1", {"entities":qUnion([Q0]), "depth":120 * mm}); } }); ''' class ParserTests(unittest.TestCase): def test_lexer_ignores_comments_and_preserves_lines(self): tokens = lex('// a\nfoo(/*b*/"x")') self.assertEqual([token.value for token in tokens[:-1]], ["foo", "(", '"x"', ")"]) self.assertEqual(tokens[0].line, 2) def test_nested_feature_script(self): model = parse_featurescript(SOURCE, "00000173") self.assertEqual([step.feature_id for step in model.steps], ["F0", "F1"]) self.assertEqual(model.sketches[0].entities[0].operation, "skCircle") self.assertIsInstance(model.features[0].params["entities"], Call) def test_query_parser(self): query = Call("makeQuery", [Call("__binary__", ["id", "+", "F1.opExtrude"]), "CAP_EDGE", "EDGE", {"isStart": False, "x": Call("sQuery", [Call("__binary__", ["id", "+", "F0.wireOp"]), "EDGE", "E0"])}]) value = parse_query(query) self.assertEqual((value.owner_feature, value.source_sketch, value.source_entity), ("F1", "F0", "E0")) self.assertFalse(value.is_start) def test_safe_units(self): self.assertEqual(length_mm("2 * inch"), 50.8) self.assertEqual(length_mm("25.4 / 2 * mm"), 12.7) with self.assertRaises(ValueError): length_mm("external.value * mm") if __name__ == "__main__": unittest.main()