123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- """
- Copyright (c) Contributors to the Open 3D Engine Project.
- For complete copyright and license terms please see the LICENSE at the root of this distribution.
- SPDX-License-Identifier: Apache-2.0 OR MIT
- """
- # Test case ID : 12712454
- # Test Case Title : Verify overlap nodes in script canvas
- # fmt: off
- class Tests:
- enter_game_mode = ("Entered game mode", "Failed to enter game mode")
- exit_game_mode = ("Exited game mode", "Couldn't exit game mode")
- # comm entities are used for communication between script canvas and the python script.
- comm_entities_found = ("All comm entities found", "All comm entities not found")
- script_canvas_entity_found = ("Script_Canvas_Entity Found", "Script_Canvas_Entity not found")
- test_array_found = ("8x8 entity array found", "8x8 entity array not found")
- all_tests_passed = ("All tests have expected results", "Some tests had unexpected results")
- # Test 0
- test_0_finished = ("Test 0 has ended", "Test 0 has not ended correctly")
- test_0_results_logged = ("Test 0 logged expected results", "Test 0 logged unexpected results")
- test_0_entity_reset = ("Test 0: entities moved back", "Test 0: not all entities moved back")
- # Test 1
- test_1_finished = ("Test 1 has ended", "Test 1 has not ended correctly")
- test_1_results_logged = ("Test 1 logged expected results", "Test 1 logged unexpected results")
- test_1_entity_reset = ("Test 1: entities moved back", "Test 1: not all entities moved back")
- # Test 2
- test_2_finished = ("Test 2 has ended", "Test 2 has not ended correctly")
- test_2_results_logged = ("Test 2 logged expected results", "Test 2 logged unexpected results")
- test_2_entity_reset = ("Test 2: entities moved back", "Test 2: not all entities moved back")
- # fmt: on
- def ScriptCanvas_OverlapNode():
- """
- Summary: Verifies that the three script canvas overlap nodes (box, sphere, capsule) work as expected. Test
- script starts and verifies each case one by one.
- Level Description:
- Test Array - 8x8 array of sphere entities lined up edge to edge along an y-z plane, they are names with
- 'Sphere_row_column' convention; has PhysX rigid body, sphere shaped PhysX collider, sphere shape.
- Comm From Test- 3 communication entities that start inactive, used by the test script to initiate each of the three cases
- by activation of the relevent sphere; has sphere shape.
- Comm To Test- 3 communication entities that start inactive, used by the script canvas to initiate when each of the three
- cases are completed by activation of the relevent sphere; has sphere shape.
- Script Canvas Entity - Entity is centered in the test array and oriented with a 90 degree angle along the y
- axis as to allow the capsule overlap node to overlap more entities; has script canvas component
- Script Canvas - Has three execution cases, one for each overlap node type. Each case goes through a similar path
- - Waits for relevant Comm From Test entity to be activated by the test script
- - Creates an array of all entities in Test Array that overlap
- - Uses this array to draw a blue sphere at every sphere that overlaps
- - Uses the same array to move each overlapping entity 5 m along the +x axis
- - Activates the relevant Comm To Test entity
- The test script then logs the results and resets the Test Array before activating the next path.
- Values for the overlaps:
- Box: x = 4.5, y = 4.5, z = 4.5
- Sphere: r = 4
- Capsule: r = 0.5, h = 5
- Note: For this script canvas to run properly it requires the custom .physxconfiguration file.
- Tests Runs - Each loop runs a different overlap node
- - test_0: Box
- - test_1: Sphere
- - test_2: Capsule
- Expected Behavior: The script canvas will run it's three different overlap nodes. Each run the overlapped
- spheres in the Test Array will be drawn in over in blue and then offset in the x direction so that this test
- script can confirm that it worked correctly.
- Test Steps:
- 1) Open Level
- 2) Enter Game Mode
- 3) Create Entity Objects
- 4) Validate Entities
- 5) Begin Testing
- 6) Signal Script Canvas to begin test
- 7) Wait until script canvas signals that it has completed the test
- 8) Check which entities in array have been moved
- 9) Validate and log results of test
- 10) Place all entities back into correct positions in entity array
- 11) Log results of all tests
- 12) Exit Game Mode
- 13) Close Editor
- 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
- import sys
- from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
- import azlmbr.legacy.general as general
- import azlmbr.bus
- import azlmbr.math as math
- # Constants
- FLOAT_THRESHOLD = 0.0001
- # Timeout for a failed test in seconds
- TIMEOUT = 1.0
- ARRAY_X = 500.0
- ARRAY_COLUMN_0 = 530.0
- ARRAY_ROW_0 = 45.0
- # Helper Functions
- class Entity:
- def __init__(self, name, activated):
- self.id = general.find_game_entity(name)
- self.name = name
- self.activated = activated
- self.handler = None
- def activate_entity(self):
- Report.info("Activating Entity : " + self.name)
- azlmbr.entity.GameEntityContextRequestBus(azlmbr.bus.Broadcast, "ActivateGameEntity", self.id)
- self.activated = True
- def entity_activated(self, args):
- self.activated = True
- def set_handler(self):
- self.handler = azlmbr.entity.EntityBusHandler()
- self.handler.connect(self.id)
- self.handler.add_callback("OnEntityActivated", self.entity_activated)
- class Sphere_Entities:
- def __init__(self, row, column):
- self.name = "Sphere_{}_{}".format(row, column)
- self.id = general.find_game_entity(self.name)
- self.y = column + ARRAY_COLUMN_0
- self.z = ARRAY_ROW_0 - row
- self.array_position = math.Vector3(ARRAY_X, self.y, self.z)
- self.current_position = self.array_position
- def check_id(self):
- return self.id.isValid()
- def move_entity_back(self):
- azlmbr.components.TransformBus(azlmbr.bus.Event, "SetWorldTranslation", self.id, self.array_position)
- def in_position(self):
- current_position = azlmbr.components.TransformBus(azlmbr.bus.Event, "GetWorldTranslation", self.id)
- return abs(current_position.x - self.array_position.x) < FLOAT_THRESHOLD
- class Script_Canvas_Test:
- def __init__(self, index):
- self.index = index
- self.name = "test_{}".format(index)
- self.got_expected_result = False
- self.test_finish = None
- self.results_logged = None
- self.array_reset = None
- def report_test_start(self):
- Report.info("Test {} has begun".format(self.index))
- def report_test_finished(self, finished):
- self.test_finish = Tests.__dict__["test_{}_finished".format(self.index)]
- Report.result(self.test_finish, finished)
- def report_results_logged(self):
- self.results_logged = Tests.__dict__["test_{}_results_logged".format(self.index)]
- Report.result(self.results_logged, self.got_expected_result)
- def report_test_array_reset(self, entities_in_position):
- self.array_reset = Tests.__dict__["test_{}_entity_reset".format(self.index)]
- Report.result(self.array_reset, entities_in_position)
- # fmt: off
- class Result_Arrays:
- true_bool_array = [[True for column in range(8)] for row in range(8)]
- # Comparison Array for box overlap node
- test_0_bool_array = [
- [True, True, True, True, True, True, True, True],
- [True, False, False, False, False, False, False, True],
- [True, True, False, False, False, False, False, True],
- [True, False, False, False, False, False, False, True],
- [True, True, False, False, False, False, False, True],
- [True, True, False, False, False, False, False, True],
- [True, True, False, False, False, False, False, True],
- [True, True, True, True, True, True, True, True],
- ]
- # Comparison Array for sphere overlap node
- test_1_bool_array = [
- [True, True, True, True, True, True, True, True],
- [True, True, False, False, False, False, True, True],
- [True, False, False, False, False, False, False, True],
- [True, False, False, False, False, False, False, True],
- [True, False, False, False, False, False, False, True],
- [True, False, False, False, False, False, False, True],
- [True, True, False, False, False, False, True, True],
- [True, True, True, True, True, True, True, True],
- ]
- # Comparison Array for capsule overlap node
- test_2_bool_array = [
- [True, True, True, True, True, True, True, True],
- [True, True, True, False, False, True, True, True],
- [True, True, True, False, False, True, True, True],
- [True, True, True, False, False, True, True, True],
- [True, True, True, False, False, True, True, True],
- [True, True, True, False, False, True, True, True],
- [True, True, True, False, False, True, True, True],
- [True, True, True, True, True, True, True, True],
- ]
- # fmt on
- def create_test_Sphere_Entities():
- return [[Sphere_Entities(row, column) for column in range(8)] for row in range(8)]
- def sphere_array_isvalid(array):
- for row in range(len(array)):
- for column in range(len(array[0])):
- if not array[row][column].id.isValid():
- return False
- return True
- def check_comm_entities(comm_list):
- for entity in comm_list:
- if not entity.id.isValid():
- return False
- return True
- def check_array_movement(array):
- return [[True if entity.in_position() else False for entity in row] for row in array]
- def reset_array(array):
- for row in array:
- for entity in row:
- entity.move_entity_back()
- def is_array_in_position(array):
- return arrays_are_the_same(Result_Arrays.true_bool_array, check_array_movement(array))
- def arrays_are_the_same(array_0, array_1):
- differences = [row for row in array_0 if row not in array_1] + [row for row in array_1 if row not in array_0]
- return differences == []
- # Main Script
- helper.init_idle()
- # 1) Open Level
- helper.open_level("Physics", "ScriptCanvas_OverlapNode")
- # 2) Enter Game Mode
- helper.enter_game_mode(Tests.enter_game_mode)
- # 3) Create Entity and Script_Canvas_Test Objects
- test_Sphere_Entities = create_test_Sphere_Entities()
- script_canvas_entity = Entity("Script_Canvas_Entity", True)
- comm_from_test_0 = Entity("Comm_From_Test_0", False)
- comm_from_test_1 = Entity("Comm_From_Test_1", False)
- comm_from_test_2 = Entity("Comm_From_Test_2", False)
- comm_to_test_0 = Entity("Comm_To_Test_0", False)
- comm_to_test_1 = Entity("Comm_To_Test_1", False)
- comm_to_test_2 = Entity("Comm_To_Test_2", False)
- comm_from_entity_list = (comm_from_test_0, comm_from_test_1, comm_from_test_2)
- comm_to_entity_list = (comm_to_test_0, comm_to_test_1, comm_to_test_2)
- test_0 = Script_Canvas_Test(0)
- test_1 = Script_Canvas_Test(1)
- test_2 = Script_Canvas_Test(2)
- test_list = (test_0, test_1, test_2)
- # 4) Validate Entities
- Report.critical_result(Tests.script_canvas_entity_found, script_canvas_entity.id.isValid())
- Report.critical_result(
- Tests.comm_entities_found, check_comm_entities(comm_from_entity_list + comm_to_entity_list)
- )
- Report.critical_result(Tests.test_array_found, sphere_array_isvalid(test_Sphere_Entities))
- # 5) Begin Testing
- for test in test_list:
- # 6) Signal Script Canvas to begin test
- comm_from_entity_list[test.index].activate_entity()
- test.report_test_start()
- # 7) Wait until script canvas signals that it has completed the test
- comm_to_entity_list[test.index].set_handler()
- test.report_test_finished(helper.wait_for_condition(lambda: comm_to_entity_list[test.index].activated, TIMEOUT))
- # 8) Check which entities in array have been moved
- result_bool_array = check_array_movement(test_Sphere_Entities)
- # 9) Validate and log results of test
- test.got_expected_result = arrays_are_the_same(
- result_bool_array, Result_Arrays.__dict__["test_{}_bool_array".format(test.index)]
- )
- test.report_results_logged()
- if test.index == 0:
- Report.info(result_bool_array)
- # 10) Place all entities back into correct positions in entity array
- reset_array(test_Sphere_Entities)
- test.report_test_array_reset(is_array_in_position(test_Sphere_Entities))
- # 11) Log results of all tests
- Report.result(
- Tests.all_tests_passed, test_0.got_expected_result and test_1.got_expected_result and test_2.got_expected_result
- )
- # 12) Exit Game Mode
- helper.exit_game_mode(Tests.exit_game_mode)
- if __name__ == "__main__":
- from editor_python_test_tools.utils import Report
- Report.start_test(ScriptCanvas_OverlapNode)
|