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.
320 lines
14 KiB
Python
320 lines
14 KiB
Python
"""
|
|
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 C12712454_ScriptCanvas_OverlapNodeVerification():
|
|
"""
|
|
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", "C12712454_ScriptCanvas_OverlapNodeVerification")
|
|
|
|
# 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(C12712454_ScriptCanvas_OverlapNodeVerification)
|