You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Tests/editor/EditorScripts/quick_push_slice.py

128 lines
5.4 KiB
Python

"""
All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
its licensors.
For complete copyright and license terms please see the LICENSE at the root of this
distribution (the "License"). All use of this software is governed by the License,
or, if provided, by the license below or the license accompanying this file. Do not
remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
"""
"""
C2669525: Adding and deleting entities to a slice are able to be quick pushed to slice
https://testrail.agscollab.com/index.php?/cases/view/2669525
"""
import os
import sys
import azlmbr.legacy.general as general
import azlmbr.bus as bus
import azlmbr.math as math
import azlmbr.asset as asset
import azlmbr.editor as editor
import azlmbr.slice as slice
import azlmbr.entity as EntityId
import Tests.ly_shared.pyside_utils as pyside_utils
from re import compile as regex
from Tests.editor.editor_utils.editor_test_helper import EditorTestHelper
class QuickPushSliceTest(EditorTestHelper):
def __init__(self):
EditorTestHelper.__init__(self, log_prefix="quick_push_slice", args=["level"])
def run_test(self):
"""
Summary:
Adding and deleting entities to a slice are able to be quick pushed to slice
Expected Behavior:
The slice is saved and the second instance of the slice is updated with the
deletion of Child 1 and a addition of Child 2.
Test Steps:
1) Open a new level
2) Create 2 entities as parent and child
3) Create slice from the parent entity
4) Wait until slice is created
5) Instantiate a newly created slice
6) Delete child on original slice
7) Add a child to the original slice entity
8) Save slice overrides
9) Verify if the instantiated slice has a new child
Note:
- This test file must be called from the Lumberyard Editor command terminal
- Any passed and failed tests are written to the Editor.log file.
Parsing the file or running a log_monitor are required to observe the test results.
:return: None
"""
SLICE_NAME = "temp_slice.slice"
def path_is_valid_asset(asset_path):
asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", asset_path, math.Uuid(), False)
return asset_id.invoke("IsValid")
# 1) Open a new level
self.test_success = self.create_level(
self.args["level"],
heightmap_resolution=1024,
heightmap_meters_per_pixel=1,
terrain_texture_resolution=4096,
use_terrain=True,
)
# 2) Create 2 entities as parent and child
parent_id = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", EntityId.EntityId())
child_id = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", parent_id)
editor.EditorEntityAPIBus(bus.Event, "SetName", child_id, "child1")
# 3) Create slice from the parent entity
success = slice.SliceRequestBus(bus.Broadcast, "CreateNewSlice", parent_id, SLICE_NAME)
print(f"Slice Created: {success}")
# 4) Wait until slice is created
self.wait_for_condition(lambda: path_is_valid_asset(SLICE_NAME), 3.0)
# 5) Instantiate a newly created slice
transform = math.Transform_CreateIdentity()
position = math.Vector3(64.0, 64.0, 32.0)
transform.SetPosition(position)
asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", SLICE_NAME, math.Uuid(), False)
slice.SliceRequestBus(bus.Broadcast, "InstantiateSliceFromAssetId", asset_id, transform)
# 6) Delete child on original slice
editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntities", [child_id])
# 7) Add a child to the original slice entity
child_2_id = editor.ToolsApplicationRequestBus(bus.Broadcast, "CreateNewEntity", parent_id)
editor.EditorEntityAPIBus(bus.Event, "SetName", child_2_id, "child2")
# 8) Save slice overrides
editor_window = pyside_utils.get_editor_main_window()
outliner_widget = pyside_utils.find_child_by_hierarchy(
editor_window, ..., dict(windowTitle=regex("Entity Outliner.*")), ..., "m_objectList"
).parent()
tree = pyside_utils.find_child_by_hierarchy(outliner_widget, ..., "m_objectTree")
# Model index for the original slice
self.wait_for_condition(lambda: pyside_utils.get_item_view_index(tree, 2) is not None, 2.0)
model_index_1 = pyside_utils.get_item_view_index(tree, 1)
pyside_utils.trigger_context_menu_entry(tree, SLICE_NAME.lower(), index=model_index_1)
# 9) Verify if the instantiated slice has a new child
# model index for instantiated slice
model_index_0 = pyside_utils.get_item_view_index(tree, 0)
self.wait_for_condition(lambda: pyside_utils.find_child_by_pattern(model_index_0, "child1") is None, 2.0)
if pyside_utils.find_child_by_pattern(model_index_0, "child2"):
print("Newly created child is updated in the instantiated slice")
if pyside_utils.find_child_by_pattern(model_index_0, "child1") is None:
print("Child deletion is updated in the instantiated slice")
test = QuickPushSliceTest()
test.run()