Files
cadSet/SimpleCADAPI/tools/scene_contract_fixtures/authored_cases.py

168 lines
5.3 KiB
Python

"""Presentation, connector binding, and normalized product corpus cases."""
from __future__ import annotations
from copy import deepcopy
from simplecadapi.scene import (
validate_connector_binding,
validate_normalized_product,
validate_presentation,
)
from .common import JsonObject, validation_case
def build_presentation_matrix_cases(
presentation: JsonObject,
) -> list[dict[str, object]]:
orthographic = deepcopy(presentation)
orthographic["cameras"][0].pop("vertical_fov_degrees")
orthographic["cameras"][0].update(
{"projection": "orthographic", "vertical_span": 1000}
)
visible_only = deepcopy(presentation)
visible_only["node_overrides"][0].pop("appearance_name")
appearance_only = deepcopy(presentation)
appearance_only["node_overrides"][0].pop("visible")
neither = deepcopy(presentation)
neither["node_overrides"][0] = {"node_id": "instance/root"}
unknown_projection = deepcopy(presentation)
unknown_projection["cameras"][0]["projection"] = "unknown"
return [
validation_case("valid_orthographic_camera", orthographic, validate_presentation),
validation_case("valid_visible_only_override", visible_only, validate_presentation),
validation_case(
"valid_appearance_only_override", appearance_only, validate_presentation
),
validation_case("empty_node_override", neither, validate_presentation),
validation_case(
"unknown_camera_projection", unknown_projection, validate_presentation
),
]
def build_connector_binding_matrix_cases(
binding: JsonObject,
) -> list[dict[str, object]]:
cases: list[dict[str, object]] = []
for topology_kind, entity_id, flip in (
("FACE", "entity/face/0", True),
("EDGE", "entity/edge/0", True),
("VERTEX", "entity/vertex/0", False),
):
value = deepcopy(binding)
value["target"]["entity_id"] = entity_id
value["target"]["flip"] = flip
value["target"]["expected_source"] = {
"graph_id": "fixture_graph",
"kind": "model_topology",
"node_id": "fixture_body",
"output_slot": 0,
"topo_id": f"topo-{topology_kind.lower()}",
"topology_kind": topology_kind,
}
cases.append(
validation_case(
f"valid_binding_model_topology_{topology_kind.lower()}",
value,
validate_connector_binding,
)
)
named = deepcopy(binding)
named["name"] = "Fixture connector"
cases.append(validation_case("valid_binding_named", named, validate_connector_binding))
missing_name = deepcopy(binding)
del missing_name["name"]
cases.append(
validation_case("missing_binding_name", missing_name, validate_connector_binding)
)
unsupported_version = deepcopy(binding)
unsupported_version["source_model"]["model_schema_version"] = "3.0"
cases.append(
validation_case(
"unsupported_binding_model_schema_version",
unsupported_version,
validate_connector_binding,
)
)
return cases
def build_normalized_product_matrix_cases(
part: JsonObject, assembly: JsonObject
) -> list[dict[str, object]]:
material_part = deepcopy(part)
material_part["material"] = {
"color": [0.2, 0.3, 0.4],
"density": 7.85,
"density_unit": "g/cm3",
"material_id": "steel",
"metadata": {},
"name": "Steel",
}
model_part = deepcopy(part)
model_part["body_source"] = {
"graph_id": "graph",
"kind": "model_output",
"node_id": "body",
"output_slot": 0,
}
placement = deepcopy(part)
placement["connectors"] = [
{
"anchor": {
"anchor_kind": "placement",
"placement": {
"origin": [0, 0, 0],
"x_axis": [1, 0, 0],
"y_axis": [0, 1, 0],
"z_axis": [0, 0, 1],
},
},
"connector_id": "placement",
"name": None,
}
]
forwarded = deepcopy(assembly)
forwarded["connectors"] = [
{
"anchor": {
"anchor_kind": "forwarded",
"offset": None,
"source_component_id": "component_a",
"source_connector_id": "placement",
},
"connector_id": "forwarded",
"name": None,
}
]
forwarded_offset = deepcopy(forwarded)
forwarded_offset["connectors"][0]["anchor"]["offset"] = {
"origin": [0, 0, 5],
"x_axis": [1, 0, 0],
"y_axis": [0, 1, 0],
"z_axis": [0, 0, 1],
}
return [
validation_case(
"valid_complete_material", material_part, validate_normalized_product
),
validation_case(
"valid_model_body_source", model_part, validate_normalized_product
),
validation_case(
"valid_placement_connector", placement, validate_normalized_product
),
validation_case(
"valid_forwarded_connector_null_offset",
forwarded,
validate_normalized_product,
),
validation_case(
"valid_forwarded_connector_offset",
forwarded_offset,
validate_normalized_product,
),
]