feat(cadfs): expand selector provenance coverage
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user