diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCapsuleDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCapsuleDamage.py
index a961ccdc52..7ed47d0b58 100755
--- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCapsuleDamage.py
+++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCapsuleDamage.py
@@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from ActorSplitsAfterDamage import Tests
-def run():
- from ActorSplitsAfterDamage import run as internal_run
- from editor_python_test_tools.utils import Constants
+def ActorSplitsAfterCapsuleDamage():
+ from ActorSplitsAfterDamage import base_run as internal_run
+ from BlastUtils import Constants
def CapsuleDamage(target_id, position0):
position1 = azlmbr.object.construct('Vector3', position0.x + 1.0, position0.y, position0.z)
@@ -30,4 +30,8 @@ def run():
if __name__ == "__main__":
- run()
+ import ImportPathHelper as imports
+ imports.init()
+
+ from editor_python_test_tools.utils import Report
+ Report.start_test(ActorSplitsAfterCapsuleDamage)
diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCollision.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCollision.py
index 5692773d6d..a75aae21f0 100755
--- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCollision.py
+++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCollision.py
@@ -22,7 +22,7 @@ class Tests():
# fmt: on
-def run():
+def ActorSplitsAfterCollision():
"""
Summary:
@@ -60,8 +60,8 @@ def run():
import azlmbr.legacy.general as general
import azlmbr.bus
- from editor_python_test_tools.utils import CollisionHandler
- from editor_python_test_tools.utils import BlastNotificationHandler
+ from BlastUtils import CollisionHandler
+ from BlastUtils import BlastNotificationHandler
# Constants
TIMEOUT = 2.0
@@ -107,4 +107,8 @@ def run():
if __name__ == "__main__":
- run()
+ import ImportPathHelper as imports
+ imports.init()
+
+ from editor_python_test_tools.utils import Report
+ Report.start_test(ActorSplitsAfterCollision)
diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterDamage.py
index ddd90ca89a..d71f17c958 100755
--- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterDamage.py
+++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterDamage.py
@@ -20,7 +20,7 @@ class Tests():
# fmt: on
-def run(damage_func):
+def base_run(damage_func):
"""
Summary:
@@ -56,7 +56,7 @@ def run(damage_func):
import azlmbr.legacy.general as general
import azlmbr.bus
- from editor_python_test_tools.utils import BlastNotificationHandler
+ from BlastUtils import BlastNotificationHandler
# Constants
TIMEOUT = 2.0
diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterImpactSpreadDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterImpactSpreadDamage.py
index 9b3fd1e596..e2783ef605 100755
--- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterImpactSpreadDamage.py
+++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterImpactSpreadDamage.py
@@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from ActorSplitsAfterDamage import Tests
-def run():
- from ActorSplitsAfterDamage import run as internal_run
- from editor_python_test_tools.utils import Constants
+def ActorSplitsAfterImpactSpreadDamage():
+ from ActorSplitsAfterDamage import base_run as internal_run
+ from BlastUtils import Constants
def ImpactSpreadDamage(target_id, position):
azlmbr.destruction.BlastFamilyDamageRequestBus(azlmbr.bus.Event, "Impact Spread Damage", target_id,
@@ -28,4 +28,8 @@ def run():
if __name__ == "__main__":
- run()
+ import ImportPathHelper as imports
+ imports.init()
+
+ from editor_python_test_tools.utils import Report
+ Report.start_test(ActorSplitsAfterImpactSpreadDamage)
diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterRadialDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterRadialDamage.py
index a219e63d34..f89a322bec 100755
--- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterRadialDamage.py
+++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterRadialDamage.py
@@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from ActorSplitsAfterDamage import Tests
-def run():
- from ActorSplitsAfterDamage import run as internal_run
- from editor_python_test_tools.utils import Constants
+def ActorSplitsAfterRadialDamage():
+ from ActorSplitsAfterDamage import base_run as internal_run
+ from BlastUtils import Constants
def RadialDamage(target_id, position):
azlmbr.destruction.BlastFamilyDamageRequestBus(azlmbr.bus.Event, "Radial Damage", target_id,
@@ -28,4 +28,8 @@ def run():
if __name__ == "__main__":
- run()
+ import ImportPathHelper as imports
+ imports.init()
+
+ from editor_python_test_tools.utils import Report
+ Report.start_test(ActorSplitsAfterRadialDamage)
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterShearDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterShearDamage.py
index e775be302d..5d2b6db1f3 100755
--- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterShearDamage.py
+++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterShearDamage.py
@@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from ActorSplitsAfterDamage import Tests
-def run():
- from ActorSplitsAfterDamage import run as internal_run
- from editor_python_test_tools.utils import Constants
+def ActorSplitsAfterShearDamage():
+ from ActorSplitsAfterDamage import base_run as internal_run
+ from BlastUtils import Constants
def ShearDamage(target_id, position):
normal = azlmbr.object.construct('Vector3', 1.0, 0.0, 0.0)
@@ -29,4 +29,8 @@ def run():
if __name__ == "__main__":
- run()
+ import ImportPathHelper as imports
+ imports.init()
+
+ from editor_python_test_tools.utils import Report
+ Report.start_test(ActorSplitsAfterShearDamage)
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterStressDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterStressDamage.py
index 0195190348..bfbbde259a 100755
--- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterStressDamage.py
+++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterStressDamage.py
@@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from ActorSplitsAfterDamage import Tests
-def run():
- from ActorSplitsAfterDamage import run as internal_run
- from editor_python_test_tools.utils import Constants
+def ActorSplitsAfterStressDamage():
+ from ActorSplitsAfterDamage import base_run as internal_run
+ from BlastUtils import Constants
def StressDamage(target_id, position):
force = azlmbr.object.construct('Vector3', 0.0, 0.0, -100.0) # Should be enough to break `brittle` objects
@@ -28,4 +28,8 @@ def run():
if __name__ == "__main__":
- run()
+ import ImportPathHelper as imports
+ imports.init()
+
+ from editor_python_test_tools.utils import Report
+ Report.start_test(ActorSplitsAfterStressDamage)
diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterTriangleDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterTriangleDamage.py
index 0351fe42e2..e8f44bbc77 100755
--- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterTriangleDamage.py
+++ b/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterTriangleDamage.py
@@ -15,9 +15,9 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from ActorSplitsAfterDamage import Tests
-def run():
- from ActorSplitsAfterDamage import run as internal_run
- from editor_python_test_tools.utils import Constants
+def ActorSplitsAfterTriangleDamage():
+ from ActorSplitsAfterDamage import base_run as internal_run
+ from BlastUtils import Constants
def TriangleDamage(target_id, position):
# Some points that form a triangle that contains the given position
@@ -32,4 +32,8 @@ def run():
if __name__ == "__main__":
- run()
+ import ImportPathHelper as imports
+ imports.init()
+
+ from editor_python_test_tools.utils import Report
+ Report.start_test(ActorSplitsAfterTriangleDamage)
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/Blast/Utils.py b/AutomatedTesting/Gem/PythonTests/Blast/BlastUtils.py
old mode 100755
new mode 100644
similarity index 100%
rename from AutomatedTesting/Gem/PythonTests/Blast/Utils.py
rename to AutomatedTesting/Gem/PythonTests/Blast/BlastUtils.py
diff --git a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
index c23d92d60a..d31ea6334c 100644
--- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
@@ -16,39 +16,53 @@
ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME})
add_subdirectory(assetpipeline)
+add_subdirectory(atom_renderer)
## Physics ##
-# DISABLED - see LYN-2536
-#if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
-# ly_add_pytest(
-# NAME AutomatedTesting::PhysicsTests
-# TEST_SUITE main
-# TEST_SERIAL
-# PATH ${CMAKE_CURRENT_LIST_DIR}/physics/TestSuite_Active.py
-# TIMEOUT 3600
-# RUNTIME_DEPENDENCIES
-# Legacy::Editor
-# Legacy::CryRenderNULL
-# AZ::AssetProcessor
-# AutomatedTesting.Assets
-# COMPONENT
-# Physics
-# )
-# ly_add_pytest(
-# NAME AutomatedTesting::PhysicsTests_Sandbox
-# TEST_SUITE sandbox
-# TEST_SERIAL
-# PATH ${CMAKE_CURRENT_LIST_DIR}/physics/TestSuite_Sandbox.py
-# TIMEOUT 3600
-# RUNTIME_DEPENDENCIES
-# Legacy::Editor
-# Legacy::CryRenderNULL
-# AZ::AssetProcessor
-# AutomatedTesting.Assets
-# COMPONENT
-# Physics
-# )
-#endif()
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
+ ly_add_pytest(
+ NAME AutomatedTesting::PhysicsTests_Main
+ TEST_SUITE main
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}/physics/TestSuite_Main.py
+ TIMEOUT 3600
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ Legacy::CryRenderNULL
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ COMPONENT
+ Physics
+ )
+ ly_add_pytest(
+ NAME AutomatedTesting::PhysicsTests_Periodic
+ TEST_SUITE periodic
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}/physics/TestSuite_Periodic.py
+ TIMEOUT 3600
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ Legacy::CryRenderNULL
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ COMPONENT
+ Physics
+ )
+ ly_add_pytest(
+ NAME AutomatedTesting::PhysicsTests_Sandbox
+ TEST_SUITE sandbox
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}/physics/TestSuite_Sandbox.py
+ TIMEOUT 3600
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ Legacy::CryRenderNULL
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ COMPONENT
+ Physics
+ )
+endif()
## ScriptCanvas ##
if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
@@ -81,23 +95,22 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
endif()
## White Box ##
-# DISABLED - See LYN-2663
-#if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
-# ly_add_pytest(
-# NAME AutomatedTesting::WhiteBoxTests
-# TEST_SUITE main
-# TEST_SERIAL
-# PATH ${CMAKE_CURRENT_LIST_DIR}/WhiteBox/TestSuite_Active.py
-# TIMEOUT 3600
-# RUNTIME_DEPENDENCIES
-# Legacy::Editor
-# Legacy::CryRenderNULL
-# AZ::AssetProcessor
-# AutomatedTesting.Assets
-# COMPONENT
-# WhiteBox
-# )
-#endif()
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
+ ly_add_pytest(
+ NAME AutomatedTesting::WhiteBoxTests
+ TEST_SUITE main
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}/WhiteBox/TestSuite_Active.py
+ TIMEOUT 3600
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ Legacy::CryRenderNULL
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ COMPONENT
+ WhiteBox
+ )
+endif()
## NvCloth ##
# [TODO LYN-1928] Enable when AutomatedTesting runs with Atom
@@ -157,7 +170,7 @@ endif()
if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
ly_add_pytest(
NAME AutomatedTesting::BlastTests
- TEST_SUITE periodic
+ TEST_SUITE main
TEST_SERIAL TRUE
PATH ${CMAKE_CURRENT_LIST_DIR}/Blast/TestSuite_Active.py
TIMEOUT 3600
@@ -165,6 +178,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
Legacy::Editor
AZ::AssetProcessor
AutomatedTesting.Assets
+ COMPONENT Blast
)
endif()
@@ -177,8 +191,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
## DynVeg ##
ly_add_pytest(
- NAME DynamicVegetationTests_Main_GPU
- TEST_REQUIRES gpu
+ NAME AutomatedTesting::DynamicVegetationTests_Main
TEST_SERIAL
TEST_SUITE main
PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/dyn_veg
@@ -194,8 +207,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
)
ly_add_pytest(
- NAME DynamicVegetationTests_Sandbox_GPU
- TEST_REQUIRES gpu
+ NAME AutomatedTesting::DynamicVegetationTests_Sandbox
TEST_SERIAL
TEST_SUITE sandbox
PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/dyn_veg
@@ -211,8 +223,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
)
ly_add_pytest(
- NAME DynamicVegetationTests_Periodic_GPU
- TEST_REQUIRES gpu
+ NAME AutomatedTesting::DynamicVegetationTests_Periodic
TEST_SERIAL
TEST_SUITE periodic
PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/dyn_veg
@@ -228,8 +239,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
## LandscapeCanvas ##
ly_add_pytest(
- NAME LandscapeCanvasTests_Main
- TEST_REQUIRES gpu
+ NAME AutomatedTesting::LandscapeCanvasTests_Main
TEST_SERIAL
TEST_SUITE main
PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/landscape_canvas
@@ -244,8 +254,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
)
ly_add_pytest(
- NAME LandscapeCanvasTests_Periodic
- TEST_REQUIRES gpu
+ NAME AutomatedTesting::LandscapeCanvasTests_Periodic
TEST_SERIAL
TEST_SUITE periodic
PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/landscape_canvas
@@ -261,8 +270,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
## GradientSignal ##
ly_add_pytest(
- NAME GradientSignalTests_Periodic
- TEST_REQUIRES gpu
+ NAME AutomatedTesting::GradientSignalTests_Periodic
TEST_SERIAL
TEST_SUITE periodic
PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/gradient_signal
@@ -280,7 +288,7 @@ endif()
## Editor ##
if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_FOUNDATION_TEST_SUPPORTED)
ly_add_pytest(
- NAME EditorTests_Periodic
+ NAME AutomatedTesting::EditorTests_Periodic
TEST_SUITE periodic
TEST_SERIAL
PATH ${CMAKE_CURRENT_LIST_DIR}/editor
@@ -298,7 +306,7 @@ endif()
if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
# Unstable, SPEC-3838 will restore
#ly_add_pytest(
- # NAME asset_load_benchmark_test
+ # NAME AutomatedTesting::asset_load_benchmark_test
# TEST_SERIAL
# TEST_SUITE benchmark
# PATH ${CMAKE_CURRENT_LIST_DIR}/streaming/benchmark/asset_load_benchmark_test.py
diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_test_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_test_utils.py
index ee352f8a73..9f498bbf50 100644
--- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_test_utils.py
+++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_test_utils.py
@@ -32,7 +32,7 @@ def teardown_editor(editor):
def launch_and_validate_results(request, test_directory, editor, editor_script, expected_lines, unexpected_lines=[],
- halt_on_unexpected=False, run_python="--runpythontest", auto_test_mode=True, null_renderer=False, cfg_args=[],
+ halt_on_unexpected=False, run_python="--runpythontest", auto_test_mode=True, null_renderer=True, cfg_args=[],
timeout=300):
"""
Runs the Editor with the specified script, and monitors for expected log lines.
@@ -58,7 +58,7 @@ def launch_and_validate_results(request, test_directory, editor, editor_script,
if auto_test_mode:
editor.args.extend(["--autotest_mode"])
if null_renderer:
- editor.args.extend(["-NullRenderer"])
+ editor.args.extend(["-rhi=Null"])
with editor.start():
diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/utils.py
index 6ca0ec16a7..a9f6d0aa02 100644
--- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/utils.py
+++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/utils.py
@@ -278,6 +278,12 @@ class Tracer:
self.function = args[3]
self.message = args[4]
+ def __str__(self):
+ return f"Warning: [{self.filename}:{self.function}:{self.line}]: [{self.window}] {self.message}"
+
+ def __repr__(self):
+ return f"[Warning: {self.message}]"
+
class ErrorInfo:
def __init__(self, args):
self.window = args[0]
@@ -285,6 +291,12 @@ class Tracer:
self.line = args[2]
self.function = args[3]
self.message = args[4]
+
+ def __str__(self):
+ return f"Error: [{self.filename}:{self.function}:{self.line}]: [{self.window}] {self.message}"
+
+ def __repr__(self):
+ return f"[Error: {self.message}]"
class AssertInfo:
def __init__(self, args):
@@ -292,6 +304,12 @@ class Tracer:
self.line = args[1]
self.function = args[2]
self.message = args[3]
+
+ def __str__(self):
+ return f"Assert: [{self.filename}:{self.function}:{self.line}]: {self.message}"
+
+ def __repr__(self):
+ return f"[Assert: {self.message}]"
def _on_warning(self, args):
warningInfo = Tracer.WarningInfo(args)
diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798177_WhiteBox_AddComponentToEntity.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798177_WhiteBox_AddComponentToEntity.py
index 252126674c..dabc04575f 100755
--- a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798177_WhiteBox_AddComponentToEntity.py
+++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798177_WhiteBox_AddComponentToEntity.py
@@ -22,10 +22,10 @@ class Tests():
# fmt:on
-def run():
+def C28798177_WhiteBox_AddComponentToEntity():
import os
import sys
- import WhiteBoxInit as init
+ from Gems.WhiteBox.Editor.Scripts import WhiteBoxInit as init
import ImportPathHelper as imports
imports.init()
@@ -58,4 +58,8 @@ def run():
if __name__ == "__main__":
- run()
+ import ImportPathHelper as imports
+ imports.init()
+
+ from editor_python_test_tools.utils import Report
+ Report.start_test(C28798177_WhiteBox_AddComponentToEntity)
diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798205_WhiteBox_SetInvisible.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798205_WhiteBox_SetInvisible.py
index b7c6719721..18a5c3164e 100755
--- a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798205_WhiteBox_SetInvisible.py
+++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798205_WhiteBox_SetInvisible.py
@@ -22,13 +22,13 @@ class Tests():
# fmt:on
-def run():
+def C28798205_WhiteBox_SetInvisible():
# note: This automated test does not fully replicate the test case in Test Rail as it's
# not currently possible using the Hydra API to get an EntityComponentIdPair at runtime,
# in future game_mode will be activated and a runtime White Box Component queried
import os
import sys
- import WhiteBoxInit as init
+ from Gems.WhiteBox.Editor.Scripts import WhiteBoxInit as init
import ImportPathHelper as imports
import editor_python_test_tools.hydra_editor_utils as hydra
imports.init()
@@ -68,4 +68,8 @@ def run():
if __name__ == "__main__":
- run()
+ import ImportPathHelper as imports
+ imports.init()
+
+ from editor_python_test_tools.utils import Report
+ Report.start_test(C28798205_WhiteBox_SetInvisible)
diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/C29279329_WhiteBox_SetDefaultShape.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/C29279329_WhiteBox_SetDefaultShape.py
index 0b0a081186..e892285dde 100755
--- a/AutomatedTesting/Gem/PythonTests/WhiteBox/C29279329_WhiteBox_SetDefaultShape.py
+++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/C29279329_WhiteBox_SetDefaultShape.py
@@ -26,10 +26,10 @@ class Tests():
critical_shape_check = ("Default shape has more than 0 sides", "default shape has 0 sides")
-def run():
+def C29279329_WhiteBox_SetDefaultShape():
import os
import sys
- import WhiteBoxInit as init
+ from Gems.WhiteBox.Editor.Scripts import WhiteBoxInit as init
import ImportPathHelper as imports
imports.init()
@@ -107,4 +107,8 @@ def run():
if __name__ == "__main__":
- run()
+ import ImportPathHelper as imports
+ imports.init()
+
+ from editor_python_test_tools.utils import Report
+ Report.start_test(C29279329_WhiteBox_SetDefaultShape)
diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt
new file mode 100644
index 0000000000..7ffc2072f1
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt
@@ -0,0 +1,40 @@
+#
+# 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.
+#
+
+################################################################################
+# Atom Renderer: Automated Tests
+# Runs EditorPythonBindings (hydra) scripts inside the Editor to verify test results for the Atom renderer.
+################################################################################
+
+if(PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_BUILD_TESTS_SUPPORTED AND AutomatedTesting IN_LIST LY_PROJECTS)
+ ly_add_pytest(
+ NAME AutomatedTesting::AtomRenderer_HydraTests_Main
+ TEST_SUITE main
+ PATH ${CMAKE_CURRENT_LIST_DIR}/test_Atom_MainSuite.py
+ TEST_SERIAL
+ TIMEOUT 300
+ RUNTIME_DEPENDENCIES
+ AssetProcessor
+ AutomatedTesting.Assets
+ Editor
+ )
+ ly_add_pytest(
+ NAME AutomatedTesting::AtomRenderer_HydraTests_Sandbox
+ TEST_SUITE sandbox
+ PATH ${CMAKE_CURRENT_LIST_DIR}/test_Atom_SandboxSuite.py
+ TEST_SERIAL
+ TIMEOUT 300
+ RUNTIME_DEPENDENCIES
+ AssetProcessor
+ AutomatedTesting.Assets
+ Editor
+ )
+endif()
diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/__init__.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/__init__.py
new file mode 100644
index 0000000000..79f8fa4422
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/__init__.py
@@ -0,0 +1,10 @@
+"""
+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.
+"""
diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/__init__.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/__init__.py
new file mode 100644
index 0000000000..79f8fa4422
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/__init__.py
@@ -0,0 +1,10 @@
+"""
+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.
+"""
diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py
new file mode 100644
index 0000000000..82a7e92c16
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py
@@ -0,0 +1,233 @@
+"""
+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.
+
+Hydra script that creates an entity and attaches Atom components to it for test verification.
+"""
+
+import os
+import sys
+
+import azlmbr.math as math
+import azlmbr.bus as bus
+import azlmbr.paths
+import azlmbr.asset as asset
+import azlmbr.entity as entity
+import azlmbr.legacy.general as general
+import azlmbr.editor as editor
+
+sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests"))
+
+import editor_python_test_tools.hydra_editor_utils as hydra
+from editor_python_test_tools.utils import TestHelper
+
+
+def run():
+ """
+ Summary:
+ The below common tests are done for each of the components.
+ 1) Addition of component to the entity
+ 2) UNDO/REDO of addition of component
+ 3) Enter/Exit game mode
+ 4) Hide/Show entity containing component
+ 5) Deletion of component
+ 6) UNDO/REDO of deletion of component
+ Some additional tests for specific components include
+ 1) Assigning value to some properties of each component
+ 2) Verifying if the component is activated only when the required components are added
+
+ Expected Result:
+ 1) Component can be added to an entity.
+ 2) The addition of component can be undone and redone.
+ 3) Game mode can be entered/exited without issue.
+ 4) Entity with component can be hidden/shown.
+ 5) Component can be deleted.
+ 6) The deletion of component can be undone and redone.
+ 7) Component is activated only when the required components are added
+ 8) Values can be assigned to the properties of the component
+
+ :return: None
+ """
+
+ def create_entity_undo_redo_component_addition(component_name):
+ new_entity = hydra.Entity(f"{component_name}")
+ new_entity.create_entity(math.Vector3(512.0, 512.0, 34.0), [component_name])
+ general.log(f"{component_name}_test: Component added to the entity: "
+ f"{hydra.has_components(new_entity.id, [component_name])}")
+
+ # undo component addition
+ general.undo()
+ TestHelper.wait_for_condition(lambda: not hydra.has_components(new_entity.id, [component_name]), 2.0)
+ general.log(f"{component_name}_test: Component removed after UNDO: "
+ f"{not hydra.has_components(new_entity.id, [component_name])}")
+
+ # redo component addition
+ general.redo()
+ TestHelper.wait_for_condition(lambda: hydra.has_components(new_entity.id, [component_name]), 2.0)
+ general.log(f"{component_name}_test: Component added after REDO: "
+ f"{hydra.has_components(new_entity.id, [component_name])}")
+
+ return new_entity
+
+ def verify_enter_exit_game_mode(component_name):
+ general.enter_game_mode()
+ TestHelper.wait_for_condition(lambda: general.is_in_game_mode(), 1.0)
+ general.log(f"{component_name}_test: Entered game mode: {general.is_in_game_mode()}")
+ general.exit_game_mode()
+ TestHelper.wait_for_condition(lambda: not general.is_in_game_mode(), 1.0)
+ general.log(f"{component_name}_test: Exit game mode: {not general.is_in_game_mode()}")
+
+ def verify_hide_unhide_entity(component_name, entity_obj):
+
+ def is_entity_hidden(entity_id):
+ return editor.EditorEntityInfoRequestBus(bus.Event, "IsHidden", entity_id)
+
+ editor.EditorEntityAPIBus(bus.Event, "SetVisibilityState", entity_obj.id, False)
+ general.idle_wait_frames(1)
+ general.log(f"{component_name}_test: Entity is hidden: {is_entity_hidden(entity_obj.id)}")
+ editor.EditorEntityAPIBus(bus.Event, "SetVisibilityState", entity_obj.id, True)
+ general.idle_wait_frames(1)
+ general.log(f"{component_name}_test: Entity is shown: {not is_entity_hidden(entity_obj.id)}")
+
+ def verify_deletion_undo_redo(component_name, entity_obj):
+ editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntityById", entity_obj.id)
+ TestHelper.wait_for_condition(lambda: not hydra.find_entity_by_name(entity_obj.name), 1.0)
+ general.log(f"{component_name}_test: Entity deleted: {not hydra.find_entity_by_name(entity_obj.name)}")
+
+ general.undo()
+ TestHelper.wait_for_condition(lambda: hydra.find_entity_by_name(entity_obj.name) is not None, 1.0)
+ general.log(f"{component_name}_test: UNDO entity deletion works: "
+ f"{hydra.find_entity_by_name(entity_obj.name) is not None}")
+
+ general.redo()
+ TestHelper.wait_for_condition(lambda: not hydra.find_entity_by_name(entity_obj.name), 1.0)
+ general.log(f"{component_name}_test: REDO entity deletion works: "
+ f"{not hydra.find_entity_by_name(entity_obj.name)}")
+
+ def verify_required_component_addition(entity_obj, components_to_add, component_name):
+
+ def is_component_enabled(entity_componentid_pair):
+ return editor.EditorComponentAPIBus(bus.Broadcast, "IsComponentEnabled", entity_componentid_pair)
+
+ general.log(
+ f"{component_name}_test: Entity disabled initially: "
+ f"{not is_component_enabled(entity_obj.components[0])}")
+ for component in components_to_add:
+ entity_obj.add_component(component)
+ TestHelper.wait_for_condition(lambda: is_component_enabled(entity_obj.components[0]), 1.0)
+ general.log(
+ f"{component_name}_test: Entity enabled after adding "
+ f"required components: {is_component_enabled(entity_obj.components[0])}"
+ )
+
+ def verify_set_property(entity_obj, path, value):
+ entity_obj.get_set_test(0, path, value)
+
+ # Wait for Editor idle loop before executing Python hydra scripts.
+ TestHelper.init_idle()
+
+ # Delete all existing entities initially
+ search_filter = azlmbr.entity.SearchFilter()
+ all_entities = entity.SearchBus(azlmbr.bus.Broadcast, "SearchEntities", search_filter)
+ editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntities", all_entities)
+
+ class ComponentTests:
+ """Test launcher for each component."""
+ def __init__(self, component_name, *additional_tests):
+ self.component_name = component_name
+ self.additional_tests = additional_tests
+ self.run_component_tests()
+
+ def run_component_tests(self):
+ # Run common and additional tests
+ entity_obj = create_entity_undo_redo_component_addition(self.component_name)
+
+ # Enter/Exit game mode test
+ verify_enter_exit_game_mode(self.component_name)
+
+ # Any additional tests are executed here
+ for test in self.additional_tests:
+ test(entity_obj)
+
+ # Hide/Unhide entity test
+ verify_hide_unhide_entity(self.component_name, entity_obj)
+
+ # Deletion/Undo/Redo test
+ verify_deletion_undo_redo(self.component_name, entity_obj)
+
+ # Area Light Component
+ area_light = "Area Light"
+ ComponentTests(
+ area_light, lambda entity_obj: verify_required_component_addition(
+ entity_obj, ["Capsule Shape"], area_light))
+
+ # Decal Component
+ material_asset_path = os.path.join("Materials", "basic_grey.material")
+ material_asset = asset.AssetCatalogRequestBus(
+ bus.Broadcast, "GetAssetIdByPath", material_asset_path, math.Uuid(), False)
+ ComponentTests(
+ "Decal", lambda entity_obj: verify_set_property(
+ entity_obj, "Settings|Decal Settings|Material", material_asset))
+
+ # DepthOfField Component
+ camera_entity = hydra.Entity("camera_entity")
+ camera_entity.create_entity(math.Vector3(512.0, 512.0, 34.0), ["Camera"])
+ depth_of_field = "DepthOfField"
+ ComponentTests(
+ depth_of_field,
+ lambda entity_obj: verify_required_component_addition(entity_obj, ["PostFX Layer"], depth_of_field),
+ lambda entity_obj: verify_set_property(
+ entity_obj, "Controller|Configuration|Camera Entity", camera_entity.id))
+
+ # Directional Light Component
+ ComponentTests(
+ "Directional Light",
+ lambda entity_obj: verify_set_property(
+ entity_obj, "Controller|Configuration|Shadow|Camera", camera_entity.id))
+
+ # Exposure Control Component
+ ComponentTests(
+ "Exposure Control", lambda entity_obj: verify_required_component_addition(
+ entity_obj, ["PostFX Layer"], "Exposure Control"))
+
+ # Global Skylight (IBL) Component
+ diffuse_image_path = os.path.join("LightingPresets", "greenwich_park_02_4k_iblskyboxcm.exr.streamingimage")
+ diffuse_image_asset = asset.AssetCatalogRequestBus(
+ bus.Broadcast, "GetAssetIdByPath", diffuse_image_path, math.Uuid(), False)
+ specular_image_path = os.path.join("LightingPresets", "greenwich_park_02_4k_iblskyboxcm.exr.streamingimage")
+ specular_image_asset = asset.AssetCatalogRequestBus(
+ bus.Broadcast, "GetAssetIdByPath", specular_image_path, math.Uuid(), False)
+ ComponentTests(
+ "Global Skylight (IBL)",
+ lambda entity_obj: verify_set_property(
+ entity_obj, "Controller|Configuration|Diffuse Image", diffuse_image_asset),
+ lambda entity_obj: verify_set_property(
+ entity_obj, "Controller|Configuration|Specular Image", specular_image_asset))
+
+ # Physical Sky Component
+ ComponentTests("Physical Sky")
+
+ # Point Light Component
+ ComponentTests("Point Light")
+
+ # PostFX Layer Component
+ ComponentTests("PostFX Layer")
+
+ # Radius Weight Modifier Component
+ ComponentTests("Radius Weight Modifier")
+
+ # Light Component
+ ComponentTests("Light")
+
+ # Display Mapper Component
+ ComponentTests("Display Mapper")
+
+
+if __name__ == "__main__":
+ run()
diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py
new file mode 100644
index 0000000000..8621fcb248
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py
@@ -0,0 +1,219 @@
+"""
+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.
+"""
+
+import logging
+import os
+import pytest
+
+import editor_python_test_tools.hydra_test_utils as hydra
+
+logger = logging.getLogger(__name__)
+EDITOR_TIMEOUT = 120
+TEST_DIRECTORY = os.path.join(os.path.dirname(__file__), "atom_hydra_scripts")
+
+
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
+@pytest.mark.parametrize("level", ["auto_test"])
+class TestAtomEditorComponents(object):
+
+
+ @pytest.mark.test_case_id(
+ "C32078117", # Area Light
+ "C32078130", # Display Mapper
+ "C32078129", # Light
+ "C32078131", # Radius Weight Modifier
+ "C32078127", # PostFX Layer
+ "C32078126", # Point Light
+ "C32078125", # Physical Sky
+ "C32078115", # Global Skylight (IBL)
+ "C32078121", # Exposure Control
+ "C32078120", # Directional Light
+ "C32078119", # DepthOfField
+ "C32078118") # Decal
+ def test_AtomEditorComponents_AddedToEntity(self, request, editor, level, workspace, project, launcher_platform):
+ cfg_args = [level]
+
+ expected_lines = [
+ # Area Light Component
+ "Area Light Entity successfully created",
+ "Area Light_test: Component added to the entity: True",
+ "Area Light_test: Component removed after UNDO: True",
+ "Area Light_test: Component added after REDO: True",
+ "Area Light_test: Entered game mode: True",
+ "Area Light_test: Entity enabled after adding required components: True",
+ "Area Light_test: Entity is hidden: True",
+ "Area Light_test: Entity is shown: True",
+ "Area Light_test: Entity deleted: True",
+ "Area Light_test: UNDO entity deletion works: True",
+ "Area Light_test: REDO entity deletion works: True",
+ # Decal Component
+ "Decal Entity successfully created",
+ "Decal_test: Component added to the entity: True",
+ "Decal_test: Component removed after UNDO: True",
+ "Decal_test: Component added after REDO: True",
+ "Decal_test: Entered game mode: True",
+ "Decal_test: Exit game mode: True",
+ "Decal Settings|Decal Settings|Material: SUCCESS",
+ "Decal_test: Entity is hidden: True",
+ "Decal_test: Entity is shown: True",
+ "Decal_test: Entity deleted: True",
+ "Decal_test: UNDO entity deletion works: True",
+ "Decal_test: REDO entity deletion works: True",
+ # DepthOfField Component
+ "DepthOfField Entity successfully created",
+ "DepthOfField_test: Component added to the entity: True",
+ "DepthOfField_test: Component removed after UNDO: True",
+ "DepthOfField_test: Component added after REDO: True",
+ "DepthOfField_test: Entered game mode: True",
+ "DepthOfField_test: Exit game mode: True",
+ "DepthOfField_test: Entity disabled initially: True",
+ "DepthOfField_test: Entity enabled after adding required components: True",
+ "DepthOfField Controller|Configuration|Camera Entity: SUCCESS",
+ "DepthOfField_test: Entity is hidden: True",
+ "DepthOfField_test: Entity is shown: True",
+ "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 Controller|Configuration|Shadow|Camera: SUCCESS",
+ "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",
+ "Exposure Control_test: Component removed after UNDO: True",
+ "Exposure Control_test: Component added after REDO: True",
+ "Exposure Control_test: Entered game mode: True",
+ "Exposure Control_test: Exit game mode: True",
+ "Exposure Control_test: Entity disabled initially: True",
+ "Exposure Control_test: Entity enabled after adding required components: True",
+ "Exposure Control_test: Entity is hidden: True",
+ "Exposure Control_test: Entity is shown: True",
+ "Exposure Control_test: Entity deleted: True",
+ "Exposure Control_test: UNDO entity deletion works: True",
+ "Exposure Control_test: REDO entity deletion works: True",
+ # Global Skylight (IBL) Component
+ "Global Skylight (IBL) Entity successfully created",
+ "Global Skylight (IBL)_test: Component added to the entity: True",
+ "Global Skylight (IBL)_test: Component removed after UNDO: True",
+ "Global Skylight (IBL)_test: Component added after REDO: True",
+ "Global Skylight (IBL)_test: Entered game mode: True",
+ "Global Skylight (IBL)_test: Exit game mode: True",
+ "Global Skylight (IBL) Controller|Configuration|Diffuse Image: SUCCESS",
+ "Global Skylight (IBL) Controller|Configuration|Specular Image: SUCCESS",
+ "Global Skylight (IBL)_test: Entity is hidden: True",
+ "Global Skylight (IBL)_test: Entity is shown: True",
+ "Global Skylight (IBL)_test: Entity deleted: True",
+ "Global Skylight (IBL)_test: UNDO entity deletion works: True",
+ "Global Skylight (IBL)_test: REDO entity deletion works: True",
+ # Physical Sky Component
+ "Physical Sky Entity successfully created",
+ "Physical Sky component was added to entity",
+ "Entity has a Physical Sky component",
+ "Physical Sky_test: Component added to the entity: True",
+ "Physical Sky_test: Component removed after UNDO: True",
+ "Physical Sky_test: Component added after REDO: True",
+ "Physical Sky_test: Entered game mode: True",
+ "Physical Sky_test: Exit game mode: True",
+ "Physical Sky_test: Entity is hidden: True",
+ "Physical Sky_test: Entity is shown: True",
+ "Physical Sky_test: Entity deleted: True",
+ "Physical Sky_test: UNDO entity deletion works: True",
+ "Physical Sky_test: REDO entity deletion works: True",
+ # Point Light Component
+ "Point Light Entity successfully created",
+ "Point Light_test: Component added to the entity: True",
+ "Point Light_test: Component removed after UNDO: True",
+ "Point Light_test: Component added after REDO: True",
+ "Point Light_test: Entered game mode: True",
+ "Point Light_test: Exit game mode: True",
+ "Point Light_test: Entity is hidden: True",
+ "Point Light_test: Entity is shown: True",
+ "Point Light_test: Entity deleted: True",
+ "Point Light_test: UNDO entity deletion works: True",
+ "Point Light_test: REDO entity deletion works: True",
+ # PostFX Layer Component
+ "PostFX Layer Entity successfully created",
+ "PostFX Layer_test: Component added to the entity: True",
+ "PostFX Layer_test: Component removed after UNDO: True",
+ "PostFX Layer_test: Component added after REDO: True",
+ "PostFX Layer_test: Entered game mode: True",
+ "PostFX Layer_test: Exit game mode: True",
+ "PostFX Layer_test: Entity is hidden: True",
+ "PostFX Layer_test: Entity is shown: True",
+ "PostFX Layer_test: Entity deleted: True",
+ "PostFX Layer_test: UNDO entity deletion works: True",
+ "PostFX Layer_test: REDO entity deletion works: True",
+ # Radius Weight Modifier Component
+ "Radius Weight Modifier Entity successfully created",
+ "Radius Weight Modifier_test: Component added to the entity: True",
+ "Radius Weight Modifier_test: Component removed after UNDO: True",
+ "Radius Weight Modifier_test: Component added after REDO: True",
+ "Radius Weight Modifier_test: Entered game mode: True",
+ "Radius Weight Modifier_test: Exit game mode: True",
+ "Radius Weight Modifier_test: Entity is hidden: True",
+ "Radius Weight Modifier_test: Entity is shown: True",
+ "Radius Weight Modifier_test: Entity deleted: True",
+ "Radius Weight Modifier_test: UNDO entity deletion works: True",
+ "Radius Weight Modifier_test: REDO entity deletion works: True",
+ # Light Component
+ "Light Entity successfully created",
+ "Light_test: Component added to the entity: True",
+ "Light_test: Component removed after UNDO: True",
+ "Light_test: Component added after REDO: True",
+ "Light_test: Entered game mode: True",
+ "Light_test: Exit game mode: True",
+ "Light_test: Entity is hidden: True",
+ "Light_test: Entity is shown: True",
+ "Light_test: Entity deleted: True",
+ "Light_test: UNDO entity deletion works: True",
+ "Light_test: REDO entity deletion works: True",
+ # Display Mapper Component
+ "Display Mapper Entity successfully created",
+ "Display Mapper_test: Component added to the entity: True",
+ "Display Mapper_test: Component removed after UNDO: True",
+ "Display Mapper_test: Component added after REDO: True",
+ "Display Mapper_test: Entered game mode: True",
+ "Display Mapper_test: Exit game mode: True",
+ "Display Mapper_test: Entity is hidden: True",
+ "Display Mapper_test: Entity is shown: True",
+ "Display Mapper_test: Entity deleted: True",
+ "Display Mapper_test: UNDO entity deletion works: True",
+ "Display Mapper_test: REDO entity deletion works: True",
+ ]
+
+ unexpected_lines = [
+ "failed to open",
+ "Traceback (most recent call last):",
+ ]
+
+ hydra.launch_and_validate_results(
+ request,
+ TEST_DIRECTORY,
+ editor,
+ "hydra_AtomEditorComponents_AddedToEntity.py",
+ timeout=EDITOR_TIMEOUT,
+ expected_lines=expected_lines,
+ unexpected_lines=unexpected_lines,
+ halt_on_unexpected=True,
+ null_renderer=True,
+ cfg_args=cfg_args,
+ )
diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_SandboxSuite.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_SandboxSuite.py
new file mode 100644
index 0000000000..01474e6018
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_SandboxSuite.py
@@ -0,0 +1,22 @@
+"""
+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.
+"""
+
+import pytest
+
+
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
+@pytest.mark.parametrize("level", ["auto_test"])
+class TestAtomEditorComponents(object):
+
+ # It requires at least one test
+ def test_Dummy(self, request, editor, level, workspace, project, launcher_platform):
+ pass
diff --git a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/base.py b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/base.py
index 1887d5736e..f00227c47f 100755
--- a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/base.py
+++ b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/base.py
@@ -94,13 +94,13 @@ class TestAutomationBase:
editor_starttime = time.time()
self.logger.debug("Running automated test")
testcase_module_filepath = self._get_testcase_module_filepath(testcase_module)
- pycmd = ["--runpythontest", testcase_module_filepath, "-BatchMode", "-autotest_mode", "-NullRenderer"] + extra_cmdline_args
+ pycmd = ["--runpythontest", testcase_module_filepath, "-BatchMode", "-autotest_mode", "-rhi=null"] + extra_cmdline_args
editor.args.extend(pycmd) # args are added to the WinLauncher start command
editor.start(backupFiles = False, launch_ap = False)
try:
editor.wait(TestAutomationBase.MAX_TIMEOUT)
except WaitTimeoutError:
- errors.append(TestRunError("TIMEOUT", "Editor did not close after {TestAutomationBase.MAX_TIMEOUT} seconds, verify the test is ending and the application didn't freeze"))
+ errors.append(TestRunError("TIMEOUT", f"Editor did not close after {TestAutomationBase.MAX_TIMEOUT} seconds, verify the test is ending and the application didn't freeze"))
editor.kill()
output = editor.get_output()
@@ -118,16 +118,16 @@ class TestAutomationBase:
else:
error_str = "Test failed, no output available..\n"
errors.append(TestRunError("FAILED TEST", error_str))
- if return_code != TestAutomationBase.TEST_FAIL_RETCODE: # Crashed
+ if return_code and return_code != TestAutomationBase.TEST_FAIL_RETCODE: # Crashed
crash_info = "-- No crash log available --"
- error_log = os.path.join(workspace.paths.project_log(), 'error.log')
+ crash_log = os.path.join(workspace.paths.project_log(), 'error.log')
try:
- waiter.wait_for(lambda: os.path.exists(error_log), timeout=TestAutomationBase.WAIT_FOR_CRASH_LOG)
+ waiter.wait_for(lambda: os.path.exists(crash_log), timeout=TestAutomationBase.WAIT_FOR_CRASH_LOG)
except AssertionError:
pass
try:
- with open(error_log) as f:
+ with open(crash_log) as f:
crash_info = f.read()
except Exception as ex:
crash_info += f"\n{str(ex)}"
diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetBrowser_TreeNavigation.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetBrowser_TreeNavigation.py
index dc0565d100..6019cdf247 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetBrowser_TreeNavigation.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/AssetBrowser_TreeNavigation.py
@@ -21,8 +21,8 @@ import azlmbr.legacy.general as general
import azlmbr.paths
sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests'))
-from automatedtesting_shared.editor_test_helper import EditorTestHelper
-import automatedtesting_shared.pyside_utils as pyside_utils
+from editor_python_test_tools.editor_test_helper import EditorTestHelper
+import editor_python_test_tools.pyside_utils as pyside_utils
class AssetBrowserTreeNavigationTest(EditorTestHelper):
@@ -66,7 +66,7 @@ class AssetBrowserTreeNavigationTest(EditorTestHelper):
return collapse_success and expand_success
# This is the hierarchy we are expanding (4 steps inside)
- self.file_path = ("AutomatedTesting", "Assets", "ImageGradients", "lumberyard_gsi.png")
+ self.file_path = ("AutomatedTesting", "Assets", "ImageGradients", "image_grad_test_gsi.png")
# 1) Open a new level
self.test_success = self.create_level(
diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Docking_BasicDockedTools.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Docking_BasicDockedTools.py
index b390b95c47..21d5a0ee30 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Docking_BasicDockedTools.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Docking_BasicDockedTools.py
@@ -22,8 +22,8 @@ import azlmbr.entity as entity
import azlmbr.paths
sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests'))
-from automatedtesting_shared.editor_test_helper import EditorTestHelper
-import automatedtesting_shared.pyside_utils as pyside_utils
+from editor_python_test_tools.editor_test_helper import EditorTestHelper
+import editor_python_test_tools.pyside_utils as pyside_utils
class TestDockingBasicDockedTools(EditorTestHelper):
diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py
index c7fa19e372..208ef40d41 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py
@@ -19,8 +19,8 @@ import sys
import azlmbr.paths
sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests'))
-from automatedtesting_shared.editor_test_helper import EditorTestHelper
-import automatedtesting_shared.pyside_utils as pyside_utils
+from editor_python_test_tools.editor_test_helper import EditorTestHelper
+import editor_python_test_tools.pyside_utils as pyside_utils
class TestEditMenuOptions(EditorTestHelper):
diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_FileMenuOptions.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_FileMenuOptions.py
index d8140c25c0..3e174af2bd 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_FileMenuOptions.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_FileMenuOptions.py
@@ -20,8 +20,8 @@ import sys
import azlmbr.paths
sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests'))
-from automatedtesting_shared.editor_test_helper import EditorTestHelper
-import automatedtesting_shared.pyside_utils as pyside_utils
+from editor_python_test_tools.editor_test_helper import EditorTestHelper
+import editor_python_test_tools.pyside_utils as pyside_utils
class TestFileMenuOptions(EditorTestHelper):
diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_ViewMenuOptions.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_ViewMenuOptions.py
index 1e364b5964..05ee802d19 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_ViewMenuOptions.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_ViewMenuOptions.py
@@ -19,8 +19,8 @@ import sys
import azlmbr.paths
sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests'))
-from automatedtesting_shared.editor_test_helper import EditorTestHelper
-import automatedtesting_shared.pyside_utils as pyside_utils
+from editor_python_test_tools.editor_test_helper import EditorTestHelper
+import editor_python_test_tools.pyside_utils as pyside_utils
class TestViewMenuOptions(EditorTestHelper):
diff --git a/AutomatedTesting/Gem/PythonTests/editor/conftest.py b/AutomatedTesting/Gem/PythonTests/editor/conftest.py
index 328c5ebad4..3260b8834a 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/conftest.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/conftest.py
@@ -19,7 +19,7 @@ logger = logging.getLogger(__name__)
layout = {
- 'path': r'Software\Amazon\Lumberyard\Editor\fancyWindowLayouts',
+ 'path': r'Software\Amazon\O3DE\Editor\fancyWindowLayouts',
'value': 'last'
}
restore_camera = {
diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_SearchFiltering.py b/AutomatedTesting/Gem/PythonTests/editor/test_SearchFiltering.py
deleted file mode 100755
index a3d4739fd8..0000000000
--- a/AutomatedTesting/Gem/PythonTests/editor/test_SearchFiltering.py
+++ /dev/null
@@ -1,71 +0,0 @@
-"""
-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.
-"""
-
-"""
-C13660194 : Asset Browser - Filtering
-"""
-
-import os
-import pytest
-
-# Bail on the test if ly_test_tools doesn't exist.
-pytest.importorskip('ly_test_tools')
-import ly_test_tools.environment.file_system as file_system
-import editor_python_test_tools.hydra_test_utils as hydra
-
-test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts")
-log_monitor_timeout = 90
-
-
-@pytest.mark.parametrize('project', ['AutomatedTesting'])
-@pytest.mark.parametrize('level', ['tmp_level'])
-@pytest.mark.usefixtures("automatic_process_killer")
-@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
-class TestSearchFiltering(object):
-
- @pytest.fixture(autouse=True)
- def setup_teardown(self, request, workspace, project, level):
- def teardown():
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
-
- request.addfinalizer(teardown)
-
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
-
- @pytest.mark.test_case_id("C13660194")
- @pytest.mark.SUITE_periodic
- def test_SearchFiltering_Asset_Browser_Filtering(self, request, editor, level, launcher_platform):
- expected_lines = [
- "cedar.fbx asset is filtered in Asset Browser",
- "Animation file type(s) is present in the file tree: True",
- "FileTag file type(s) and Animation file type(s) is present in the file tree: True",
- "FileTag file type(s) is present in the file tree after removing Animation filter: True",
- ]
-
- unexpected_lines = [
- "Asset Browser opened: False",
- "Animation file type(s) is present in the file tree: False",
- "FileTag file type(s) and Animation file type(s) is present in the file tree: False",
- "FileTag file type(s) is present in the file tree after removing Animation filter: False",
- ]
-
- hydra.launch_and_validate_results(
- request,
- test_directory,
- editor,
- "AssetBrowser_SearchFiltering.py",
- expected_lines,
- unexpected_lines=unexpected_lines,
- cfg_args=[level],
- auto_test_mode=False,
- run_python="--runpython",
- timeout=log_monitor_timeout,
- )
diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_TreeNavigation.py b/AutomatedTesting/Gem/PythonTests/editor/test_TreeNavigation.py
deleted file mode 100755
index 069d09f144..0000000000
--- a/AutomatedTesting/Gem/PythonTests/editor/test_TreeNavigation.py
+++ /dev/null
@@ -1,62 +0,0 @@
-"""
-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.
-"""
-
-"""
-C13660195: Asset Browser - File Tree Navigation
-"""
-
-import os
-import pytest
-
-# Bail on the test if ly_test_tools doesn't exist.
-pytest.importorskip('ly_test_tools')
-import ly_test_tools.environment.file_system as file_system
-import editor_python_test_tools.hydra_test_utils as hydra
-
-test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts")
-log_monitor_timeout = 90
-
-
-@pytest.mark.parametrize('project', ['AutomatedTesting'])
-@pytest.mark.parametrize('level', ['tmp_level'])
-@pytest.mark.usefixtures("automatic_process_killer")
-@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
-class TestTreeNavigation(object):
-
- @pytest.fixture(autouse=True)
- def setup_teardown(self, request, workspace, project, level):
- def teardown():
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
-
- request.addfinalizer(teardown)
-
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
-
- @pytest.mark.test_case_id("C13660195")
- @pytest.mark.SUITE_periodic
- def test_TreeNavigation_Asset_Browser(self, request, editor, level, launcher_platform):
- expected_lines = [
- "Collapse/Expand tests: True",
- "Asset visibility test: True",
- "Scrollbar visibility test: True",
- "TreeNavigation_Asset_Browser: result=SUCCESS"
- ]
-
- hydra.launch_and_validate_results(
- request,
- test_directory,
- editor,
- "TreeNavigation_Asset_Browser.py",
- expected_lines,
- run_python="--runpython",
- cfg_args=[level],
- timeout=log_monitor_timeout,
- )
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AltitudeFilter.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AltitudeFilter.py
index 65b5198213..2db8534696 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AltitudeFilter.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_AltitudeFilter.py
@@ -85,7 +85,8 @@ class TestAltitudeFilter(object):
@pytest.mark.test_case_id("C4847478")
@pytest.mark.SUITE_periodic
- def test_AltitudeFilterFilterStageToggle(self, request, editor, level, workspace, launcher_platform):
+ @pytest.mark.xfail # LYN-3275
+ def test_AltitudeFilter_FilterStageToggle(self, request, editor, level, workspace, launcher_platform):
cfg_args = [level]
expected_lines = [
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py
index c5b8046f73..f0673a9438 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py
@@ -41,7 +41,7 @@ class TestDynamicSliceInstanceSpawner(object):
return console
@pytest.mark.test_case_id("C28851763")
- @pytest.mark.SUITE_main
+ @pytest.mark.SUITE_sandbox
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
def test_DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks(self, request, editor, level, workspace, project,
launcher_platform):
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py
index a7f221b780..fc8c31fc7b 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py
@@ -36,8 +36,13 @@ class TestEmptyInstanceSpawner(object):
file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
- @pytest.mark.test_case_id("C28851762")
+ # Main suite needs at least one test
@pytest.mark.SUITE_main
+ def test_EmptyInstanceSpawner_Dummy(self, request, editor, level, workspace, project, launcher_platform):
+ pass
+
+ @pytest.mark.test_case_id("C28851762")
+ @pytest.mark.SUITE_sandbox
def test_EmptyInstanceSpawner_EmptySpawnerWorks(self, request, editor, level, launcher_platform):
cfg_args = [level]
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerSpawner.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerSpawner.py
index e74ecc8bd1..93149c9490 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerSpawner.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_LayerSpawner.py
@@ -101,6 +101,7 @@ class TestLayerSpawner(object):
@pytest.mark.test_case_id("C4765973")
@pytest.mark.SUITE_periodic
+ @pytest.mark.xfail # LYN-3275
def test_LayerSpawner_FilterStageToggle(self, request, editor, level, workspace, launcher_platform):
expected_lines = [
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_MeshBlocker.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_MeshBlocker.py
index 5e8ffe4d50..c04390e647 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_MeshBlocker.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_MeshBlocker.py
@@ -46,6 +46,7 @@ class TestMeshBlocker(object):
"""
@pytest.mark.test_case_id("C3980834")
@pytest.mark.SUITE_periodic
+ @pytest.mark.xfail # LYN-3273
def test_MeshBlocker_InstancesBlockedByMesh(self, request, editor, level, launcher_platform):
expected_lines = [
"'Instance Spawner' created",
@@ -69,6 +70,7 @@ class TestMeshBlocker(object):
"""
@pytest.mark.test_case_id("C4766030")
@pytest.mark.SUITE_periodic
+ @pytest.mark.xfail # LYN-3273
def test_MeshBlocker_InstancesBlockedByMeshHeightTuning(self, request, editor, level, launcher_platform):
expected_lines = [
"'Instance Spawner' created",
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_PositionModifier.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_PositionModifier.py
index 47ff17bfa6..ac3e0abb4f 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_PositionModifier.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_PositionModifier.py
@@ -60,6 +60,7 @@ class TestPositionModifier(object):
@pytest.mark.test_case_id("C4874100")
@pytest.mark.SUITE_sandbox
+ @pytest.mark.xfail # LYN-3275
def test_PositionModifier_AutoSnapToSurfaceWorks(self, request, editor, level, launcher_platform):
expected_lines = [
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py
index d210bce7e2..38f8641b4c 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py
@@ -21,7 +21,7 @@ import azlmbr.math as math
import azlmbr.paths
sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests'))
-from automatedtesting_shared.editor_test_helper import EditorTestHelper
+from editor_python_test_tools.editor_test_helper import EditorTestHelper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
createdEntityId = None
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_AreaNodes.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_AreaNodes.py
index 4805d46e75..cb19b77088 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_AreaNodes.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_AreaNodes.py
@@ -22,7 +22,7 @@ import pytest
# Bail on the test if ly_test_tools doesn't exist.
pytest.importorskip('ly_test_tools')
import ly_test_tools.environment.file_system as file_system
-import automateeditor_python_test_toolsdtesting_shared.hydra_test_utils as hydra
+import editor_python_test_tools.hydra_test_utils as hydra
test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts')
diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14861501_PhysXCollider_RenderMeshAutoAssigned.py b/AutomatedTesting/Gem/PythonTests/physics/C14861501_PhysXCollider_RenderMeshAutoAssigned.py
index eae5ea547a..904b5b0189 100755
--- a/AutomatedTesting/Gem/PythonTests/physics/C14861501_PhysXCollider_RenderMeshAutoAssigned.py
+++ b/AutomatedTesting/Gem/PythonTests/physics/C14861501_PhysXCollider_RenderMeshAutoAssigned.py
@@ -24,7 +24,7 @@ class Tests():
# fmt: on
-def run():
+def C14861501_PhysXCollider_RenderMeshAutoAssigned():
"""
Summary:
Create entity with Mesh component and assign a render mesh to the Mesh component. Add Physics Collider component
@@ -61,7 +61,7 @@ def run():
from asset_utils import Asset
# Asset paths
- STATIC_MESH = os.path.join("assets", "c14861501_physxcollider_rendermeshautoassigned", "spherebot", "r0-b_body.cgf")
+ STATIC_MESH = os.path.join("assets", "c14861501_physxcollider_rendermeshautoassigned", "spherebot", "r0-b_body.azmodel")
PHYSX_MESH = os.path.join(
"assets", "c14861501_physxcollider_rendermeshautoassigned", "spherebot", "r0-b_body.pxmesh"
)
@@ -80,8 +80,8 @@ def run():
# 4) Assign a render mesh asset to Mesh component (the fbx mesh having both Static mesh and PhysX collision Mesh)
mesh_asset = Asset.find_asset_by_path(STATIC_MESH)
- mesh_component.set_component_property_value("MeshComponentRenderNode|Mesh asset", mesh_asset.id)
- mesh_asset.id = mesh_component.get_component_property_value("MeshComponentRenderNode|Mesh asset")
+ mesh_component.set_component_property_value("Controller|Configuration|Mesh Asset", mesh_asset.id)
+ mesh_asset.id = mesh_component.get_component_property_value("Controller|Configuration|Mesh Asset")
Report.result(Tests.assign_mesh_asset, mesh_asset.get_path() == STATIC_MESH.replace(os.sep, "/"))
# 5) Add PhysX Collider component
@@ -95,4 +95,8 @@ def run():
if __name__ == "__main__":
- run()
+ import ImportPathHelper as imports
+ imports.init()
+
+ from utils import Report
+ Report.start_test(C14861501_PhysXCollider_RenderMeshAutoAssigned)
diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14861502_PhysXCollider_AssetAutoAssigned.py b/AutomatedTesting/Gem/PythonTests/physics/C14861502_PhysXCollider_AssetAutoAssigned.py
index 6ea81ea2ff..075c3f5b61 100755
--- a/AutomatedTesting/Gem/PythonTests/physics/C14861502_PhysXCollider_AssetAutoAssigned.py
+++ b/AutomatedTesting/Gem/PythonTests/physics/C14861502_PhysXCollider_AssetAutoAssigned.py
@@ -62,8 +62,8 @@ def C14861502_PhysXCollider_AssetAutoAssigned():
# Open 3D Engine Imports
import azlmbr.legacy.general as general
- MESH_ASSET_PATH = os.path.join("Objects", "SphereBot", "r0-b_body.cgf")
- MESH_PROPERTY_PATH = "MeshComponentRenderNode|Mesh asset"
+ MESH_ASSET_PATH = os.path.join("Objects", "SphereBot", "r0-b_body.azmodel")
+ MESH_PROPERTY_PATH = "Controller|Configuration|Mesh Asset"
TESTED_PROPERTY_PATH = "Shape Configuration|Asset|PhysX Mesh"
helper.init_idle()
diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14861504_RenderMeshAsset_WithNoPxAsset.py b/AutomatedTesting/Gem/PythonTests/physics/C14861504_RenderMeshAsset_WithNoPxAsset.py
index abc79ba1b0..bbaabf67f6 100755
--- a/AutomatedTesting/Gem/PythonTests/physics/C14861504_RenderMeshAsset_WithNoPxAsset.py
+++ b/AutomatedTesting/Gem/PythonTests/physics/C14861504_RenderMeshAsset_WithNoPxAsset.py
@@ -69,7 +69,7 @@ def run():
import azlmbr.asset as azasset
# Asset paths
- STATIC_MESH = os.path.join("assets", "c14861504_rendermeshasset_withnopxasset", "test_asset.cgf")
+ STATIC_MESH = os.path.join("assets", "c14861504_rendermeshasset_withnopxasset", "test_asset.azmodel")
helper.init_idle()
# 1) Load the empty level
@@ -85,8 +85,8 @@ def run():
# 4) Assign a render mesh asset to Mesh component (the fbx mesh having both Static mesh and PhysX collision Mesh)
mesh_asset = Asset.find_asset_by_path(STATIC_MESH)
- mesh_component.set_component_property_value("MeshComponentRenderNode|Mesh asset", mesh_asset.id)
- mesh_asset.id = mesh_component.get_component_property_value("MeshComponentRenderNode|Mesh asset")
+ mesh_component.set_component_property_value("Controller|Configuration|Mesh Asset", mesh_asset.id)
+ mesh_asset.id = mesh_component.get_component_property_value("Controller|Configuration|Mesh Asset")
Report.result(Tests.assign_mesh_asset, mesh_asset.get_path() == STATIC_MESH.replace(os.sep, "/"))
# 5) Add PhysX Collider component
diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py b/AutomatedTesting/Gem/PythonTests/physics/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py
index a92927a9db..858e778f07 100755
--- a/AutomatedTesting/Gem/PythonTests/physics/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py
+++ b/AutomatedTesting/Gem/PythonTests/physics/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py
@@ -27,7 +27,7 @@ class Tests():
# fmt: on
-def run():
+def C4044695_PhysXCollider_AddMultipleSurfaceFbx():
"""
Summary:
Create entity with Mesh and PhysX Collider components and assign a fbx file in both the components.
@@ -45,12 +45,7 @@ def run():
4) Select the PhysicsAsset shape in the PhysX Collider component
5) Assign the fbx file in PhysX Mesh and Mesh component
6) Check if multiple material slots show up under Materials section in the PhysX Collider component
-
- 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
"""
# Builtins
@@ -70,7 +65,7 @@ def run():
SURFACE_TAG_COUNT = 4 # Number of surface tags included in used asset
# Asset paths
- STATIC_MESH = os.path.join("assets", "c4044695_physxcollider_addmultiplesurfacefbx", "test.cgf")
+ STATIC_MESH = os.path.join("assets", "c4044695_physxcollider_addmultiplesurfacefbx", "test.azmodel")
PHYSX_MESH = os.path.join("assets", "c4044695_physxcollider_addmultiplesurfacefbx", "test.pxmesh")
helper.init_idle()
@@ -100,8 +95,8 @@ def run():
Report.result(Tests.assign_px_mesh_asset, px_asset.get_path() == PHYSX_MESH.replace(os.sep, "/"))
mesh_asset = Asset.find_asset_by_path(STATIC_MESH)
- mesh_component.set_component_property_value("MeshComponentRenderNode|Mesh asset", mesh_asset.id)
- mesh_asset.id = mesh_component.get_component_property_value("MeshComponentRenderNode|Mesh asset")
+ mesh_component.set_component_property_value("Controller|Configuration|Mesh Asset", mesh_asset.id)
+ mesh_asset.id = mesh_component.get_component_property_value("Controller|Configuration|Mesh Asset")
Report.result(Tests.assign_mesh_asset, mesh_asset.get_path() == STATIC_MESH.replace(os.sep, "/"))
# 6) Check if multiple material slots show up under Materials section in the PhysX Collider component
@@ -116,4 +111,8 @@ def run():
if __name__ == "__main__":
- run()
+ import ImportPathHelper as imports
+ imports.init()
+
+ from utils import Report
+ Report.start_test(C4044695_PhysXCollider_AddMultipleSurfaceFbx)
diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976236_AddPhysxColliderComponent.py b/AutomatedTesting/Gem/PythonTests/physics/C4976236_AddPhysxColliderComponent.py
index 906c6db55b..72442601e4 100755
--- a/AutomatedTesting/Gem/PythonTests/physics/C4976236_AddPhysxColliderComponent.py
+++ b/AutomatedTesting/Gem/PythonTests/physics/C4976236_AddPhysxColliderComponent.py
@@ -27,7 +27,7 @@ class Tests():
def C4976236_AddPhysxColliderComponent():
"""
Summary:
- Load level with Entity having PhysX Collider component. Verify that editor remains stable in Game mode.
+ Opens an empty level and creates an Entity with PhysX Collider. Verify that editor remains stable in Game mode.
Expected Behavior:
The Editor is stable there are no warnings or errors.
@@ -37,16 +37,10 @@ def C4976236_AddPhysxColliderComponent():
2) Create test entity
3) Start the Tracer to catch any errors and warnings
4) Add the PhysX Collider component and change shape to box
- 5) Add Mesh component and an asset
- 6) Enter game mode
- 7) Verify there are no errors and warnings in the logs
- 8) Exit game mode
- 9) Close the 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.
+ 5) Enter game mode
+ 6) Verify there are no errors and warnings in the logs
+ 7) Exit game mode
+ 8) Close the editor
:return: None
"""
@@ -60,7 +54,7 @@ def C4976236_AddPhysxColliderComponent():
from editor_python_test_tools.utils import TestHelper as helper
from editor_python_test_tools.utils import Tracer
from asset_utils import Asset
-
+
helper.init_idle()
# 1) Load the level
helper.open_level("Physics", "Base")
@@ -74,17 +68,12 @@ def C4976236_AddPhysxColliderComponent():
# 4) Add the PhysX Collider component and change shape to box
collider_component = test_entity.add_component("PhysX Collider")
Report.result(Tests.add_physx_collider, test_entity.has_component("PhysX Collider"))
- collider_component.set_component_property_value('Shape Configuration|Shape', 1)
-
- # 5) Add Mesh component and an asset
- mesh_component = test_entity.add_component("Mesh")
- asset = Asset.find_asset_by_path(r"Objects\default\primitive_cube.cgf")
- mesh_component.set_component_property_value('MeshComponentRenderNode|Mesh asset', asset.id)
+ collider_component.set_component_property_value('Shape Configuration|Shape', azlmbr.physics.ShapeType_Box)
- # 6) Enter game mode
+ # 5) Enter game mode
helper.enter_game_mode(Tests.enter_game_mode)
- # 7) Verify there are no errors and warnings in the logs
+ # 6) Verify there are no errors and warnings in the logs
success_condition = not (section_tracer.has_errors or section_tracer.has_warnings)
Report.result(Tests.no_errors_and_warnings_found, success_condition)
if not success_condition:
@@ -92,9 +81,8 @@ def C4976236_AddPhysxColliderComponent():
Report.info(f"Warnings found: {section_tracer.warnings}")
if section_tracer.has_errors:
Report.info(f"Errors found: {section_tracer.errors}")
- Report.failure(Tests.no_errors_and_warnings_found)
- # 8) Exit game mode
+ # 7) Exit game mode
helper.exit_game_mode(Tests.exit_game_mode)
diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py
new file mode 100644
index 0000000000..67e855a00e
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py
@@ -0,0 +1,37 @@
+"""
+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.
+
+"""
+
+# This suite consists of all test cases that are passing and have been verified.
+
+import pytest
+import os
+import sys
+
+from .FileManagement import FileManagement as fm
+from ly_test_tools import LAUNCHERS
+
+sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared')
+
+from base import TestAutomationBase
+
+
+revert_physics_config = fm.file_revert_list(['physxdebugconfiguration.setreg', 'physxdefaultsceneconfiguration.setreg', 'physxsystemconfiguration.setreg'], 'AutomatedTesting/Registry')
+
+
+@pytest.mark.SUITE_main
+@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+class TestAutomation(TestAutomationBase):
+
+ def test_C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC(self, request, workspace, editor, launcher_platform):
+ from . import C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC as test_module
+ self._run_test(request, workspace, editor, test_module)
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Active.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py
similarity index 96%
rename from AutomatedTesting/Gem/PythonTests/physics/TestSuite_Active.py
rename to AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py
index 805e4f7d79..39ed85a65a 100755
--- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Active.py
+++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py
@@ -27,26 +27,16 @@ from base import TestAutomationBase
revert_physics_config = fm.file_revert_list(['physxdebugconfiguration.setreg', 'physxdefaultsceneconfiguration.setreg', 'physxsystemconfiguration.setreg'], 'AutomatedTesting/Registry')
-@pytest.mark.SUITE_main
+@pytest.mark.SUITE_periodic
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
@pytest.mark.parametrize("project", ["AutomatedTesting"])
class TestAutomation(TestAutomationBase):
- # Marking the test as an expected failure due to sporadic failure on Automated Review: SPEC-3146
- # The test still runs, but a failure of the test doesn't result in the test run failing
- @pytest.mark.xfail(
- reason="This test seems to fail sometimes due to it being the first test in the testsuite, we'll duplicate it temporarly."
- "Need to figure out the reason why this is the case")
- @revert_physics_config
- def test_C000000_RigidBody_EnablingGravityWorksPoC_DUPLICATE(self, request, workspace, editor, launcher_platform):
- from . import C100000_RigidBody_EnablingGravityWorksPoC as test_module
- self._run_test(request, workspace, editor, test_module)
-
@revert_physics_config
def test_C3510642_Terrain_NotCollideWithTerrain(self, request, workspace, editor, launcher_platform):
from . import C3510642_Terrain_NotCollideWithTerrain as test_module
self._run_test(request, workspace, editor, test_module)
-
+
@revert_physics_config
def test_C4976195_RigidBodies_InitialLinearVelocity(self, request, workspace, editor, launcher_platform):
from . import C4976195_RigidBodies_InitialLinearVelocity as test_module
@@ -279,6 +269,8 @@ class TestAutomation(TestAutomationBase):
from . import C18977601_Material_FrictionCombinePriority as test_module
self._run_test(request, workspace, editor, test_module)
+ @pytest.mark.xfail(
+ reason="Something with the CryRenderer disabling is causing this test to fail now.")
@revert_physics_config
def test_C13895144_Ragdoll_ChangeLevel(self, request, workspace, editor, launcher_platform):
from . import C13895144_Ragdoll_ChangeLevel as test_module
@@ -530,8 +522,4 @@ class TestAutomation(TestAutomationBase):
def test_C100000_RigidBody_EnablingGravityWorksPoC(self, request, workspace, editor, launcher_platform):
from . import C100000_RigidBody_EnablingGravityWorksPoC as test_module
- self._run_test(request, workspace, editor, test_module)
-
- def test_C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC(self, request, workspace, editor, launcher_platform):
- from . import C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC as test_module
- self._run_test(request, workspace, editor, test_module)
+ self._run_test(request, workspace, editor, test_module)
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/Physics/Base/Base.ly b/AutomatedTesting/Levels/Physics/Base/Base.ly
index 97546ff3a2..f99dc672b0 100644
--- a/AutomatedTesting/Levels/Physics/Base/Base.ly
+++ b/AutomatedTesting/Levels/Physics/Base/Base.ly
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:75cb1c8454aafc3de81351450a9480f91cb98d926a6e47f87a5ffe91e1d5a7d5
-size 4745
+oid sha256:f63204a86af8bc0963a4823d047a2e222cc19aabd14570d0789dc90cdc82970c
+size 2017
diff --git a/AutomatedTesting/Levels/Physics/Base/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Base/leveldata/TimeOfDay.xml
index 456d609b8a..6ea168cc6b 100644
--- a/AutomatedTesting/Levels/Physics/Base/leveldata/TimeOfDay.xml
+++ b/AutomatedTesting/Levels/Physics/Base/leveldata/TimeOfDay.xml
@@ -1,356 +1,356 @@
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
-
+
+
diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas
index a422f072a5..34e80f3ccd 100644
--- a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas
+++ b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas
@@ -3,7 +3,7 @@
-
+
@@ -16,21 +16,21 @@
-
+
-
+
-
+
-
+
-
+
@@ -39,23 +39,9 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
@@ -76,12 +62,13 @@
+
-
+
@@ -91,8 +78,8 @@
-
-
+
+
@@ -101,7 +88,7 @@
-
+
@@ -113,12 +100,13 @@
+
-
+
@@ -128,8 +116,8 @@
-
-
+
+
@@ -150,12 +138,13 @@
+
-
+
@@ -164,9 +153,14 @@
+
+
+
+
+
-
-
+
+
@@ -175,24 +169,59 @@
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -201,9 +230,14 @@
+
+
+
+
+
-
-
+
+
@@ -212,24 +246,25 @@
-
-
+
+
-
+
-
+
+
-
+
@@ -239,34 +274,35 @@
-
+
-
-
+
+
-
-
+
+
-
+
+
-
+
@@ -276,34 +312,35 @@
-
+
-
-
+
+
-
+
-
+
+
-
+
@@ -312,37 +349,18 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
-
+
@@ -354,53 +372,37 @@
+
-
-
+
+
-
-
-
-
-
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -408,72 +410,127 @@
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -482,9 +539,14 @@
+
+
+
+
+
-
-
+
+
@@ -494,23 +556,24 @@
-
+
-
+
+
-
+
@@ -520,8 +583,8 @@
-
-
+
+
@@ -530,7 +593,7 @@
-
+
@@ -542,12 +605,13 @@
+
-
+
@@ -557,8 +621,8 @@
-
-
+
+
@@ -579,12 +643,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -593,9 +704,14 @@
+
+
+
+
+
-
-
+
+
@@ -604,24 +720,25 @@
-
-
+
+
-
+
-
+
+
-
+
@@ -631,34 +748,35 @@
-
+
-
-
+
+
-
-
+
+
-
+
+
-
+
@@ -668,34 +786,35 @@
-
+
-
-
+
+
-
+
-
+
+
-
+
@@ -704,37 +823,18 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
-
+
@@ -746,53 +846,37 @@
+
-
-
+
+
-
-
-
-
-
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -800,21 +884,21 @@
-
+
-
+
-
+
-
+
-
+
@@ -824,13 +908,22 @@
-
+
+
+
+
+
+
+
+
+
+
-
-
+
+
@@ -840,23 +933,24 @@
-
+
-
+
+
-
+
@@ -866,8 +960,8 @@
-
-
+
+
@@ -888,12 +982,13 @@
+
-
+
@@ -903,8 +998,8 @@
-
-
+
+
@@ -925,58 +1020,13 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -986,8 +1036,8 @@
-
-
+
+
@@ -996,7 +1046,7 @@
-
+
@@ -1008,12 +1058,13 @@
+
-
+
@@ -1023,8 +1074,8 @@
-
-
+
+
@@ -1036,7 +1087,7 @@
-
+
@@ -1045,12 +1096,13 @@
+
-
+
@@ -1060,34 +1112,73 @@
-
-
+
+
-
-
+
+
-
+
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1101,9 +1192,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
@@ -1124,24 +1229,54 @@
+
-
-
+
+
-
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1149,21 +1284,21 @@
-
+
-
+
-
+
-
+
-
+
@@ -1172,12 +1307,26 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1195,12 +1344,13 @@
+
-
+
@@ -1210,8 +1360,8 @@
-
-
+
+
@@ -1220,7 +1370,7 @@
-
+
@@ -1232,12 +1382,13 @@
+
-
+
@@ -1247,8 +1398,8 @@
-
-
+
+
@@ -1269,12 +1420,13 @@
+
-
+
@@ -1283,14 +1435,9 @@
-
-
-
-
-
-
-
+
+
@@ -1299,162 +1446,25 @@
-
-
+
+
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -1463,14 +1473,9 @@
-
-
-
-
-
-
-
+
+
@@ -1479,24 +1484,25 @@
-
-
+
+
-
+
-
+
+
-
+
@@ -1506,34 +1512,35 @@
-
+
-
-
+
+
-
-
+
+
-
+
+
-
+
@@ -1543,34 +1550,35 @@
-
+
-
-
+
+
-
+
-
+
+
-
+
@@ -1579,18 +1587,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
+
+
+
-
+
@@ -1602,36 +1629,54 @@
+
-
-
+
+
-
-
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
@@ -1639,21 +1684,21 @@
-
+
-
+
-
+
-
+
-
+
@@ -1663,8 +1708,8 @@
-
-
+
+
@@ -1685,12 +1730,13 @@
+
-
+
@@ -1700,8 +1746,8 @@
-
-
+
+
@@ -1710,7 +1756,7 @@
-
+
@@ -1722,12 +1768,13 @@
+
-
+
@@ -1736,14 +1783,9 @@
-
-
-
-
-
-
-
+
+
@@ -1752,24 +1794,25 @@
-
-
+
+
-
+
+
-
+
@@ -1779,10 +1822,10 @@
-
-
+
+
-
+
@@ -1790,60 +1833,24 @@
-
+
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -1853,8 +1860,8 @@
-
-
+
+
@@ -1863,7 +1870,7 @@
-
+
@@ -1875,12 +1882,13 @@
+
-
+
@@ -1889,9 +1897,14 @@
+
+
+
+
+
-
-
+
+
@@ -1900,24 +1913,25 @@
-
-
+
+
-
+
+
-
+
@@ -1927,10 +1941,10 @@
-
-
+
+
-
+
@@ -1938,23 +1952,24 @@
-
+
-
+
+
-
+
@@ -1963,14 +1978,9 @@
-
-
-
-
-
-
-
+
+
@@ -1979,58 +1989,25 @@
-
-
+
+
-
+
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -2040,34 +2017,35 @@
-
-
+
+
-
+
-
-
+
+
-
+
+
-
+
@@ -2077,8 +2055,8 @@
-
-
+
+
@@ -2090,7 +2068,7 @@
-
+
@@ -2099,12 +2077,104 @@
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2114,143 +2184,165 @@
-
-
+
+
-
+
-
-
+
+
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -2259,7 +2351,7 @@
-
+
@@ -2310,6 +2402,7 @@
+
@@ -2347,6 +2440,7 @@
+
@@ -2384,6 +2478,7 @@
+
@@ -2421,21 +2516,21 @@
-
+
-
+
-
+
-
+
-
+
@@ -2446,7 +2541,7 @@
-
+
@@ -2467,12 +2562,13 @@
+
-
+
@@ -2483,7 +2579,7 @@
-
+
@@ -2504,12 +2600,13 @@
+
-
+
@@ -2518,11 +2615,54 @@
+
+
+
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2541,18 +2681,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
@@ -2560,21 +2710,21 @@
-
+
-
+
-
+
-
+
@@ -2611,12 +2761,13 @@
+
-
+
@@ -2648,12 +2799,13 @@
+
-
+
@@ -2685,6 +2837,7 @@
+
@@ -2706,7 +2859,7 @@
-
+
@@ -2722,21 +2875,21 @@
-
+
-
+
-
+
-
+
-
+
@@ -2746,22 +2899,13 @@
-
-
-
-
-
-
-
+
-
-
-
-
-
+
+
@@ -2771,23 +2915,24 @@
-
+
-
+
+
-
+
@@ -2797,8 +2942,8 @@
-
-
+
+
@@ -2819,12 +2964,13 @@
+
-
+
@@ -2834,8 +2980,8 @@
-
-
+
+
@@ -2856,12 +3002,13 @@
+
-
+
@@ -2871,71 +3018,81 @@
-
-
+
+
-
-
+
+
-
+
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -2945,34 +3102,35 @@
-
-
+
+
-
-
+
+
-
-
+
+
-
+
+
-
+
@@ -2982,34 +3140,35 @@
-
-
+
+
-
-
+
+
-
+
-
+
+
-
+
@@ -3018,37 +3177,18 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
+
@@ -3060,53 +3200,19 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
@@ -3114,21 +3220,21 @@
-
+
-
+
-
+
-
+
-
+
@@ -3137,13 +3243,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
@@ -3153,24 +3292,25 @@
-
-
+
+
-
+
+
-
+
@@ -3179,8 +3319,13 @@
+
+
+
+
+
-
+
@@ -3191,23 +3336,24 @@
-
+
-
+
+
-
+
@@ -3217,10 +3363,10 @@
-
+
-
+
@@ -3228,17 +3374,18 @@
-
+
-
+
+
@@ -3254,21 +3401,118 @@
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
@@ -3276,21 +3520,21 @@
-
+
-
+
-
+
-
+
@@ -3327,12 +3571,13 @@
+
-
+
@@ -3364,12 +3609,13 @@
+
-
+
@@ -3401,43 +3647,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -3458,16 +3668,16 @@
-
-
-
+
+
+
-
+
@@ -3475,7 +3685,7 @@
-
+
@@ -3526,6 +3736,7 @@
+
@@ -3563,6 +3774,7 @@
+
@@ -3600,6 +3812,7 @@
+
@@ -3637,58 +3850,21 @@
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -3698,8 +3874,8 @@
-
-
+
+
@@ -3720,49 +3896,13 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -3772,8 +3912,8 @@
-
-
+
+
@@ -3794,12 +3934,13 @@
+
-
+
@@ -3809,8 +3950,8 @@
-
-
+
+
@@ -3831,12 +3972,13 @@
+
-
+
@@ -3851,8 +3993,8 @@
-
-
+
+
@@ -3873,49 +4015,47 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -3924,9 +4064,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
@@ -3935,10 +4089,10 @@
-
+
-
+
@@ -3947,12 +4101,13 @@
+
-
+
@@ -3962,34 +4117,35 @@
-
-
+
+
-
+
-
-
+
+
-
+
+
-
+
@@ -3999,8 +4155,8 @@
-
-
+
+
@@ -4012,7 +4168,7 @@
-
+
@@ -4021,103 +4177,13 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -4126,14 +4192,9 @@
-
-
-
-
-
-
-
+
+
@@ -4142,24 +4203,25 @@
-
-
+
+
-
+
+
-
+
@@ -4169,8 +4231,8 @@
-
-
+
+
@@ -4179,10 +4241,10 @@
-
+
-
+
@@ -4191,12 +4253,13 @@
+
-
+
@@ -4206,34 +4269,35 @@
-
+
-
-
+
+
-
+
-
+
+
-
+
@@ -4243,11 +4307,11 @@
-
+
-
+
@@ -4265,58 +4329,13 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -4325,8 +4344,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -4337,23 +4375,87 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -4362,8 +4464,13 @@
+
+
+
+
+
-
+
@@ -4373,24 +4480,25 @@
-
-
+
+
-
+
+
-
+
@@ -4399,13 +4507,8 @@
-
-
-
-
-
-
+
@@ -4416,23 +4519,24 @@
-
+
-
+
+
-
+
@@ -4442,10 +4546,10 @@
-
+
-
+
@@ -4453,17 +4557,18 @@
-
+
-
+
+
@@ -4479,12 +4584,21 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
@@ -4492,21 +4606,21 @@
-
+
-
+
-
+
@@ -4538,12 +4652,13 @@
+
-
+
@@ -4575,12 +4690,13 @@
+
-
+
@@ -4612,16 +4728,17 @@
+
-
+
-
+
@@ -4631,21 +4748,21 @@
-
+
-
+
-
+
-
+
-
+
@@ -4654,14 +4771,9 @@
-
-
-
-
-
-
-
+
+
@@ -4671,23 +4783,24 @@
-
+
-
+
+
-
+
@@ -4697,8 +4810,8 @@
-
-
+
+
@@ -4707,7 +4820,7 @@
-
+
@@ -4719,12 +4832,13 @@
+
-
+
@@ -4734,10 +4848,10 @@
-
+
-
+
@@ -4745,47 +4859,30 @@
-
+
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
+
+
-
+
+
+
+
@@ -4793,7 +4890,7 @@
-
+
@@ -4839,6 +4936,7 @@
+
@@ -4876,6 +4974,7 @@
+
@@ -4918,6 +5017,7 @@
+
@@ -4955,6 +5055,7 @@
+
@@ -4985,7 +5086,7 @@
-
+
@@ -4995,7 +5096,7 @@
-
+
@@ -5003,7 +5104,7 @@
-
+
@@ -5016,7 +5117,7 @@
-
+
@@ -5026,7 +5127,7 @@
-
+
@@ -5034,7 +5135,7 @@
-
+
@@ -5047,7 +5148,7 @@
-
+
@@ -5057,7 +5158,7 @@
-
+
@@ -5065,7 +5166,7 @@
-
+
@@ -5078,7 +5179,7 @@
-
+
@@ -5088,7 +5189,7 @@
-
+
@@ -5096,7 +5197,7 @@
-
+
@@ -5109,7 +5210,7 @@
-
+
@@ -5119,7 +5220,7 @@
-
+
@@ -5127,7 +5228,7 @@
-
+
@@ -5140,7 +5241,7 @@
-
+
@@ -5150,7 +5251,7 @@
-
+
@@ -5158,7 +5259,7 @@
-
+
@@ -5171,7 +5272,7 @@
-
+
@@ -5181,7 +5282,7 @@
-
+
@@ -5189,7 +5290,7 @@
-
+
@@ -5202,7 +5303,7 @@
-
+
@@ -5212,7 +5313,7 @@
-
+
@@ -5220,7 +5321,7 @@
-
+
@@ -5233,7 +5334,7 @@
-
+
@@ -5243,7 +5344,7 @@
-
+
@@ -5251,7 +5352,7 @@
-
+
@@ -5264,7 +5365,7 @@
-
+
@@ -5274,7 +5375,7 @@
-
+
@@ -5282,7 +5383,7 @@
-
+
@@ -5295,7 +5396,7 @@
-
+
@@ -5305,7 +5406,7 @@
-
+
@@ -5313,7 +5414,7 @@
-
+
@@ -5326,7 +5427,7 @@
-
+
@@ -5336,7 +5437,7 @@
-
+
@@ -5344,7 +5445,7 @@
-
+
@@ -5357,7 +5458,7 @@
-
+
@@ -5367,7 +5468,7 @@
-
+
@@ -5375,7 +5476,7 @@
-
+
@@ -5388,7 +5489,7 @@
-
+
@@ -5398,7 +5499,7 @@
-
+
@@ -5406,7 +5507,7 @@
-
+
@@ -5419,7 +5520,7 @@
-
+
@@ -5429,7 +5530,7 @@
-
+
@@ -5437,7 +5538,7 @@
-
+
@@ -5450,7 +5551,7 @@
-
+
@@ -5460,7 +5561,7 @@
-
+
@@ -5468,7 +5569,7 @@
-
+
@@ -5481,7 +5582,7 @@
-
+
@@ -5491,7 +5592,7 @@
-
+
@@ -5499,7 +5600,7 @@
-
+
@@ -5512,7 +5613,7 @@
-
+
@@ -5522,7 +5623,7 @@
-
+
@@ -5530,7 +5631,7 @@
-
+
@@ -5543,7 +5644,7 @@
-
+
@@ -5553,7 +5654,7 @@
-
+
@@ -5561,7 +5662,7 @@
-
+
@@ -5574,7 +5675,7 @@
-
+
@@ -5584,7 +5685,7 @@
-
+
@@ -5592,7 +5693,7 @@
-
+
@@ -5605,7 +5706,7 @@
-
+
@@ -5615,7 +5716,7 @@
-
+
@@ -5623,7 +5724,7 @@
-
+
@@ -5636,7 +5737,7 @@
-
+
@@ -5646,7 +5747,7 @@
-
+
@@ -5654,7 +5755,7 @@
-
+
@@ -5667,7 +5768,7 @@
-
+
@@ -5677,7 +5778,7 @@
-
+
@@ -5685,7 +5786,7 @@
-
+
@@ -5698,7 +5799,7 @@
-
+
@@ -5708,7 +5809,7 @@
-
+
@@ -5716,7 +5817,7 @@
-
+
@@ -5729,7 +5830,7 @@
-
+
@@ -5739,7 +5840,7 @@
-
+
@@ -5747,7 +5848,7 @@
-
+
@@ -5760,7 +5861,7 @@
-
+
@@ -5770,7 +5871,7 @@
-
+
@@ -5778,7 +5879,7 @@
-
+
@@ -5791,7 +5892,7 @@
-
+
@@ -5801,7 +5902,7 @@
-
+
@@ -5809,7 +5910,7 @@
-
+
@@ -5822,7 +5923,7 @@
-
+
@@ -5832,7 +5933,7 @@
-
+
@@ -5840,7 +5941,7 @@
-
+
@@ -5853,7 +5954,7 @@
-
+
@@ -5863,7 +5964,7 @@
-
+
@@ -5871,7 +5972,7 @@
-
+
@@ -5884,7 +5985,7 @@
-
+
@@ -5894,7 +5995,7 @@
-
+
@@ -5902,7 +6003,7 @@
-
+
@@ -5915,7 +6016,7 @@
-
+
@@ -5925,7 +6026,7 @@
-
+
@@ -5933,7 +6034,7 @@
-
+
@@ -5946,7 +6047,7 @@
-
+
@@ -5956,7 +6057,7 @@
-
+
@@ -5964,7 +6065,7 @@
-
+
@@ -5977,7 +6078,7 @@
-
+
@@ -5987,7 +6088,7 @@
-
+
@@ -5995,7 +6096,7 @@
-
+
@@ -6008,7 +6109,7 @@
-
+
@@ -6018,7 +6119,7 @@
-
+
@@ -6026,7 +6127,7 @@
-
+
@@ -6039,7 +6140,7 @@
-
+
@@ -6049,7 +6150,7 @@
-
+
@@ -6057,7 +6158,7 @@
-
+
@@ -6070,7 +6171,7 @@
-
+
@@ -6080,7 +6181,7 @@
-
+
@@ -6088,7 +6189,7 @@
-
+
@@ -6101,7 +6202,7 @@
-
+
@@ -6111,7 +6212,7 @@
-
+
@@ -6119,7 +6220,7 @@
-
+
@@ -6132,7 +6233,7 @@
-
+
@@ -6142,7 +6243,7 @@
-
+
@@ -6150,7 +6251,7 @@
-
+
@@ -6163,7 +6264,7 @@
-
+
@@ -6173,7 +6274,7 @@
-
+
@@ -6181,7 +6282,7 @@
-
+
@@ -6194,7 +6295,7 @@
-
+
@@ -6204,7 +6305,7 @@
-
+
@@ -6212,7 +6313,7 @@
-
+
@@ -6225,7 +6326,7 @@
-
+
@@ -6235,7 +6336,7 @@
-
+
@@ -6243,7 +6344,7 @@
-
+
@@ -6256,7 +6357,7 @@
-
+
@@ -6266,7 +6367,7 @@
-
+
@@ -6274,7 +6375,7 @@
-
+
@@ -6287,7 +6388,7 @@
-
+
@@ -6297,7 +6398,7 @@
-
+
@@ -6305,7 +6406,7 @@
-
+
@@ -6318,7 +6419,7 @@
-
+
@@ -6328,7 +6429,7 @@
-
+
@@ -6336,7 +6437,7 @@
-
+
@@ -6349,7 +6450,7 @@
-
+
@@ -6359,7 +6460,7 @@
-
+
@@ -6367,7 +6468,7 @@
-
+
@@ -6386,7 +6487,7 @@
-
+
@@ -6394,7 +6495,7 @@
-
+
@@ -6402,83 +6503,41 @@
-
+
-
+
-
+
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -6486,27 +6545,27 @@
-
+
-
+
-
+
-
+
@@ -6520,7 +6579,7 @@
-
+
@@ -6533,28 +6592,28 @@
-
+
-
+
-
+
-
+
@@ -6562,62 +6621,41 @@
-
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
+
-
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
@@ -6625,7 +6663,7 @@
-
+
@@ -6633,27 +6671,27 @@
-
+
-
+
-
+
-
+
@@ -6667,20 +6705,22 @@
-
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
@@ -6691,17 +6731,15 @@
-
-
-
-
+
+
+
-
-
-
-
+
+
+
@@ -6709,41 +6747,46 @@
-
+
-
-
-
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
-
-
+
+
+
@@ -6751,46 +6794,41 @@
-
+
-
-
-
-
-
-
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
-
-
+
-
+
+
+
+
+
+
+
@@ -6798,41 +6836,41 @@
-
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
+
-
-
-
-
+
+
+
-
-
-
-
+
+
+
@@ -6840,41 +6878,41 @@
-
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
+
-
-
-
-
+
+
+
-
-
-
-
+
+
+
@@ -6882,7 +6920,7 @@
-
+
@@ -6890,7 +6928,7 @@
-
+
@@ -6910,7 +6948,7 @@
-
+
@@ -6924,7 +6962,7 @@
-
+
@@ -6937,28 +6975,28 @@
-
+
-
+
-
+
-
+
@@ -6966,41 +7004,41 @@
-
+
-
-
-
-
+
+
+
-
-
-
-
+
+
+
-
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
@@ -7008,7 +7046,7 @@
-
+
@@ -7021,28 +7059,28 @@
-
+
-
+
-
+
-
+
@@ -7050,41 +7088,41 @@
-
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
+
-
-
-
-
+
+
+
-
-
-
-
+
+
+
@@ -7092,20 +7130,22 @@
-
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
@@ -7116,17 +7156,15 @@
-
-
-
-
+
+
+
-
-
-
-
+
+
+
@@ -7134,41 +7172,41 @@
-
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
+
-
-
-
-
+
+
+
-
-
-
-
+
+
+
@@ -7176,41 +7214,41 @@
-
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
+
-
-
-
-
+
+
+
-
-
-
-
+
+
+
@@ -7218,7 +7256,7 @@
-
+
@@ -7231,7 +7269,7 @@
-
+
@@ -7252,7 +7290,7 @@
-
+
@@ -7260,41 +7298,41 @@
-
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
+
-
-
-
-
+
+
+
-
-
-
-
+
+
+
@@ -7302,7 +7340,7 @@
-
+
@@ -7310,27 +7348,27 @@
-
+
-
+
-
+
-
+
@@ -7344,7 +7382,7 @@
-
+
@@ -7357,28 +7395,28 @@
-
+
-
+
-
+
-
+
@@ -7386,27 +7424,78 @@
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -7417,10 +7506,22 @@
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -7431,23 +7532,27 @@
-
+
-
-
+
+
-
+
-
+
+
+
+
+
-
+
@@ -7455,27 +7560,23 @@
-
-
-
-
-
+
-
+
-
-
+
+
-
+
-
+
@@ -7497,7 +7598,7 @@
-
+
@@ -7524,14 +7625,15 @@
-
+
+
-
+
@@ -7558,14 +7660,15 @@
-
+
+
-
+
@@ -7592,7 +7695,8 @@
-
+
+
diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas
index 88e3333298..f4ca23b882 100644
--- a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas
+++ b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas
@@ -3,7 +3,7 @@
-
+
@@ -16,21 +16,21 @@
-
+
-
+
-
+
-
+
-
+
@@ -41,7 +41,7 @@
-
+
@@ -62,12 +62,13 @@
+
-
+
@@ -77,8 +78,8 @@
-
-
+
+
@@ -99,12 +100,13 @@
+
-
+
@@ -114,10 +116,10 @@
-
-
+
+
-
+
@@ -125,48 +127,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -178,46 +138,13 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -226,49 +153,36 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
+
-
-
+
+
-
+
+
-
+
@@ -278,34 +192,35 @@
-
-
+
+
-
+
-
-
+
+
-
+
+
-
+
@@ -315,10 +230,10 @@
-
-
+
+
-
+
@@ -326,34 +241,205 @@
-
+
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -362,24 +448,25 @@
-
-
+
+
-
+
+
-
+
@@ -389,8 +476,8 @@
-
-
+
+
@@ -399,10 +486,10 @@
-
+
-
+
@@ -411,12 +498,13 @@
+
-
+
@@ -425,27 +513,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
+
@@ -455,73 +562,71 @@
-
-
+
+
-
+
+
-
-
+
+
-
-
-
-
-
-
-
+
+
-
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -553,12 +658,13 @@
+
-
+
@@ -590,12 +696,13 @@
+
-
+
@@ -604,23 +711,18 @@
-
-
-
-
-
-
+
-
-
+
+
-
+
@@ -632,12 +734,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -646,13 +780,8 @@
-
-
-
-
-
-
+
@@ -663,7 +792,131 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -674,6 +927,7 @@
+
@@ -716,6 +970,7 @@
+
@@ -753,6 +1008,7 @@
+
@@ -803,21 +1059,21 @@
-
+
-
+
-
+
-
+
-
+
@@ -827,8 +1083,8 @@
-
-
+
+
@@ -849,12 +1105,13 @@
+
-
+
@@ -864,8 +1121,8 @@
-
-
+
+
@@ -874,7 +1131,7 @@
-
+
@@ -886,12 +1143,13 @@
+
-
+
@@ -901,65 +1159,35 @@
-
-
+
+
-
-
+
+
-
+
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -968,14 +1196,9 @@
-
-
-
-
-
-
-
+
+
@@ -984,24 +1207,25 @@
-
-
+
+
-
+
+
-
+
@@ -1011,8 +1235,8 @@
-
-
+
+
@@ -1021,7 +1245,7 @@
-
+
@@ -1033,12 +1257,13 @@
+
-
+
@@ -1047,18 +1272,23 @@
+
+
+
+
+
-
-
+
+
-
+
-
+
@@ -1070,12 +1300,13 @@
+
-
+
@@ -1085,10 +1316,10 @@
-
+
-
+
@@ -1096,47 +1327,207 @@
-
+
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
@@ -1144,21 +1535,21 @@
-
+
-
+
-
+
-
+
-
+
@@ -1169,7 +1560,7 @@
-
+
@@ -1190,12 +1581,13 @@
+
-
+
@@ -1206,7 +1598,7 @@
-
+
@@ -1227,12 +1619,56 @@
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1264,12 +1700,13 @@
+
-
+
@@ -1301,12 +1738,13 @@
+
-
+
@@ -1338,12 +1776,13 @@
+
-
+
@@ -1375,21 +1814,38 @@
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -1399,7 +1855,7 @@
-
+
@@ -1409,7 +1865,7 @@
-
+
@@ -1425,7 +1881,7 @@
-
+
@@ -1472,6 +1928,7 @@
+
@@ -1509,6 +1966,7 @@
+
@@ -1529,125 +1987,21 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
+
-
+
-
+
@@ -1656,9 +2010,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -1679,12 +2047,13 @@
+
-
+
@@ -1695,7 +2064,7 @@
-
+
@@ -1716,12 +2085,13 @@
+
-
+
@@ -1731,7 +2101,7 @@
-
+
@@ -1753,12 +2123,13 @@
+
-
+
@@ -1768,7 +2139,7 @@
-
+
@@ -1790,12 +2161,13 @@
+
-
+
@@ -1805,8 +2177,8 @@
-
-
+
+
@@ -1818,7 +2190,7 @@
-
+
@@ -1827,12 +2199,13 @@
+
-
+
@@ -1846,363 +2219,22 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
+
+
+
+
-
+
@@ -2224,12 +2256,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -2239,34 +2321,35 @@
-
-
+
+
-
+
-
-
+
+
-
+
+
-
+
@@ -2276,10 +2359,10 @@
-
-
+
+
-
+
@@ -2287,23 +2370,24 @@
-
+
-
+
+
-
+
@@ -2313,10 +2397,10 @@
-
-
+
+
-
+
@@ -2324,23 +2408,24 @@
-
+
-
+
+
-
+
@@ -2349,18 +2434,23 @@
+
+
+
+
+
-
-
+
+
-
+
-
+
@@ -2372,65 +2462,25 @@
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -2440,7 +2490,7 @@
-
+
@@ -2450,7 +2500,7 @@
-
+
@@ -2458,7 +2508,7 @@
-
+
@@ -2471,7 +2521,7 @@
-
+
@@ -2481,7 +2531,7 @@
-
+
@@ -2489,7 +2539,7 @@
-
+
@@ -2502,7 +2552,7 @@
-
+
@@ -2512,7 +2562,7 @@
-
+
@@ -2520,7 +2570,7 @@
-
+
@@ -2533,7 +2583,7 @@
-
+
@@ -2543,7 +2593,7 @@
-
+
@@ -2551,7 +2601,7 @@
-
+
@@ -2564,7 +2614,7 @@
-
+
@@ -2574,7 +2624,7 @@
-
+
@@ -2582,7 +2632,7 @@
-
+
@@ -2595,7 +2645,7 @@
-
+
@@ -2605,7 +2655,7 @@
-
+
@@ -2613,7 +2663,7 @@
-
+
@@ -2626,7 +2676,7 @@
-
+
@@ -2636,7 +2686,7 @@
-
+
@@ -2644,7 +2694,7 @@
-
+
@@ -2657,7 +2707,7 @@
-
+
@@ -2667,7 +2717,7 @@
-
+
@@ -2675,7 +2725,7 @@
-
+
@@ -2688,7 +2738,7 @@
-
+
@@ -2698,7 +2748,7 @@
-
+
@@ -2706,7 +2756,7 @@
-
+
@@ -2719,7 +2769,7 @@
-
+
@@ -2729,7 +2779,7 @@
-
+
@@ -2737,7 +2787,7 @@
-
+
@@ -2750,7 +2800,7 @@
-
+
@@ -2760,7 +2810,7 @@
-
+
@@ -2768,7 +2818,7 @@
-
+
@@ -2781,7 +2831,7 @@
-
+
@@ -2791,7 +2841,7 @@
-
+
@@ -2799,7 +2849,7 @@
-
+
@@ -2812,7 +2862,7 @@
-
+
@@ -2822,7 +2872,7 @@
-
+
@@ -2830,7 +2880,7 @@
-