168 lines
5.3 KiB
Python
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,
|
|
),
|
|
]
|