feat(cadfs): expand selector provenance coverage

This commit is contained in:
2026-09-14 11:00:14 +08:00
parent 994d06aaea
commit de21ee8a5b
45 changed files with 19837 additions and 842 deletions
+51 -2
View File
@@ -4,8 +4,8 @@ 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.lowering import _queries, _source_refs
from cadfs_to_cdsl.query_parser import parse_query
from cadfs_to_cdsl.lowering import _number, _queries, _source_refs
from cadfs_to_cdsl.query_parser import parse_query, query_expr
from cadfs_to_cdsl.units import length_mm
@@ -28,6 +28,14 @@ TRANSFORM_SOURCE = SOURCE.replace(
''',
)
UNKNOWN_FEATURE_SOURCE = SOURCE.replace(
'\n});\n',
'''
assignVariable(context, id + "F2", {"name" : "diameter", "value" : 10 * mm});
});
''',
)
class ParserTests(unittest.TestCase):
def test_lexer_ignores_comments_and_preserves_lines(self):
@@ -47,6 +55,10 @@ class ParserTests(unittest.TestCase):
self.assertEqual(model.features[-1].operation, "transform")
self.assertEqual(model.features[-1].params["transformType"], "TransformType.TRANSLATION_3D")
def test_unknown_direct_context_feature_is_preserved_for_capability_diagnostics(self):
model = parse_featurescript(UNKNOWN_FEATURE_SOURCE, "unknown-feature")
self.assertEqual([(feature.feature_id, feature.operation) for feature in model.features], [("F1", "extrude"), ("F2", "assignVariable")])
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)
@@ -55,6 +67,43 @@ class ParserTests(unittest.TestCase):
self.assertEqual(value.ast["call"], "makeQuery")
self.assertEqual(value.ast["args"][0]["call"], "__binary__")
def test_signed_parenthesized_scalar_preserves_unit_expression_semantics(self):
model = parse_featurescript(SOURCE.replace(
'"depth":120 * mm', '"depth":-(10 + 2) / 2 * mm', 1,
), "signed-scalar")
depth = model.features[-1].params["depth"]
self.assertEqual((depth.name, depth.args[1]), ("__binary__", "*"))
self.assertEqual(_number(depth), -6.0)
def test_query_expression_preserves_nested_set_and_filter_boundaries(self):
source = Call("qUnion", [[
Call("qConstructionFilter", [
Call("qBodyType", [
Call("qCreatedBy", [Call("__binary__", ["id", "+", "F1"]), "EDGE"]),
"BodyType.WIRE",
]),
"ConstructionObject.NO",
]),
Call("qSubtraction", [
Call("sQuery", [Call("__binary__", ["id", "+", "F0.wireOp"]), "EDGE", "E0"]),
Call("sQuery", [Call("__binary__", ["id", "+", "F0.wireOp"]), "EDGE", "E1"]),
]),
]])
expression = query_expr(source)
self.assertEqual(expression["version"], "1.0")
self.assertEqual(expression["root"]["node"], "set")
self.assertEqual(expression["root"]["operator"], "union")
filtered, subtraction = expression["root"]["operands"]
self.assertEqual((filtered["node"], filtered["filter"]), ("filter", "construction"))
self.assertEqual((filtered["input"]["node"], filtered["input"]["filter"]), ("filter", "body_type"))
self.assertEqual((subtraction["node"], subtraction["operator"]), ("set", "subtraction"))
parsed = parse_query(source)
self.assertEqual(parsed.query_combinators, ["qUnion", "qSubtraction"])
self.assertEqual(
parsed.filters,
["qConstructionFilter", "qBodyType"],
)
def test_source_version_and_standard_library_are_retained(self):
source = '''FeatureScript 1511;
import(path : "onshape/std/geometry.fs", version : "1511.0");