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/AutomatedTesting/Gem/PythonTests/scripting/OnEntityActivatedDeactivate...

184 lines
7.8 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.
Test case ID: T92569253 // T92569254
Test Case Title: On Entity Activated // On Entity Deactivated
"""
# fmt: off
class Tests():
level_created = ("Successfully created temp level", "Failed to create temp level")
controller_exists = ("Successfully found controller entity", "Failed to find controller entity")
activated_exists = ("Successfully found activated entity", "Failed to find activated entity")
deactivated_exists = ("Successfully found deactivated entity","Failed to find deactivated entity")
start_states_correct = ("Start states set up successfully", "Start states set up incorrectly")
game_mode_entered = ("Successfully entered game mode" "Failed to enter game mode")
lines_found = ("Successfully found expected prints", "Failed to find expected prints")
game_mode_exited = ("Successfully exited game mode" "Failed to exit game mode")
# fmt: on
def OnEntityActivatedDeactivated_PrintMessage():
"""
Summary:
Verify that the On Entity Activation node is working as expected
Expected Behavior:
Upon entering game mode, the Controller entity will wait 1 second and then activate the ActivationTest
entity. The script attached to ActivationTest will print out a message on activation. The Controller
will also deactivate the DeactivationTest entity, which should print a message.
Test Steps:
1) Create temp level
2) Setup the level
3) Validate the entities
4) Start the Tracer
5) Enter Game Mode
6) Validate Print message
7) Exit game mode
Note:
- This test file must be called from the Open 3D Engine 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
"""
import os
from utils import TestHelper as helper
from editor_entity_utils import EditorEntity as Entity
from utils import Report
from utils import Tracer
import azlmbr.legacy.general as general
EditorEntity = str
LEVEL_NAME = "tmp_level"
WAIT_TIME = 3.0 # SECONDS
EXPECTED_LINES = ["Activator Script: Activated", "Deactivator Script: Deactivated"]
controller_dict = {
"name": "Controller",
"status": "active",
"path": os.path.join("ScriptCanvas", "OnEntityActivatedScripts", "controller.scriptcanvas")
}
activated_dict = {
"name": "ActivationTest",
"status": "inactive",
"path": os.path.join("ScriptCanvas", "OnEntityActivatedScripts", "activator.scriptcanvas")
}
deactivated_dict = {
"name": "DeactivationTest",
"status": "active",
"path": os.path.join("ScriptCanvas", "OnEntityActivatedScripts", "deactivator.scriptcanvas")
}
def get_asset(asset_path):
return azlmbr.asset.AssetCatalogRequestBus(azlmbr.bus.Broadcast, "GetAssetIdByPath", asset_path, azlmbr.math.Uuid(), False)
def setup_level():
def create_editor_entity(entity_dict:dict, entity_to_activate:EditorEntity=None, entity_to_deactivate:EditorEntity=None) -> EditorEntity:
entity = Entity.create_editor_entity(entity_dict["name"])
entity.set_start_status(entity_dict["status"])
sc_component = entity.add_component("Script Canvas")
sc_component.set_component_property_value("Script Canvas Asset|Script Canvas Asset", get_asset(entity_dict["path"]))
if entity_dict["name"] == "Controller":
sc_component.get_property_tree()
sc_component.set_component_property_value("Properties|Variable Fields|Variables|[0]|Name,Value|Datum|Datum|EntityToActivate", entity_to_activate.id)
sc_component.set_component_property_value("Properties|Variable Fields|Variables|[1]|Name,Value|Datum|Datum|EntityToDeactivate", entity_to_deactivate.id)
return entity
activated = create_editor_entity(activated_dict)
deactivated = create_editor_entity(deactivated_dict)
create_editor_entity(controller_dict, activated, deactivated)
def validate_entity_exist(entity_name: str, test_tuple: tuple):
"""
Validate the entity with the given name exists in the level
:return: entity: editor entity object
"""
entity = Entity.find_editor_entity(entity_name)
Report.critical_result(test_tuple, entity.id.IsValid())
return entity
def validate_start_state(entity:EditorEntity, expected_state:str):
"""
Validate that the starting state of the entity is correct, if it isn't then attempt to rectify and recheck.
:return: bool: Whether state is set as expected
"""
state_options = {
"active": azlmbr.globals.property.EditorEntityStartStatus_StartActive,
"inactive": azlmbr.globals.property.EditorEntityStartStatus_StartInactive,
"editor": azlmbr.globals.property.EditorEntityStartStatus_EditorOnly,
}
if expected_state.lower() not in state_options.keys():
raise ValueError(f"{expected_state} is an invalid option; valid options: active, inactive, or editor.")
state = entity.get_start_status()
if state != state_options[expected_state]:
# If state fails to set, set_start_status will assert
entity.set_start_status(expected_state)
return True
def validate_entities_in_level():
controller = validate_entity_exist(controller_dict["name"], Tests.controller_exists)
state1_correct = validate_start_state(controller, controller_dict["status"])
act_tester = validate_entity_exist(activated_dict["name"], Tests.activated_exists)
state2_correct = validate_start_state(act_tester, activated_dict["status"])
deac_tester = validate_entity_exist(deactivated_dict["name"], Tests.deactivated_exists)
state3_correct = validate_start_state(deac_tester, deactivated_dict["status"])
all_states_correct = state1_correct and state2_correct and state3_correct
Report.critical_result(Tests.start_states_correct, all_states_correct)
def locate_expected_lines(line_list: list):
found_lines = [printInfo.message.strip() for printInfo in section_tracer.prints]
return all(line in found_lines for line in line_list)
# 1) Create temp level
general.idle_enable(True)
result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
Report.critical_result(Tests.level_created, result == 0)
helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
general.close_pane("Error Report")
# 2) Setup the level
setup_level()
# 3) Validate the entities
validate_entities_in_level()
# 4) Start the Tracer
with Tracer() as section_tracer:
# 5) Enter Game Mode
helper.enter_game_mode(Tests.game_mode_entered)
# 6) Validate Print message
helper.wait_for_condition(lambda: locate_expected_lines(EXPECTED_LINES), WAIT_TIME)
Report.result(Tests.lines_found, locate_expected_lines(EXPECTED_LINES))
# 7) Exit game mode
helper.exit_game_mode(Tests.game_mode_exited)
if __name__ == "__main__":
import ImportPathHelper as imports
imports.init()
from utils import Report
Report.start_test(OnEntityActivatedDeactivated_PrintMessage)