From 99c47069cd629eb86d0364db590fb55fe3e4d11c Mon Sep 17 00:00:00 2001 From: Carlos Villagrasa Date: Tue, 26 Jul 2022 01:22:22 +0200 Subject: [PATCH] Tests polished --- .../test/bim/feature/geometry.feature | 26 +++---- src/blenderbim/test/bim/feature/model.feature | 42 ++++++++---- src/blenderbim/test/bim/test_feature.py | 67 +++++++++++++++---- 3 files changed, 94 insertions(+), 41 deletions(-) diff --git a/src/blenderbim/test/bim/feature/geometry.feature b/src/blenderbim/test/bim/feature/geometry.feature index dae44cff62..af5afb882e 100644 --- a/src/blenderbim/test/bim/feature/geometry.feature +++ b/src/blenderbim/test/bim/feature/geometry.feature @@ -31,8 +31,8 @@ Scenario: Add representation - add a new representation to a typed instance And I set "scene.BIMRootProperties.ifc_product" to "IfcElementType" And I set "scene.BIMRootProperties.ifc_class" to "IfcWallType" And I press "bim.assign_class" - And I press "bim.add_type_instance" - And I press "bim.add_type_instance" + And I press "bim.add_constr_type" + And I press "bim.add_constr_type" Then the object "IfcWall/Wall" data is a "Tessellation" representation of "Model/Body/MODEL_VIEW" And the object "IfcWall/Wall.001" data is a "Tessellation" representation of "Model/Body/MODEL_VIEW" When the object "IfcWall/Wall" is selected @@ -144,11 +144,11 @@ Scenario: Remove representation - remove an instanced representation from an act And I set "scene.BIMRootProperties.ifc_product" to "IfcElementType" And I set "scene.BIMRootProperties.ifc_class" to "IfcWallType" And I press "bim.assign_class" - And I set "scene.BIMModelProperties.ifc_class" to "IfcWallType" + And I set "scene.BIMModelProperties.constr_class" to "IfcWallType" And the variable "cube" is "{ifc}.by_type('IfcWallType')[0].id()" - And I set "scene.BIMModelProperties.relating_type" to "{cube}" - And I press "bim.add_type_instance" - And I press "bim.add_type_instance" + And I set "scene.BIMModelProperties.constr_type_id" to "{cube}" + And I press "bim.add_constr_type" + And I press "bim.add_constr_type" And the object "IfcWallType/Cube" is selected When the variable "representation" is "{ifc}.by_type('IfcWallType')[0].RepresentationMaps[1].MappedRepresentation.id()" And I press "bim.remove_representation(representation_id={representation})" @@ -163,11 +163,11 @@ Scenario: Remove representation - remove an instanced representation from an act And I set "scene.BIMRootProperties.ifc_product" to "IfcElementType" And I set "scene.BIMRootProperties.ifc_class" to "IfcWallType" And I press "bim.assign_class" - And I set "scene.BIMModelProperties.ifc_class" to "IfcWallType" + And I set "scene.BIMModelProperties.constr_class" to "IfcWallType" And the variable "cube" is "{ifc}.by_type('IfcWallType')[0].id()" - And I set "scene.BIMModelProperties.relating_type" to "{cube}" - And I press "bim.add_type_instance" - And I press "bim.add_type_instance" + And I set "scene.BIMModelProperties.constr_type_id" to "{cube}" + And I press "bim.add_constr_type" + And I press "bim.add_constr_type" And the object "IfcWall/Wall" is selected When the variable "representation" is "{ifc}.by_type('IfcWall')[0].Representation.Representations[1].id()" And I press "bim.remove_representation(representation_id={representation})" @@ -337,10 +337,10 @@ Scenario: Override duplicate move - copying a type instance with a representatio And I set "scene.BIMRootProperties.ifc_product" to "IfcElementType" And I set "scene.BIMRootProperties.ifc_class" to "IfcWallType" And I press "bim.assign_class" - And I set "scene.BIMModelProperties.ifc_class" to "IfcWallType" + And I set "scene.BIMModelProperties.constr_class" to "IfcWallType" And the variable "cube" is "{ifc}.by_type('IfcWallType')[0].id()" - And I set "scene.BIMModelProperties.relating_type" to "{cube}" - And I press "bim.add_type_instance" + And I set "scene.BIMModelProperties.constr_type_id" to "{cube}" + And I press "bim.add_constr_type" And the object "IfcWall/Wall" is selected When I press "object.duplicate_move" Then the object "IfcWall/Wall.001" exists diff --git a/src/blenderbim/test/bim/feature/model.feature b/src/blenderbim/test/bim/feature/model.feature index 68d3e5f76b..247f4fed45 100644 --- a/src/blenderbim/test/bim/feature/model.feature +++ b/src/blenderbim/test/bim/feature/model.feature @@ -11,7 +11,7 @@ Scenario: Add type instance - add from a mesh And I set "scene.BIMModelProperties.constr_class" to "IfcWallType" And the variable "cube" is "{ifc}.by_type('IfcWallType')[0].id()" And I set "scene.BIMModelProperties.constr_type_id" to "{cube}" - When I press "bim.add_type_instance" + When I press "bim.add_constr_type" Then the object "IfcWall/Wall" exists Scenario: Add type instance - add from an empty @@ -24,7 +24,7 @@ Scenario: Add type instance - add from an empty And I set "scene.BIMModelProperties.constr_class" to "IfcWallType" And the variable "empty" is "{ifc}.by_type('IfcWallType')[0].id()" And I set "scene.BIMModelProperties.constr_type_id" to "{empty}" - When I press "bim.add_type_instance" + When I press "bim.add_constr_type" Then the object "IfcWall/Wall" exists Scenario: Add type instance - add a mesh where existing instances have changed context @@ -37,36 +37,50 @@ Scenario: Add type instance - add a mesh where existing instances have changed c And I set "scene.BIMModelProperties.constr_class" to "IfcWallType" And the variable "cube" is "{ifc}.by_type('IfcWallType')[0].id()" And I set "scene.BIMModelProperties.constr_type_id" to "{cube}" - And I press "bim.add_type_instance" + And I press "bim.add_constr_type" And the object "IfcWall/Wall" data is a "Tessellation" representation of "Model/Body/MODEL_VIEW" And the object "IfcWall/Wall" is selected And the variable "context" is "[c for c in {ifc}.by_type('IfcGeometricRepresentationSubContext') if c.TargetView == 'PLAN_VIEW'][0].id()" And I set "scene.BIMRootProperties.contexts" to "{context}" And I press "bim.add_representation" And the object "IfcWall/Wall" data is a "Annotation2D" representation of "Plan/Annotation/PLAN_VIEW" - When I press "bim.add_type_instance" + When I press "bim.add_constr_type" Then the object "IfcWall/Wall" data is a "Annotation2D" representation of "Plan/Annotation/PLAN_VIEW" And the object "IfcWall/Wall.001" data is a "Annotation2D" representation of "Plan/Annotation/PLAN_VIEW" Scenario: Preview one type on the Construction Type Browser Given an empty IFC project And I load the demo construction library - When I display the Construction Type Browser - And I preview only one asset on the Construction Type Browser - And I set "scene.BIMModelProperties.constr_class_browser" to "IfcBeamType" - And I set "scene.BIMModelProperties.constr_type_browser" to "DEMO1" - Then the object "IfcBeam/Beam" does not exist - And the construction type "IfcBeamType"/"DEMO1" has a preview + When I display the construction type browser + And I preview only one asset on the construction type browser + And I set "scene.BIMModelProperties.constr_class_browser" to "IfcColumnType" + And I set "scene.BIMModelProperties.constr_type_browser" to "DEMO2" + And I select the browser construction type + Then "scene.BIMModelProperties.constr_class" is "IfcColumnType" + And construction type is DEMO2 + And objects starting with "IfcColumn/" do not exist + And the construction type "IfcColumnType"/"DEMO2" has a preview -Scenario: Preview one class on the Construction Type Browser +Scenario: Preview one class on the construction type browser Given an empty IFC project And I load the demo construction library - When I display the Construction Type Browser - And I preview all available assets on the Construction Type Browser + When I display the construction type browser + And I preview all available assets on the construction type browser And I set "scene.BIMModelProperties.constr_class_browser" to "IfcWallType" - Then objects starting with "IfcWall/" do not exist + Then "scene.BIMModelProperties.constr_class_browser" is "IfcWallType" + And objects starting with "IfcWall/" do not exist And all construction types for "IfcWallType" have a preview +Scenario: Add one type from the Construction Type Browser + Given an empty IFC project + And I load the demo construction library + When I display the construction type browser + And I preview only one asset on the construction type browser + And I set "scene.BIMModelProperties.constr_class_browser" to "IfcColumnType" + And I set "scene.BIMModelProperties.constr_type_browser" to "DEMO2" + And I add the browser construction type + Then the object "IfcColumn/Column" exists + Scenario: Add grid Given an empty IFC project When I press "mesh.add_grid" diff --git a/src/blenderbim/test/bim/test_feature.py b/src/blenderbim/test/bim/test_feature.py index b359819f3b..4fc61fff59 100644 --- a/src/blenderbim/test/bim/test_feature.py +++ b/src/blenderbim/test/bim/test_feature.py @@ -99,16 +99,19 @@ def i_add_a_sun(): def i_add_a_material(): bpy.context.active_object.active_material = bpy.data.materials.new("Material") + @given("I add a new group to IfcSelector") @when("I add a new group to IfcSelector") def i_add_a_new_collection_item(): bpy.data.scenes["Scene"].IfcSelectorProperties.groups.add() - + + @given("I add a new query to IfcSelector") @when("I add a new query to IfcSelector") def i_add_a_new_collection_item(): bpy.data.scenes["Scene"].IfcSelectorProperties.groups[0].queries.add() + @given(parsers.parse('the material "{name}" colour is set to "{colour}"')) @when(parsers.parse('the material "{name}" colour is set to "{colour}"')) def the_material_name_colour_is_set_to_colour(name, colour): @@ -591,11 +594,18 @@ def the_construction_type_has_a_preview(constr_class, constr_type): icon_id = preview_data["icon_id"] if not isinstance(icon_id, int): assert False, f'Construction type {constr_class}/{constr_type} has an invalid icon_id {icon_id}' - if icon_id == 0: - assert False, f'Construction type {constr_class}/{constr_type} has the default null value for icon_id' + # Note: icon_id must be > 0 in UI mode, but asset_generate_preview() doesn't work headlessly -> skipping for now + # if icon_id == 0: + # assert False, f'Construction type {constr_class}/{constr_type} has the default null value for icon_id' assert True +@then("there is a Construction Type preview") +def there_is_a_construction_type_preview(): + props = bpy.context.scene.BIMModelProperties + assert props.icon_id > 0, f"There isn't a Construction Type preview" + + @then(parsers.parse('all construction types for "{constr_class}" have a preview')) def all_construction_types_have_a_preview(constr_class): if "preview_constr_types" not in AuthoringData.data: @@ -615,28 +625,57 @@ def i_add_a_construction_library(): bpy.ops.bim.select_library_file(filepath=lib_path, append_all=True) -@given("I display the Construction Type Browser") -@when("I display the Construction Type Browser") +@given("I display the construction type browser") +@when("I display the construction type browser") def i_display_the_construction_type_browser(): - bpy.ops.bim.display_constr_types() + bpy.ops.bim.display_constr_types('INVOKE_DEFAULT') -@given("I preview only one asset on the Construction Type Browser") -@when("I preview only one asset on the Construction Type Browser") +@given("I preview only one asset on the construction type browser") +@when("I preview only one asset on the construction type browser") def i_preview_one_construction_type(): - bpy.context.scene.BIMModelProperties.unfold_relating_type = False + bpy.context.scene.BIMModelProperties.unfold_constr_types = False -@given("I preview all available assets on the Construction Type Browser") -@when("I preview all available assets on the Construction Type Browser") +@given("I preview all available assets on the construction type browser") +@when("I preview all available assets on the construction type browser") def i_preview_all_construction_types(): - bpy.context.scene.BIMModelProperties.unfold_relating_type = True + bpy.context.scene.BIMModelProperties.unfold_constr_types = True -@given("I select the active construction type") -@when("I select the active construction type") +@given("I select the browser construction type") +@when("I select the browser construction type") def i_select_the_active_construction_type(): props = bpy.context.scene.BIMModelProperties bpy.ops.bim.select_construction_type( constr_class=props.constr_class_browser, constr_type_id=props.constr_type_id_browser ) + + +@given("I add the browser construction type") +@when("I add the browser construction type") +def i_add_the_active_construction_type(): + props = bpy.context.scene.BIMModelProperties + bpy.ops.bim.add_constr_type( + constr_class=props.constr_class_browser, constr_type_id=int(props.constr_type_id_browser) + ) + + +@then(parsers.parse("browser construction type is {constr_type_name}")) +def browser_construction_type(constr_type_name): + props = bpy.context.scene.BIMModelProperties + constr_type_browser = AuthoringData.constr_type_name_by_id(props.constr_class_browser, props.constr_type_id_browser) + assert constr_type_browser == constr_type_name, (f"Construction Type is a {constr_type_browser}, not " + + f"a {constr_type_name}") + + +@then(parsers.parse("construction type is {constr_type_name}")) +def construction_type(constr_type_name): + props = bpy.context.scene.BIMModelProperties + constr_type = AuthoringData.constr_type_name_by_id(props.constr_class, props.constr_type_id) + assert constr_type == constr_type_name, f"Construction Type is a {constr_type}, not a {constr_type_name}" + + +@when("I move the cursor to the bottom left corner") +def move_cursor_bottom_left(): + bpy.context.window.cursor_warp(10, 10)