diff --git a/src/bonsai/bonsai/tool/style.py b/src/bonsai/bonsai/tool/style.py index 42a3dc207a..635e5ef9bf 100644 --- a/src/bonsai/bonsai/tool/style.py +++ b/src/bonsai/bonsai/tool/style.py @@ -28,7 +28,7 @@ import bonsai.core.tool import bonsai.tool as tool import bonsai.bim.helper from mathutils import Color -from typing import Union, Any, Optional, Literal, TYPE_CHECKING +from typing import Union, Any, Optional, Literal, TYPE_CHECKING, Sequence if TYPE_CHECKING: from bonsai.bim.module.style.prop import BIMStylesProperties, BIMStyleProperties @@ -291,7 +291,7 @@ class Style(bonsai.core.tool.Style): def get_surface_rendering_attributes(cls, obj: bpy.types.Material, verbose: bool = False) -> dict[str, Any]: report = (lambda *x: print(*x)) if verbose else (lambda *x: None) - def color_to_ifc_format(color): + def color_to_ifc_format(color: Sequence[float]) -> dict[str, Any]: return { "Name": None, "Red": color[0], @@ -324,6 +324,7 @@ class Style(bonsai.core.tool.Style): report(f"{GREEN}Viewport color{R} saved as {GREEN}SurfaceColour{R}") # TODO: make sure bsdf is connected to the output? + assert obj.node_tree bsdfs = {n.type: n for n in obj.node_tree.nodes if n.outputs and n.outputs[0].is_linked} if "BSDF_PRINCIPLED" not in bsdfs: report(f"{GREEN}Viewport color alpha{R} saved as {GREEN}Transparency{R}") diff --git a/src/bonsai/test/bim/test_feature.py b/src/bonsai/test/bim/test_feature.py index 929ccc8dfa..2b1dc9ca63 100644 --- a/src/bonsai/test/bim/test_feature.py +++ b/src/bonsai/test/bim/test_feature.py @@ -162,7 +162,7 @@ class TemplateListSpy: ui_name_cache = {} -panel_spy: PanelSpy = None +panel_spy: Union[PanelSpy, None] = None def create_ui_name_cache(): @@ -287,6 +287,7 @@ def i_trigger_operator(operator): @when(parsers.parse('I see "{text}"')) @then(parsers.parse('I see "{text}"')) def i_see_text(text): + assert panel_spy panel_spy.refresh_spy() assert [l for l in panel_spy.spied_labels if text in l], f"Text {text} not found in {panel_spy.spied_labels}" @@ -295,6 +296,7 @@ def i_see_text(text): @when(parsers.parse('I don\'t see "{text}"')) @then(parsers.parse('I don\'t see "{text}"')) def i_dont_see_text(text): + assert panel_spy panel_spy.refresh_spy() assert not [l for l in panel_spy.spied_labels if text in l], f"Text {text} found in {panel_spy.spied_labels}" @@ -303,6 +305,7 @@ def i_dont_see_text(text): @when(parsers.parse('I don\'t see the "{name}" list')) @then(parsers.parse('I don\'t see the "{name}" list')) def i_dont_see_the_name_list(name): + assert panel_spy panel_spy.refresh_spy() assert name not in [l["listtype_name"] for l in panel_spy.spied_lists] @@ -311,6 +314,7 @@ def i_dont_see_the_name_list(name): @when(parsers.parse('I see the "{prop}" property')) @then(parsers.parse('I see the "{prop}" property')) def i_see_the_prop_property(prop): + assert panel_spy panel_spy.refresh_spy() assert [ p for p in panel_spy.spied_props if prop in (p["name"], p["text"], p["icon"]) @@ -321,6 +325,7 @@ def i_see_the_prop_property(prop): @when(parsers.parse('I don\'t see the "{prop}" property')) @then(parsers.parse('I don\'t see the "{prop}" property')) def i_dont_see_the_prop_property(prop): + assert panel_spy panel_spy.refresh_spy() assert not [ p for p in panel_spy.spied_props if prop in (p["name"], p["text"], p["icon"]) @@ -331,6 +336,7 @@ def i_dont_see_the_prop_property(prop): @when(parsers.parse('I see the "{prop}" property is "{value}"')) @then(parsers.parse('I see the "{prop}" property is "{value}"')) def i_see_the_prop_property_is_value(prop, value): + assert panel_spy panel_spy.refresh_spy() for spied_prop in panel_spy.spied_props: if prop in (spied_prop["name"], spied_prop["text"], spied_prop["icon"]): @@ -344,8 +350,9 @@ def i_see_the_prop_property_is_value(prop, value): @given(parsers.parse('I set the "{prop}" property to "{value}"')) @when(parsers.parse('I set the "{prop}" property to "{value}"')) @then(parsers.parse('I set the "{prop}" property to "{value}"')) -def i_set_the_prop_property_to_value(prop, value): +def i_set_the_prop_property_to_value(prop: str, value: str): value = value.strip() + assert panel_spy panel_spy.refresh_spy() is_nth = False if prop[0].isnumeric() and (prop.endswith("st") or prop.endswith("nd") or prop.endswith("th")): @@ -382,6 +389,7 @@ def i_set_the_prop_property_to_value(prop, value): @then(parsers.parse('The "{name}" list has {total} items')) def the_name_list_has_total_items(name, total): total = int(total) + assert panel_spy panel_spy.refresh_spy() for spied_list in panel_spy.spied_lists: if name == spied_list["listtype_name"]: @@ -394,6 +402,7 @@ def the_name_list_has_total_items(name, total): @given(parsers.parse('I select the "{item_name}" item in the "{list_name}" list')) @when(parsers.parse('I select the "{item_name}" item in the "{list_name}" list')) def i_select_the_item_name_item_in_the_list_name_list(item_name, list_name): + assert panel_spy panel_spy.refresh_spy() for spied_list in panel_spy.spied_lists: if list_name == spied_list["listtype_name"]: @@ -553,6 +562,7 @@ def i_press_operator(operator): @when(parsers.parse('I click "{button}"')) @then(parsers.parse('I click "{button}"')) def i_click_button(button): + assert panel_spy panel_spy.refresh_spy() for spied_operator in panel_spy.spied_operators: if spied_operator["text"] == button or spied_operator["icon"] == button: @@ -577,6 +587,7 @@ def i_click_button(button): @when(parsers.parse('I click the "{button}" after the text "{text}"')) @then(parsers.parse('I click the "{button}" after the text "{text}"')) def i_click_the_button_after_the_text_text(button, text): + assert panel_spy panel_spy.refresh_spy() for spied_operator in panel_spy.spied_operators: if spied_operator["after"] == text: diff --git a/src/bonsai/test/tool/test_style.py b/src/bonsai/test/tool/test_style.py index 5f37d397b5..0b38e66a15 100644 --- a/src/bonsai/test/tool/test_style.py +++ b/src/bonsai/test/tool/test_style.py @@ -126,6 +126,7 @@ class TestGetSurfaceRenderingAttributes(NewFile): obj.diffuse_color = [1, 1, 1, 1] obj.use_nodes = True node = tool.Blender.get_material_node(obj, "BSDF_PRINCIPLED") + assert node node.inputs["Alpha"].default_value = 0.8 node.inputs["Base Color"].default_value = [0.5, 0.5, 0.5, 0.5] node.inputs["Roughness"].default_value = 0.2 @@ -154,6 +155,7 @@ class TestGetSurfaceRenderingAttributes(NewFile): obj.use_nodes = True output = tool.Blender.get_material_node(obj, "OUTPUT_MATERIAL") node = tool.Blender.get_material_node(obj, "BSDF_PRINCIPLED") + assert obj.node_tree and node obj.node_tree.nodes.remove(node) node = obj.node_tree.nodes.new(type="ShaderNodeBsdfGlossy") @@ -185,6 +187,7 @@ class TestGetSurfaceRenderingAttributes(NewFile): obj.use_nodes = True output = tool.Blender.get_material_node(obj, "OUTPUT_MATERIAL") node = tool.Blender.get_material_node(obj, "BSDF_PRINCIPLED") + assert obj.node_tree and node and output obj.node_tree.nodes.remove(node) node = obj.node_tree.nodes.new(type="ShaderNodeBsdfDiffuse") @@ -216,6 +219,7 @@ class TestGetSurfaceRenderingAttributes(NewFile): obj.use_nodes = True output = tool.Blender.get_material_node(obj, "OUTPUT_MATERIAL") node = tool.Blender.get_material_node(obj, "BSDF_PRINCIPLED") + assert obj.node_tree and node and output obj.node_tree.nodes.remove(node) node = obj.node_tree.nodes.new(type="ShaderNodeBsdfGlass") @@ -247,6 +251,7 @@ class TestGetSurfaceRenderingAttributes(NewFile): obj.use_nodes = True output = tool.Blender.get_material_node(obj, "OUTPUT_MATERIAL") node = tool.Blender.get_material_node(obj, "BSDF_PRINCIPLED") + assert obj.node_tree and node and output obj.node_tree.nodes.remove(node) node = obj.node_tree.nodes.new(type="ShaderNodeEmission") @@ -277,6 +282,7 @@ class TestGetSurfaceRenderingAttributes(NewFile): obj.use_nodes = True output = tool.Blender.get_material_node(obj, "OUTPUT_MATERIAL") node = tool.Blender.get_material_node(obj, "BSDF_PRINCIPLED") + assert obj.node_tree and node and output obj.node_tree.nodes.remove(node) node = obj.node_tree.nodes.new(type="ShaderNodeVolumePrincipled")