TestSuite_Periodic.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. """
  2. Copyright (c) Contributors to the Open 3D Engine Project.
  3. For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. SPDX-License-Identifier: Apache-2.0 OR MIT
  5. """
  6. import pytest
  7. import os
  8. import sys
  9. sys.path.append(os.path.dirname(__file__))
  10. import ImportPathHelper as imports
  11. imports.init()
  12. import hydra_test_utils as hydra
  13. import ly_test_tools.environment.file_system as file_system
  14. from ly_test_tools.o3de.editor_test import EditorBatchedTest, EditorTestSuite
  15. from ly_test_tools import LAUNCHERS
  16. from base import TestAutomationBase
  17. TEST_DIRECTORY = os.path.dirname(__file__)
  18. #Bat
  19. @pytest.mark.SUITE_periodic
  20. @pytest.mark.parametrize("launcher_platform", ['windows_editor'])
  21. @pytest.mark.parametrize("project", ["AutomatedTesting"])
  22. class TestScriptCanvas(EditorTestSuite):
  23. class test_NodePalette_HappyPath_CanSelectNode(EditorBatchedTest):
  24. import NodePalette_HappyPath_CanSelectNode as test_module
  25. @pytest.mark.SUITE_periodic
  26. @pytest.mark.parametrize("launcher_platform", ['windows_editor'])
  27. @pytest.mark.parametrize("project", ["AutomatedTesting"])
  28. class TestAutomation(TestAutomationBase):
  29. def test_Pane_HappyPath_OpenCloseSuccessfully(self, request, workspace, editor, launcher_platform):
  30. from . import Pane_HappyPath_OpenCloseSuccessfully as test_module
  31. self._run_test(request, workspace, editor, test_module)
  32. def test_Pane_HappyPath_DocksProperly(self, request, workspace, editor, launcher_platform):
  33. from . import Pane_HappyPath_DocksProperly as test_module
  34. self._run_test(request, workspace, editor, test_module)
  35. def test_Pane_HappyPath_ResizesProperly(self, request, workspace, editor, launcher_platform):
  36. from . import Pane_HappyPath_ResizesProperly as test_module
  37. self._run_test(request, workspace, editor, test_module)
  38. @pytest.mark.parametrize("level", ["tmp_level"])
  39. def test_ScriptCanvas_TwoComponents_InteractSuccessfully(self, request, workspace, editor, launcher_platform, level):
  40. def teardown():
  41. file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
  42. request.addfinalizer(teardown)
  43. file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
  44. from . import ScriptCanvas_TwoComponents_InteractSuccessfully as test_module
  45. self._run_test(request, workspace, editor, test_module)
  46. @pytest.mark.skip(reason="Test fails to find expected lines, it needs to be fixed.")
  47. @pytest.mark.parametrize("level", ["tmp_level"])
  48. def test_ScriptCanvas_ChangingAssets_ComponentStable(self, request, workspace, editor, launcher_platform, project, level):
  49. def teardown():
  50. file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
  51. request.addfinalizer(teardown)
  52. file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
  53. from . import ScriptCanvas_ChangingAssets_ComponentStable as test_module
  54. self._run_test(request, workspace, editor, test_module)
  55. def test_Graph_HappyPath_ZoomInZoomOut(self, request, workspace, editor, launcher_platform):
  56. from . import Graph_HappyPath_ZoomInZoomOut as test_module
  57. self._run_test(request, workspace, editor, test_module)
  58. @pytest.mark.skip(reason="Test fails to find expected lines, it needs to be fixed.")
  59. @pytest.mark.parametrize("level", ["tmp_level"])
  60. def test_ScriptCanvasComponent_OnEntityActivatedDeactivated_PrintMessage(self, request, workspace, editor, launcher_platform, project, level):
  61. def teardown():
  62. file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
  63. request.addfinalizer(teardown)
  64. file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
  65. from . import ScriptCanvasComponent_OnEntityActivatedDeactivated_PrintMessage as test_module
  66. self._run_test(request, workspace, editor, test_module)
  67. def test_NodePalette_HappyPath_ClearSelection(self, request, workspace, editor, launcher_platform, project):
  68. from . import NodePalette_HappyPath_ClearSelection as test_module
  69. self._run_test(request, workspace, editor, test_module)
  70. @pytest.mark.skip(reason="Test fails to find expected lines, it needs to be fixed.")
  71. @pytest.mark.parametrize("level", ["tmp_level"])
  72. def test_ScriptCanvas_TwoEntities_UseSimultaneously(self, request, workspace, editor, launcher_platform, project, level):
  73. def teardown():
  74. file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
  75. request.addfinalizer(teardown)
  76. file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
  77. from . import ScriptCanvas_TwoEntities_UseSimultaneously as test_module
  78. self._run_test(request, workspace, editor, test_module)
  79. def test_ScriptEvent_HappyPath_CreatedWithoutError(self, request, workspace, editor, launcher_platform, project):
  80. def teardown():
  81. file_system.delete(
  82. [os.path.join(workspace.paths.project(), "ScriptCanvas", "test_file.scriptevent")], True, True
  83. )
  84. request.addfinalizer(teardown)
  85. file_system.delete(
  86. [os.path.join(workspace.paths.project(), "ScriptCanvas", "test_file.scriptevent")], True, True
  87. )
  88. from . import ScriptEvent_HappyPath_CreatedWithoutError as test_module
  89. self._run_test(request, workspace, editor, test_module)
  90. def test_ScriptCanvasTools_Toggle_OpenCloseSuccess(self, request, workspace, editor, launcher_platform):
  91. from . import ScriptCanvasTools_Toggle_OpenCloseSuccess as test_module
  92. self._run_test(request, workspace, editor, test_module)
  93. def test_NodeInspector_HappyPath_VariableRenames(self, request, workspace, editor, launcher_platform, project):
  94. from . import NodeInspector_HappyPath_VariableRenames as test_module
  95. self._run_test(request, workspace, editor, test_module)
  96. def test_Debugger_HappyPath_TargetMultipleGraphs(self, request, workspace, editor, launcher_platform, project):
  97. from . import Debugger_HappyPath_TargetMultipleGraphs as test_module
  98. self._run_test(request, workspace, editor, test_module)
  99. @pytest.mark.skip(reason="Test fails on nightly build builds, it needs to be fixed.")
  100. @pytest.mark.parametrize("level", ["tmp_level"])
  101. def test_Debugger_HappyPath_TargetMultipleEntities(self, request, workspace, editor, launcher_platform, project, level):
  102. def teardown():
  103. file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
  104. request.addfinalizer(teardown)
  105. file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
  106. from . import Debugger_HappyPath_TargetMultipleEntities as test_module
  107. self._run_test(request, workspace, editor, test_module)
  108. def test_Pane_Undocked_ClosesSuccessfully(self, request, workspace, editor, launcher_platform):
  109. from . import Pane_Undocked_ClosesSuccessfully as test_module
  110. self._run_test(request, workspace, editor, test_module)
  111. @pytest.mark.parametrize("level", ["tmp_level"])
  112. def test_Entity_HappyPath_AddScriptCanvasComponent(self, request, workspace, editor, launcher_platform, project, level):
  113. def teardown():
  114. file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
  115. request.addfinalizer(teardown)
  116. file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
  117. from . import Entity_HappyPath_AddScriptCanvasComponent as test_module
  118. self._run_test(request, workspace, editor, test_module)
  119. def test_Pane_Default_RetainOnSCRestart(self, request, workspace, editor, launcher_platform):
  120. from . import Pane_Default_RetainOnSCRestart as test_module
  121. self._run_test(request, workspace, editor, test_module)
  122. @pytest.mark.skip(reason="Test fails to find expected lines, it needs to be fixed.")
  123. @pytest.mark.parametrize("level", ["tmp_level"])
  124. def test_ScriptEvents_HappyPath_SendReceiveAcrossMultiple(self, request, workspace, editor, launcher_platform, project, level):
  125. def teardown():
  126. file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
  127. request.addfinalizer(teardown)
  128. file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
  129. from . import ScriptEvents_HappyPath_SendReceiveAcrossMultiple as test_module
  130. self._run_test(request, workspace, editor, test_module)
  131. def test_NodePalette_SearchText_Deletion(self, request, workspace, editor, launcher_platform):
  132. from . import NodePalette_SearchText_Deletion as test_module
  133. self._run_test(request, workspace, editor, test_module)
  134. # NOTE: We had to use hydra_test_utils.py, as TestAutomationBase run_test method
  135. # fails because of pyside_utils import
  136. @pytest.mark.SUITE_periodic
  137. @pytest.mark.parametrize("launcher_platform", ["windows_editor"])
  138. @pytest.mark.parametrize("project", ["AutomatedTesting"])
  139. class TestScriptCanvasTests(object):
  140. """
  141. The following tests use hydra_test_utils.py to launch the editor and validate the results.
  142. """
  143. def test_EditMenu_Default_UndoRedo(self, request, editor, launcher_platform):
  144. expected_lines = [
  145. "New variable created",
  146. "Undo action working",
  147. "Redo action working",
  148. ]
  149. hydra.launch_and_validate_results(
  150. request,
  151. TEST_DIRECTORY,
  152. editor,
  153. "EditMenu_Default_UndoRedo.py",
  154. expected_lines,
  155. auto_test_mode=False,
  156. timeout=60,
  157. )
  158. def test_ScriptEvents_Default_SendReceiveSuccessfully(self, request, editor, launcher_platform):
  159. expected_lines = [
  160. "Successfully created test entity",
  161. "Successfully entered game mode",
  162. "Successfully found expected message",
  163. "Successfully exited game mode",
  164. ]
  165. hydra.launch_and_validate_results(
  166. request,
  167. TEST_DIRECTORY,
  168. editor,
  169. "ScriptEvents_Default_SendReceiveSuccessfully.py",
  170. expected_lines,
  171. auto_test_mode=False,
  172. timeout=60,
  173. )
  174. def test_ScriptEvents_ReturnSetType_Successfully(self, request, editor, launcher_platform):
  175. expected_lines = [
  176. "Successfully created test entity",
  177. "Successfully entered game mode",
  178. "Successfully found expected message",
  179. "Successfully exited game mode",
  180. ]
  181. hydra.launch_and_validate_results(
  182. request,
  183. TEST_DIRECTORY,
  184. editor,
  185. "ScriptEvents_ReturnSetType_Successfully.py",
  186. expected_lines,
  187. auto_test_mode=False,
  188. timeout=60,
  189. )
  190. def test_NodeCategory_ExpandOnClick(self, request, editor, launcher_platform):
  191. expected_lines = [
  192. "Script Canvas pane successfully opened",
  193. "Category expanded on left click",
  194. "Category collapsed on left click",
  195. "Category expanded on double click",
  196. "Category collapsed on double click",
  197. ]
  198. hydra.launch_and_validate_results(
  199. request,
  200. TEST_DIRECTORY,
  201. editor,
  202. "NodeCategory_ExpandOnClick.py",
  203. expected_lines,
  204. auto_test_mode=False,
  205. timeout=60,
  206. )
  207. def test_VariableManager_UnpinVariableType_Works(self, request, editor, launcher_platform):
  208. expected_lines = [
  209. "Success: VariableManager is opened successfully",
  210. "Success: Variable is pinned",
  211. "Success: Variable is unpinned",
  212. "Success: Variable is unpinned after reopening create variable menu",
  213. ]
  214. hydra.launch_and_validate_results(
  215. request,
  216. TEST_DIRECTORY,
  217. editor,
  218. "VariableManager_UnpinVariableType_Works.py",
  219. expected_lines,
  220. auto_test_mode=False,
  221. timeout=60,
  222. )
  223. def test_Node_HappyPath_DuplicateNode(self, request, editor, launcher_platform):
  224. expected_lines = [
  225. "Successfully duplicated node",
  226. ]
  227. hydra.launch_and_validate_results(
  228. request,
  229. TEST_DIRECTORY,
  230. editor,
  231. "Node_HappyPath_DuplicateNode.py",
  232. expected_lines,
  233. auto_test_mode=False,
  234. timeout=60,
  235. )
  236. def test_ScriptEvent_AddRemoveParameter_ActionsSuccessful(self, request, editor, launcher_platform):
  237. expected_lines = [
  238. "Success: New Script Event created",
  239. "Success: Child Event created",
  240. "Success: Successfully saved event asset",
  241. "Success: Successfully added parameter",
  242. "Success: Successfully removed parameter",
  243. ]
  244. hydra.launch_and_validate_results(
  245. request,
  246. TEST_DIRECTORY,
  247. editor,
  248. "ScriptEvent_AddRemoveParameter_ActionsSuccessful.py",
  249. expected_lines,
  250. auto_test_mode=False,
  251. timeout=60,
  252. )
  253. def test_FileMenu_Default_NewAndOpen(self, request, editor, launcher_platform):
  254. expected_lines = [
  255. "Verified no tabs open: True",
  256. "New tab opened successfully: True",
  257. "Open file window triggered successfully: True"
  258. ]
  259. hydra.launch_and_validate_results(
  260. request,
  261. TEST_DIRECTORY,
  262. editor,
  263. "FileMenu_Default_NewAndOpen.py",
  264. expected_lines,
  265. auto_test_mode=False,
  266. timeout=60,
  267. )
  268. def test_NewScriptEventButton_HappyPath_ContainsSCCategory(self, request, editor, launcher_platform):
  269. expected_lines = [
  270. "New Script event action found: True",
  271. "Asset Editor opened: True",
  272. "Asset Editor created with new asset: True",
  273. "New Script event created in Asset Editor: True",
  274. ]
  275. hydra.launch_and_validate_results(
  276. request,
  277. TEST_DIRECTORY,
  278. editor,
  279. "NewScriptEventButton_HappyPath_ContainsSCCategory.py",
  280. expected_lines,
  281. auto_test_mode=False,
  282. timeout=60,
  283. )
  284. def test_GraphClose_Default_SavePrompt(self, request, editor, launcher_platform):
  285. expected_lines = [
  286. "New graph created: True",
  287. "Save prompt opened as expected: True",
  288. "Close button worked as expected: True",
  289. ]
  290. hydra.launch_and_validate_results(
  291. request,
  292. TEST_DIRECTORY,
  293. editor,
  294. "GraphClose_Default_SavePrompt.py",
  295. expected_lines,
  296. auto_test_mode=False,
  297. timeout=60,
  298. )
  299. def test_VariableManager_Default_CreateDeleteVars(self, request, editor, launcher_platform):
  300. var_types = ["Boolean", "Color", "EntityId", "Number", "String", "Transform", "Vector2", "Vector3", "Vector4"]
  301. expected_lines = [f"{var_type} variable is created: True" for var_type in var_types]
  302. expected_lines.extend([f"{var_type} variable is deleted: True" for var_type in var_types])
  303. hydra.launch_and_validate_results(
  304. request,
  305. TEST_DIRECTORY,
  306. editor,
  307. "VariableManager_Default_CreateDeleteVars.py",
  308. expected_lines,
  309. auto_test_mode=False,
  310. timeout=60,
  311. )
  312. @pytest.mark.parametrize(
  313. "config",
  314. [
  315. {
  316. "cfg_args": "before_restart",
  317. "expected_lines": [
  318. "All the test panes are opened: True",
  319. "Test pane 1 is closed: True",
  320. "Location of test pane 2 changed successfully: True",
  321. "Test pane 3 resized successfully: True",
  322. ],
  323. },
  324. {
  325. "cfg_args": "after_restart",
  326. "expected_lines": [
  327. "Test pane retained its visiblity on Editor restart: True",
  328. "Test pane retained its location on Editor restart: True",
  329. "Test pane retained its size on Editor restart: True",
  330. ],
  331. },
  332. ],
  333. )
  334. def test_Pane_PropertiesChanged_RetainsOnRestart(self, request, editor, config, project, launcher_platform):
  335. hydra.launch_and_validate_results(
  336. request,
  337. TEST_DIRECTORY,
  338. editor,
  339. "Pane_PropertiesChanged_RetainsOnRestart.py",
  340. config.get('expected_lines'),
  341. cfg_args=[config.get('cfg_args')],
  342. auto_test_mode=False,
  343. timeout=60,
  344. )
  345. def test_ScriptEvent_AddRemoveMethod_UpdatesInSC(self, request, workspace, editor, launcher_platform):
  346. def teardown():
  347. file_system.delete(
  348. [os.path.join(workspace.paths.project(), "TestAssets", "test_file.scriptevents")], True, True
  349. )
  350. request.addfinalizer(teardown)
  351. file_system.delete(
  352. [os.path.join(workspace.paths.project(), "TestAssets", "test_file.scriptevents")], True, True
  353. )
  354. expected_lines = [
  355. "Success: New Script Event created",
  356. "Success: Initial Child Event created",
  357. "Success: Second Child Event created",
  358. "Success: Script event file saved",
  359. "Success: Method added to scriptevent file",
  360. "Success: Method removed from scriptevent file",
  361. ]
  362. hydra.launch_and_validate_results(
  363. request,
  364. TEST_DIRECTORY,
  365. editor,
  366. "ScriptEvent_AddRemoveMethod_UpdatesInSC.py",
  367. expected_lines,
  368. auto_test_mode=False,
  369. timeout=60,
  370. )
  371. def test_ScriptEvents_AllParamDatatypes_CreationSuccess(self, request, workspace, editor, launcher_platform):
  372. def teardown():
  373. file_system.delete(
  374. [os.path.join(workspace.paths.project(), "TestAssets", "test_file.scriptevents")], True, True
  375. )
  376. request.addfinalizer(teardown)
  377. file_system.delete(
  378. [os.path.join(workspace.paths.project(), "TestAssets", "test_file.scriptevents")], True, True
  379. )
  380. expected_lines = [
  381. "Success: New Script Event created",
  382. "Success: Child Event created",
  383. "Success: New parameters added",
  384. "Success: Script event file saved",
  385. "Success: Node found in Script Canvas",
  386. ]
  387. hydra.launch_and_validate_results(
  388. request,
  389. TEST_DIRECTORY,
  390. editor,
  391. "ScriptEvents_AllParamDatatypes_CreationSuccess.py",
  392. expected_lines,
  393. auto_test_mode=False,
  394. timeout=60,
  395. )