wait_for_condition added and merged development
Signed-off-by: Scott Murray <scottmur@amazon.com>
This commit is contained in:
@@ -23,20 +23,20 @@ TEST_DIRECTORY = os.path.join(os.path.dirname(__file__), "tests")
|
||||
class TestAtomEditorComponentsMain(object):
|
||||
"""Holds tests for Atom components."""
|
||||
|
||||
@pytest.mark.test_case_id("C32078118") # Decal
|
||||
@pytest.mark.test_case_id("C32078119") # DepthOfField
|
||||
@pytest.mark.test_case_id("C32078120") # Directional Light
|
||||
@pytest.mark.test_case_id("C32078121") # Exposure Control
|
||||
@pytest.mark.test_case_id("C32078115") # Global Skylight (IBL)
|
||||
@pytest.mark.test_case_id("C32078125") # Physical Sky
|
||||
@pytest.mark.test_case_id("C32078127") # PostFX Layer
|
||||
@pytest.mark.test_case_id("C32078131") # PostFX Radius Weight Modifier
|
||||
@pytest.mark.test_case_id("C32078117") # Light
|
||||
@pytest.mark.test_case_id("C36525660") # Display Mapper
|
||||
def test_AtomEditorComponents_AddedToEntity(self, request, editor, level, workspace, project, launcher_platform):
|
||||
"""
|
||||
Please review the hydra script run by this test for more specific test info.
|
||||
Tests the following Atom components and verifies all "expected_lines" appear in Editor.log:
|
||||
1. Display Mapper
|
||||
2. Light
|
||||
3. PostFX Radius Weight Modifier
|
||||
4. PostFX Layer
|
||||
5. Physical Sky
|
||||
6. Global Skylight (IBL)
|
||||
7. Exposure Control
|
||||
8. Directional Light
|
||||
9. DepthOfField
|
||||
10. Decal
|
||||
Tests the Atom components & verifies all "expected_lines" appear in Editor.log
|
||||
"""
|
||||
cfg_args = [level]
|
||||
|
||||
@@ -69,6 +69,18 @@ class TestAtomEditorComponentsMain(object):
|
||||
"DepthOfField_test: Entity deleted: True",
|
||||
"DepthOfField_test: UNDO entity deletion works: True",
|
||||
"DepthOfField_test: REDO entity deletion works: True",
|
||||
# Directional Light Component
|
||||
"Directional Light Entity successfully created",
|
||||
"Directional Light_test: Component added to the entity: True",
|
||||
"Directional Light_test: Component removed after UNDO: True",
|
||||
"Directional Light_test: Component added after REDO: True",
|
||||
"Directional Light_test: Entered game mode: True",
|
||||
"Directional Light_test: Exit game mode: True",
|
||||
"Directional Light_test: Entity is hidden: True",
|
||||
"Directional Light_test: Entity is shown: True",
|
||||
"Directional Light_test: Entity deleted: True",
|
||||
"Directional Light_test: UNDO entity deletion works: True",
|
||||
"Directional Light_test: REDO entity deletion works: True",
|
||||
# Exposure Control Component
|
||||
"Exposure Control Entity successfully created",
|
||||
"Exposure Control_test: Component added to the entity: True",
|
||||
@@ -180,6 +192,7 @@ class TestAtomEditorComponentsMain(object):
|
||||
cfg_args=cfg_args,
|
||||
)
|
||||
|
||||
@pytest.mark.test_case_id("C34525095")
|
||||
def test_AtomEditorComponents_LightComponent(
|
||||
self, request, editor, workspace, project, launcher_platform, level):
|
||||
"""
|
||||
@@ -266,6 +279,15 @@ class TestMaterialEditorBasicTests(object):
|
||||
request.addfinalizer(teardown)
|
||||
|
||||
@pytest.mark.parametrize("exe_file_name", ["MaterialEditor"])
|
||||
@pytest.mark.test_case_id("C34448113") # Creating a New Asset.
|
||||
@pytest.mark.test_case_id("C34448114") # Opening an Existing Asset.
|
||||
@pytest.mark.test_case_id("C34448115") # Closing Selected Material.
|
||||
@pytest.mark.test_case_id("C34448116") # Closing All Materials.
|
||||
@pytest.mark.test_case_id("C34448117") # Closing all but Selected Material.
|
||||
@pytest.mark.test_case_id("C34448118") # Saving Material.
|
||||
@pytest.mark.test_case_id("C34448119") # Saving as a New Material.
|
||||
@pytest.mark.test_case_id("C34448120") # Saving as a Child Material.
|
||||
@pytest.mark.test_case_id("C34448121") # Saving all Open Materials.
|
||||
def test_MaterialEditorBasicTests(
|
||||
self, request, workspace, project, launcher_platform, generic_launcher, exe_file_name):
|
||||
|
||||
|
||||
@@ -73,6 +73,7 @@ def create_screenshots_archive(screenshot_path):
|
||||
class TestAllComponentsIndepthTests(object):
|
||||
|
||||
@pytest.mark.parametrize("screenshot_name", ["AtomBasicLevelSetup.ppm"])
|
||||
@pytest.mark.test_case_id("C34603773")
|
||||
def test_BasicLevelSetup_SetsUpLevel(
|
||||
self, request, editor, workspace, project, launcher_platform, level, screenshot_name):
|
||||
"""
|
||||
@@ -115,6 +116,7 @@ class TestAllComponentsIndepthTests(object):
|
||||
|
||||
create_screenshots_archive(screenshot_directory)
|
||||
|
||||
@pytest.mark.test_case_id("C34525095")
|
||||
def test_LightComponent_ScreenshotMatchesGoldenImage(
|
||||
self, request, editor, workspace, project, launcher_platform, level):
|
||||
"""
|
||||
@@ -225,6 +227,8 @@ class TestMaterialEditor(object):
|
||||
pytest.param("-rhi=Vulkan", ["Registering vulkan RHI"])
|
||||
])
|
||||
@pytest.mark.parametrize("exe_file_name", ["MaterialEditor"])
|
||||
@pytest.mark.test_case_id("C30973986") # Material Editor Launching in Dx12
|
||||
@pytest.mark.test_case_id("C30973987") # Material Editor Launching in Vulkan
|
||||
def test_MaterialEditorLaunch_AllRHIOptionsSucceed(
|
||||
self, request, workspace, project, launcher_platform, generic_launcher, exe_file_name, cfg_args,
|
||||
expected_lines):
|
||||
|
||||
@@ -23,6 +23,7 @@ class TestAutomation(EditorTestSuite):
|
||||
# Remove -autotest_mode from global_extra_cmdline_args since we need rendering for these tests.
|
||||
global_extra_cmdline_args = ["-BatchMode"] # Default is ["-BatchMode", "-autotest_mode"]
|
||||
|
||||
@pytest.mark.test_case_id("C34603773")
|
||||
class AtomGPU_BasicLevelSetup_SetsUpLevel(EditorSharedTest):
|
||||
use_null_renderer = False # Default is True
|
||||
screenshot_name = "AtomBasicLevelSetup.ppm"
|
||||
|
||||
@@ -30,6 +30,7 @@ class TestAtomEditorComponentsSandbox(object):
|
||||
class TestAtomEditorComponentsMain(object):
|
||||
"""Holds tests for Atom components."""
|
||||
|
||||
@pytest.mark.test_case_id("C32078128")
|
||||
def test_AtomEditorComponents_ReflectionProbeAddedToEntity(
|
||||
self, request, editor, level, workspace, project, launcher_platform):
|
||||
"""
|
||||
|
||||
@@ -113,7 +113,6 @@ def create_basic_atom_level(level_name):
|
||||
general.close_pane("Error Log")
|
||||
general.idle_wait(1.0)
|
||||
general.run_console("r_displayInfo=0")
|
||||
general.run_console("r_antialiasingmode=0")
|
||||
general.idle_wait(1.0)
|
||||
|
||||
# Delete all existing entities & create default_level entity
|
||||
|
||||
+1
@@ -160,6 +160,7 @@ def AtomEditorComponents_postfx_shape_weight_AddedToEntity():
|
||||
|
||||
# 9. Undo to remove each added shape and verify PostFX Shape Weight Modifier is not enabled.
|
||||
general.undo()
|
||||
TestHelper.wait_for_condition(lambda: not postfx_shape_weight_entity.has_component(shape), 1.0)
|
||||
Report.result(Tests.postfx_shape_weight_disabled, not postfx_shape_weight_component.is_enabled())
|
||||
|
||||
# 10. Verify PostFx Shape Weight Modifier component is enabled by adding Spline and Tube Shape component.
|
||||
|
||||
-1
@@ -66,7 +66,6 @@ def run():
|
||||
general.close_pane("Error Log")
|
||||
general.idle_wait(1.0)
|
||||
general.run_console("r_displayInfo=0")
|
||||
general.run_console("r_antialiasingmode=0")
|
||||
general.idle_wait(1.0)
|
||||
|
||||
return True
|
||||
|
||||
@@ -82,7 +82,6 @@ def run():
|
||||
general.close_pane("Error Log")
|
||||
general.idle_wait(1.0)
|
||||
general.run_console("r_displayInfo=0")
|
||||
general.run_console("r_antialiasingmode=0")
|
||||
general.idle_wait(1.0)
|
||||
|
||||
return True
|
||||
|
||||
-1
@@ -149,7 +149,6 @@ class TestHelper:
|
||||
general.idle_wait(1.0)
|
||||
general.idle_wait(1.0)
|
||||
general.run_console("r_displayInfo=0")
|
||||
general.run_console("r_antialiasingmode=0")
|
||||
general.idle_wait(1.0)
|
||||
|
||||
|
||||
|
||||
+3
-11
@@ -52,9 +52,6 @@ def Joints_BallLeadFollowerCollide():
|
||||
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
|
||||
|
||||
from JointsHelper import JointEntityCollisionAware
|
||||
|
||||
# Helper Entity class - self.collided flag is set when instance receives collision event.
|
||||
@@ -75,17 +72,12 @@ def Joints_BallLeadFollowerCollide():
|
||||
lead = Entity("lead")
|
||||
follower = Entity("follower")
|
||||
|
||||
# 4) Wait for several seconds
|
||||
general.idle_wait(2.0) # wait for lead and follower to move
|
||||
# 4) Wait for collision between lead and follower or timeout
|
||||
Report.critical_result(Tests.check_collision_happened, helper.wait_for_condition(lambda: lead.collided and follower.collided, 10.0))
|
||||
|
||||
# 5) Check to see if lead and follower behaved as expected
|
||||
Report.critical_result(Tests.check_collision_happened, lead.collided and follower.collided)
|
||||
|
||||
# 6) Exit Game Mode
|
||||
# 5) 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(Joints_BallLeadFollowerCollide)
|
||||
|
||||
+49
-10
@@ -52,11 +52,13 @@ def Joints_HingeNoLimitsConstrained():
|
||||
"""
|
||||
import os
|
||||
import sys
|
||||
import math
|
||||
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 azmath
|
||||
|
||||
import JointsHelper
|
||||
from JointsHelper import JointEntity
|
||||
@@ -84,28 +86,65 @@ def Joints_HingeNoLimitsConstrained():
|
||||
Report.info_vector3(lead.position, "lead initial position:")
|
||||
Report.info_vector3(follower.position, "follower initial position:")
|
||||
leadInitialPosition = lead.position
|
||||
followerInitialPosition = follower.position
|
||||
|
||||
# 4) Wait for several seconds
|
||||
general.idle_wait(4.0) # wait for lead and follower to move
|
||||
# 4) Wait for the follower to move above and over the lead or Timeout
|
||||
normalizedStartPos = JointsHelper.getRelativeVector(lead.position, follower.position)
|
||||
normalizedStartPos = normalizedStartPos.GetNormalizedSafe()
|
||||
|
||||
class WaitCondition:
|
||||
ANGLE_CHECKPOINT_1 = math.radians(90)
|
||||
ANGLE_CHECKPOINT_2 = math.radians(200)
|
||||
|
||||
angleAchieved = 0.0
|
||||
followerMovedAbove90Deg = False #this is expected to be true to pass the test
|
||||
followerMovedAbove200Deg = False #this is expected to be true to pass the test
|
||||
|
||||
jointNormal = azmath.Vector3(0.0, -1.0, 0.0) # the joint rotates around the y axis
|
||||
def checkConditionMet(self):
|
||||
#calculate the current follower-lead vector
|
||||
normalVec = JointsHelper.getRelativeVector(lead.position, follower.position)
|
||||
normalVec = normalVec.GetNormalizedSafe()
|
||||
|
||||
#triple product and get the angle
|
||||
tripleProduct = normalizedStartPos.dot(normalVec.cross(self.jointNormal))
|
||||
currentAngle = math.acos(normalizedStartPos.Dot(normalVec))
|
||||
if tripleProduct < 0:
|
||||
currentAngle = (2*math.pi) - currentAngle
|
||||
|
||||
#if the angle is now less then last time, it is no longer rising, so end the test.
|
||||
if currentAngle < self.angleAchieved:
|
||||
return True
|
||||
|
||||
#once we're passed the final check point, end the test
|
||||
if currentAngle > self.ANGLE_CHECKPOINT_2:
|
||||
self.followerMovedAbove200Deg = True
|
||||
return True
|
||||
|
||||
self.angleAchieved = currentAngle
|
||||
self.followerMovedAbove90Deg = currentAngle > self.ANGLE_CHECKPOINT_1
|
||||
return False
|
||||
|
||||
def isFollowerPositionCorrect(self):
|
||||
return self.followerMovedAbove90Deg and self.followerMovedAbove200Deg
|
||||
|
||||
waitCondition = WaitCondition()
|
||||
|
||||
MAX_WAIT_TIME = 10.0 #seconds
|
||||
conditionMet = helper.wait_for_condition(lambda: waitCondition.checkConditionMet(), MAX_WAIT_TIME)
|
||||
|
||||
# 5) Check to see if lead and follower behaved as expected
|
||||
Report.info_vector3(lead.position, "lead position after 1 second:")
|
||||
Report.info_vector3(follower.position, "follower position after 1 second:")
|
||||
Report.info_vector3(lead.position, "lead position after test run:")
|
||||
Report.info_vector3(follower.position, "follower position after test run:")
|
||||
|
||||
leadPositionDelta = lead.position.Subtract(leadInitialPosition)
|
||||
leadRemainedStill = JointsHelper.vector3SmallerThanScalar(leadPositionDelta, FLOAT_EPSILON)
|
||||
Report.critical_result(Tests.check_lead_position, leadRemainedStill)
|
||||
|
||||
followerSwingedOverLead = (follower.position.x < leadInitialPosition.x and
|
||||
follower.position.z > leadInitialPosition.z)
|
||||
Report.critical_result(Tests.check_follower_position, followerSwingedOverLead)
|
||||
Report.critical_result(Tests.check_follower_position, conditionMet and waitCondition.isFollowerPositionCorrect())
|
||||
|
||||
# 6) 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(Joints_HingeNoLimitsConstrained)
|
||||
|
||||
@@ -187,7 +187,3 @@ def prepare_for_screenshot_compare(remote_console_instance):
|
||||
"""
|
||||
wait_for(lambda: _retry_command(remote_console_instance, 'r_displayinfo 0',
|
||||
'$3r_DisplayInfo = $60 $5[DUMPTODISK, RESTRICTEDMODE]$4'))
|
||||
wait_for(lambda: _retry_command(remote_console_instance, 'r_antialiasingmode 0',
|
||||
'$3r_AntialiasingMode = $60 $5[]$4'))
|
||||
wait_for(lambda: _retry_command(remote_console_instance, 'e_WaterOcean 0',
|
||||
'$3e_WaterOcean = $60 $5[]$4'))
|
||||
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
"""
|
||||
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
|
||||
"""
|
||||
|
||||
|
||||
class Tests:
|
||||
load_level = (
|
||||
"Level loaded successfully",
|
||||
"Failed to load the level"
|
||||
)
|
||||
create_entity = (
|
||||
"Parent entity created successfully",
|
||||
"Failed to create a parent entity"
|
||||
)
|
||||
set_entity_name = (
|
||||
"Entity name set successfully",
|
||||
"Failed to set entity name"
|
||||
)
|
||||
delete_entity = (
|
||||
"Parent Entity deleted successfully",
|
||||
"Failed to delete parent entity"
|
||||
)
|
||||
create_child_entity = (
|
||||
"Child entity created successfully",
|
||||
"Failed to create a child entity"
|
||||
)
|
||||
delete_child_entity = (
|
||||
"Child entity deleted successfully",
|
||||
"Failed to delete child entity"
|
||||
)
|
||||
add_mesh_component = (
|
||||
"Mesh component added successfully",
|
||||
"Failed to add mesh component"
|
||||
)
|
||||
found_component_typeId = (
|
||||
"Found component typeId",
|
||||
"Unable to find component TypeId"
|
||||
)
|
||||
remove_mesh_component = (
|
||||
"Mesh component removed successfully",
|
||||
"Failed to remove mesh component"
|
||||
)
|
||||
|
||||
|
||||
def BasicEditorWorkflows_ExistingLevel_EntityComponentCRUD():
|
||||
"""
|
||||
Performing basic test in editor
|
||||
01. Load exiting level
|
||||
02. create parent entity and set name
|
||||
03. create child entity and set a name
|
||||
04. delete child entity
|
||||
05. add mesh component to parent entity
|
||||
06. delete parent entity
|
||||
"""
|
||||
|
||||
from editor_python_test_tools.utils import Report
|
||||
from editor_python_test_tools.editor_entity_utils import EditorEntity
|
||||
|
||||
import azlmbr.bus as bus
|
||||
import azlmbr.editor as editor
|
||||
import azlmbr.entity as entity
|
||||
import azlmbr.legacy.general as general
|
||||
import azlmbr.object
|
||||
|
||||
# 01. load an existing level
|
||||
test_level = 'Simple'
|
||||
general.open_level_no_prompt(test_level)
|
||||
Report.result(Tests.load_level, general.get_current_level_name() == test_level)
|
||||
|
||||
# 02. create parent entity and set name
|
||||
# Delete any exiting entity and Create a new Entity at the root level
|
||||
search_filter = azlmbr.entity.SearchFilter()
|
||||
all_entities = entity.SearchBus(azlmbr.bus.Broadcast, "SearchEntities", search_filter)
|
||||
editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntities", all_entities)
|
||||
parent_entity = EditorEntity.create_editor_entity("Parent_1")
|
||||
Report.result(Tests.create_entity, parent_entity.exists())
|
||||
|
||||
# 03. Create child Entity to above created parent entity and set a name
|
||||
child_1_entity = EditorEntity.create_editor_entity("Child_1", parent_entity.id )
|
||||
Report.result(Tests.create_child_entity, child_1_entity.exists())
|
||||
|
||||
# 04. delete_Child_entity
|
||||
child_1_entity.delete()
|
||||
Report.result(Tests.delete_child_entity, not child_1_entity.exists())
|
||||
|
||||
# 05. add mesh component to parent entity
|
||||
parent_entity.add_component("Mesh")
|
||||
Report.result(Tests.add_mesh_component, parent_entity.has_component("Mesh"))
|
||||
|
||||
# 06. delete parent entity
|
||||
parent_entity.delete()
|
||||
Report.result(Tests.delete_entity, not parent_entity.exists())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
from editor_python_test_tools.utils import Report
|
||||
|
||||
Report.start_test(BasicEditorWorkflows_ExistingLevel_EntityComponentCRUD)
|
||||
@@ -73,3 +73,7 @@ class TestAutomationAutoTestMode(EditorTestSuite):
|
||||
@pytest.mark.skip(reason="Times out due to dialogs failing to dismiss: LYN-4208")
|
||||
class test_Menus_FileMenuOptions_Work(EditorSharedTest):
|
||||
from .EditorScripts import Menus_FileMenuOptions as test_module
|
||||
|
||||
|
||||
class test_BasicEditorWorkflows_ExistingLevel_EntityComponentCRUD(EditorSharedTest):
|
||||
from .EditorScripts import BasicEditorWorkflows_ExistingLevel_EntityComponentCRUD as test_module
|
||||
|
||||
+2
-2
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:817bd8dd22e185136418b60fba5b3552993687515d3d5ae96791f2c3be907b92
|
||||
size 7233
|
||||
oid sha256:60276c07b45a734e4f71d695278167ea61e884f8b513906168c9642078ad5954
|
||||
size 6045
|
||||
|
||||
Reference in New Issue
Block a user