diff --git a/.github/workflows/beehave-ci.yml b/.github/workflows/beehave-ci.yml index 4816cb47..083981b2 100644 --- a/.github/workflows/beehave-ci.yml +++ b/.github/workflows/beehave-ci.yml @@ -37,7 +37,7 @@ jobs: fail-fast: false max-parallel: 10 matrix: - godot-version: ["4.5.1"] + godot-version: ["4.5.1", "4.6"] name: "🤖 CI on Godot ${{ matrix.godot-version }}" steps: @@ -45,7 +45,7 @@ jobs: uses: actions/checkout@v2 - name: Run GDUnit4 tests - uses: MikeSchulze/gdUnit4-action@v1.2.3 + uses: MikeSchulze/gdUnit4-action@v1.3.0 with: godot-version: ${{ matrix.godot-version }} godot-status: "stable" diff --git a/addons/gdUnit4/GdUnitRunner.cfg b/addons/gdUnit4/GdUnitRunner.cfg index 654b7339..2d42e0d2 100644 --- a/addons/gdUnit4/GdUnitRunner.cfg +++ b/addons/gdUnit4/GdUnitRunner.cfg @@ -1,4 +1,5 @@ { + "exit_on_first_fail": false, "server_port": 31002, "tests": [ { @@ -8,7 +9,7 @@ "attribute_index": -1, "display_name": "test_normal_tick", "fully_qualified_name": "test.beehave_tree_test.test_normal_tick", - "guid": "24aaad51-9bb8421-282e17d-204d56dedf", + "guid": "34717ab8-f10b487-7942267-00937fc402", "line_number": 19, "metadata": { @@ -26,7 +27,7 @@ "attribute_index": -1, "display_name": "test_low_tick_rate", "fully_qualified_name": "test.beehave_tree_test.test_low_tick_rate", - "guid": "56fcc0e2-50464c7-d8b199b-c0260846a1", + "guid": "e1cfd915-51b444f-daf4138-56a89484d6", "line_number": 26, "metadata": { @@ -44,7 +45,7 @@ "attribute_index": -1, "display_name": "test_low_tick_rate_last_tick", "fully_qualified_name": "test.beehave_tree_test.test_low_tick_rate_last_tick", - "guid": "d6a33bfb-60bb4c7-2bdbc65-dd8375fed5", + "guid": "fe8961ba-4296440-fbe1be6-40206088fc", "line_number": 39, "metadata": { @@ -62,7 +63,7 @@ "attribute_index": -1, "display_name": "test_nothing_running_before_first_tick", "fully_qualified_name": "test.beehave_tree_test.test_nothing_running_before_first_tick", - "guid": "540e948d-e1dd468-183caff-d53f1be8b2", + "guid": "d740d27b-03a2420-0b25cb6-2e7d77d217", "line_number": 50, "metadata": { @@ -80,7 +81,7 @@ "attribute_index": -1, "display_name": "test_get_last_condition", "fully_qualified_name": "test.beehave_tree_test.test_get_last_condition", - "guid": "bc90a3cd-60f7457-eb08647-14ebbda761", + "guid": "0bbf1899-09ff45d-88b7453-2b3bf82975", "line_number": 58, "metadata": { @@ -98,7 +99,7 @@ "attribute_index": -1, "display_name": "test_disabled", "fully_qualified_name": "test.beehave_tree_test.test_disabled", - "guid": "6923cc54-8f634ff-68b62f4-783eb58a16", + "guid": "41ef4389-359a4d4-c8ae226-483050407e", "line_number": 67, "metadata": { @@ -116,7 +117,7 @@ "attribute_index": -1, "display_name": "test_reenabled", "fully_qualified_name": "test.beehave_tree_test.test_reenabled", - "guid": "85f3834d-29254b2-683bdfb-b42b2ceeb7", + "guid": "ebb40e09-b771435-3ab574f-717f00e723", "line_number": 77, "metadata": { @@ -134,7 +135,7 @@ "attribute_index": -1, "display_name": "test_interrupt_running_action", "fully_qualified_name": "test.beehave_tree_test.test_interrupt_running_action", - "guid": "7125d374-88744ad-ba2e5d2-a5a6abb91b", + "guid": "a01bca80-93b4432-aa8e4d8-aef2ed9d38", "line_number": 87, "metadata": { @@ -152,7 +153,7 @@ "attribute_index": -1, "display_name": "test_blackboard_not_initialized", "fully_qualified_name": "test.beehave_tree_test.test_blackboard_not_initialized", - "guid": "095b0fbc-1acd4f1-f8104e8-cc1041ca58", + "guid": "703b034e-35cc4fc-785888c-713ebcb5a9", "line_number": 99, "metadata": { @@ -170,7 +171,7 @@ "attribute_index": -1, "display_name": "test_actor_override", "fully_qualified_name": "test.beehave_tree_test.test_actor_override", - "guid": "32db7f91-ff2d46f-4a8c457-91a55aba79", + "guid": "cab5802e-a0f64aa-9860a91-cf099b7023", "line_number": 109, "metadata": { @@ -188,7 +189,7 @@ "attribute_index": -1, "display_name": "test_manual_mode_does_not_auto_tick", "fully_qualified_name": "test.beehave_tree_test.test_manual_mode_does_not_auto_tick", - "guid": "6a034aed-f3614ab-bb5ea14-50202d5bfa", + "guid": "0c1a6362-e5df4bd-6ace1d6-e524089ff0", "line_number": 119, "metadata": { @@ -206,7 +207,7 @@ "attribute_index": -1, "display_name": "test_manual_mode_can_tick_manually", "fully_qualified_name": "test.beehave_tree_test.test_manual_mode_can_tick_manually", - "guid": "b76da07c-bf0b484-a88af27-b05d5cacb2", + "guid": "08e43f69-e90e480-dad613d-eb19480c12", "line_number": 134, "metadata": { @@ -224,7 +225,7 @@ "attribute_index": -1, "display_name": "test_manual_mode_respects_tick_rate", "fully_qualified_name": "test.beehave_tree_test.test_manual_mode_respects_tick_rate", - "guid": "6c6d0ea2-e56c4b0-0bbd40a-0551a6db39", + "guid": "2f35bf27-03954bd-f8060ef-08c9f07a98", "line_number": 153, "metadata": { @@ -242,7 +243,7 @@ "attribute_index": -1, "display_name": "test_manual_mode_can_be_disabled", "fully_qualified_name": "test.beehave_tree_test.test_manual_mode_can_be_disabled", - "guid": "e061a342-224d4ad-28b6b48-78d40582fa", + "guid": "a5ac58f0-540643c-cbe3186-8d0bdce439", "line_number": 181, "metadata": { @@ -260,7 +261,7 @@ "attribute_index": -1, "display_name": "test_action_after_run", "fully_qualified_name": "test.before_after_run_test.test_action_after_run", - "guid": "ba6c6410-ece7498-da8b912-48d33585b3", + "guid": "adf8cae4-5fc8412-6a6a7d2-6f8e0b427f", "line_number": 30, "metadata": { @@ -278,7 +279,7 @@ "attribute_index": -1, "display_name": "test_has_value", "fully_qualified_name": "test.blackboard.blackboard_test.test_has_value", - "guid": "1b4270d2-4528431-986df39-5128bc39d1", + "guid": "05583f56-ff0642b-bbf1e3f-e6d98bf175", "line_number": 11, "metadata": { @@ -296,7 +297,7 @@ "attribute_index": -1, "display_name": "test_erase_value", "fully_qualified_name": "test.blackboard.blackboard_test.test_erase_value", - "guid": "70049c9b-6fe343b-6aca23f-58bf31d1ec", + "guid": "55fdd22f-3371413-88b7bcb-da8c414496", "line_number": 18, "metadata": { @@ -314,7 +315,7 @@ "attribute_index": -1, "display_name": "test_separate_blackboard_erase_value", "fully_qualified_name": "test.blackboard.blackboard_test.test_separate_blackboard_erase_value", - "guid": "e1196bae-0c93449-f8bcd1c-23d8398a2a", + "guid": "6b918425-566241e-eb95723-123779f30c", "line_number": 25, "metadata": { @@ -332,7 +333,7 @@ "attribute_index": -1, "display_name": "test_set_value", "fully_qualified_name": "test.blackboard.blackboard_test.test_set_value", - "guid": "541a14d1-08d8425-09df022-a04f933c03", + "guid": "256542b7-ccf2419-3944644-39c6b06cda", "line_number": 32, "metadata": { @@ -350,7 +351,7 @@ "attribute_index": -1, "display_name": "test_separate_blackboard_id_value", "fully_qualified_name": "test.blackboard.blackboard_test.test_separate_blackboard_id_value", - "guid": "f3417c95-1abb45a-a8d5ac7-98a2ebe727", + "guid": "1e82c85b-524143d-29d15b3-a9bc919d11", "line_number": 38, "metadata": { @@ -368,7 +369,7 @@ "attribute_index": -1, "display_name": "test_get_default", "fully_qualified_name": "test.blackboard.blackboard_test.test_get_default", - "guid": "b15fd23b-d48c4cb-d805977-2d199ddd65", + "guid": "4afbe0aa-4b254f2-69ae4e5-258058b749", "line_number": 46, "metadata": { @@ -386,7 +387,7 @@ "attribute_index": -1, "display_name": "test_blackboard_shared_between_trees", "fully_qualified_name": "test.blackboard.blackboard_test.test_blackboard_shared_between_trees", - "guid": "bce280da-add04e7-595a3f4-41c1ba1366", + "guid": "d68a1252-650e40e-08bb25c-25c76f5262", "line_number": 52, "metadata": { @@ -404,7 +405,7 @@ "attribute_index": -1, "display_name": "test_blackboard_property_shared_between_trees", "fully_qualified_name": "test.blackboard.blackboard_test.test_blackboard_property_shared_between_trees", - "guid": "3298f4de-cd55466-6bf16f2-af8260aeb8", + "guid": "eb83fb5b-5bbf488-caf3f06-cf4767ef0e", "line_number": 63, "metadata": { @@ -422,7 +423,7 @@ "attribute_index": -1, "display_name": "test_separate_blackboards_independent_values", "fully_qualified_name": "test.blackboard.blackboard_test.test_separate_blackboards_independent_values", - "guid": "b17430db-f53d431-995e82e-8690752630", + "guid": "0bc3ec11-147e4e5-dbeac98-698817e700", "line_number": 76, "metadata": { @@ -440,7 +441,7 @@ "attribute_index": -1, "display_name": "test_debugger_renders_correctly", "fully_qualified_name": "test.debug.debugger_test.test_debugger_renders_correctly", - "guid": "0a2bf679-9d9d42f-0b7966b-5341a5202d", + "guid": "7bbe8d7e-d19845b-2a3873d-f30c8cb688", "line_number": 16, "metadata": { @@ -458,7 +459,7 @@ "attribute_index": -1, "display_name": "test_changing_to_all_colors", "fully_qualified_name": "test.e2e_test.test_changing_to_all_colors", - "guid": "5906d2e5-0a3c453-5be8931-4cef3e3509", + "guid": "f9b1f3cc-3e9a447-58854df-2d6a2d59ee", "line_number": 15, "metadata": { @@ -476,7 +477,7 @@ "attribute_index": -1, "display_name": "test_always_executing_first_successful_node", "fully_qualified_name": "test.nodes.composites.selector_random_test.test_always_executing_first_successful_node", - "guid": "3aaeda59-d3454e7-29da507-5a488ba33d", + "guid": "996d4da5-bc0e40f-681cd84-ea7c7ff22a", "line_number": 38, "metadata": { @@ -494,7 +495,7 @@ "attribute_index": -1, "display_name": "test_execute_second_when_first_is_failing", "fully_qualified_name": "test.nodes.composites.selector_random_test.test_execute_second_when_first_is_failing", - "guid": "b6ddc0b3-fe3946c-ab0937d-83aa021582", + "guid": "84d076a6-7b85422-49f5878-4aae4d73a1", "line_number": 46, "metadata": { @@ -512,7 +513,7 @@ "attribute_index": -1, "display_name": "test_random_even_execution", "fully_qualified_name": "test.nodes.composites.selector_random_test.test_random_even_execution", - "guid": "1c3d3c0f-6648420-4854faf-8cd13ed638", + "guid": "8db67dae-d8e24aa-6874554-e94320c274", "line_number": 55, "metadata": { @@ -530,7 +531,7 @@ "attribute_index": -1, "display_name": "test_return_failure_of_none_is_succeeding", "fully_qualified_name": "test.nodes.composites.selector_random_test.test_return_failure_of_none_is_succeeding", - "guid": "b6b0253c-8928420-e8a9042-f91ead3f35", + "guid": "1971f998-ac64456-2aa10ec-835af81d0c", "line_number": 63, "metadata": { @@ -548,7 +549,7 @@ "attribute_index": -1, "display_name": "test_clear_running_child_after_run", "fully_qualified_name": "test.nodes.composites.selector_random_test.test_clear_running_child_after_run", - "guid": "f43fa7b7-57d6450-4bfdd8e-c314dcb9f2", + "guid": "1eade657-df64480-9ae81b3-fdecbb688d", "line_number": 72, "metadata": { @@ -566,7 +567,7 @@ "attribute_index": -1, "display_name": "test_always_executing_first_successful_node", "fully_qualified_name": "test.nodes.composites.selector_reactive_test.test_always_executing_first_successful_node", - "guid": "5cfa64c2-7b53423-3a2dded-76fb149742", + "guid": "3aa751b0-235f489-79344c4-eb23ad6454", "line_number": 38, "metadata": { @@ -584,7 +585,7 @@ "attribute_index": -1, "display_name": "test_execute_second_when_first_is_failing", "fully_qualified_name": "test.nodes.composites.selector_reactive_test.test_execute_second_when_first_is_failing", - "guid": "ee9e0a86-95ab428-9b72d97-0a28bbba76", + "guid": "e3322938-ce004d1-9b608f6-3e8f50e119", "line_number": 48, "metadata": { @@ -602,7 +603,7 @@ "attribute_index": -1, "display_name": "test_return_failure_of_none_is_succeeding", "fully_qualified_name": "test.nodes.composites.selector_reactive_test.test_return_failure_of_none_is_succeeding", - "guid": "0817141b-a9f54c5-ba1285e-145a1aedc2", + "guid": "597d17db-85eb4f2-9a138b6-4bc6d51922", "line_number": 61, "metadata": { @@ -620,7 +621,7 @@ "attribute_index": -1, "display_name": "test_keeps_restarting_child_until_success", "fully_qualified_name": "test.nodes.composites.selector_reactive_test.test_keeps_restarting_child_until_success", - "guid": "adb59797-08d246e-0b052c7-9c21c488f1", + "guid": "1602c57f-3fb8429-99b4d2a-73f92c08f1", "line_number": 71, "metadata": { @@ -638,7 +639,7 @@ "attribute_index": -1, "display_name": "test_keeps_restarting_child_until_failure", "fully_qualified_name": "test.nodes.composites.selector_reactive_test.test_keeps_restarting_child_until_failure", - "guid": "320ee333-1c504d2-a87dfa9-e9a23f546c", + "guid": "22827237-b4574ba-9b6f660-5d2b6d41a7", "line_number": 92, "metadata": { @@ -656,7 +657,7 @@ "attribute_index": -1, "display_name": "test_interrupt_second_when_first_is_running", "fully_qualified_name": "test.nodes.composites.selector_reactive_test.test_interrupt_second_when_first_is_running", - "guid": "0d1b20f7-0b4340f-b8b5aa9-b2215efe99", + "guid": "f8d1d0ac-cc71456-6a81e77-a95d0253b5", "line_number": 113, "metadata": { @@ -674,7 +675,7 @@ "attribute_index": -1, "display_name": "test_clear_running_child_after_run", "fully_qualified_name": "test.nodes.composites.selector_reactive_test.test_clear_running_child_after_run", - "guid": "6829529c-f61246d-e98cd01-d44bb5ea6e", + "guid": "6bdf3cb8-1c4f4f6-d810114-4e31c6c82d", "line_number": 126, "metadata": { @@ -692,7 +693,7 @@ "attribute_index": -1, "display_name": "test_branch_change_detection", "fully_qualified_name": "test.nodes.composites.selector_reactive_test.test_branch_change_detection", - "guid": "a71b08e5-0c5c490-a9c10d2-e39d633eca", + "guid": "2a568094-b8444f0-fb8d031-ea28b7c5cf", "line_number": 136, "metadata": { @@ -710,7 +711,7 @@ "attribute_index": -1, "display_name": "test_complex_nested_selector_interruption", "fully_qualified_name": "test.nodes.composites.selector_reactive_test.test_complex_nested_selector_interruption", - "guid": "6ed062f4-6d4241a-5aef345-850e32e17c", + "guid": "ea914681-8cc4418-d95f355-43b9b401d4", "line_number": 171, "metadata": { @@ -728,7 +729,7 @@ "attribute_index": -1, "display_name": "test_interrupt_all_children_after_all_failed", "fully_qualified_name": "test.nodes.composites.selector_reactive_test.test_interrupt_all_children_after_all_failed", - "guid": "e935cdcb-aa0d4c4-d8e5ad3-b4241a0167", + "guid": "6203eccf-9aff496-f91d9ac-597b1e08ad", "line_number": 245, "metadata": { @@ -746,7 +747,7 @@ "attribute_index": -1, "display_name": "test_nested_interrupt_after_all_failed", "fully_qualified_name": "test.nodes.composites.selector_reactive_test.test_nested_interrupt_after_all_failed", - "guid": "88fff82e-214c491-5a4ba50-b8c4e8dcb5", + "guid": "f3a48dd8-136b436-19233c3-f6219a996f", "line_number": 305, "metadata": { @@ -764,7 +765,7 @@ "attribute_index": -1, "display_name": "test_always_executing_first_successful_node", "fully_qualified_name": "test.nodes.composites.selector_test.test_always_executing_first_successful_node", - "guid": "33490c67-a6394f1-5b30c95-a64d0ff143", + "guid": "59e6b2ec-2f6b41b-78c20cc-6e653693f4", "line_number": 38, "metadata": { @@ -782,7 +783,7 @@ "attribute_index": -1, "display_name": "test_execute_second_when_first_is_failing", "fully_qualified_name": "test.nodes.composites.selector_test.test_execute_second_when_first_is_failing", - "guid": "40853e62-e27442f-99859e8-d02ea7d8b7", + "guid": "ab1c24c1-63d7462-5a2c7c2-a64abb91a2", "line_number": 45, "metadata": { @@ -800,7 +801,7 @@ "attribute_index": -1, "display_name": "test_return_failure_of_none_is_succeeding", "fully_qualified_name": "test.nodes.composites.selector_test.test_return_failure_of_none_is_succeeding", - "guid": "003a7903-eee2463-c9074ba-c101b49e97", + "guid": "4313c622-784b4af-b9e4c86-15dfd6fdb2", "line_number": 53, "metadata": { @@ -818,7 +819,7 @@ "attribute_index": -1, "display_name": "test_not_interrupt_second_when_first_is_succeeding", "fully_qualified_name": "test.nodes.composites.selector_test.test_not_interrupt_second_when_first_is_succeeding", - "guid": "23718a22-41ab4c1-5a1024e-78f1960306", + "guid": "365b54cb-3eec44c-8b58ce9-181a5f9a48", "line_number": 61, "metadata": { @@ -836,7 +837,7 @@ "attribute_index": -1, "display_name": "test_not_interrupt_second_when_first_is_running", "fully_qualified_name": "test.nodes.composites.selector_test.test_not_interrupt_second_when_first_is_running", - "guid": "a70ddcdd-48c6428-4ada393-f3679d2ada", + "guid": "20087d70-f416490-29428c7-ab071482f9", "line_number": 74, "metadata": { @@ -854,7 +855,7 @@ "attribute_index": -1, "display_name": "test_tick_again_when_child_returns_running", "fully_qualified_name": "test.nodes.composites.selector_test.test_tick_again_when_child_returns_running", - "guid": "7f0d685b-1424409-2b3e270-3fb97d5c65", + "guid": "5022afe4-21a4473-78d45a7-e1912ff7b4", "line_number": 87, "metadata": { @@ -872,7 +873,7 @@ "attribute_index": -1, "display_name": "test_clear_running_child_after_run", "fully_qualified_name": "test.nodes.composites.selector_test.test_clear_running_child_after_run", - "guid": "0234104f-19554be-0902029-9f9884c501", + "guid": "d9797b01-23814bd-da2e2b6-cdfd840366", "line_number": 96, "metadata": { @@ -890,7 +891,7 @@ "attribute_index": -1, "display_name": "test_not_interrupt_first_after_finished", "fully_qualified_name": "test.nodes.composites.selector_test.test_not_interrupt_first_after_finished", - "guid": "8bcf3c98-31264d6-a8cac68-08ed67be23", + "guid": "469fffb8-700e4f8-381e711-a7b2ce6ff0", "line_number": 106, "metadata": { @@ -908,7 +909,7 @@ "attribute_index": -1, "display_name": "test_branch_change_resets_cooldown", "fully_qualified_name": "test.nodes.composites.selector_test.test_branch_change_resets_cooldown", - "guid": "1e0523b6-5da347c-9a15bd4-076499b6ae", + "guid": "370b2c51-5e82473-2952a9c-44f7da504f", "line_number": 132, "metadata": { @@ -926,7 +927,7 @@ "attribute_index": -1, "display_name": "test_nested_selector_interruption", "fully_qualified_name": "test.nodes.composites.selector_test.test_nested_selector_interruption", - "guid": "c0422933-cd164d6-5a34d58-9ee5e60db1", + "guid": "f85b2e50-5fb64f0-39254b8-5525d52937", "line_number": 192, "metadata": { @@ -944,7 +945,7 @@ "attribute_index": -1, "display_name": "test_complex_nested_selector_interruption", "fully_qualified_name": "test.nodes.composites.selector_test.test_complex_nested_selector_interruption", - "guid": "81dd67de-e5a4499-dbe2591-155a35b4cc", + "guid": "7c5aa42b-df4a488-ca54f52-e4690eada4", "line_number": 229, "metadata": { @@ -962,7 +963,7 @@ "attribute_index": -1, "display_name": "test_interrupt_all_children_after_all_failed", "fully_qualified_name": "test.nodes.composites.selector_test.test_interrupt_all_children_after_all_failed", - "guid": "bdfbb895-db78451-7866d88-a845ec622c", + "guid": "3c118fbf-e7264dd-6875b55-9bafad2b0b", "line_number": 304, "metadata": { @@ -980,7 +981,7 @@ "attribute_index": -1, "display_name": "test_nested_interrupt_after_all_failed", "fully_qualified_name": "test.nodes.composites.selector_test.test_nested_interrupt_after_all_failed", - "guid": "b0d52379-4f22402-cbafa6e-fe0a9eb1cf", + "guid": "17b957fd-a28747a-f9e957a-b1c80787c8", "line_number": 364, "metadata": { @@ -998,7 +999,7 @@ "attribute_index": -1, "display_name": "test_interrupt_all_children_after_failure_return", "fully_qualified_name": "test.nodes.composites.selector_test.test_interrupt_all_children_after_failure_return", - "guid": "1303401f-0ab64ac-68ea8bf-ec8f14b84c", + "guid": "258c0156-e354419-490f580-7faf4e7ca0", "line_number": 428, "metadata": { @@ -1016,7 +1017,7 @@ "attribute_index": -1, "display_name": "test_always_executing_first_successful_node", "fully_qualified_name": "test.nodes.composites.sequence_random_test.test_always_executing_first_successful_node", - "guid": "cb9ddeb9-17bd47c-19dd8ce-e961fd0f1f", + "guid": "9b555c87-007b49e-1904d1f-791f677e27", "line_number": 39, "metadata": { @@ -1034,7 +1035,7 @@ "attribute_index": -1, "display_name": "test_execute_second_when_first_is_failing", "fully_qualified_name": "test.nodes.composites.sequence_random_test.test_execute_second_when_first_is_failing", - "guid": "ddc0a0c7-41754c2-a8a73d5-85d10831a2", + "guid": "affdd22a-d23f4dd-7b0d428-b08cfb2dfb", "line_number": 49, "metadata": { @@ -1052,7 +1053,7 @@ "attribute_index": -1, "display_name": "test_random_even_execution", "fully_qualified_name": "test.nodes.composites.sequence_random_test.test_random_even_execution", - "guid": "ddd64f3f-996a4e1-a9fd045-e4ac99e775", + "guid": "758201af-383a4aa-a8a1e02-869ae30fa5", "line_number": 60, "metadata": { @@ -1070,7 +1071,7 @@ "attribute_index": -1, "display_name": "test_weighted_random_sampling", "fully_qualified_name": "test.nodes.composites.sequence_random_test.test_weighted_random_sampling", - "guid": "7fc82fa5-0c9744f-6b3a664-a8c27ee75a", + "guid": "159086cc-20664fb-3b7f09f-32ae6d0940", "line_number": 68, "metadata": { @@ -1088,7 +1089,7 @@ "attribute_index": -1, "display_name": "test_return_failure_of_none_is_succeeding", "fully_qualified_name": "test.nodes.composites.sequence_random_test.test_return_failure_of_none_is_succeeding", - "guid": "bfb8ffef-ee0040a-7bd831e-1614633fa4", + "guid": "2ce4179d-a45b459-b94e161-0ea859e060", "line_number": 98, "metadata": { @@ -1106,7 +1107,7 @@ "attribute_index": -1, "display_name": "test_clear_running_child_after_run", "fully_qualified_name": "test.nodes.composites.sequence_random_test.test_clear_running_child_after_run", - "guid": "4f04b157-f211416-5a4c137-f8b111723d", + "guid": "2ff3062e-cb6f43d-6815673-c86daac535", "line_number": 108, "metadata": { @@ -1124,7 +1125,7 @@ "attribute_index": -1, "display_name": "test_always_exexuting_all_successful_nodes", "fully_qualified_name": "test.nodes.composites.sequence_reactive_test.test_always_exexuting_all_successful_nodes", - "guid": "13f19495-c43a419-ba2a79d-d41a22578d", + "guid": "10ba3e49-23804a2-cae7044-d578f8e0d5", "line_number": 37, "metadata": { @@ -1142,7 +1143,7 @@ "attribute_index": -1, "display_name": "test_never_execute_second_when_first_is_failing", "fully_qualified_name": "test.nodes.composites.sequence_reactive_test.test_never_execute_second_when_first_is_failing", - "guid": "53621014-e2e24a9-5b58b02-e61d875c48", + "guid": "b5c040b0-6e114a4-ba97be4-b0d7e51012", "line_number": 47, "metadata": { @@ -1160,7 +1161,7 @@ "attribute_index": -1, "display_name": "test_keeps_running_child_until_success", "fully_qualified_name": "test.nodes.composites.sequence_reactive_test.test_keeps_running_child_until_success", - "guid": "9b3c4cf4-25c145e-19d2769-90bc29916d", + "guid": "1dd8bad5-75524b1-7ad1262-f47e63effb", "line_number": 58, "metadata": { @@ -1178,7 +1179,7 @@ "attribute_index": -1, "display_name": "test_keeps_running_child_until_failure", "fully_qualified_name": "test.nodes.composites.sequence_reactive_test.test_keeps_running_child_until_failure", - "guid": "a5ef5b34-ca8f455-788be0e-e1696bd97c", + "guid": "0978b53c-15d04dd-29bb7c9-4f77f0b03a", "line_number": 79, "metadata": { @@ -1196,7 +1197,7 @@ "attribute_index": -1, "display_name": "test_restart_when_child_returns_failure", "fully_qualified_name": "test.nodes.composites.sequence_reactive_test.test_restart_when_child_returns_failure", - "guid": "a4285f8d-6cb84d0-99fa050-eac10cbc85", + "guid": "5c66bc14-343047c-f94584e-df4ea0a28e", "line_number": 100, "metadata": { @@ -1214,7 +1215,7 @@ "attribute_index": -1, "display_name": "test_restart_again_when_child_returns_running", "fully_qualified_name": "test.nodes.composites.sequence_reactive_test.test_restart_again_when_child_returns_running", - "guid": "9ad4f1b8-c6574ba-98ffe07-2f9311cf79", + "guid": "d6f97cda-a62d48d-197efcf-363418c925", "line_number": 109, "metadata": { @@ -1232,7 +1233,7 @@ "attribute_index": -1, "display_name": "test_interrupt_second_when_first_is_running", "fully_qualified_name": "test.nodes.composites.sequence_reactive_test.test_interrupt_second_when_first_is_running", - "guid": "02c201e2-34a3423-db4340c-b99e225d0a", + "guid": "db407946-934248b-bab9773-94203ee923", "line_number": 118, "metadata": { @@ -1250,7 +1251,7 @@ "attribute_index": -1, "display_name": "test_clear_running_child_after_run", "fully_qualified_name": "test.nodes.composites.sequence_reactive_test.test_clear_running_child_after_run", - "guid": "1726dc87-7a7a458-f9684e2-0d945975d5", + "guid": "528479e1-76bb406-28dd018-ff951b9cdf", "line_number": 131, "metadata": { @@ -1268,7 +1269,7 @@ "attribute_index": -1, "display_name": "test_branch_change_detection_on_failure", "fully_qualified_name": "test.nodes.composites.sequence_reactive_test.test_branch_change_detection_on_failure", - "guid": "1d182ea7-d06941b-199d6ef-7c75a80345", + "guid": "4fc72b70-f857417-abf1532-464935bd02", "line_number": 141, "metadata": { @@ -1286,7 +1287,7 @@ "attribute_index": -1, "display_name": "test_nested_sequence_interrupt", "fully_qualified_name": "test.nodes.composites.sequence_reactive_test.test_nested_sequence_interrupt", - "guid": "127d287b-64d44d6-8b4704a-8b47cce76a", + "guid": "7419f94d-e16d465-093105b-ce60ce4794", "line_number": 173, "metadata": { @@ -1304,7 +1305,7 @@ "attribute_index": -1, "display_name": "test_nested_sequence_child_failure_interrupt", "fully_qualified_name": "test.nodes.composites.sequence_reactive_test.test_nested_sequence_child_failure_interrupt", - "guid": "92bbdb2e-7cd341c-99683e6-e8f9f3ff8b", + "guid": "c3fa0285-cdb24df-7bd13f7-e9b39f6da6", "line_number": 232, "metadata": { @@ -1322,7 +1323,7 @@ "attribute_index": -1, "display_name": "test_always_exexuting_all_successful_nodes", "fully_qualified_name": "test.nodes.composites.sequence_star_test.test_always_exexuting_all_successful_nodes", - "guid": "e63a30ff-875f447-291584f-688d38dc28", + "guid": "463051e2-3ad642c-4bf6a8a-677ccbff29", "line_number": 38, "metadata": { @@ -1340,7 +1341,7 @@ "attribute_index": -1, "display_name": "test_never_execute_second_when_first_is_failing", "fully_qualified_name": "test.nodes.composites.sequence_star_test.test_never_execute_second_when_first_is_failing", - "guid": "06dfc9f2-8cf340e-db22304-b7f6a05517", + "guid": "d1be96f9-6b7a4e6-18c6bab-730b952e4c", "line_number": 48, "metadata": { @@ -1358,7 +1359,7 @@ "attribute_index": -1, "display_name": "test_keeps_running_child_until_success", "fully_qualified_name": "test.nodes.composites.sequence_star_test.test_keeps_running_child_until_success", - "guid": "0567f8fa-b6e347f-e925702-edb78bff43", + "guid": "a0832069-57be4be-fa8b039-e294f9a43c", "line_number": 59, "metadata": { @@ -1376,7 +1377,7 @@ "attribute_index": -1, "display_name": "test_keeps_running_child_until_failure", "fully_qualified_name": "test.nodes.composites.sequence_star_test.test_keeps_running_child_until_failure", - "guid": "2c2a7426-e89b4e8-ba090c8-370fae4645", + "guid": "6ddfacbf-71eb43f-b881d62-3991944bbf", "line_number": 80, "metadata": { @@ -1394,7 +1395,7 @@ "attribute_index": -1, "display_name": "test_tick_again_when_child_returns_failure", "fully_qualified_name": "test.nodes.composites.sequence_star_test.test_tick_again_when_child_returns_failure", - "guid": "d4f8b853-af11440-9b2bd71-90dd1aba6d", + "guid": "f56e890e-85a44fd-4b16713-bc4bfbcb8b", "line_number": 103, "metadata": { @@ -1412,7 +1413,7 @@ "attribute_index": -1, "display_name": "test_tick_again_when_child_returns_running", "fully_qualified_name": "test.nodes.composites.sequence_star_test.test_tick_again_when_child_returns_running", - "guid": "27b79eaf-0f8941b-687ab15-6c99cd171a", + "guid": "11c48a08-5124445-3a00679-f6dfc5944a", "line_number": 112, "metadata": { @@ -1430,7 +1431,7 @@ "attribute_index": -1, "display_name": "test_clear_running_child_after_run", "fully_qualified_name": "test.nodes.composites.sequence_star_test.test_clear_running_child_after_run", - "guid": "ddfc0abf-805448e-2afb234-25a5a1a1b1", + "guid": "46bce228-5b2442b-f840c0d-c8b7d9302a", "line_number": 121, "metadata": { @@ -1448,7 +1449,7 @@ "attribute_index": -1, "display_name": "test_branch_change_detection_on_failure", "fully_qualified_name": "test.nodes.composites.sequence_star_test.test_branch_change_detection_on_failure", - "guid": "285ba51c-07b6417-7a014c6-0452e3448b", + "guid": "fce9f6e3-1362442-fa1cd1f-56557cca8a", "line_number": 131, "metadata": { @@ -1466,7 +1467,7 @@ "attribute_index": -1, "display_name": "test_branch_change_detection_on_consequent_failure", "fully_qualified_name": "test.nodes.composites.sequence_star_test.test_branch_change_detection_on_consequent_failure", - "guid": "b0dd1588-0dfe4d0-a95ae64-e70a76790f", + "guid": "fe0a45fb-ffd248a-ca3d6b2-77cef8ea4f", "line_number": 157, "metadata": { @@ -1484,7 +1485,7 @@ "attribute_index": -1, "display_name": "test_nested_sequence_interrupt", "fully_qualified_name": "test.nodes.composites.sequence_star_test.test_nested_sequence_interrupt", - "guid": "71774ffb-a640415-3853932-358fcabd95", + "guid": "cd09e962-eb2b4e0-0bd7c03-63f2a9270f", "line_number": 188, "metadata": { @@ -1502,7 +1503,7 @@ "attribute_index": -1, "display_name": "test_nested_sequence_child_failure_interrupt", "fully_qualified_name": "test.nodes.composites.sequence_star_test.test_nested_sequence_child_failure_interrupt", - "guid": "32338aef-60a24da-2a4b352-24f81905cd", + "guid": "5ea6f8c8-31574c1-88e59c2-e73501339f", "line_number": 247, "metadata": { @@ -1520,7 +1521,7 @@ "attribute_index": -1, "display_name": "test_always_executing_all_successful_nodes", "fully_qualified_name": "test.nodes.composites.sequence_test.test_always_executing_all_successful_nodes", - "guid": "df82b77a-c5b9453-689bcf6-97d235fffe", + "guid": "705806f7-12d140f-2845131-50600144a6", "line_number": 37, "metadata": { @@ -1538,7 +1539,7 @@ "attribute_index": -1, "display_name": "test_never_execute_second_when_first_is_failing", "fully_qualified_name": "test.nodes.composites.sequence_test.test_never_execute_second_when_first_is_failing", - "guid": "46d195dc-13a0433-cba44c6-f8e379ef74", + "guid": "fe7d0209-2a2d463-486b23d-522ca8e5a5", "line_number": 44, "metadata": { @@ -1556,7 +1557,7 @@ "attribute_index": -1, "display_name": "test_not_interrupt_second_when_first_is_failing", "fully_qualified_name": "test.nodes.composites.sequence_test.test_not_interrupt_second_when_first_is_failing", - "guid": "9a3d31d8-1fa2423-daba8ea-2e9ba17123", + "guid": "de5eb6da-4f4743a-8a999ab-9ae4651f33", "line_number": 52, "metadata": { @@ -1574,7 +1575,7 @@ "attribute_index": -1, "display_name": "test_not_interrupting_second_when_first_is_running", "fully_qualified_name": "test.nodes.composites.sequence_test.test_not_interrupting_second_when_first_is_running", - "guid": "03776f94-3efd48c-5aa92d2-078cc123a4", + "guid": "a7f7ea42-0e83452-b8fd499-1388f63dce", "line_number": 65, "metadata": { @@ -1592,7 +1593,7 @@ "attribute_index": -1, "display_name": "test_restart_when_child_returns_failure", "fully_qualified_name": "test.nodes.composites.sequence_test.test_restart_when_child_returns_failure", - "guid": "2eaea8be-c42e498-28e0f17-63e48860be", + "guid": "01a61e06-baca4a3-3b8c5ba-67d57c6fe5", "line_number": 78, "metadata": { @@ -1610,7 +1611,7 @@ "attribute_index": -1, "display_name": "test_tick_again_when_child_returns_running", "fully_qualified_name": "test.nodes.composites.sequence_test.test_tick_again_when_child_returns_running", - "guid": "ff9c66f5-6ebe4a8-ab73874-3b787dc5a8", + "guid": "25468f02-f234486-eabf48b-50ed69f45c", "line_number": 87, "metadata": { @@ -1628,7 +1629,7 @@ "attribute_index": -1, "display_name": "test_clear_running_child_after_run", "fully_qualified_name": "test.nodes.composites.sequence_test.test_clear_running_child_after_run", - "guid": "bf3e8dee-ee8e4fb-ba5fb37-951cfb2be5", + "guid": "627e411d-fc82408-88fac97-400cf5e93c", "line_number": 96, "metadata": { @@ -1646,7 +1647,7 @@ "attribute_index": -1, "display_name": "test_not_interrupt_first_after_finished", "fully_qualified_name": "test.nodes.composites.sequence_test.test_not_interrupt_first_after_finished", - "guid": "e9f5089c-9977401-f85480c-cc7b9e449c", + "guid": "ea2916cf-74bf40a-f816427-dce83e6fa8", "line_number": 106, "metadata": { @@ -1664,7 +1665,7 @@ "attribute_index": -1, "display_name": "test_branch_change_detection_on_consequent_failure", "fully_qualified_name": "test.nodes.composites.sequence_test.test_branch_change_detection_on_consequent_failure", - "guid": "3adb9219-81974aa-1905f08-55efea4c7a", + "guid": "9a663e40-adc0485-7811c00-ecd573ca03", "line_number": 130, "metadata": { @@ -1682,7 +1683,7 @@ "attribute_index": -1, "display_name": "test_nested_sequence_interrupt", "fully_qualified_name": "test.nodes.composites.sequence_test.test_nested_sequence_interrupt", - "guid": "2b1b67dd-9d904a4-9b6d19b-7c35617099", + "guid": "ebc26ab9-ebee4f9-dbd92c9-d6ba82a26a", "line_number": 160, "metadata": { @@ -1700,7 +1701,7 @@ "attribute_index": -1, "display_name": "test_nested_sequence_child_failure_interrupt", "fully_qualified_name": "test.nodes.composites.sequence_test.test_nested_sequence_child_failure_interrupt", - "guid": "94c1b9ed-24664df-3a457a7-ed279d5aab", + "guid": "6261f43d-f3e4401-3b115a1-fdf4390364", "line_number": 216, "metadata": { @@ -1718,7 +1719,7 @@ "attribute_index": -1, "display_name": "test_always_return_first_node_result", "fully_qualified_name": "test.nodes.composites.simple_parallel_test.test_always_return_first_node_result", - "guid": "d9c98a30-7339462-8a5aa21-9a2ab54bbf", + "guid": "562b931f-10dd4e7-99ab15d-f080ae558f", "line_number": 37, "metadata": { @@ -1736,7 +1737,7 @@ "attribute_index": -1, "display_name": "test_interrupt_second_when_first_is_succeeding", "fully_qualified_name": "test.nodes.composites.simple_parallel_test.test_interrupt_second_when_first_is_succeeding", - "guid": "6e752ee4-cfc2447-4afa5f8-4bfb0b3868", + "guid": "4583c5c9-c55c48d-5b322e6-4ef22e5757", "line_number": 50, "metadata": { @@ -1754,7 +1755,7 @@ "attribute_index": -1, "display_name": "test_interrupt_second_when_first_is_failing", "fully_qualified_name": "test.nodes.composites.simple_parallel_test.test_interrupt_second_when_first_is_failing", - "guid": "468baa5d-38ef418-69ea2c1-f65ea68ca3", + "guid": "55aed4ab-78ec498-9899833-4b43aa33ef", "line_number": 63, "metadata": { @@ -1772,7 +1773,7 @@ "attribute_index": -1, "display_name": "test_continue_tick_when_child_returns_failing", "fully_qualified_name": "test.nodes.composites.simple_parallel_test.test_continue_tick_when_child_returns_failing", - "guid": "ea6655bb-8a42431-2bcd85b-dc70cd737c", + "guid": "872fe309-692c4a4-ab5f2b4-222b932c83", "line_number": 76, "metadata": { @@ -1790,7 +1791,7 @@ "attribute_index": -1, "display_name": "test_child_continue_tick_in_delay_mode", "fully_qualified_name": "test.nodes.composites.simple_parallel_test.test_child_continue_tick_in_delay_mode", - "guid": "0d48306c-5e3e48a-c97730c-042b67b46f", + "guid": "8d586b4d-e86b49d-98b5209-9ccee7ad69", "line_number": 88, "metadata": { @@ -1808,7 +1809,7 @@ "attribute_index": -1, "display_name": "test_child_tick_count", "fully_qualified_name": "test.nodes.composites.simple_parallel_test.test_child_tick_count", - "guid": "fa1b5c58-fbbb496-b9df282-cea52f8b32", + "guid": "5c4b7b03-366c400-995dc2c-f15f2caa50", "line_number": 107, "metadata": { @@ -1826,7 +1827,7 @@ "attribute_index": -1, "display_name": "test_nested_simple_parallel", "fully_qualified_name": "test.nodes.composites.simple_parallel_test.test_nested_simple_parallel", - "guid": "32fc94ba-6d8442d-0b49af2-7cf2479564", + "guid": "be020761-ef2543e-9b5ed3b-437ab35ba0", "line_number": 133, "metadata": { @@ -1844,7 +1845,7 @@ "attribute_index": -1, "display_name": "test_running_then_fail", "fully_qualified_name": "test.nodes.decorators.cooldown_test.test_running_then_fail", - "guid": "f62519cb-fb83406-ebecfb4-f15e905280", + "guid": "8dcd6d1b-5ae84c6-2aaea85-148eca69c6", "line_number": 49, "metadata": { @@ -1862,7 +1863,7 @@ "attribute_index": -1, "display_name": "test_interrupt_propagates_when_actionleaf", "fully_qualified_name": "test.nodes.decorators.cooldown_test.test_interrupt_propagates_when_actionleaf", - "guid": "091135cb-009240b-ea63498-011ca93ca1", + "guid": "a614c713-3e69480-ca69926-9132d94cf2", "line_number": 61, "metadata": { @@ -1880,7 +1881,7 @@ "attribute_index": -1, "display_name": "test_interrupt_propagates_when_composite", "fully_qualified_name": "test.nodes.decorators.cooldown_test.test_interrupt_propagates_when_composite", - "guid": "9d58c7f4-f154412-6a70bde-f2004b0f27", + "guid": "305b4fd3-88c9416-cac6ac9-0a2fb4a353", "line_number": 71, "metadata": { @@ -1898,7 +1899,7 @@ "attribute_index": -1, "display_name": "test_after_run_called_on_success", "fully_qualified_name": "test.nodes.decorators.cooldown_test.test_after_run_called_on_success", - "guid": "48116802-29e3423-29a0510-4129ca049a", + "guid": "edb39990-96d2475-cae4ed2-fe1d917f14", "line_number": 88, "metadata": { @@ -1916,7 +1917,7 @@ "attribute_index": -1, "display_name": "test_after_run_called_on_failure", "fully_qualified_name": "test.nodes.decorators.cooldown_test.test_after_run_called_on_failure", - "guid": "8e25a403-d3f044f-a96056c-058c62f310", + "guid": "33330437-4f024e0-f818589-e087463704", "line_number": 103, "metadata": { @@ -1934,7 +1935,7 @@ "attribute_index": -1, "display_name": "test_after_run_not_called_during_cooldown", "fully_qualified_name": "test.nodes.decorators.cooldown_test.test_after_run_not_called_during_cooldown", - "guid": "382b6406-617d46a-989b3de-11a4f5d407", + "guid": "90efd309-eaac461-aba5572-cfc9c13b58", "line_number": 118, "metadata": { @@ -1952,7 +1953,7 @@ "attribute_index": -1, "display_name": "test_before_run_only_called_once_per_cooldown", "fully_qualified_name": "test.nodes.decorators.cooldown_test.test_before_run_only_called_once_per_cooldown", - "guid": "71dc261b-160f419-2bb3780-212ea61a40", + "guid": "3a1f488f-b5eb493-4b69d15-c3d620046f", "line_number": 134, "metadata": { @@ -1970,7 +1971,7 @@ "attribute_index": -1, "display_name": "test_cooldown_reset_on_interrupt", "fully_qualified_name": "test.nodes.decorators.cooldown_test.test_cooldown_reset_on_interrupt", - "guid": "813c0e34-e19a4bb-db0c67f-d60679e332", + "guid": "d6f7572c-888b480-a9d0e39-707ddfdbd0", "line_number": 153, "metadata": { @@ -1988,7 +1989,7 @@ "attribute_index": -1, "display_name": "test_return_success_after_delay", "fully_qualified_name": "test.nodes.decorators.delayer_test.test_return_success_after_delay", - "guid": "1aa4aab4-ea67448-4b2dd34-f0ceca08ef", + "guid": "4396459b-dcb64ac-f8a62c5-8383aae3b7", "line_number": 35, "metadata": { @@ -2006,7 +2007,7 @@ "attribute_index": -1, "display_name": "test_return_running_after_delay", "fully_qualified_name": "test.nodes.decorators.delayer_test.test_return_running_after_delay", - "guid": "2629b199-433943f-3a24bbf-2375597942", + "guid": "b91c7ccc-373842e-faf29b3-174e50ea93", "line_number": 45, "metadata": { @@ -2024,7 +2025,7 @@ "attribute_index": -1, "display_name": "test_after_run_called_on_success", "fully_qualified_name": "test.nodes.decorators.delayer_test.test_after_run_called_on_success", - "guid": "e31bde52-148f42a-f9f6c32-cd1800a731", + "guid": "981cce79-d05449e-987e075-de6ff3221b", "line_number": 61, "metadata": { @@ -2042,7 +2043,7 @@ "attribute_index": -1, "display_name": "test_after_run_called_on_failure", "fully_qualified_name": "test.nodes.decorators.delayer_test.test_after_run_called_on_failure", - "guid": "4bc594d9-185442b-aa50b0d-ed6215686b", + "guid": "abff27ca-aeb5436-8bfe631-ff8c874989", "line_number": 73, "metadata": { @@ -2060,7 +2061,7 @@ "attribute_index": -1, "display_name": "test_after_run_not_called_during_delay", "fully_qualified_name": "test.nodes.decorators.delayer_test.test_after_run_not_called_during_delay", - "guid": "fe93a509-a5cc481-0b632ff-deec97fc79", + "guid": "6c86b63c-6aa04c8-79244bc-2f36ae7daf", "line_number": 85, "metadata": { @@ -2078,7 +2079,7 @@ "attribute_index": -1, "display_name": "test_before_run_only_called_once_per_run", "fully_qualified_name": "test.nodes.decorators.delayer_test.test_before_run_only_called_once_per_run", - "guid": "61aeee6c-f420416-6b2bc44-e3ad0741b6", + "guid": "3add26ee-487b494-6af9c3c-bb48e1d326", "line_number": 98, "metadata": { @@ -2096,7 +2097,7 @@ "attribute_index": -1, "display_name": "test_delay_reset_on_interrupt", "fully_qualified_name": "test.nodes.decorators.delayer_test.test_delay_reset_on_interrupt", - "guid": "c1a350b1-65c343d-7ab590d-6db072d5e7", + "guid": "ebf0266b-a5ef4aa-8a6daa6-8da29522f4", "line_number": 122, "metadata": { @@ -2114,7 +2115,7 @@ "attribute_index": -1, "display_name": "test_tick", "fully_qualified_name": "test.nodes.decorators.failer_test.test_tick", - "guid": "8a2cd08d-27d5436-caa73a5-61ef6a548d", + "guid": "5b08b6ee-9c4f437-cb9e3f8-320169555d", "line_number": 33, "metadata": { @@ -2132,7 +2133,7 @@ "attribute_index": -1, "display_name": "test_clear_running_child_after_run", "fully_qualified_name": "test.nodes.decorators.failer_test.test_clear_running_child_after_run", - "guid": "27280958-4e2e472-bb95626-bc0702914e", + "guid": "b2d4cf3f-87ff48e-d848662-bdb9f9d73f", "line_number": 38, "metadata": { @@ -2150,7 +2151,7 @@ "attribute_index": -1, "display_name": "test_invert_success_to_failure", "fully_qualified_name": "test.nodes.decorators.inverter_test.test_invert_success_to_failure", - "guid": "0365c21a-d35a41d-9b25a70-d099cf0f12", + "guid": "1529df40-f7e442d-7a82ac4-6a642748cb", "line_number": 33, "metadata": { @@ -2168,7 +2169,7 @@ "attribute_index": -1, "display_name": "test_invert_failure_to_success", "fully_qualified_name": "test.nodes.decorators.inverter_test.test_invert_failure_to_success", - "guid": "fef24213-49a04c3-da10972-28b2e516f8", + "guid": "92aa21e8-d61543f-09bfde5-d469b28af4", "line_number": 38, "metadata": { @@ -2186,7 +2187,7 @@ "attribute_index": -1, "display_name": "test_clear_running_child_after_run", "fully_qualified_name": "test.nodes.decorators.inverter_test.test_clear_running_child_after_run", - "guid": "f01bfd42-671c4e3-5b96fc8-76911e18e3", + "guid": "4c070c37-b49c447-ead2d85-d1394c1af8", "line_number": 43, "metadata": { @@ -2204,7 +2205,7 @@ "attribute_index": 0, "display_name": "test_max_count:0 (2)", "fully_qualified_name": "test.nodes.decorators.limiter_test.test_max_count.test_max_count:0 (2)", - "guid": "f56c17fe-d11a494-9a261f7-28b6330741", + "guid": "25f7651c-413b4d0-e8732aa-85d6c86568", "line_number": 33, "metadata": { @@ -2222,7 +2223,7 @@ "attribute_index": 1, "display_name": "test_max_count:1 (0)", "fully_qualified_name": "test.nodes.decorators.limiter_test.test_max_count.test_max_count:1 (0)", - "guid": "ecd99abf-66e0410-589a6f2-2d9bdc58c8", + "guid": "435ec398-10c940c-9b84e42-3a185449d4", "line_number": 33, "metadata": { @@ -2240,7 +2241,7 @@ "attribute_index": -1, "display_name": "test_interrupt_after_run", "fully_qualified_name": "test.nodes.decorators.limiter_test.test_interrupt_after_run", - "guid": "bfb858d4-c0c346d-896ee95-88eda20f47", + "guid": "bf002e3c-1f1f4c1-f83a142-ee3e19921f", "line_number": 45, "metadata": { @@ -2258,7 +2259,7 @@ "attribute_index": -1, "display_name": "test_clear_running_child_after_run", "fully_qualified_name": "test.nodes.decorators.limiter_test.test_clear_running_child_after_run", - "guid": "1ea9f477-450240d-0a1f269-5defe90dcc", + "guid": "f2019812-c8f9461-9bf6211-1d8a066d21", "line_number": 56, "metadata": { @@ -2276,7 +2277,7 @@ "attribute_index": -1, "display_name": "test_counter_reset_on_interrupt", "fully_qualified_name": "test.nodes.decorators.limiter_test.test_counter_reset_on_interrupt", - "guid": "b26978f8-382d45a-2bd0938-d66b0c4dee", + "guid": "c0012a31-a67b43e-7a8b02e-2445a27f1f", "line_number": 66, "metadata": { @@ -2294,7 +2295,7 @@ "attribute_index": 0, "display_name": "test_repetitions:0 (2)", "fully_qualified_name": "test.nodes.decorators.repeater_test.test_repetitions.test_repetitions:0 (2)", - "guid": "5eea8049-26244f4-aaad486-457549f6ff", + "guid": "5d29ed00-bad54b7-0a7c179-2e8e1c872c", "line_number": 44, "metadata": { @@ -2312,7 +2313,7 @@ "attribute_index": 1, "display_name": "test_repetitions:1 (0)", "fully_qualified_name": "test.nodes.decorators.repeater_test.test_repetitions.test_repetitions:1 (0)", - "guid": "176d847a-3e7641d-c82f425-1224f745fb", + "guid": "e559bc8e-552a467-aacdd58-bffa8f6e4a", "line_number": 44, "metadata": { @@ -2330,7 +2331,7 @@ "attribute_index": -1, "display_name": "test_failure", "fully_qualified_name": "test.nodes.decorators.repeater_test.test_failure", - "guid": "2ca9dcff-ff254e3-dbd0d55-a5049fb9c5", + "guid": "5c94399f-87bb413-fa1a442-f23bbc2542", "line_number": 63, "metadata": { @@ -2348,7 +2349,7 @@ "attribute_index": -1, "display_name": "test_counter_reset_on_interrupt", "fully_qualified_name": "test.nodes.decorators.repeater_test.test_counter_reset_on_interrupt", - "guid": "be754c1c-45e540c-c8bdcd2-70e5b7e5a7", + "guid": "5eb84548-b31f4bf-4bacbb1-1df686df38", "line_number": 99, "metadata": { @@ -2366,7 +2367,7 @@ "attribute_index": -1, "display_name": "test_tick", "fully_qualified_name": "test.nodes.decorators.succeeder_test.test_tick", - "guid": "254852db-9dd64c6-2baf95e-f91f486802", + "guid": "c7975e01-26144a0-ca4d21d-355c0b5f23", "line_number": 33, "metadata": { @@ -2384,7 +2385,7 @@ "attribute_index": -1, "display_name": "test_clear_running_child_after_run", "fully_qualified_name": "test.nodes.decorators.succeeder_test.test_clear_running_child_after_run", - "guid": "dfbd7896-982e449-29ac127-184c1abea6", + "guid": "6a9dfcf6-5393480-b9b06b3-254ff48670", "line_number": 38, "metadata": { @@ -2402,7 +2403,7 @@ "attribute_index": -1, "display_name": "test_return_failure_when_child_exceeds_time_limiter", "fully_qualified_name": "test.nodes.decorators.time_limiter_test.test_return_failure_when_child_exceeds_time_limiter", - "guid": "6317de5e-39804eb-8978903-84846932f0", + "guid": "47160c76-59a84fb-f816fca-016076ba78", "line_number": 37, "metadata": { @@ -2420,7 +2421,7 @@ "attribute_index": -1, "display_name": "test_reset_when_child_finishes", "fully_qualified_name": "test.nodes.decorators.time_limiter_test.test_reset_when_child_finishes", - "guid": "2c43e7a7-0c7743e-580b566-b8b31d0d20", + "guid": "f2b91495-ed84455-986edfc-fe1f970cef", "line_number": 46, "metadata": { @@ -2438,7 +2439,7 @@ "attribute_index": -1, "display_name": "test_clear_running_child_after_run", "fully_qualified_name": "test.nodes.decorators.time_limiter_test.test_clear_running_child_after_run", - "guid": "cff1b7a3-17fe411-ea94f93-6b32a52252", + "guid": "ae9d9659-b21c497-38a47ca-951b5affea", "line_number": 56, "metadata": { @@ -2456,7 +2457,7 @@ "attribute_index": -1, "display_name": "test_timer_reset_on_interrupt", "fully_qualified_name": "test.nodes.decorators.time_limiter_test.test_timer_reset_on_interrupt", - "guid": "0f55f2b2-641a419-3a1e111-1c3b126c89", + "guid": "3698ed04-a7d64df-c9789e3-32ac470fb8", "line_number": 65, "metadata": { @@ -2474,7 +2475,7 @@ "attribute_index": -1, "display_name": "test_failure", "fully_qualified_name": "test.nodes.decorators.until_fail_test.test_failure", - "guid": "9c63c384-7ca041b-6826eb7-1961cf1fef", + "guid": "6449f298-9d0f45d-b94acc2-0468365117", "line_number": 33, "metadata": { @@ -2492,7 +2493,7 @@ "attribute_index": -1, "display_name": "test_after_run_called_on_success", "fully_qualified_name": "test.nodes.decorators.until_fail_test.test_after_run_called_on_success", - "guid": "f6e641ff-d396459-9af58cb-a374856e0b", + "guid": "db8367f5-22534b9-d9014fa-eef02a9092", "line_number": 47, "metadata": { @@ -2510,7 +2511,7 @@ "attribute_index": -1, "display_name": "test_after_run_called_on_failure", "fully_qualified_name": "test.nodes.decorators.until_fail_test.test_after_run_called_on_failure", - "guid": "950dfc78-67e940f-2975b90-84c83d168a", + "guid": "80f65571-0a2c40c-bb7aa79-4ad52486a7", "line_number": 54, "metadata": { @@ -2528,7 +2529,7 @@ "attribute_index": -1, "display_name": "test_after_run_not_called_during_running", "fully_qualified_name": "test.nodes.decorators.until_fail_test.test_after_run_not_called_during_running", - "guid": "b7131f2b-28b14ba-298acb1-cd763fe244", + "guid": "a09960b6-753b4b1-0b04c4e-f4dc7ea081", "line_number": 61, "metadata": { @@ -2546,7 +2547,7 @@ "attribute_index": -1, "display_name": "test_erase_existing_key", "fully_qualified_name": "test.nodes.leaves.actions.blackboard_erase_test.test_erase_existing_key", - "guid": "1016139c-b8404b7-9917369-eac3f1254d", + "guid": "085cbc2e-3fe047b-c8874d8-4deb5003db", "line_number": 27, "metadata": { @@ -2564,7 +2565,7 @@ "attribute_index": -1, "display_name": "test_erase_non_existing_key", "fully_qualified_name": "test.nodes.leaves.actions.blackboard_erase_test.test_erase_non_existing_key", - "guid": "3bf2804a-152e46c-a9f9b2a-fef9ad9b7c", + "guid": "da5ff71b-ce784c4-9a7cf84-579de2f712", "line_number": 34, "metadata": { @@ -2582,7 +2583,7 @@ "attribute_index": -1, "display_name": "test_invalid_key_expression", "fully_qualified_name": "test.nodes.leaves.actions.blackboard_erase_test.test_invalid_key_expression", - "guid": "2f111865-abd64c3-3974e07-b26fa88fd2", + "guid": "be9873bf-ee3149b-2a55dbd-7e4a1ff766", "line_number": 39, "metadata": { @@ -2600,7 +2601,7 @@ "attribute_index": -1, "display_name": "test_set_to_constant", "fully_qualified_name": "test.nodes.leaves.actions.blackboard_set_test.test_set_to_constant", - "guid": "cafe8f23-022a443-d94590b-cde4541e19", + "guid": "ca5fe267-36a7407-dba1bfb-89778adb47", "line_number": 26, "metadata": { @@ -2618,7 +2619,7 @@ "attribute_index": -1, "display_name": "test_copy_key", "fully_qualified_name": "test.nodes.leaves.actions.blackboard_set_test.test_copy_key", - "guid": "b15efdca-7c7f4c4-5ac0650-7618d809d1", + "guid": "ba32cad9-9f274fa-484ae32-fcba34cb10", "line_number": 34, "metadata": { @@ -2636,7 +2637,7 @@ "attribute_index": -1, "display_name": "test_invalid_expression", "fully_qualified_name": "test.nodes.leaves.actions.blackboard_set_test.test_invalid_expression", - "guid": "bef7ba38-51c3431-39ff90d-09e2635c68", + "guid": "0c2ee16e-d43f463-b8f5fb2-5d9b21e6f4", "line_number": 42, "metadata": { @@ -2654,7 +2655,7 @@ "attribute_index": -1, "display_name": "test_set_vector3", "fully_qualified_name": "test.nodes.leaves.actions.blackboard_set_test.test_set_vector3", - "guid": "0a6094fa-bf774ad-fa85958-aadf0c7613", + "guid": "a328cb55-0e62469-5912de4-84cd4ad6c9", "line_number": 49, "metadata": { @@ -2672,7 +2673,7 @@ "attribute_index": -1, "display_name": "test_invalid_key_expression", "fully_qualified_name": "test.nodes.leaves.actions.blackboard_set_test.test_invalid_key_expression", - "guid": "882e0923-6a6a45c-a972137-da65db3141", + "guid": "98141660-138c43d-8bab571-737aecea1e", "line_number": 57, "metadata": { @@ -2690,7 +2691,7 @@ "attribute_index": -1, "display_name": "test_invalid_value_expression", "fully_qualified_name": "test.nodes.leaves.actions.blackboard_set_test.test_invalid_value_expression", - "guid": "70709b98-56b0438-bb645b3-f1af1528ff", + "guid": "54c3d72f-9a774d6-f9a5aa5-7a4f6185b6", "line_number": 63, "metadata": { @@ -2708,7 +2709,7 @@ "attribute_index": -1, "display_name": "test_comparison_operators", "fully_qualified_name": "test.nodes.leaves.conditions.blackboard_compare_test.test_comparison_operators", - "guid": "051484ef-dfb9424-7a9d9f4-1f64d08a97", + "guid": "fa1702f2-6d00488-48a1715-fb1cc5a5c1", "line_number": 24, "metadata": { @@ -2726,7 +2727,7 @@ "attribute_index": -1, "display_name": "test_blackboard_access", "fully_qualified_name": "test.nodes.leaves.conditions.blackboard_compare_test.test_blackboard_access", - "guid": "25de94d2-e65e46b-0bf4286-a0c91f2171", + "guid": "2bbe7390-097341b-e9fb115-1380c10374", "line_number": 71, "metadata": { @@ -2744,7 +2745,7 @@ "attribute_index": -1, "display_name": "test_invalid_left_operand_expression", "fully_qualified_name": "test.nodes.leaves.conditions.blackboard_compare_test.test_invalid_left_operand_expression", - "guid": "9e9b6a47-d0f54ff-f9bbba3-b284ec2d97", + "guid": "fc7fb411-d5c4497-f94c4d8-62978d6c9a", "line_number": 82, "metadata": { @@ -2762,7 +2763,7 @@ "attribute_index": -1, "display_name": "test_invalid_right_operand_expression", "fully_qualified_name": "test.nodes.leaves.conditions.blackboard_compare_test.test_invalid_right_operand_expression", - "guid": "40a2b992-c2c049a-4a879a1-420539efc1", + "guid": "f121e7e8-feb842d-8ae18af-d004beaed8", "line_number": 91, "metadata": { @@ -2780,7 +2781,7 @@ "attribute_index": -1, "display_name": "test_key_exists", "fully_qualified_name": "test.nodes.leaves.conditions.blackboard_has_test.test_key_exists", - "guid": "047814e4-ae8242c-1b59dd4-505dea1c8d", + "guid": "b700ee68-cc3f48f-c943841-1ded0fc6ac", "line_number": 27, "metadata": { @@ -2798,7 +2799,7 @@ "attribute_index": -1, "display_name": "test_variant_key_exists", "fully_qualified_name": "test.nodes.leaves.conditions.blackboard_has_test.test_variant_key_exists", - "guid": "131352dc-acbc46b-2ab87be-7da4e9a2e8", + "guid": "d974f1b3-ef6c47d-290c61e-1b3d7c9dca", "line_number": 34, "metadata": { @@ -2816,7 +2817,7 @@ "attribute_index": -1, "display_name": "test_key_exists_but_value_null", "fully_qualified_name": "test.nodes.leaves.conditions.blackboard_has_test.test_key_exists_but_value_null", - "guid": "2aa3f3c9-5c9d49f-f9b6a2a-a085f6e552", + "guid": "5f1a951f-8e3e45a-59ba717-fec498e4e4", "line_number": 42, "metadata": { @@ -2834,7 +2835,7 @@ "attribute_index": -1, "display_name": "test_key_does_not_exist", "fully_qualified_name": "test.nodes.leaves.conditions.blackboard_has_test.test_key_does_not_exist", - "guid": "0414316d-a4ef4b1-88b94f6-fdb4b27d64", + "guid": "66cc41ec-318f454-c912cce-8645b9873f", "line_number": 49, "metadata": { @@ -2852,7 +2853,7 @@ "attribute_index": -1, "display_name": "test_invalid_key_expression", "fully_qualified_name": "test.nodes.leaves.conditions.blackboard_has_test.test_invalid_key_expression", - "guid": "3118eb6f-d6b04da-1adfe91-7ee7d025ca", + "guid": "5d726c69-a655425-b871aed-8aeae96173", "line_number": 54, "metadata": { @@ -2870,7 +2871,7 @@ "attribute_index": -1, "display_name": "test_invalid_key_expression_wrong_format", "fully_qualified_name": "test.nodes.leaves.conditions.blackboard_has_test.test_invalid_key_expression_wrong_format", - "guid": "7b0f0c7f-77d84cd-a85aa7a-12df79a6c6", + "guid": "6de77ca0-44c74bf-ea6e4af-63bc0efabe", "line_number": 61, "metadata": { @@ -2888,7 +2889,7 @@ "attribute_index": -1, "display_name": "test_add_child", "fully_qualified_name": "test.randomized_composites.runtime_changes.runtime_changes_test.test_add_child", - "guid": "6480b0d0-a0e94f3-294c3da-082adc4172", + "guid": "bbfe807b-c5684b5-f92958a-744878ba37", "line_number": 22, "metadata": { @@ -2906,7 +2907,7 @@ "attribute_index": -1, "display_name": "test_remove_child", "fully_qualified_name": "test.randomized_composites.runtime_changes.runtime_changes_test.test_remove_child", - "guid": "e76fd0fb-6c7a47c-1b8c763-ff919af12a", + "guid": "5469c898-9ebc4c8-da621a5-b3fe170a74", "line_number": 45, "metadata": { @@ -2924,7 +2925,7 @@ "attribute_index": -1, "display_name": "test_rename_child", "fully_qualified_name": "test.randomized_composites.runtime_changes.runtime_changes_test.test_rename_child", - "guid": "5b66b695-d09a42e-4922d82-44897f7419", + "guid": "bb5dfcc1-b5da41e-38e3907-56647227f2", "line_number": 71, "metadata": { @@ -2942,7 +2943,7 @@ "attribute_index": -1, "display_name": "test_scene_reload", "fully_qualified_name": "test.randomized_composites.runtime_changes.runtime_changes_test.test_scene_reload", - "guid": "df1fb5b1-1019469-48d3da3-4db6175915", + "guid": "b85954dc-11e54ff-29885ed-f2a2fcab91", "line_number": 99, "metadata": { @@ -2960,7 +2961,7 @@ "attribute_index": -1, "display_name": "test_weights_effecting_sample", "fully_qualified_name": "test.randomized_composites.weighted_sampling.selector_random.selector_random_weights_test.test_weights_effecting_sample", - "guid": "6fe4c52c-d376405-1911625-c5ac5568c4", + "guid": "d9c27d77-8a564a5-eb742da-ed197a7fa2", "line_number": 13, "metadata": { @@ -2978,7 +2979,7 @@ "attribute_index": -1, "display_name": "test_weights_effecting_sample", "fully_qualified_name": "test.randomized_composites.weighted_sampling.sequence_random_weights.sequence_random_weights_test.test_weights_effecting_sample", - "guid": "5a018f08-5a3e417-18a74e6-a0816d32d0", + "guid": "e8c13ed5-fd4a4c6-1a12dc8-158bf32e0d", "line_number": 15, "metadata": { @@ -2991,4 +2992,4 @@ } ], "version": "5.0" -} +} \ No newline at end of file diff --git a/addons/gdUnit4/bin/GdUnitCmdTool.gd.uid b/addons/gdUnit4/bin/GdUnitCmdTool.gd.uid index 69e43a57..21abe242 100644 --- a/addons/gdUnit4/bin/GdUnitCmdTool.gd.uid +++ b/addons/gdUnit4/bin/GdUnitCmdTool.gd.uid @@ -1 +1 @@ -uid://drclt2mnlga5u +uid://by80ypvxha4xx diff --git a/addons/gdUnit4/bin/GdUnitCopyLog.gd.uid b/addons/gdUnit4/bin/GdUnitCopyLog.gd.uid index 2715b1b4..d921ee0a 100644 --- a/addons/gdUnit4/bin/GdUnitCopyLog.gd.uid +++ b/addons/gdUnit4/bin/GdUnitCopyLog.gd.uid @@ -1 +1 @@ -uid://cdipopy0teh2q +uid://cxrpp0l3pfxha diff --git a/addons/gdUnit4/plugin.cfg b/addons/gdUnit4/plugin.cfg index 64bfc352..8293c3f2 100644 --- a/addons/gdUnit4/plugin.cfg +++ b/addons/gdUnit4/plugin.cfg @@ -3,5 +3,5 @@ name="gdUnit4" description="Unit Testing Framework for Godot Scripts" author="Mike Schulze" -version="6.0.1" +version="6.1.1" script="plugin.gd" diff --git a/addons/gdUnit4/plugin.gd b/addons/gdUnit4/plugin.gd index 822c4d56..1e220c07 100644 --- a/addons/gdUnit4/plugin.gd +++ b/addons/gdUnit4/plugin.gd @@ -1,23 +1,29 @@ @tool extends EditorPlugin -# We need to define manually the slot id's, to be downwards compatible -const CONTEXT_SLOT_FILESYSTEM: int = 1 # EditorContextMenuPlugin.CONTEXT_SLOT_FILESYSTEM -const CONTEXT_SLOT_SCRIPT_EDITOR: int = 2 # EditorContextMenuPlugin.CONTEXT_SLOT_SCRIPT_EDITOR - var _gd_inspector: Control var _gd_console: Control -var _gd_filesystem_context_menu: Variant -var _gd_scripteditor_context_menu: Variant +var _filesystem_context_menu: EditorContextMenuPlugin +var _editor_context_menu: EditorContextMenuPlugin +var _editor_code_context_menu: EditorContextMenuPlugin func _enter_tree() -> void: - var inferred_declaration: int = ProjectSettings.get_setting("debug/gdscript/warnings/inferred_declaration") - var exclude_addons: bool = ProjectSettings.get_setting("debug/gdscript/warnings/exclude_addons") - if !exclude_addons and inferred_declaration != 0: + + var is_gdunit_excluded_warnings: bool = false + if Engine.get_version_info().hex >= 0x40600: + var dirctrory_rules: Dictionary = ProjectSettings.get_setting("debug/gdscript/warnings/directory_rules") + if dirctrory_rules.has("res://addons/gdUnit4") and dirctrory_rules["res://addons/gdUnit4"] == 0: + is_gdunit_excluded_warnings = true + else: + is_gdunit_excluded_warnings = ProjectSettings.get_setting("debug/gdscript/warnings/exclude_addons") + if !is_gdunit_excluded_warnings and inferred_declaration != 0: printerr("GdUnit4: 'inferred_declaration' is set to Warning/Error!") - printerr("GdUnit4 is not 'inferred_declaration' save, you have to excluded addons (debug/gdscript/warnings/exclude_addons)") + if Engine.get_version_info().hex >= 0x40600: + printerr("GdUnit4 is not 'inferred_declaration' save, you have to excluded the addon (debug/gdscript/warnings/directory_rules)") + else: + printerr("GdUnit4 is not 'inferred_declaration' save, you have to excluded addons (debug/gdscript/warnings/exclude_addons)") printerr("Loading GdUnit4 Plugin failed.") return @@ -73,36 +79,21 @@ func check_running_in_test_env() -> bool: func _add_context_menus() -> void: - if Engine.get_version_info().hex >= 0x40400: - # With Godot 4.4 we have to use the 'add_context_menu_plugin' to register editor context menus - _gd_filesystem_context_menu = _preload_gdx_script("res://addons/gdUnit4/src/ui/menu/EditorFileSystemContextMenuHandlerV44.gdx") - call_deferred("add_context_menu_plugin", CONTEXT_SLOT_FILESYSTEM, _gd_filesystem_context_menu) - # the CONTEXT_SLOT_SCRIPT_EDITOR is adding to the script panel instead of script editor see https://github.com/godotengine/godot/pull/100556 - #_gd_scripteditor_context_menu = _preload("res://addons/gdUnit4/src/ui/menu/ScriptEditorContextMenuHandlerV44.gdx") - #call_deferred("add_context_menu_plugin", CONTEXT_SLOT_SCRIPT_EDITOR, _gd_scripteditor_context_menu) - # so we use the old hacky way to add the context menu - _gd_inspector.add_child(preload("res://addons/gdUnit4/src/ui/menu/ScriptEditorContextMenuHandler.gd").new()) - else: - # TODO Delete it if the minimum requirement for the plugin is set to Godot 4.4. - _gd_inspector.add_child(preload("res://addons/gdUnit4/src/ui/menu/EditorFileSystemContextMenuHandler.gd").new()) - _gd_inspector.add_child(preload("res://addons/gdUnit4/src/ui/menu/ScriptEditorContextMenuHandler.gd").new()) + _filesystem_context_menu = preload("res://addons/gdUnit4/src/ui/menu/GdUnitEditorFileSystemContextMenuHandler.gd").new() + _editor_context_menu = preload("res://addons/gdUnit4/src/ui/menu/GdUnitScriptEditorContextMenuHandler.gd").new() + _editor_code_context_menu = preload("res://addons/gdUnit4/src/ui/menu/GdUnitScriptEditorContextMenuHandler.gd").new() + add_context_menu_plugin(EditorContextMenuPlugin.CONTEXT_SLOT_FILESYSTEM, _filesystem_context_menu) + add_context_menu_plugin(EditorContextMenuPlugin.CONTEXT_SLOT_SCRIPT_EDITOR, _editor_context_menu) + add_context_menu_plugin(EditorContextMenuPlugin.CONTEXT_SLOT_SCRIPT_EDITOR_CODE, _editor_code_context_menu) func _remove_context_menus() -> void: - if is_instance_valid(_gd_filesystem_context_menu): - call_deferred("remove_context_menu_plugin", _gd_filesystem_context_menu) - if is_instance_valid(_gd_scripteditor_context_menu): - call_deferred("remove_context_menu_plugin", _gd_scripteditor_context_menu) - - -func _preload_gdx_script(script_path: String) -> Variant: - var script: GDScript = GDScript.new() - script.source_code = GdUnitFileAccess.resource_as_string(script_path) - script.take_over_path(script_path) - var err :Error = script.reload() - if err != OK: - push_error("Can't create context menu %s, error: %s" % [script_path, error_string(err)]) - return script.new() + if is_instance_valid(_filesystem_context_menu): + remove_context_menu_plugin(_filesystem_context_menu) + if is_instance_valid(_editor_context_menu): + remove_context_menu_plugin(_editor_context_menu) + if is_instance_valid(_editor_code_context_menu): + remove_context_menu_plugin(_editor_code_context_menu) func _on_resource_saved(resource: Resource) -> void: diff --git a/addons/gdUnit4/plugin.gd.uid b/addons/gdUnit4/plugin.gd.uid index 30d555e6..3e8c7750 100644 --- a/addons/gdUnit4/plugin.gd.uid +++ b/addons/gdUnit4/plugin.gd.uid @@ -1 +1 @@ -uid://cryriduwrk2m +uid://bduuoo74ugn8r diff --git a/addons/gdUnit4/runtest.sh b/addons/gdUnit4/runtest.sh old mode 100644 new mode 100755 diff --git a/addons/gdUnit4/src/Comparator.gd.uid b/addons/gdUnit4/src/Comparator.gd.uid index addeb4fb..787e9cad 100644 --- a/addons/gdUnit4/src/Comparator.gd.uid +++ b/addons/gdUnit4/src/Comparator.gd.uid @@ -1 +1 @@ -uid://ctu3xbpejb7xc +uid://ca70wxvy13ijo diff --git a/addons/gdUnit4/src/Fuzzers.gd b/addons/gdUnit4/src/Fuzzers.gd index f61ba6e6..c8689df3 100644 --- a/addons/gdUnit4/src/Fuzzers.gd +++ b/addons/gdUnit4/src/Fuzzers.gd @@ -1,34 +1,80 @@ -## A fuzzer implementation to provide default implementation +## Factory class providing convenient static methods to create various fuzzer instances.[br] +## +## Fuzzers is a utility class that simplifies the creation of different fuzzer types +## for testing purposes. It provides static factory methods that create pre-configured +## fuzzers with sensible defaults, making it easier to set up fuzz testing in your +## test suites without manually instantiating each fuzzer type.[br] +## +## This class acts as a central access point for all fuzzer types, improving code +## readability and reducing boilerplate in test cases.[br] +## +## @tutorial(Fuzzing Testing): https://en.wikipedia.org/wiki/Fuzzing class_name Fuzzers extends Resource -## Generates an random string with min/max length and given charset -static func rand_str(min_length: int, max_length :int, charset := StringFuzzer.DEFAULT_CHARSET) -> Fuzzer: +## Generates random strings with length between [param min_length] and +## [param max_length] (inclusive), using characters from [param charset]. +## See [StringFuzzer] for detailed documentation and examples. +static func rand_str(min_length: int, max_length: int, charset := StringFuzzer.DEFAULT_CHARSET) -> StringFuzzer: return StringFuzzer.new(min_length, max_length, charset) -## Generates an random integer in a range form to -static func rangei(from: int, to: int) -> Fuzzer: +## Creates a [BoolFuzzer] for generating random boolean values.[br] +## +## See [BoolFuzzer] for detailed documentation and examples. +static func boolean() -> BoolFuzzer: + return BoolFuzzer.new() + + +## Creates an [IntFuzzer] for generating random integers within a range.[br] +## +## Generates random integers between [param from] and [param to] (inclusive) +## using [constant IntFuzzer.NORMAL] mode. +## See [IntFuzzer] for detailed documentation and examples. +static func rangei(from: int, to: int) -> IntFuzzer: return IntFuzzer.new(from, to) -## Generates a randon float within in a given range -static func rangef(from: float, to: float) -> Fuzzer: + +## Creates a [FloatFuzzer] for generating random floats within a range.[br] +## +## Generates random float values between [param from] and [param to] (inclusive). +## See [FloatFuzzer] for detailed documentation and examples. +static func rangef(from: float, to: float) -> FloatFuzzer: return FloatFuzzer.new(from, to) -## Generates an random Vector2 in a range form to -static func rangev2(from: Vector2, to: Vector2) -> Fuzzer: + +## Creates a [Vector2Fuzzer] for generating random 2D vectors within a range.[br] +## +## Generates random Vector2 values where each component is bounded by +## [param from] and [param to] (inclusive). +## See [Vector2Fuzzer] for detailed documentation and examples. +static func rangev2(from: Vector2, to: Vector2) -> Vector2Fuzzer: return Vector2Fuzzer.new(from, to) -## Generates an random Vector3 in a range form to -static func rangev3(from: Vector3, to: Vector3) -> Fuzzer: +## Creates a [Vector3Fuzzer] for generating random 3D vectors within a range.[br] +## +## Generates random Vector3 values where each component is bounded by +## [param from] and [param to] (inclusive). +## See [Vector3Fuzzer] for detailed documentation and examples. +static func rangev3(from: Vector3, to: Vector3) -> Vector3Fuzzer: return Vector3Fuzzer.new(from, to) -## Generates an integer in a range form to that can be divided exactly by 2 -static func eveni(from: int, to: int) -> Fuzzer: + +## Creates an [IntFuzzer] that generates only even integers.[br] +## +## Generates random even integers between [param from] and [param to] (inclusive) +## using [constant IntFuzzer.EVEN] mode. +## See [IntFuzzer] for detailed documentation about even number generation. +static func eveni(from: int, to: int) -> IntFuzzer: return IntFuzzer.new(from, to, IntFuzzer.EVEN) -## Generates an integer in a range form to that cannot be divided exactly by 2 -static func oddi(from: int, to: int) -> Fuzzer: + +## Creates an [IntFuzzer] that generates only odd integers.[br] +## +## Generates random odd integers between [param from] and [param to] (inclusive) +## using [constant IntFuzzer.ODD] mode. +## See [IntFuzzer] for detailed documentation about odd number generation. +static func oddi(from: int, to: int) -> IntFuzzer: return IntFuzzer.new(from, to, IntFuzzer.ODD) diff --git a/addons/gdUnit4/src/Fuzzers.gd.uid b/addons/gdUnit4/src/Fuzzers.gd.uid index 2d09316e..88a0e68a 100644 --- a/addons/gdUnit4/src/Fuzzers.gd.uid +++ b/addons/gdUnit4/src/Fuzzers.gd.uid @@ -1 +1 @@ -uid://yffwyn0x4je5 +uid://cpolkfvcfxpa3 diff --git a/addons/gdUnit4/src/GdUnitArrayAssert.gd.uid b/addons/gdUnit4/src/GdUnitArrayAssert.gd.uid index 0027b493..c04debf0 100644 --- a/addons/gdUnit4/src/GdUnitArrayAssert.gd.uid +++ b/addons/gdUnit4/src/GdUnitArrayAssert.gd.uid @@ -1 +1 @@ -uid://bs4k5s8f0w08j +uid://bb7pfi8hocfwj diff --git a/addons/gdUnit4/src/GdUnitAssert.gd.uid b/addons/gdUnit4/src/GdUnitAssert.gd.uid index 7e93fbaa..67b0f148 100644 --- a/addons/gdUnit4/src/GdUnitAssert.gd.uid +++ b/addons/gdUnit4/src/GdUnitAssert.gd.uid @@ -1 +1 @@ -uid://byo1s7ubv1f76 +uid://bvnrety6qt1o5 diff --git a/addons/gdUnit4/src/GdUnitAwaiter.gd.uid b/addons/gdUnit4/src/GdUnitAwaiter.gd.uid index a63ef1c5..b28e6278 100644 --- a/addons/gdUnit4/src/GdUnitAwaiter.gd.uid +++ b/addons/gdUnit4/src/GdUnitAwaiter.gd.uid @@ -1 +1 @@ -uid://b1kmmghjf1bg1 +uid://65xbqy26rb4d diff --git a/addons/gdUnit4/src/GdUnitBoolAssert.gd.uid b/addons/gdUnit4/src/GdUnitBoolAssert.gd.uid index db6e9314..1b914f36 100644 --- a/addons/gdUnit4/src/GdUnitBoolAssert.gd.uid +++ b/addons/gdUnit4/src/GdUnitBoolAssert.gd.uid @@ -1 +1 @@ -uid://cx23l4urr7nli +uid://dkxxknybvsygu diff --git a/addons/gdUnit4/src/GdUnitConstants.gd.uid b/addons/gdUnit4/src/GdUnitConstants.gd.uid index cb5bf9e8..90439ab5 100644 --- a/addons/gdUnit4/src/GdUnitConstants.gd.uid +++ b/addons/gdUnit4/src/GdUnitConstants.gd.uid @@ -1 +1 @@ -uid://blatoco5nffpr +uid://dpqlnnj80bhym diff --git a/addons/gdUnit4/src/GdUnitDictionaryAssert.gd.uid b/addons/gdUnit4/src/GdUnitDictionaryAssert.gd.uid index 4fa9f6af..9cf693c4 100644 --- a/addons/gdUnit4/src/GdUnitDictionaryAssert.gd.uid +++ b/addons/gdUnit4/src/GdUnitDictionaryAssert.gd.uid @@ -1 +1 @@ -uid://215u3ktvnwp6 +uid://dkkmfkuev0cx7 diff --git a/addons/gdUnit4/src/GdUnitFailureAssert.gd.uid b/addons/gdUnit4/src/GdUnitFailureAssert.gd.uid index f2de9b3a..f584ce6c 100644 --- a/addons/gdUnit4/src/GdUnitFailureAssert.gd.uid +++ b/addons/gdUnit4/src/GdUnitFailureAssert.gd.uid @@ -1 +1 @@ -uid://bamtimy2noquj +uid://b4k2cp2gpxik0 diff --git a/addons/gdUnit4/src/GdUnitFileAssert.gd.uid b/addons/gdUnit4/src/GdUnitFileAssert.gd.uid index 1bc3f0c2..7dcda656 100644 --- a/addons/gdUnit4/src/GdUnitFileAssert.gd.uid +++ b/addons/gdUnit4/src/GdUnitFileAssert.gd.uid @@ -1 +1 @@ -uid://cr6fmdftrdhh3 +uid://cd0iuqqhgnxdk diff --git a/addons/gdUnit4/src/GdUnitFloatAssert.gd.uid b/addons/gdUnit4/src/GdUnitFloatAssert.gd.uid index 607cc1bf..1f9777f5 100644 --- a/addons/gdUnit4/src/GdUnitFloatAssert.gd.uid +++ b/addons/gdUnit4/src/GdUnitFloatAssert.gd.uid @@ -1 +1 @@ -uid://b3jnp7abh7f4b +uid://bmh7t0fveiagu diff --git a/addons/gdUnit4/src/GdUnitFuncAssert.gd.uid b/addons/gdUnit4/src/GdUnitFuncAssert.gd.uid index a1629489..88fb6828 100644 --- a/addons/gdUnit4/src/GdUnitFuncAssert.gd.uid +++ b/addons/gdUnit4/src/GdUnitFuncAssert.gd.uid @@ -1 +1 @@ -uid://daosqxaehunjs +uid://yqjd8phv4hsl diff --git a/addons/gdUnit4/src/GdUnitGodotErrorAssert.gd.uid b/addons/gdUnit4/src/GdUnitGodotErrorAssert.gd.uid index 9b94f5a8..d3860ff0 100644 --- a/addons/gdUnit4/src/GdUnitGodotErrorAssert.gd.uid +++ b/addons/gdUnit4/src/GdUnitGodotErrorAssert.gd.uid @@ -1 +1 @@ -uid://h36vxwpenfe7 +uid://lpqlgyg5bmq5 diff --git a/addons/gdUnit4/src/GdUnitIntAssert.gd.uid b/addons/gdUnit4/src/GdUnitIntAssert.gd.uid index 6176c6b6..5c8f487e 100644 --- a/addons/gdUnit4/src/GdUnitIntAssert.gd.uid +++ b/addons/gdUnit4/src/GdUnitIntAssert.gd.uid @@ -1 +1 @@ -uid://owftkm7kpycc +uid://ceyfrsp0dawmu diff --git a/addons/gdUnit4/src/GdUnitObjectAssert.gd.uid b/addons/gdUnit4/src/GdUnitObjectAssert.gd.uid index e04a9e28..5a13e10b 100644 --- a/addons/gdUnit4/src/GdUnitObjectAssert.gd.uid +++ b/addons/gdUnit4/src/GdUnitObjectAssert.gd.uid @@ -1 +1 @@ -uid://d3fy67cwrju16 +uid://06vxgkds37ef diff --git a/addons/gdUnit4/src/GdUnitResultAssert.gd.uid b/addons/gdUnit4/src/GdUnitResultAssert.gd.uid index 83842b0c..a508a110 100644 --- a/addons/gdUnit4/src/GdUnitResultAssert.gd.uid +++ b/addons/gdUnit4/src/GdUnitResultAssert.gd.uid @@ -1 +1 @@ -uid://cb6xwld1v312k +uid://byvyfivj2ocp5 diff --git a/addons/gdUnit4/src/GdUnitSceneRunner.gd b/addons/gdUnit4/src/GdUnitSceneRunner.gd index 6b11918d..9b156f3a 100644 --- a/addons/gdUnit4/src/GdUnitSceneRunner.gd +++ b/addons/gdUnit4/src/GdUnitSceneRunner.gd @@ -24,9 +24,8 @@ extends RefCounted ## Simulates that a key has been pressed.[br] +## @deprecated: the modifier [b]shift_pressed[/b] and [b]ctrl_pressed[/b] will be removed in v7.0 ## [member key_code] : the key code e.g. [constant KEY_ENTER][br] -## [member shift_pressed] : false by default set to true if simmulate shift is press[br] -## [member ctrl_pressed] : false by default set to true if simmulate control is press[br] ## [codeblock] ## func test_key_presssed(): ## var runner = scene_runner("res://scenes/simple_scene.tscn") @@ -35,17 +34,43 @@ extends RefCounted @abstract func simulate_key_pressed(key_code: int, shift_pressed := false, ctrl_pressed := false) -> GdUnitSceneRunner -## Simulates that a key is pressed.[br] +## Simulates that a key is pressing.[br] +## @deprecated: the modifier [b]shift_pressed[/b] and [b]ctrl_pressed[/b] will be removed in v7.0[br]See `test_key_shift_and_A_presssing` for example using key combinations ## [member key_code] : the key code e.g. [constant KEY_ENTER][br] -## [member shift_pressed] : false by default set to true if simmulate shift is press[br] -## [member ctrl_pressed] : false by default set to true if simmulate control is press[br] +## [codeblock] +## # Do simulate key pressing A +## func test_key_A_presssing(): +## var runner = scene_runner("res://scenes/simple_scene.tscn") +## await runner.simulate_key_press(KEY_A) +## +## +## # Do simulate keycombination pressing shift+A +## func test_key_shift_and_A_presssing(): +## var runner = scene_runner("res://scenes/simple_scene.tscn") +## runner.simulate_key_press(KEY_SHIFT) +## runner.simulate_key_press(KEY_A) +## await _runner.await_input_processed() +## [/codeblock] @abstract func simulate_key_press(key_code: int, shift_pressed := false, ctrl_pressed := false) -> GdUnitSceneRunner ## Simulates that a key has been released.[br] ## [member key_code] : the key code e.g. [constant KEY_ENTER][br] -## [member shift_pressed] : false by default set to true if simmulate shift is press[br] -## [member ctrl_pressed] : false by default set to true if simmulate control is press[br] +## [codeblock] +## # Do simulate releasing key A +## func test_key_A_releasing(): +## var runner = scene_runner("res://scenes/simple_scene.tscn") +## await runner.simulate_key_release(KEY_A) +## +## +## # Do simulate keycombination pressing shift+A +## func test_key_shift_and_A_releasing((): +## var runner = scene_runner("res://scenes/simple_scene.tscn") +## runner.simulate_key_release(KEY_SHIFT) +## runner.simulate_key_release(KEY_A) +## await _runner.await_input_processed() +## [/codeblock] +## @deprecated: the modifier [b]shift_pressed[/b] and [b]ctrl_pressed[/b] will be removed in v7.0[br]See `test_key_shift_and_A_releasing` for example using key combinations @abstract func simulate_key_release(key_code: int, shift_pressed := false, ctrl_pressed := false) -> GdUnitSceneRunner diff --git a/addons/gdUnit4/src/GdUnitSceneRunner.gd.uid b/addons/gdUnit4/src/GdUnitSceneRunner.gd.uid index e85cc753..77cb5a90 100644 --- a/addons/gdUnit4/src/GdUnitSceneRunner.gd.uid +++ b/addons/gdUnit4/src/GdUnitSceneRunner.gd.uid @@ -1 +1 @@ -uid://bgc5iuggvw4fs +uid://cgjg681kniddf diff --git a/addons/gdUnit4/src/GdUnitSignalAssert.gd b/addons/gdUnit4/src/GdUnitSignalAssert.gd index bb975e89..2c3d39bb 100644 --- a/addons/gdUnit4/src/GdUnitSignalAssert.gd +++ b/addons/gdUnit4/src/GdUnitSignalAssert.gd @@ -27,20 +27,132 @@ extends GdUnitAssert @abstract func append_failure_message(message: String) -> GdUnitSignalAssert -## Verifies that given signal is emitted until waiting time -@abstract func is_emitted(name: String, args := []) -> GdUnitSignalAssert - - -## Verifies that given signal is NOT emitted until waiting time -@abstract func is_not_emitted(name: String, args := []) -> GdUnitSignalAssert - - -## Verifies the signal exists checked the emitter -@abstract func is_signal_exists(name: String) -> GdUnitSignalAssert +## Verifies that the specified signal is emitted with the expected arguments.[br] +## +## This assertion waits for a signal to be emitted from the object under test and +## validates that it was emitted with the correct arguments. The function supports +## both typed signals (Signal type) and string-based signal names for flexibility +## in different testing scenarios.[br] +## [br] +## [b]Parameters:[/b][br] +## [param signal_name]: The signal to monitor. Can be either:[br] +## • A [Signal] reference (recommended for type safety)[br] +## • A [String] with the signal name +## [param signal_args]: Optional expected signal arguments.[br] +## When provided, verifies the signal was emitted with exactly these values.[br] +## [br] +## [b]Returns:[/b][br] +## [GdUnitSignalAssert] - Returns self for method chaining.[br] +## [br] +## [b]Examples:[/b] +## [codeblock] +## signal signal_a(value: int) +## signal signal_b(name: String, count: int) +## +## # Wait for signal emission without checking arguments +## # Using Signal reference (type-safe) +## await assert_signal(instance).is_emitted(signal_a) +## # Using string name (dynamic) +## await assert_signal(instance).is_emitted("signal_a") +## +## # Wait for signal emission with specific argument +## await assert_signal(instance).is_emitted(signal_a, 10) +## +## # Wait for signal with multiple arguments +## await assert_signal(instance).is_emitted(signal_b, "test", 42) +## +## # Wait max 500ms for signal with argument 10 +## await assert_signal(instance).wait_until(500).is_emitted(signal_a, 10) +## [/codeblock] +## [br] +## [b]Note:[/b] This is an async operation - use [code]await[/code] when calling.[br] +## The assertion fails if the signal is not emitted within the timeout period. +@abstract func is_emitted(signal_name: Variant, ...signal_args: Array) -> GdUnitSignalAssert + + +## Verifies that the specified signal is NOT emitted with the expected arguments.[br] +## +## This assertion waits for a specified time period and validates that a signal +## was not emitted with the given arguments. Useful for ensuring certain conditions +## don't trigger unwanted signals or for verifying signal filtering logic.[br] +## [br] +## [b]Parameters:[/b][br] +## [param signal_name]: The signal to monitor. Can be either:[br] +## • A [Signal] reference (recommended for type safety)[br] +## • A [String] with the signal name +## [param signal_args]: Optional expected signal arguments.[br] +## When provided, verifies the signal was not emitted with these specific values.[br] +## If omitted, verifies the signal was not emitted at all.[br] +## [br] +## [b]Returns:[/b][br] +## [GdUnitSignalAssert] - Returns self for method chaining.[br] +## [br] +## [b]Examples:[/b] +## [codeblock] +## signal signal_a(value: int) +## signal signal_b(name: String, count: int) +## +## # Verify signal is not emitted at all (without checking arguments) +## await assert_signal(instance).wait_until(500).is_not_emitted(signal_a) +## await assert_signal(instance).wait_until(500).is_not_emitted("signal_a") +## +## # Verify signal is not emitted with specific argument +## await assert_signal(instance).wait_until(500).is_not_emitted(signal_a, 10) +## +## # Verify signal is not emitted with multiple arguments +## await assert_signal(instance).wait_until(500).is_not_emitted(signal_b, "test", 42) +## +## # Can be emitted with different arguments (this passes) +## instance.emit_signal("signal_a", 20) # Emits with 20, not 10 +## await assert_signal(instance).wait_until(500).is_not_emitted(signal_a, 10) +## [/codeblock] +## [br] +## [b]Note:[/b] This is an async operation - use [code]await[/code] when calling.[br] +## The assertion fails if the signal IS emitted with the specified arguments within the timeout period. +@abstract func is_not_emitted(signal_name: Variant, ...signal_args: Array) -> GdUnitSignalAssert + + +## Verifies that the specified signal exists on the emitter object.[br] +## +## This assertion checks if a signal is defined on the object under test, +## regardless of whether it has been emitted. Useful for validating that +## objects have the expected signals before testing their emission.[br] +## [br] +## [b]Parameters:[/b][br] +## [param signal_name]: The signal to check. Can be either:[br] +## • A [Signal] reference (recommended for type safety)[br] +## • A [String] with the signal name +## [br] +## [b]Returns:[/b][br] +## [GdUnitSignalAssert] - Returns self for method chaining.[br] +## [br] +## [b]Examples:[/b] +## [codeblock] +## signal my_signal(value: int) +## signal another_signal() +## +## # Verify signal exists using Signal reference +## assert_signal(instance).is_signal_exists(my_signal) +## +## # Verify signal exists using string name +## assert_signal(instance).is_signal_exists("my_signal") +## +## # Chain with other assertions +## assert_signal(instance) \ +## .is_signal_exists(my_signal) \ +## .is_emitted(my_signal, 42) +## +## [/codeblock] +## [br] +## [b]Note:[/b] This only checks signal definition, not emission.[br] +## The assertion fails if the signal is not defined on the object. +@abstract func is_signal_exists(signal_name: Variant) -> GdUnitSignalAssert ## Sets the assert signal timeout in ms, if the time over a failure is reported.[br] -## e.g.[br] +## Example: +## [codeblock] ## do wait until 5s the instance has emitted the signal `signal_a`[br] -## [code]assert_signal(instance).wait_until(5000).is_emitted("signal_a")[/code] +## assert_signal(instance).wait_until(5000).is_emitted("signal_a") +## [/codeblock] @abstract func wait_until(timeout: int) -> GdUnitSignalAssert diff --git a/addons/gdUnit4/src/GdUnitSignalAssert.gd.uid b/addons/gdUnit4/src/GdUnitSignalAssert.gd.uid index 00751308..3f121e26 100644 --- a/addons/gdUnit4/src/GdUnitSignalAssert.gd.uid +++ b/addons/gdUnit4/src/GdUnitSignalAssert.gd.uid @@ -1 +1 @@ -uid://vye3abjnxxca +uid://1ck5pjvv3fqf diff --git a/addons/gdUnit4/src/GdUnitStringAssert.gd.uid b/addons/gdUnit4/src/GdUnitStringAssert.gd.uid index 14cc8e5b..b3e22258 100644 --- a/addons/gdUnit4/src/GdUnitStringAssert.gd.uid +++ b/addons/gdUnit4/src/GdUnitStringAssert.gd.uid @@ -1 +1 @@ -uid://8ees6wtyjco8 +uid://tgj3ucvyiolk diff --git a/addons/gdUnit4/src/GdUnitTestSuite.gd b/addons/gdUnit4/src/GdUnitTestSuite.gd index e69c7a8d..5cf269f5 100644 --- a/addons/gdUnit4/src/GdUnitTestSuite.gd +++ b/addons/gdUnit4/src/GdUnitTestSuite.gd @@ -14,14 +14,13 @@ class_name GdUnitTestSuite extends Node -const NO_ARG :Variant = GdUnitConstants.NO_ARG ### internal runtime variables that must not be overwritten!!! @warning_ignore("unused_private_class_variable") var __is_skipped := false @warning_ignore("unused_private_class_variable") -var __skip_reason :String = "Unknow." -var __active_test_case :String +var __skip_reason := "Unknow." +var __active_test_case: String var __awaiter := __gdunit_awaiter() @@ -29,7 +28,7 @@ var __awaiter := __gdunit_awaiter() ### in order to noticeably reduce the loading time of the test suite. # We go this hard way to increase the loading performance to avoid reparsing all the used scripts # for more detailed info -> https://github.com/godotengine/godot/issues/67400 -func __lazy_load(script_path :String) -> GDScript: +func __lazy_load(script_path: String) -> GDScript: return GdUnitAssertions.__lazy_load(script_path) @@ -81,23 +80,23 @@ func after_test() -> void: pass -func is_failure(_expected_failure :String = NO_ARG) -> bool: +func is_failure() -> bool: return Engine.get_meta("GD_TEST_FAILURE") if Engine.has_meta("GD_TEST_FAILURE") else false -func set_active_test_case(test_case :String) -> void: +func set_active_test_case(test_case: String) -> void: __active_test_case = test_case # === Tools ==================================================================== # Mapps Godot error number to a readable error message. See at ERROR # https://docs.godotengine.org/de/stable/classes/class_@globalscope.html#enum-globalscope-error -func error_as_string(error_number :int) -> String: +func error_as_string(error_number: int) -> String: return error_string(error_number) ## A litle helper to auto freeing your created objects after test execution -func auto_free(obj :Variant) -> Variant: +func auto_free(obj: Variant) -> Variant: var execution_context := GdUnitThreadManager.get_current_context().get_execution_context() assert(execution_context != null, "INTERNAL ERROR: The current execution_context is null! Please report this as bug.") @@ -105,7 +104,7 @@ func auto_free(obj :Variant) -> Variant: @warning_ignore("native_method_override") -func add_child(node :Node, force_readable_name := false, internal := Node.INTERNAL_MODE_DISABLED) -> void: +func add_child(node: Node, force_readable_name := false, internal := Node.INTERNAL_MODE_DISABLED) -> void: super.add_child(node, force_readable_name, internal) var execution_context := GdUnitThreadManager.get_current_context().get_execution_context() if execution_context != null: @@ -123,7 +122,7 @@ func discard_error_interupted_by_timeout() -> void: ## Creates a new directory under the temporary directory *user://tmp*[br] ## Useful for storing data during test execution. [br] ## The directory is automatically deleted after test suite execution -func create_temp_dir(relative_path :String) -> String: +func create_temp_dir(relative_path: String) -> String: @warning_ignore("unsafe_method_access") return __gdunit_file_access().create_temp_dir(relative_path) @@ -138,25 +137,25 @@ func clean_temp_dir() -> void: ## Creates a new file under the temporary directory *user://tmp* + [br] ## with given name and given file (default = File.WRITE)[br] ## If success the returned File is automatically closed after the execution of the test suite -func create_temp_file(relative_path :String, file_name :String, mode := FileAccess.WRITE) -> FileAccess: +func create_temp_file(relative_path: String, file_name: String, mode := FileAccess.WRITE) -> FileAccess: @warning_ignore("unsafe_method_access") return __gdunit_file_access().create_temp_file(relative_path, file_name, mode) ## Reads a resource by given path into a PackedStringArray. -func resource_as_array(resource_path :String) -> PackedStringArray: +func resource_as_array(resource_path: String) -> PackedStringArray: @warning_ignore("unsafe_method_access") return __gdunit_file_access().resource_as_array(resource_path) ## Reads a resource by given path and returned the content as String. -func resource_as_string(resource_path :String) -> String: +func resource_as_string(resource_path: String) -> String: @warning_ignore("unsafe_method_access") return __gdunit_file_access().resource_as_string(resource_path) ## Reads a resource by given path and return Variand translated by str_to_var -func resource_as_var(resource_path :String) -> Variant: +func resource_as_var(resource_path: String) -> Variant: @warning_ignore("unsafe_method_access", "unsafe_cast") return str_to_var(__gdunit_file_access().resource_as_string(resource_path) as String) @@ -166,7 +165,7 @@ func resource_as_var(resource_path :String) -> Variant: ## signal_name: signal name[br] ## args: the expected signal arguments as an array[br] ## timeout: the timeout in ms, default is set to 2000ms -func await_signal_on(source :Object, signal_name :String, args :Array = [], timeout :int = 2000) -> Variant: +func await_signal_on(source: Object, signal_name: String, args: Array = [], timeout: int = 2000) -> Variant: @warning_ignore("unsafe_method_access") return await __awaiter.await_signal_on(source, signal_name, args, timeout) @@ -184,11 +183,50 @@ func await_idle_frame() -> void: ## await await_millis(myNode, 100).completed ## [/codeblock][br] ## use this waiter and not `await get_tree().create_timer().timeout to prevent errors when a test case is timed out -func await_millis(timeout :int) -> void: +func await_millis(timeout: int) -> void: @warning_ignore("unsafe_method_access") await __awaiter.await_millis(timeout) +## Collects detailed information about orphaned nodes for debugging purposes.[br] +## +## This function gathers comprehensive details about nodes that remain in memory +## after test execution (orphans). It provides debugging information to help +## identify the source of memory leaks in tests. Must be manually called in +## tests when orphan nodes are detected.[br] +## [br] +## [b]When to Use:[/b][br] +## - When GdUnit4 reports orphan nodes after test execution[br] +## - For debugging memory leaks in test scenarios[br] +## - To get detailed information about unreleased nodes[br] +## [br] +## [b]Usage Pattern:[/b][br] +## Add this call at the end of tests that are suspected to create orphans, +## or when the test runner reports orphan detection.[br] +## [br] +## [b]Examples:[/b] +## [codeblock] +## func test_scene_management(): +## # Test code that might create orphan nodes +## var scene = preload("res://TestScene.tscn").instantiate() +## add_child(scene) +## +## # Do test operations +## scene.some_method() +## +## # Clean up (but might miss some nodes) +## scene.queue_free() +## +## # Collect orphan details if any are detected +## collect_orphan_node_details() +## [/codeblock] +## [br] +## [b]Note:[/b] This is a debugging utility function that should be removed +## or commented out once orphan issues are resolved. +func collect_orphan_node_details() -> void: + GdUnitThreadManager.get_current_context().get_execution_context().orphan_monitor_collect() + + ## Creates a new scene runner to allow simulate interactions checked a scene.[br] ## The runner will manage the scene instance and release after the runner is released[br] ## example:[br] @@ -200,7 +238,7 @@ func await_millis(timeout :int) -> void: ## # or simply creates a runner by using the scene resource path ## var runner := scene_runner("res://foo/my_scne.tscn") ## [/codeblock] -func scene_runner(scene :Variant, verbose := false) -> GdUnitSceneRunner: +func scene_runner(scene: Variant, verbose := false) -> GdUnitSceneRunner: return auto_free(__lazy_load("res://addons/gdUnit4/src/core/GdUnitSceneRunnerImpl.gd").new(scene, verbose)) @@ -216,13 +254,13 @@ const RETURN_DEEP_STUB = GdUnitMock.RETURN_DEEP_STUB ## Creates a mock for given class name -func mock(clazz :Variant, mock_mode := RETURN_DEFAULTS) -> Variant: +func mock(clazz: Variant, mock_mode := RETURN_DEFAULTS) -> Variant: @warning_ignore("unsafe_method_access") return __lazy_load("res://addons/gdUnit4/src/mocking/GdUnitMockBuilder.gd").build(clazz, mock_mode) ## Creates a spy checked given object instance -func spy(instance :Variant) -> Variant: +func spy(instance: Variant) -> Variant: @warning_ignore("unsafe_method_access") return __lazy_load("res://addons/gdUnit4/src/spy/GdUnitSpyBuilder.gd").build(instance) @@ -233,30 +271,30 @@ func spy(instance :Variant) -> Variant: ## # overrides the return value of myMock.is_selected() to false ## do_return(false).on(myMock).is_selected() ## [/codeblock] -func do_return(value :Variant) -> GdUnitMock: +func do_return(value: Variant) -> GdUnitMock: return GdUnitMock.new(value) ## Verifies certain behavior happened at least once or exact number of times -func verify(obj :Variant, times := 1) -> Variant: +func verify(obj: Variant, times := 1) -> Variant: @warning_ignore("unsafe_method_access") return __gdunit_object_interactions().verify(obj, times) ## Verifies no interactions is happen checked this mock or spy -func verify_no_interactions(obj :Variant) -> GdUnitAssert: +func verify_no_interactions(obj: Variant) -> GdUnitAssert: @warning_ignore("unsafe_method_access") return __gdunit_object_interactions().verify_no_interactions(obj) ## Verifies the given mock or spy has any unverified interaction. -func verify_no_more_interactions(obj :Variant) -> GdUnitAssert: +func verify_no_more_interactions(obj: Variant) -> GdUnitAssert: @warning_ignore("unsafe_method_access") return __gdunit_object_interactions().verify_no_more_interactions(obj) ## Resets the saved function call counters checked a mock or spy -func reset(obj :Variant) -> void: +func reset(obj: Variant) -> void: @warning_ignore("unsafe_method_access") __gdunit_object_interactions().reset(obj) @@ -273,12 +311,12 @@ func reset(obj :Variant) -> void: ## # verify the signial is emitted ## await assert_signal(emitter).is_emitted('my_signal') ## [/codeblock] -func monitor_signals(source :Object, _auto_free := true) -> Object: +func monitor_signals(source: Object, _auto_free := true) -> Object: @warning_ignore("unsafe_method_access") __lazy_load("res://addons/gdUnit4/src/core/thread/GdUnitThreadManager.gd")\ .get_current_context()\ .get_signal_collector()\ - .register_emitter(source) + .register_emitter(source, true) # force recreate to start with a fresh monitoring return auto_free(source) if _auto_free else source @@ -502,29 +540,46 @@ func any_class(clazz :Object) -> GdUnitArgumentMatcher: # === value extract utils ====================================================== ## Builds an extractor by given function name and optional arguments -func extr(func_name :String, args := Array()) -> GdUnitValueExtractor: +func extr(func_name: String, args := Array()) -> GdUnitValueExtractor: return __lazy_load("res://addons/gdUnit4/src/extractors/GdUnitFuncValueExtractor.gd").new(func_name, args) -## Constructs a tuple by given arguments -func tuple(arg0 :Variant, - arg1 :Variant=NO_ARG, - arg2 :Variant=NO_ARG, - arg3 :Variant=NO_ARG, - arg4 :Variant=NO_ARG, - arg5 :Variant=NO_ARG, - arg6 :Variant=NO_ARG, - arg7 :Variant=NO_ARG, - arg8 :Variant=NO_ARG, - arg9 :Variant=NO_ARG) -> GdUnitTuple: - return GdUnitTuple.new(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) +## Creates a GdUnitTuple from the provided arguments for use in test assertions. +## [br] +## This is the primary helper function for creating tuples in GdUnit4 tests. +## It provides a convenient way to group multiple expected values when using +## [method extractv] assertions. The function enforces that tuples must contain +## at least two values, as single-value extractions don't require tuple grouping. +## [br] +## [b]Parameters:[/b] [br] +## - [code]...args[/code]: Variable number of arguments (minimum 2) to group into a tuple. +## Each argument represents a value to be compared in assertions. +## [br] +## [b]Returns:[/b] [br] +## A [GdUnitTuple] containing the provided values, or an empty tuple if fewer than +## 2 arguments are provided (with an error message). +## [br] +## [b]Error Handling:[/b] [br] +## [codeblock] +## # This will push an error and return empty tuple +## var invalid = tuple("single_value") # Error: requires at least 2 arguments +## [br] +## # Correct usage - minimum 2 arguments +## var valid = tuple("name", "value") +## var valid_multi = tuple(1, 2, 3, 4, 5) # Can have many values +## [/codeblock] +func tuple(...args: Array) -> GdUnitTuple: + if args.size() < 2: + push_error("Tuple requires at least two arguments.") + return GdUnitTuple.new() + return GdUnitTuple.new.callv(args) # === Asserts ================================================================== ## The common assertion tool to verify values. ## It checks the given value by type to fit to the best assert -func assert_that(current :Variant) -> GdUnitAssert: +func assert_that(current: Variant) -> GdUnitAssert: match typeof(current): TYPE_BOOL: return assert_bool(current) @@ -549,22 +604,22 @@ func assert_that(current :Variant) -> GdUnitAssert: ## An assertion tool to verify boolean values. -func assert_bool(current :Variant) -> GdUnitBoolAssert: +func assert_bool(current: Variant) -> GdUnitBoolAssert: return __lazy_load("res://addons/gdUnit4/src/asserts/GdUnitBoolAssertImpl.gd").new(current) ## An assertion tool to verify String values. -func assert_str(current :Variant) -> GdUnitStringAssert: +func assert_str(current: Variant) -> GdUnitStringAssert: return __lazy_load("res://addons/gdUnit4/src/asserts/GdUnitStringAssertImpl.gd").new(current) ## An assertion tool to verify integer values. -func assert_int(current :Variant) -> GdUnitIntAssert: +func assert_int(current: Variant) -> GdUnitIntAssert: return __lazy_load("res://addons/gdUnit4/src/asserts/GdUnitIntAssertImpl.gd").new(current) ## An assertion tool to verify float values. -func assert_float(current :Variant) -> GdUnitFloatAssert: +func assert_float(current: Variant) -> GdUnitFloatAssert: return __lazy_load("res://addons/gdUnit4/src/asserts/GdUnitFloatAssertImpl.gd").new(current) @@ -574,41 +629,41 @@ func assert_float(current :Variant) -> GdUnitFloatAssert: ## [codeblock] ## assert_vector(Vector2(1.2, 1.000001)).is_equal(Vector2(1.2, 1.000001)) ## [/codeblock] -func assert_vector(current :Variant, type_check := true) -> GdUnitVectorAssert: +func assert_vector(current: Variant, type_check := true) -> GdUnitVectorAssert: return __lazy_load("res://addons/gdUnit4/src/asserts/GdUnitVectorAssertImpl.gd").new(current, type_check) ## An assertion tool to verify arrays. -func assert_array(current :Variant, type_check := true) -> GdUnitArrayAssert: +func assert_array(current: Variant, type_check := true) -> GdUnitArrayAssert: return __lazy_load("res://addons/gdUnit4/src/asserts/GdUnitArrayAssertImpl.gd").new(current, type_check) ## An assertion tool to verify dictionaries. -func assert_dict(current :Variant) -> GdUnitDictionaryAssert: +func assert_dict(current: Variant) -> GdUnitDictionaryAssert: return __lazy_load("res://addons/gdUnit4/src/asserts/GdUnitDictionaryAssertImpl.gd").new(current) ## An assertion tool to verify FileAccess. -func assert_file(current :Variant) -> GdUnitFileAssert: +func assert_file(current: Variant) -> GdUnitFileAssert: return __lazy_load("res://addons/gdUnit4/src/asserts/GdUnitFileAssertImpl.gd").new(current) ## An assertion tool to verify Objects. -func assert_object(current :Variant) -> GdUnitObjectAssert: +func assert_object(current: Variant) -> GdUnitObjectAssert: return __lazy_load("res://addons/gdUnit4/src/asserts/GdUnitObjectAssertImpl.gd").new(current) -func assert_result(current :Variant) -> GdUnitResultAssert: +func assert_result(current: Variant) -> GdUnitResultAssert: return __lazy_load("res://addons/gdUnit4/src/asserts/GdUnitResultAssertImpl.gd").new(current) ## An assertion tool that waits until a certain time for an expected function return value -func assert_func(instance :Object, func_name :String, args := Array()) -> GdUnitFuncAssert: +func assert_func(instance: Object, func_name: String, args := Array()) -> GdUnitFuncAssert: return __lazy_load("res://addons/gdUnit4/src/asserts/GdUnitFuncAssertImpl.gd").new(instance, func_name, args) ## An assertion tool to verify for emitted signals until a certain time. -func assert_signal(instance :Object) -> GdUnitSignalAssert: +func assert_signal(instance: Object) -> GdUnitSignalAssert: return __lazy_load("res://addons/gdUnit4/src/asserts/GdUnitSignalAssertImpl.gd").new(instance) @@ -619,7 +674,7 @@ func assert_signal(instance :Object) -> GdUnitSignalAssert: ## assert_failure(func(): assert_bool(true).is_not_equal(true)) \ ## .has_message("Expecting:\n 'true'\n not equal to\n 'true'") ## [/codeblock] -func assert_failure(assertion :Callable) -> GdUnitFailureAssert: +func assert_failure(assertion: Callable) -> GdUnitFailureAssert: @warning_ignore("unsafe_method_access") return __lazy_load("res://addons/gdUnit4/src/asserts/GdUnitFailureAssertImpl.gd").new().execute(assertion) @@ -631,7 +686,7 @@ func assert_failure(assertion :Callable) -> GdUnitFailureAssert: ## await assert_failure_await(func(): assert_bool(true).is_not_equal(true)) \ ## .has_message("Expecting:\n 'true'\n not equal to\n 'true'") ## [/codeblock] -func assert_failure_await(assertion :Callable) -> GdUnitFailureAssert: +func assert_failure_await(assertion: Callable) -> GdUnitFailureAssert: @warning_ignore("unsafe_method_access") return await __lazy_load("res://addons/gdUnit4/src/asserts/GdUnitFailureAssertImpl.gd").new().execute_and_await(assertion) @@ -648,7 +703,7 @@ func assert_failure_await(assertion :Callable) -> GdUnitFailureAssert: ## await assert_error(func (): push_error('test error') )\ ## .is_push_error('test error') ## [/codeblock] -func assert_error(current :Callable) -> GdUnitGodotErrorAssert: +func assert_error(current: Callable) -> GdUnitGodotErrorAssert: return __lazy_load("res://addons/gdUnit4/src/asserts/GdUnitGodotErrorAssertImpl.gd").new(current) diff --git a/addons/gdUnit4/src/GdUnitTestSuite.gd.uid b/addons/gdUnit4/src/GdUnitTestSuite.gd.uid index 606f8262..1bdab31e 100644 --- a/addons/gdUnit4/src/GdUnitTestSuite.gd.uid +++ b/addons/gdUnit4/src/GdUnitTestSuite.gd.uid @@ -1 +1 @@ -uid://dj5hr5hq7neaj +uid://bjl1s755e1mxt diff --git a/addons/gdUnit4/src/GdUnitTuple.gd b/addons/gdUnit4/src/GdUnitTuple.gd index 6c910023..9d56dd80 100644 --- a/addons/gdUnit4/src/GdUnitTuple.gd +++ b/addons/gdUnit4/src/GdUnitTuple.gd @@ -1,28 +1,86 @@ -## A tuple implementation to hold two or many values +## A tuple implementation for GdUnit4 test assertions and value extraction. +## @tutorial(GdUnit4 Array Assertions): https://mikeschulze.github.io/gdUnit4/latest/testing/assert-array/#extractv +## @tutorial(GdUnit4 Testing Framework): https://mikeschulze.github.io/gdUnit4/ +## [br] +## The GdUnitTuple class is a utility container designed specifically for the GdUnit4 +## testing framework. It enables advanced assertion operations, particularly when +## extracting and comparing multiple values from complex test results. +## [br] +## [b]Primary Use Cases in Testing:[/b] [br] +## - Extracting multiple properties from test objects with [method extractv]## [br] +## - Grouping related assertion values for comparison## [br] +## - Returning multiple values from test helper methods## [br] +## - Organizing expected vs actual value pairs in assertions## [br] +## [br] +## [b]Example Usage in Tests:[/b] +## [codeblock] +## func test_player_stats_after_level_up(): +## var player = Player.new() +## player.level_up() +## +## # Extract multiple properties using tuple +## assert_array([player]) \ +## .extractv(extr("name"), extr("level"), extr("hp")) \ +## .contains(tuple("Hero", 2, 150)) +## +## func test_enemy_spawn_positions(): +## var enemies: Array = spawn_enemies(3) +## +## # Verify multiple enemies have correct position data +## assert_array(enemies) \ +## .extractv(extr("position.x"), extr("position.y")) \ +## .contains_exactly([ +## tuple(100, 200), +## tuple(150, 200), +## tuple(200, 200) +## ]) +## [/codeblock] +## [br] +## [b]Integration with GdUnit4 Assertions:[/b] [br] +## Tuples work seamlessly with array assertion methods like: [br] +## - [code]contains()[/code] - Check if extracted values contain specific tuples [br] +## - [code]contains_exactly()[/code] - Verify exact tuple matches [br] +## - [code]is_equal()[/code] - Compare tuple equality [br] +## [br] +## [b]Note:[/b] This class is part of the GdUnit4 testing framework's internal +## utilities and is primarily intended for use within test assertions rather +## than production code. class_name GdUnitTuple extends RefCounted -const NO_ARG :Variant = GdUnitConstants.NO_ARG +var _values: Array = [] -var __values :Array = Array() - -func _init(arg0:Variant, - arg1 :Variant=NO_ARG, - arg2 :Variant=NO_ARG, - arg3 :Variant=NO_ARG, - arg4 :Variant=NO_ARG, - arg5 :Variant=NO_ARG, - arg6 :Variant=NO_ARG, - arg7 :Variant=NO_ARG, - arg8 :Variant=NO_ARG, - arg9 :Variant=NO_ARG) -> void: - __values = GdArrayTools.filter_value([arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9], NO_ARG) +## Initializes a new GdUnitTuple with test values. +## [br] +## Creates a tuple to hold multiple values extracted from test objects +## or expected values for assertions. Commonly used with the [code]tuple()[/code] +## helper function in GdUnit4 tests. +## [br] +## [b]Parameters:[/b] +## - [code]...args[/code]: Variable number of values to store. +func _init(...args: Array) -> void: + _values = args +## Returns the tuple's values as an array for assertion comparisons. +## [br] +## Provides access to the stored test values. Used internally by GdUnit4's +## assertion system when comparing tuples in test validations. +## [br] +## [b]Returns:[/b] +## An [Array] containing all values stored in the tuple. func values() -> Array: - return __values + return _values +## Returns a string representation for test output and debugging. +## [br] +## Formats the tuple for display in test results, error messages, and debug logs. +## This method is automatically called by GdUnit4 when displaying assertion +## failures involving tuples. +## [br] +## [b]Returns:[/b] +## A [String] in the format "tuple([value1, value2, ...])" func _to_string() -> String: - return "tuple(%s)" % str(__values) + return "tuple(%s)" % str(_values) diff --git a/addons/gdUnit4/src/GdUnitTuple.gd.uid b/addons/gdUnit4/src/GdUnitTuple.gd.uid index dd552f51..bddb4230 100644 --- a/addons/gdUnit4/src/GdUnitTuple.gd.uid +++ b/addons/gdUnit4/src/GdUnitTuple.gd.uid @@ -1 +1 @@ -uid://lb4ker4h17gp +uid://chal46hkwp1fy diff --git a/addons/gdUnit4/src/GdUnitValueExtractor.gd.uid b/addons/gdUnit4/src/GdUnitValueExtractor.gd.uid index b99be20f..b8703232 100644 --- a/addons/gdUnit4/src/GdUnitValueExtractor.gd.uid +++ b/addons/gdUnit4/src/GdUnitValueExtractor.gd.uid @@ -1 +1 @@ -uid://ggmsvu80wb74 +uid://d0xsa32s2yku2 diff --git a/addons/gdUnit4/src/GdUnitVectorAssert.gd.uid b/addons/gdUnit4/src/GdUnitVectorAssert.gd.uid index a8d4bbd9..df8d7598 100644 --- a/addons/gdUnit4/src/GdUnitVectorAssert.gd.uid +++ b/addons/gdUnit4/src/GdUnitVectorAssert.gd.uid @@ -1 +1 @@ -uid://duucfgdngx3ww +uid://b6s2mnr10s6rx diff --git a/addons/gdUnit4/src/asserts/CallBackValueProvider.gd.uid b/addons/gdUnit4/src/asserts/CallBackValueProvider.gd.uid index 1112c1ad..4ae4cee2 100644 --- a/addons/gdUnit4/src/asserts/CallBackValueProvider.gd.uid +++ b/addons/gdUnit4/src/asserts/CallBackValueProvider.gd.uid @@ -1 +1 @@ -uid://dmtjlpl4kdwoh +uid://dlyjx2wmm2jrg diff --git a/addons/gdUnit4/src/asserts/DefaultValueProvider.gd.uid b/addons/gdUnit4/src/asserts/DefaultValueProvider.gd.uid index 16aa6887..b16d74c5 100644 --- a/addons/gdUnit4/src/asserts/DefaultValueProvider.gd.uid +++ b/addons/gdUnit4/src/asserts/DefaultValueProvider.gd.uid @@ -1 +1 @@ -uid://c44jw5aieq7fj +uid://qmtxysq5bkaw diff --git a/addons/gdUnit4/src/asserts/GdAssertMessages.gd b/addons/gdUnit4/src/asserts/GdAssertMessages.gd index abc135a1..5a2fa1c7 100644 --- a/addons/gdUnit4/src/asserts/GdAssertMessages.gd +++ b/addons/gdUnit4/src/asserts/GdAssertMessages.gd @@ -4,8 +4,8 @@ extends Resource const WARN_COLOR = "#EFF883" const ERROR_COLOR = "#CD5C5C" const VALUE_COLOR = "#1E90FF" -const SUB_COLOR := Color(1, 0, 0, .3) -const ADD_COLOR := Color(0, 1, 0, .3) +const SUB_COLOR := Color(1, 0, 0, .15) +const ADD_COLOR := Color(0, 1, 0, .15) # Dictionary of control characters and their readable representations @@ -40,22 +40,40 @@ static func input_event_as_text(event :InputEvent) -> String: var text := "" if event is InputEventKey: var key_event := event as InputEventKey - text += "InputEventKey : key='%s', pressed=%s, keycode=%d, physical_keycode=%s" % [ - event.as_text(), key_event.pressed, key_event.keycode, key_event.physical_keycode] + text += """ + InputEventKey : keycode=%s (%s) pressed: %s + physical_keycode: %s + location: %s + echo: %s""" % [ + key_event.keycode, + key_event.as_text_keycode(), + key_event.pressed, + key_event.physical_keycode, + key_event.location, + key_event.echo] else: text += event.as_text() if event is InputEventMouse: var mouse_event := event as InputEventMouse - text += ", global_position %s" % mouse_event.global_position + text += """ + global_position: %s""" % mouse_event.global_position if event is InputEventWithModifiers: var mouse_event := event as InputEventWithModifiers - text += ", shift=%s, alt=%s, control=%s, meta=%s, command=%s" % [ + text += """ + -------- + mods: %s + shift: %s + alt: %s + control: %s + meta: %s + command: %s""" % [ + mouse_event.get_modifiers_mask(), mouse_event.shift_pressed, mouse_event.alt_pressed, mouse_event.ctrl_pressed, mouse_event.meta_pressed, mouse_event.command_or_control_autoremap] - return text + return text.dedent() static func _colored_string_div(characters: String) -> String: @@ -119,6 +137,10 @@ static func _nerror(number :Variant) -> String: return "[color=%s]%s[/color]" % [ERROR_COLOR, str(number)] +static func _colored(value: Variant, color: Color) -> String: + return "[color=%s]%s[/color]" % [color.to_html(), value] + + static func _colored_value(value :Variant) -> String: match typeof(value): TYPE_STRING, TYPE_STRING_NAME: @@ -161,19 +183,53 @@ static func _index_report_as_table(index_reports :Array) -> String: return table.replace("$cells", cells) -static func orphan_detected_on_suite_setup(count :int) -> String: - return "%s\n Detected <%d> orphan nodes during test suite setup stage! [b]Check before() and after()![/b]" % [ - _warning("WARNING:"), count] + +static func orphan_warning(orphans_count: int) -> String: + return """ + %s: Found %s possible orphan nodes. + Add %s to the end of the test to collect details.""".dedent().trim_prefix("\n") % [ + _warning("WARNING:"), + _nerror(orphans_count), + _colored_value("collect_orphan_node_details()") + ] + +static func orphan_detected_on_suite_setup(orphans: Array[GdUnitOrphanNodeInfo]) -> String: + return """ + %s Detected %s orphan nodes! + [b]Verify your test suite setup.[/b] + %s""".dedent().trim_prefix("\n") % [ + _warning("WARNING:"), + _nerror(orphans.size()), + _build_orphan_node_stacktrace(orphans)] + + +static func orphan_detected_on_test_setup(orphans: Array[GdUnitOrphanNodeInfo]) -> String: + return """ + %s Detected %s orphan nodes on test setup! + [b]Check before_test() and after_test()![/b] + %s""".dedent().trim_prefix("\n") % [ + _warning("WARNING:"), + _nerror(orphans.size()), + _build_orphan_node_stacktrace(orphans) + ] -static func orphan_detected_on_test_setup(count :int) -> String: - return "%s\n Detected <%d> orphan nodes during test setup! [b]Check before_test() and after_test()![/b]" % [ - _warning("WARNING:"), count] +static func orphan_detected_on_test(orphans: Array[GdUnitOrphanNodeInfo]) -> String: + return """ + %s Detected %s orphan nodes! + %s""".dedent().trim_prefix("\n") % [ + _warning("WARNING:"), + _nerror(orphans.size()), + _build_orphan_node_stacktrace(orphans) + ] -static func orphan_detected_on_test(count :int) -> String: - return "%s\n Detected <%d> orphan nodes during test execution!" % [ - _warning("WARNING:"), count] +static func _build_orphan_node_stacktrace(orphans: Array[GdUnitOrphanNodeInfo]) -> String: + var stack_trace := "\n" + for orphan in orphans: + stack_trace += orphan.as_trace(orphan, true) + "\n" + return stack_trace.indent(" ") + static func fuzzer_interuped(iterations: int, error: String) -> String: @@ -188,6 +244,10 @@ static func test_timeout(timeout :int) -> String: return "%s\n %s" % [_error("Timeout !"), _colored_value("Test timed out after %s" % LocalTime.elapsed(timeout))] +static func test_session_terminated() -> String: + return "%s" % _error("Test Session Terminated") + + # gdlint:disable = mixed-tabs-and-spaces static func test_suite_skipped(hint :String, skip_count :int) -> String: return """ diff --git a/addons/gdUnit4/src/asserts/GdAssertMessages.gd.uid b/addons/gdUnit4/src/asserts/GdAssertMessages.gd.uid index 6f42d4e0..e245bd93 100644 --- a/addons/gdUnit4/src/asserts/GdAssertMessages.gd.uid +++ b/addons/gdUnit4/src/asserts/GdAssertMessages.gd.uid @@ -1 +1 @@ -uid://cx3stsdp081tn +uid://dbhlfd2jdqq11 diff --git a/addons/gdUnit4/src/asserts/GdAssertReports.gd.uid b/addons/gdUnit4/src/asserts/GdAssertReports.gd.uid index 785fa9cb..28a7e950 100644 --- a/addons/gdUnit4/src/asserts/GdAssertReports.gd.uid +++ b/addons/gdUnit4/src/asserts/GdAssertReports.gd.uid @@ -1 +1 @@ -uid://bwpe1kwgw4v4r +uid://duo4owqiagd3v diff --git a/addons/gdUnit4/src/asserts/GdUnitArrayAssertImpl.gd b/addons/gdUnit4/src/asserts/GdUnitArrayAssertImpl.gd index 730b5da9..63b45a07 100644 --- a/addons/gdUnit4/src/asserts/GdUnitArrayAssertImpl.gd +++ b/addons/gdUnit4/src/asserts/GdUnitArrayAssertImpl.gd @@ -75,7 +75,7 @@ func _toPackedStringArray(value: Variant) -> PackedStringArray: return PackedStringArray([str(value)]) -func _array_equals_div(current: Variant, expected: Variant, case_sensitive: bool = false) -> Array[Array]: +func _array_equals_div(current: Variant, expected: Variant, case_sensitive: bool = false) -> Array: var current_value := _toPackedStringArray(current) var expected_value := _toPackedStringArray(expected) var index_report := Array() @@ -374,24 +374,12 @@ func extractv(...extractors: Array) -> GdUnitArrayAssert: _current_value_provider = DefaultValueProvider.new(null) else: for element: Variant in current: - var ev: Array[Variant] = [ - GdUnitTuple.NO_ARG, - GdUnitTuple.NO_ARG, - GdUnitTuple.NO_ARG, - GdUnitTuple.NO_ARG, - GdUnitTuple.NO_ARG, - GdUnitTuple.NO_ARG, - GdUnitTuple.NO_ARG, - GdUnitTuple.NO_ARG, - GdUnitTuple.NO_ARG, - GdUnitTuple.NO_ARG - ] - + var ev: Array[Variant] = [] for index: int in extractors.size(): var extractor: GdUnitValueExtractor = extractors[index] - ev[index] = extractor.extract_value(element) + ev.append(extractor.extract_value(element)) if extractors.size() > 1: - extracted_elements.append(GdUnitTuple.new(ev[0], ev[1], ev[2], ev[3], ev[4], ev[5], ev[6], ev[7], ev[8], ev[9])) + extracted_elements.append(GdUnitTuple.new.callv(ev)) else: extracted_elements.append(ev[0]) _current_value_provider = DefaultValueProvider.new(extracted_elements) diff --git a/addons/gdUnit4/src/asserts/GdUnitArrayAssertImpl.gd.uid b/addons/gdUnit4/src/asserts/GdUnitArrayAssertImpl.gd.uid index 7288be4b..1949a333 100644 --- a/addons/gdUnit4/src/asserts/GdUnitArrayAssertImpl.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitArrayAssertImpl.gd.uid @@ -1 +1 @@ -uid://74iuv3grl0lq +uid://gr34k5xs8nn0 diff --git a/addons/gdUnit4/src/asserts/GdUnitAssertImpl.gd.uid b/addons/gdUnit4/src/asserts/GdUnitAssertImpl.gd.uid index 22ea58e1..e32eeff9 100644 --- a/addons/gdUnit4/src/asserts/GdUnitAssertImpl.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitAssertImpl.gd.uid @@ -1 +1 @@ -uid://cg3rnqubdphf +uid://cydbh62vhd2ae diff --git a/addons/gdUnit4/src/asserts/GdUnitAssertions.gd.uid b/addons/gdUnit4/src/asserts/GdUnitAssertions.gd.uid index a09bd0e9..7a1d095a 100644 --- a/addons/gdUnit4/src/asserts/GdUnitAssertions.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitAssertions.gd.uid @@ -1 +1 @@ -uid://nr8ifpqtdi3t +uid://13anicl1vgym diff --git a/addons/gdUnit4/src/asserts/GdUnitBoolAssertImpl.gd.uid b/addons/gdUnit4/src/asserts/GdUnitBoolAssertImpl.gd.uid index f7ca0bd9..93eed65a 100644 --- a/addons/gdUnit4/src/asserts/GdUnitBoolAssertImpl.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitBoolAssertImpl.gd.uid @@ -1 +1 @@ -uid://gq2h57pfenn4 +uid://cilccui4ro3ov diff --git a/addons/gdUnit4/src/asserts/GdUnitDictionaryAssertImpl.gd.uid b/addons/gdUnit4/src/asserts/GdUnitDictionaryAssertImpl.gd.uid index 63c481ff..cdec0049 100644 --- a/addons/gdUnit4/src/asserts/GdUnitDictionaryAssertImpl.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitDictionaryAssertImpl.gd.uid @@ -1 +1 @@ -uid://cuolaq6omu4fn +uid://cupi5wiglnmhy diff --git a/addons/gdUnit4/src/asserts/GdUnitFailureAssertImpl.gd.uid b/addons/gdUnit4/src/asserts/GdUnitFailureAssertImpl.gd.uid index a138a2eb..e7a51a33 100644 --- a/addons/gdUnit4/src/asserts/GdUnitFailureAssertImpl.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitFailureAssertImpl.gd.uid @@ -1 +1 @@ -uid://0kcx8nknrvef +uid://cpiu7eaaxnjnx diff --git a/addons/gdUnit4/src/asserts/GdUnitFileAssertImpl.gd.uid b/addons/gdUnit4/src/asserts/GdUnitFileAssertImpl.gd.uid index 57a1a111..bd2e98be 100644 --- a/addons/gdUnit4/src/asserts/GdUnitFileAssertImpl.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitFileAssertImpl.gd.uid @@ -1 +1 @@ -uid://bxqm5ruxgq6bo +uid://dw43deg751t7i diff --git a/addons/gdUnit4/src/asserts/GdUnitFloatAssertImpl.gd.uid b/addons/gdUnit4/src/asserts/GdUnitFloatAssertImpl.gd.uid index b08c0317..70b66afe 100644 --- a/addons/gdUnit4/src/asserts/GdUnitFloatAssertImpl.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitFloatAssertImpl.gd.uid @@ -1 +1 @@ -uid://brpstspqw280k +uid://dpo1iv3o8jmbu diff --git a/addons/gdUnit4/src/asserts/GdUnitFuncAssertImpl.gd.uid b/addons/gdUnit4/src/asserts/GdUnitFuncAssertImpl.gd.uid index 7897dd13..82549f08 100644 --- a/addons/gdUnit4/src/asserts/GdUnitFuncAssertImpl.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitFuncAssertImpl.gd.uid @@ -1 +1 @@ -uid://3w1gnd5w3qgf +uid://dh1togmcfu1s0 diff --git a/addons/gdUnit4/src/asserts/GdUnitGodotErrorAssertImpl.gd b/addons/gdUnit4/src/asserts/GdUnitGodotErrorAssertImpl.gd index fc010db3..ce5503de 100644 --- a/addons/gdUnit4/src/asserts/GdUnitGodotErrorAssertImpl.gd +++ b/addons/gdUnit4/src/asserts/GdUnitGodotErrorAssertImpl.gd @@ -4,6 +4,7 @@ var _current_failure_message := "" var _custom_failure_message := "" var _additional_failure_message := "" var _callable: Callable +var _logger := GodotGdErrorMonitor.GdUnitLogger.new(true, true) func _init(callable: Callable) -> void: @@ -14,17 +15,8 @@ func _init(callable: Callable) -> void: func _execute() -> Array[ErrorLogEntry]: - # execute the given code and monitor for runtime errors - if _callable == null or not _callable.is_valid(): - @warning_ignore("return_value_discarded") - _report_error("Invalid Callable '%s'" % _callable) - else: - await _callable.call() - return await _error_monitor().scan(true) - - -func _error_monitor() -> GodotGdErrorMonitor: - return GdUnitThreadManager.get_current_context().get_execution_context().error_monitor + await _callable.call() + return _logger.entries() func failure_message() -> String: @@ -46,8 +38,7 @@ func _report_error(error_message: String, failure_line_number: int = -1) -> GdUn func _has_log_entry(log_entries: Array[ErrorLogEntry], type: ErrorLogEntry.TYPE, error: Variant) -> bool: for entry in log_entries: if entry._type == type and GdObjects.equals(entry._message, error): - # Erase the log entry we already handled it by this assertion, otherwise it will report at twice - _error_monitor().erase_log_entry(entry) + GdUnitThreadManager.get_current_context().get_execution_context().error_monitor.erase_log_entry(entry) return true return false @@ -55,12 +46,11 @@ func _has_log_entry(log_entries: Array[ErrorLogEntry], type: ErrorLogEntry.TYPE, func _to_list(log_entries: Array[ErrorLogEntry]) -> String: if log_entries.is_empty(): return "no errors" - if log_entries.size() == 1: - return log_entries[0]._message - var value := "" + + var values := [] for entry in log_entries: - value += "'%s'\n" % entry._message - return value + values.append(entry) + return "\n".join(values) func is_null() -> GdUnitGodotErrorAssert: @@ -90,6 +80,9 @@ func append_failure_message(message: String) -> GdUnitGodotErrorAssert: func is_success() -> GdUnitGodotErrorAssert: + if not _validate_callable(): + return self + var log_entries := await _execute() if log_entries.is_empty(): return _report_success() @@ -100,6 +93,9 @@ func is_success() -> GdUnitGodotErrorAssert: func is_runtime_error(expected_error: Variant) -> GdUnitGodotErrorAssert: + if not _validate_callable(): + return self + var result := GdUnitArgumentMatchers.is_variant_string_matching(expected_error) if result.is_error(): return _report_error(result.error_message()) @@ -108,12 +104,15 @@ func is_runtime_error(expected_error: Variant) -> GdUnitGodotErrorAssert: return _report_success() return _report_error(""" Expecting: a runtime error is triggered. - message: '%s' - found: %s + expected: '%s' + current: '%s' """.dedent().trim_prefix("\n") % [expected_error, _to_list(log_entries)]) func is_push_warning(expected_warning: Variant) -> GdUnitGodotErrorAssert: + if not _validate_callable(): + return self + var result := GdUnitArgumentMatchers.is_variant_string_matching(expected_warning) if result.is_error(): return _report_error(result.error_message()) @@ -122,12 +121,15 @@ func is_push_warning(expected_warning: Variant) -> GdUnitGodotErrorAssert: return _report_success() return _report_error(""" Expecting: push_warning() is called. - message: '%s' - found: %s + expected: '%s' + current: '%s' """.dedent().trim_prefix("\n") % [expected_warning, _to_list(log_entries)]) func is_push_error(expected_error: Variant) -> GdUnitGodotErrorAssert: + if not _validate_callable(): + return self + var result := GdUnitArgumentMatchers.is_variant_string_matching(expected_error) if result.is_error(): return _report_error(result.error_message()) @@ -136,6 +138,14 @@ func is_push_error(expected_error: Variant) -> GdUnitGodotErrorAssert: return _report_success() return _report_error(""" Expecting: push_error() is called. - message: '%s' - found: %s + expected: '%s' + current: '%s' """.dedent().trim_prefix("\n") % [expected_error, _to_list(log_entries)]) + + +func _validate_callable() -> bool: + if _callable == null or not _callable.is_valid(): + @warning_ignore("return_value_discarded") + _report_error("Invalid Callable '%s'" % _callable) + return false + return true diff --git a/addons/gdUnit4/src/asserts/GdUnitGodotErrorAssertImpl.gd.uid b/addons/gdUnit4/src/asserts/GdUnitGodotErrorAssertImpl.gd.uid index 5e564f36..34710766 100644 --- a/addons/gdUnit4/src/asserts/GdUnitGodotErrorAssertImpl.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitGodotErrorAssertImpl.gd.uid @@ -1 +1 @@ -uid://cxftq2y1pj36g +uid://btuyno2ar5kmf diff --git a/addons/gdUnit4/src/asserts/GdUnitIntAssertImpl.gd.uid b/addons/gdUnit4/src/asserts/GdUnitIntAssertImpl.gd.uid index 16b1cda3..215e6eeb 100644 --- a/addons/gdUnit4/src/asserts/GdUnitIntAssertImpl.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitIntAssertImpl.gd.uid @@ -1 +1 @@ -uid://bb3ltpyyxpu5c +uid://ccbtjntijl8a7 diff --git a/addons/gdUnit4/src/asserts/GdUnitObjectAssertImpl.gd.uid b/addons/gdUnit4/src/asserts/GdUnitObjectAssertImpl.gd.uid index 28922d61..f87b443e 100644 --- a/addons/gdUnit4/src/asserts/GdUnitObjectAssertImpl.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitObjectAssertImpl.gd.uid @@ -1 +1 @@ -uid://bio2eeyfg1kbf +uid://c0xv4rw6jqokn diff --git a/addons/gdUnit4/src/asserts/GdUnitResultAssertImpl.gd.uid b/addons/gdUnit4/src/asserts/GdUnitResultAssertImpl.gd.uid index ae3cfeb9..13074ec1 100644 --- a/addons/gdUnit4/src/asserts/GdUnitResultAssertImpl.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitResultAssertImpl.gd.uid @@ -1 +1 @@ -uid://bvyreybo4m2n1 +uid://dnubmpsu24qmy diff --git a/addons/gdUnit4/src/asserts/GdUnitSignalAssertImpl.gd b/addons/gdUnit4/src/asserts/GdUnitSignalAssertImpl.gd index 6f5878c8..0da696a3 100644 --- a/addons/gdUnit4/src/asserts/GdUnitSignalAssertImpl.gd +++ b/addons/gdUnit4/src/asserts/GdUnitSignalAssertImpl.gd @@ -91,7 +91,12 @@ func is_not_equal(_expected: Variant) -> GdUnitSignalAssert: # Verifies the signal exists checked the emitter -func is_signal_exists(signal_name :String) -> GdUnitSignalAssert: +func is_signal_exists(signal_or_name: Variant) -> GdUnitSignalAssert: + if not (signal_or_name is String or signal_or_name is Signal): + return report_error("Invalid signal_name: expected String or Signal, but is '%s'" % type_string(typeof(signal_or_name))) + + var signal_name := _to_signal_name(signal_or_name) + if not _emitter.has_signal(signal_name): @warning_ignore("return_value_discarded") report_error("The signal '%s' not exists checked object '%s'." % [signal_name, _emitter.get_class()]) @@ -99,20 +104,39 @@ func is_signal_exists(signal_name :String) -> GdUnitSignalAssert: # Verifies that given signal is emitted until waiting time -func is_emitted(name :String, args := []) -> GdUnitSignalAssert: +func is_emitted(signal_name: Variant, ...signal_args: Array) -> GdUnitSignalAssert: _line_number = GdUnitAssertions.get_line_number() - return await _wail_until_signal(name, args, false) + @warning_ignore("unsafe_call_argument") + return await _wail_until_signal( + signal_name, + _wrap_arguments.callv(signal_args), + false) # Verifies that given signal is NOT emitted until waiting time -func is_not_emitted(name :String, args := []) -> GdUnitSignalAssert: +func is_not_emitted(signal_name: Variant, ...signal_args: Array) -> GdUnitSignalAssert: _line_number = GdUnitAssertions.get_line_number() - return await _wail_until_signal(name, args, true) + @warning_ignore("unsafe_call_argument") + return await _wail_until_signal( + signal_name, + _wrap_arguments.callv(signal_args), + true) + + +func _wrap_arguments(...args: Array) -> Array: + # Check using old syntax + if not args.is_empty() and args[0] is Array: + return args[0] + return args -func _wail_until_signal(signal_name :String, expected_args :Array, expect_not_emitted: bool) -> GdUnitSignalAssert: +func _wail_until_signal(signal_or_name: Variant, expected_args: Array, expect_not_emitted: bool) -> GdUnitSignalAssert: if _emitter == null: return report_error("Can't wait for signal checked a NULL object.") + if not (signal_or_name is String or signal_or_name is Signal): + return report_error("Invalid signal_name: expected String or Signal, but is '%s'" % type_string(typeof(signal_or_name))) + + var signal_name := _to_signal_name(signal_or_name) # first verify the signal is defined if not _emitter.has_signal(signal_name): return report_error("Can't wait for non-existion signal '%s' checked object '%s'." % [signal_name,_emitter.get_class()]) @@ -141,3 +165,8 @@ func _wail_until_signal(signal_name :String, expected_args :Array, expect_not_em if is_instance_valid(_emitter): _signal_collector.reset_received_signals(_emitter, signal_name, expected_args) return self + + +func _to_signal_name(signal_or_name: Variant) -> String: + @warning_ignore("unsafe_cast") + return (signal_or_name as Signal).get_name() if signal_or_name is Signal else signal_or_name diff --git a/addons/gdUnit4/src/asserts/GdUnitSignalAssertImpl.gd.uid b/addons/gdUnit4/src/asserts/GdUnitSignalAssertImpl.gd.uid index 1278f73a..59e3943a 100644 --- a/addons/gdUnit4/src/asserts/GdUnitSignalAssertImpl.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitSignalAssertImpl.gd.uid @@ -1 +1 @@ -uid://brd46i1fx41k8 +uid://cqn1w3ql8xn8k diff --git a/addons/gdUnit4/src/asserts/GdUnitStringAssertImpl.gd b/addons/gdUnit4/src/asserts/GdUnitStringAssertImpl.gd index cb49c9ce..cdbcdff8 100644 --- a/addons/gdUnit4/src/asserts/GdUnitStringAssertImpl.gd +++ b/addons/gdUnit4/src/asserts/GdUnitStringAssertImpl.gd @@ -64,25 +64,30 @@ func is_not_null() -> GdUnitStringAssert: func is_equal(expected: Variant) -> GdUnitStringAssert: - var current: Variant = current_value() - if current == null: - return report_error(GdAssertMessages.error_equal(current, expected)) - if not GdObjects.equals(current, expected): - var diffs := GdDiffTool.string_diff(current, expected) - var formatted_current := GdAssertMessages.colored_array_div(diffs[1]) - return report_error(GdAssertMessages.error_equal(formatted_current, expected)) - return report_success() + return _is_equal(expected, false, GdAssertMessages.error_equal) -func is_equal_ignoring_case(expected :Variant) -> GdUnitStringAssert: - var current :Variant = current_value() +func is_equal_ignoring_case(expected: Variant) -> GdUnitStringAssert: + return _is_equal(expected, true, GdAssertMessages.error_equal_ignoring_case) + + +@warning_ignore_start("unsafe_call_argument") +func _is_equal(expected: Variant, ignore_case: bool, message_cb: Callable) -> GdUnitStringAssert: + var current: Variant = current_value() if current == null: - return report_error(GdAssertMessages.error_equal_ignoring_case(current, expected)) - if not GdObjects.equals(str(current), expected, true): - var diffs := GdDiffTool.string_diff(current, expected) + return report_error(message_cb.call(current, expected)) + var cur_value := str(current) + if not GdObjects.equals(cur_value, expected, ignore_case): + var exp_value := str(expected) + if contains_bbcode(cur_value): + # mask user bbcode + # https://docs.godotengine.org/en/4.5/tutorials/ui/bbcode_in_richtextlabel.html#handling-user-input-safely + return report_error(message_cb.call(cur_value.replace("[", "[lb]"), exp_value.replace("[", "[lb]"))) + var diffs := GdDiffTool.string_diff(cur_value, exp_value) var formatted_current := GdAssertMessages.colored_array_div(diffs[1]) - return report_error(GdAssertMessages.error_equal_ignoring_case(formatted_current, expected)) + return report_error(message_cb.call(formatted_current, exp_value)) return report_success() +@warning_ignore_restore("unsafe_call_argument") func is_not_equal(expected: Variant) -> GdUnitStringAssert: @@ -192,3 +197,12 @@ func has_length(expected :int, comparator := Comparator.EQUAL) -> GdUnitStringAs _: return report_error("Comparator '%d' not implemented!" % comparator) return report_success() + + +func contains_bbcode(value: String) -> bool: + var rtl := RichTextLabel.new() + rtl.bbcode_enabled = true + rtl.parse_bbcode(value) + var has_bbcode := rtl.get_parsed_text() != value + rtl.free() + return has_bbcode diff --git a/addons/gdUnit4/src/asserts/GdUnitStringAssertImpl.gd.uid b/addons/gdUnit4/src/asserts/GdUnitStringAssertImpl.gd.uid index 655803b2..32335744 100644 --- a/addons/gdUnit4/src/asserts/GdUnitStringAssertImpl.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitStringAssertImpl.gd.uid @@ -1 +1 @@ -uid://cggae0ath5sfg +uid://caxf23egceseb diff --git a/addons/gdUnit4/src/asserts/GdUnitVectorAssertImpl.gd.uid b/addons/gdUnit4/src/asserts/GdUnitVectorAssertImpl.gd.uid index 64d204e2..1c2f878c 100644 --- a/addons/gdUnit4/src/asserts/GdUnitVectorAssertImpl.gd.uid +++ b/addons/gdUnit4/src/asserts/GdUnitVectorAssertImpl.gd.uid @@ -1 +1 @@ -uid://dxt2spula6ex6 +uid://bkmh1cm7np804 diff --git a/addons/gdUnit4/src/asserts/ValueProvider.gd.uid b/addons/gdUnit4/src/asserts/ValueProvider.gd.uid index 7afb5b4f..3541abc1 100644 --- a/addons/gdUnit4/src/asserts/ValueProvider.gd.uid +++ b/addons/gdUnit4/src/asserts/ValueProvider.gd.uid @@ -1 +1 @@ -uid://gn3hsk23b2je +uid://ceseiy017ts8h diff --git a/addons/gdUnit4/src/cmd/CmdArgumentParser.gd.uid b/addons/gdUnit4/src/cmd/CmdArgumentParser.gd.uid index 3d0949d8..2a4af80b 100644 --- a/addons/gdUnit4/src/cmd/CmdArgumentParser.gd.uid +++ b/addons/gdUnit4/src/cmd/CmdArgumentParser.gd.uid @@ -1 +1 @@ -uid://bvgpt6ubyrn5l +uid://c56kjaa87dwov diff --git a/addons/gdUnit4/src/cmd/CmdCommand.gd.uid b/addons/gdUnit4/src/cmd/CmdCommand.gd.uid index 20769616..fc98b01b 100644 --- a/addons/gdUnit4/src/cmd/CmdCommand.gd.uid +++ b/addons/gdUnit4/src/cmd/CmdCommand.gd.uid @@ -1 +1 @@ -uid://cywq2cxy4lo1k +uid://bfgol8f2d4h3j diff --git a/addons/gdUnit4/src/cmd/CmdCommandHandler.gd.uid b/addons/gdUnit4/src/cmd/CmdCommandHandler.gd.uid index b27ec21f..688213cd 100644 --- a/addons/gdUnit4/src/cmd/CmdCommandHandler.gd.uid +++ b/addons/gdUnit4/src/cmd/CmdCommandHandler.gd.uid @@ -1 +1 @@ -uid://dijlao2grvq6i +uid://8dc4bemkjany diff --git a/addons/gdUnit4/src/cmd/CmdOption.gd.uid b/addons/gdUnit4/src/cmd/CmdOption.gd.uid index e56ea52f..23d495c3 100644 --- a/addons/gdUnit4/src/cmd/CmdOption.gd.uid +++ b/addons/gdUnit4/src/cmd/CmdOption.gd.uid @@ -1 +1 @@ -uid://b5ks5cvvfiq1y +uid://ce6vhat5vkciw diff --git a/addons/gdUnit4/src/cmd/CmdOptions.gd.uid b/addons/gdUnit4/src/cmd/CmdOptions.gd.uid index c59a8ed7..35d02faf 100644 --- a/addons/gdUnit4/src/cmd/CmdOptions.gd.uid +++ b/addons/gdUnit4/src/cmd/CmdOptions.gd.uid @@ -1 +1 @@ -uid://dfjkvc6bhnvts +uid://c1x111ndrjjl8 diff --git a/addons/gdUnit4/src/core/GdArrayTools.gd.uid b/addons/gdUnit4/src/core/GdArrayTools.gd.uid index 2d35f9ef..e0bb8483 100644 --- a/addons/gdUnit4/src/core/GdArrayTools.gd.uid +++ b/addons/gdUnit4/src/core/GdArrayTools.gd.uid @@ -1 +1 @@ -uid://coqvut1bjsit5 +uid://5eq0x5wfmvhp diff --git a/addons/gdUnit4/src/core/GdDiffTool.gd.uid b/addons/gdUnit4/src/core/GdDiffTool.gd.uid index ff316b72..fef9362e 100644 --- a/addons/gdUnit4/src/core/GdDiffTool.gd.uid +++ b/addons/gdUnit4/src/core/GdDiffTool.gd.uid @@ -1 +1 @@ -uid://rnet4m70ynnu +uid://dwtvt84me7miy diff --git a/addons/gdUnit4/src/core/GdObjects.gd.uid b/addons/gdUnit4/src/core/GdObjects.gd.uid index b5faf110..2cef832e 100644 --- a/addons/gdUnit4/src/core/GdObjects.gd.uid +++ b/addons/gdUnit4/src/core/GdObjects.gd.uid @@ -1 +1 @@ -uid://bcap2udrnxox3 +uid://bxeqq5bdai77h diff --git a/addons/gdUnit4/src/core/GdUnit4Version.gd.uid b/addons/gdUnit4/src/core/GdUnit4Version.gd.uid index 6f9078f7..0138cd37 100644 --- a/addons/gdUnit4/src/core/GdUnit4Version.gd.uid +++ b/addons/gdUnit4/src/core/GdUnit4Version.gd.uid @@ -1 +1 @@ -uid://ba72tcnf0s2ld +uid://m2cfbl0b225h diff --git a/addons/gdUnit4/src/core/GdUnitFileAccess.gd b/addons/gdUnit4/src/core/GdUnitFileAccess.gd index f6db5b4a..f4ba0035 100644 --- a/addons/gdUnit4/src/core/GdUnitFileAccess.gd +++ b/addons/gdUnit4/src/core/GdUnitFileAccess.gd @@ -196,7 +196,7 @@ static func resource_as_string(resource_path :String) -> String: if file == null: push_error("ERROR: Can't read resource '%s'. %s" % [resource_path, error_string(FileAccess.get_open_error())]) return "" - return file.get_as_text(true) + return file.get_as_text() static func make_qualified_path(path :String) -> String: diff --git a/addons/gdUnit4/src/core/GdUnitFileAccess.gd.uid b/addons/gdUnit4/src/core/GdUnitFileAccess.gd.uid index 07beb492..55981761 100644 --- a/addons/gdUnit4/src/core/GdUnitFileAccess.gd.uid +++ b/addons/gdUnit4/src/core/GdUnitFileAccess.gd.uid @@ -1 +1 @@ -uid://ctxy5tcx42o0j +uid://j61avicvxnpk diff --git a/addons/gdUnit4/src/core/GdUnitProperty.gd.uid b/addons/gdUnit4/src/core/GdUnitProperty.gd.uid index 5a2dafe5..29449fce 100644 --- a/addons/gdUnit4/src/core/GdUnitProperty.gd.uid +++ b/addons/gdUnit4/src/core/GdUnitProperty.gd.uid @@ -1 +1 @@ -uid://jb5pgif12g8s +uid://2kfs6nl3oc6p diff --git a/addons/gdUnit4/src/core/GdUnitResult.gd.uid b/addons/gdUnit4/src/core/GdUnitResult.gd.uid index 4d8d3742..82714cf4 100644 --- a/addons/gdUnit4/src/core/GdUnitResult.gd.uid +++ b/addons/gdUnit4/src/core/GdUnitResult.gd.uid @@ -1 +1 @@ -uid://cxreyen5wvoui +uid://bycl30fxkp8kc diff --git a/addons/gdUnit4/src/core/GdUnitRunnerConfig.gd b/addons/gdUnit4/src/core/GdUnitRunnerConfig.gd index 9f36354d..0d1a42d7 100644 --- a/addons/gdUnit4/src/core/GdUnitRunnerConfig.gd +++ b/addons/gdUnit4/src/core/GdUnitRunnerConfig.gd @@ -18,7 +18,10 @@ var _config := { TESTS : Array([], TYPE_OBJECT, "RefCounted", GdUnitTestCase), # the port of running test server for this session - SERVER_PORT : -1 + SERVER_PORT : -1, + + # Exit on first failure + EXIT_FAIL_FAST : false } @@ -40,6 +43,15 @@ func server_port() -> int: return _config.get(SERVER_PORT, -1) +func do_fail_fast(fail_fast: bool) -> GdUnitRunnerConfig: + _config[EXIT_FAIL_FAST] = fail_fast + return self + + +func is_fail_fast() -> bool: + return _config.get(EXIT_FAIL_FAST, false) + + func add_test_cases(tests: Array[GdUnitTestCase]) -> GdUnitRunnerConfig: test_cases().append_array(tests) return self @@ -57,7 +69,8 @@ func save_config(path: String = CONFIG_FILE) -> GdUnitResult: var to_save := { VERSION : CONFIG_VERSION, - SERVER_PORT : _config.get(SERVER_PORT), + EXIT_FAIL_FAST : is_fail_fast(), + SERVER_PORT : server_port(), TESTS : Array() } diff --git a/addons/gdUnit4/src/core/GdUnitRunnerConfig.gd.uid b/addons/gdUnit4/src/core/GdUnitRunnerConfig.gd.uid index 28a243d3..b9a0b290 100644 --- a/addons/gdUnit4/src/core/GdUnitRunnerConfig.gd.uid +++ b/addons/gdUnit4/src/core/GdUnitRunnerConfig.gd.uid @@ -1 +1 @@ -uid://gyi4wwcni60n +uid://ddha3p2ku64kp diff --git a/addons/gdUnit4/src/core/GdUnitSceneRunnerImpl.gd b/addons/gdUnit4/src/core/GdUnitSceneRunnerImpl.gd index f2718537..5c852525 100644 --- a/addons/gdUnit4/src/core/GdUnitSceneRunnerImpl.gd +++ b/addons/gdUnit4/src/core/GdUnitSceneRunnerImpl.gd @@ -72,12 +72,11 @@ func _init(p_scene: Variant, p_verbose: bool, p_hide_push_errors := false) -> vo return _scene_tree().root.add_child(_current_scene) + Engine.set_meta("GdUnitSceneRunner", self) # do finally reset all open input events when the scene is removed @warning_ignore("return_value_discarded") - _scene_tree().root.child_exiting_tree.connect(func f(child :Node) -> void: + _scene_tree().root.child_exiting_tree.connect(func f(child: Node) -> void: if child == _current_scene: - # we need to disable the processing to avoid input flush buffer errors - _current_scene.process_mode = Node.PROCESS_MODE_DISABLED _reset_input_to_default() ) _simulate_start_time = LocalTime.now() @@ -103,6 +102,7 @@ func _notification(what: int) -> void: _current_scene.free() _is_disposed = true _current_scene = null + Engine.remove_meta("GdUnitSceneRunner") func _scene_tree() -> SceneTree: @@ -145,6 +145,7 @@ func simulate_action_release(action: String, event_index := -1) -> GdUnitSceneRu @warning_ignore("return_value_discarded") func simulate_key_pressed(key_code: int, shift_pressed := false, ctrl_pressed := false) -> GdUnitSceneRunner: + _push_warning_deprecated_arguments(shift_pressed, ctrl_pressed) simulate_key_press(key_code, shift_pressed, ctrl_pressed) await _scene_tree().process_frame simulate_key_release(key_code, shift_pressed, ctrl_pressed) @@ -152,30 +153,33 @@ func simulate_key_pressed(key_code: int, shift_pressed := false, ctrl_pressed := func simulate_key_press(key_code: int, shift_pressed := false, ctrl_pressed := false) -> GdUnitSceneRunner: + _push_warning_deprecated_arguments(shift_pressed, ctrl_pressed) __print_current_focus() var event := InputEventKey.new() event.pressed = true event.keycode = key_code as Key event.physical_keycode = key_code as Key event.unicode = key_code - event.alt_pressed = key_code == KEY_ALT - event.shift_pressed = shift_pressed or key_code == KEY_SHIFT - event.ctrl_pressed = ctrl_pressed or key_code == KEY_CTRL + event.set_alt_pressed(key_code == KEY_ALT) + event.set_shift_pressed(shift_pressed) + event.set_ctrl_pressed(ctrl_pressed) + event.get_modifiers_mask() _apply_input_modifiers(event) _key_on_press.append(key_code) return _handle_input_event(event) func simulate_key_release(key_code: int, shift_pressed := false, ctrl_pressed := false) -> GdUnitSceneRunner: + _push_warning_deprecated_arguments(shift_pressed, ctrl_pressed) __print_current_focus() var event := InputEventKey.new() event.pressed = false event.keycode = key_code as Key event.physical_keycode = key_code as Key event.unicode = key_code - event.alt_pressed = key_code == KEY_ALT - event.shift_pressed = shift_pressed or key_code == KEY_SHIFT - event.ctrl_pressed = ctrl_pressed or key_code == KEY_CTRL + event.set_alt_pressed(key_code == KEY_ALT) + event.set_shift_pressed(shift_pressed) + event.set_ctrl_pressed(ctrl_pressed) _apply_input_modifiers(event) _key_on_press.erase(key_code) return _handle_input_event(event) @@ -485,6 +489,8 @@ func find_child(name: String, recursive: bool = true, owned: bool = false) -> No func _scene_name() -> String: + if scene() == null: + return "unknown" var scene_script :GDScript = scene().get_script() var scene_name :String = scene().get_name() if not scene_script: @@ -515,6 +521,13 @@ func _apply_input_modifiers(event: InputEvent) -> void: _event.ctrl_pressed = _event.ctrl_pressed or last_input_event.ctrl_pressed # this line results into reset the control_pressed state!!! #event.command_or_control_autoremap = event.command_or_control_autoremap or _last_input_event.command_or_control_autoremap + if _last_input_event is InputEventKey and event is InputEventWithModifiers: + var last_input_event := _last_input_event as InputEventKey + var _event := event as InputEventWithModifiers + _event.shift_pressed = _event.shift_pressed or last_input_event.keycode == KEY_SHIFT + _event.alt_pressed = _event.alt_pressed or last_input_event.keycode == KEY_ALT + _event.ctrl_pressed = _event.ctrl_pressed or last_input_event.keycode == KEY_CTRL + _event.meta_pressed = _event.meta_pressed or last_input_event.keycode == KEY_META # copy over current active mouse mask and combine with curren mask @@ -620,3 +633,10 @@ func scene() -> Node: if not _is_disposed: push_error("The current scene instance is not valid anymore! check your test is valid. e.g. check for missing awaits.") return null + + +func _push_warning_deprecated_arguments(shift_pressed: bool, ctrl_pressed: bool) -> void: + if shift_pressed: + push_warning("Deprecated! Don't use 'shift_pressed' it will be removed in v7.0, checkout the documentaion how to use key combinations.") + if ctrl_pressed: + push_warning("Deprecated! Don't use 'ctrl_pressed' it will be removed in v7.0, checkout the documentaion how to use key combinations.") diff --git a/addons/gdUnit4/src/core/GdUnitSceneRunnerImpl.gd.uid b/addons/gdUnit4/src/core/GdUnitSceneRunnerImpl.gd.uid index 6bebd0b8..5a9f6ba7 100644 --- a/addons/gdUnit4/src/core/GdUnitSceneRunnerImpl.gd.uid +++ b/addons/gdUnit4/src/core/GdUnitSceneRunnerImpl.gd.uid @@ -1 +1 @@ -uid://chwwu1byj24a4 +uid://bxtw3kpm27853 diff --git a/addons/gdUnit4/src/core/GdUnitSettings.gd b/addons/gdUnit4/src/core/GdUnitSettings.gd index f6bff127..c4eaa962 100644 --- a/addons/gdUnit4/src/core/GdUnitSettings.gd +++ b/addons/gdUnit4/src/core/GdUnitSettings.gd @@ -21,6 +21,7 @@ const TEST_SUITE_NAMING_CONVENTION = GROUP_TEST + "/test_suite_naming_convention const TEST_DISCOVER_ENABLED = GROUP_TEST + "/test_discovery" const TEST_FLAKY_CHECK = GROUP_TEST + "/flaky_check_enable" const TEST_FLAKY_MAX_RETRIES = GROUP_TEST + "/flaky_max_retries" +const TEST_RERUN_UNTIL_FAILURE_RETRIES = GROUP_TEST + "/rerun_until_failure_retries" # Report Setiings @@ -62,6 +63,7 @@ const SHORTCUT_INSPECTOR_RERUN_TEST = GROUP_SHORTCUT_INSPECTOR + "/rerun_test" const SHORTCUT_INSPECTOR_RERUN_TEST_DEBUG = GROUP_SHORTCUT_INSPECTOR + "/rerun_test_debug" const SHORTCUT_INSPECTOR_RUN_TEST_OVERALL = GROUP_SHORTCUT_INSPECTOR + "/run_test_overall" const SHORTCUT_INSPECTOR_RUN_TEST_STOP = GROUP_SHORTCUT_INSPECTOR + "/run_test_stop" +const SHORTCUT_INSPECTOR_RERUN_TEST_UNTIL_FAILURE = GROUP_SHORTCUT_INSPECTOR + "/rerun_test_until_failure" const GROUP_SHORTCUT_EDITOR = SHORTCUT_SETTINGS + "/editor" const SHORTCUT_EDITOR_RUN_TEST = GROUP_SHORTCUT_EDITOR + "/run_test" @@ -112,6 +114,7 @@ static func setup() -> void: create_property_if_need(TEST_DISCOVER_ENABLED, false, "Automatically detect new tests in test lookup folders at runtime") create_property_if_need(TEST_FLAKY_CHECK, false, "Rerun tests on failure and mark them as FLAKY") create_property_if_need(TEST_FLAKY_MAX_RETRIES, 3, "Sets the number of retries for rerunning a flaky test") + create_property_if_need(TEST_RERUN_UNTIL_FAILURE_RETRIES, 10, "The number of reruns until the test fails.") # report settings create_property_if_need(REPORT_PUSH_ERRORS, false, "Report push_error() as failure") create_property_if_need(REPORT_SCRIPT_ERRORS, true, "Report script errors as failure") @@ -148,6 +151,7 @@ static func create_shortcut_properties_if_need() -> void: # inspector create_property_if_need(SHORTCUT_INSPECTOR_RERUN_TEST, GdUnitShortcut.default_keys(GdUnitShortcut.ShortCut.RERUN_TESTS), "Rerun the most recently executed tests") create_property_if_need(SHORTCUT_INSPECTOR_RERUN_TEST_DEBUG, GdUnitShortcut.default_keys(GdUnitShortcut.ShortCut.RERUN_TESTS_DEBUG), "Rerun the most recently executed tests (Debug mode)") + create_property_if_need(SHORTCUT_INSPECTOR_RERUN_TEST_UNTIL_FAILURE, GdUnitShortcut.default_keys(GdUnitShortcut.ShortCut.RERUN_TESTS_UNTIL_FAILURE), "Rerun tests until failure occurs") create_property_if_need(SHORTCUT_INSPECTOR_RUN_TEST_OVERALL, GdUnitShortcut.default_keys(GdUnitShortcut.ShortCut.RUN_TESTS_OVERALL), "Runs all tests (Debug mode)") create_property_if_need(SHORTCUT_INSPECTOR_RUN_TEST_STOP, GdUnitShortcut.default_keys(GdUnitShortcut.ShortCut.STOP_TEST_RUN), "Stop the current test execution") # script editor @@ -155,8 +159,8 @@ static func create_shortcut_properties_if_need() -> void: create_property_if_need(SHORTCUT_EDITOR_RUN_TEST_DEBUG, GdUnitShortcut.default_keys(GdUnitShortcut.ShortCut.RUN_TESTCASE_DEBUG), "Run the currently selected test (Debug mode).") create_property_if_need(SHORTCUT_EDITOR_CREATE_TEST, GdUnitShortcut.default_keys(GdUnitShortcut.ShortCut.CREATE_TEST), "Create a new test case for the currently selected function") # filesystem - create_property_if_need(SHORTCUT_FILESYSTEM_RUN_TEST, GdUnitShortcut.default_keys(GdUnitShortcut.ShortCut.NONE), "Run all test suites in the selected folder or file") - create_property_if_need(SHORTCUT_FILESYSTEM_RUN_TEST_DEBUG, GdUnitShortcut.default_keys(GdUnitShortcut.ShortCut.NONE), "Run all test suites in the selected folder or file (Debug)") + create_property_if_need(SHORTCUT_FILESYSTEM_RUN_TEST, GdUnitShortcut.default_keys(GdUnitShortcut.ShortCut.RUN_TESTSUITE), "Run all test suites in the selected folder or file") + create_property_if_need(SHORTCUT_FILESYSTEM_RUN_TEST_DEBUG, GdUnitShortcut.default_keys(GdUnitShortcut.ShortCut.RUN_TESTSUITE_DEBUG), "Run all test suites in the selected folder or file (Debug)") static func create_property_if_need(name :String, default :Variant, help :="", value_set := PackedStringArray()) -> void: @@ -306,6 +310,10 @@ static func get_flaky_max_retries() -> int: return get_setting(TEST_FLAKY_MAX_RETRIES, 3) +static func get_rerun_max_retries() -> int: + return get_setting(TEST_RERUN_UNTIL_FAILURE_RETRIES, 10) + + static func set_test_discover_enabled(enable :bool) -> void: var property := get_property(TEST_DISCOVER_ENABLED) property.set_value(enable) diff --git a/addons/gdUnit4/src/core/GdUnitSettings.gd.uid b/addons/gdUnit4/src/core/GdUnitSettings.gd.uid index eeb14da9..d2a0c442 100644 --- a/addons/gdUnit4/src/core/GdUnitSettings.gd.uid +++ b/addons/gdUnit4/src/core/GdUnitSettings.gd.uid @@ -1 +1 @@ -uid://f7k6qlm8xs2 +uid://bv004y6x1moyo diff --git a/addons/gdUnit4/src/core/GdUnitSignalAwaiter.gd.uid b/addons/gdUnit4/src/core/GdUnitSignalAwaiter.gd.uid index c686cafb..0d0d8503 100644 --- a/addons/gdUnit4/src/core/GdUnitSignalAwaiter.gd.uid +++ b/addons/gdUnit4/src/core/GdUnitSignalAwaiter.gd.uid @@ -1 +1 @@ -uid://cnodv5gyv8qsk +uid://xphsu5pqg5bf diff --git a/addons/gdUnit4/src/core/GdUnitSignalCollector.gd b/addons/gdUnit4/src/core/GdUnitSignalCollector.gd index d03cc8ea..0cb6ad71 100644 --- a/addons/gdUnit4/src/core/GdUnitSignalCollector.gd +++ b/addons/gdUnit4/src/core/GdUnitSignalCollector.gd @@ -23,11 +23,16 @@ func clear() -> void: # connect to all possible signals defined by the emitter # prepares the signal collection to store received signals and arguments -func register_emitter(emitter :Object) -> void: +func register_emitter(emitter: Object, force_recreate := false) -> void: if is_instance_valid(emitter): # check emitter is already registerd if _collected_signals.has(emitter): - return + if not force_recreate: + return + # If the flag recreate is set to true, emitters that are already registered must be deregistered before recreating, + # otherwise signals that have already been collected will be evaluated. + unregister_emitter(emitter) + _collected_signals[emitter] = Dictionary() # connect to 'tree_exiting' of the emitter to finally release all acquired resources/connections. if emitter is Node and !(emitter as Node).tree_exiting.is_connected(unregister_emitter): @@ -102,7 +107,7 @@ func is_signal_collecting(emitter: Object, signal_name: String) -> bool: return _collected_signals.has(emitter) and (_collected_signals[emitter] as Dictionary).has(signal_name) -func match(emitter :Object, signal_name :String, args :Array) -> bool: +func match(emitter: Object, signal_name: String, args: Array) -> bool: #prints("match", signal_name, _collected_signals[emitter][signal_name]); if _collected_signals.is_empty() or not _collected_signals.has(emitter): return false diff --git a/addons/gdUnit4/src/core/GdUnitSignalCollector.gd.uid b/addons/gdUnit4/src/core/GdUnitSignalCollector.gd.uid index 0c16d947..5e76b138 100644 --- a/addons/gdUnit4/src/core/GdUnitSignalCollector.gd.uid +++ b/addons/gdUnit4/src/core/GdUnitSignalCollector.gd.uid @@ -1 +1 @@ -uid://bxtxhv2qd0nj4 +uid://bjchxvn7s0ouu diff --git a/addons/gdUnit4/src/core/GdUnitSignals.gd b/addons/gdUnit4/src/core/GdUnitSignals.gd index 53aafe99..f0a900dc 100644 --- a/addons/gdUnit4/src/core/GdUnitSignals.gd +++ b/addons/gdUnit4/src/core/GdUnitSignals.gd @@ -33,9 +33,9 @@ signal gdunit_client_connected(client_id: int) signal gdunit_client_disconnected(client_id: int) -## Emitted when a client terminates unexpectedly. +## Emitted when a the user stops (terminates) the current test session @warning_ignore("unused_signal") -signal gdunit_client_terminated() +signal gdunit_test_session_terminate() ## Emitted when a test execution event occurs.[br] diff --git a/addons/gdUnit4/src/core/GdUnitSignals.gd.uid b/addons/gdUnit4/src/core/GdUnitSignals.gd.uid index 21f5ea10..b0d4cd02 100644 --- a/addons/gdUnit4/src/core/GdUnitSignals.gd.uid +++ b/addons/gdUnit4/src/core/GdUnitSignals.gd.uid @@ -1 +1 @@ -uid://dg5wqm36etlw2 +uid://bverd0smxo14x diff --git a/addons/gdUnit4/src/core/GdUnitSingleton.gd.uid b/addons/gdUnit4/src/core/GdUnitSingleton.gd.uid index 6fbb4288..733eaaff 100644 --- a/addons/gdUnit4/src/core/GdUnitSingleton.gd.uid +++ b/addons/gdUnit4/src/core/GdUnitSingleton.gd.uid @@ -1 +1 @@ -uid://vo88blqpntx3 +uid://cttycfsd5pws4 diff --git a/addons/gdUnit4/src/core/GdUnitTestResourceLoader.gd.uid b/addons/gdUnit4/src/core/GdUnitTestResourceLoader.gd.uid index 445d4c94..5baaf646 100644 --- a/addons/gdUnit4/src/core/GdUnitTestResourceLoader.gd.uid +++ b/addons/gdUnit4/src/core/GdUnitTestResourceLoader.gd.uid @@ -1 +1 @@ -uid://slwvv8m1opts +uid://dijywh8dats7m diff --git a/addons/gdUnit4/src/core/GdUnitTestSuiteBuilder.gd.uid b/addons/gdUnit4/src/core/GdUnitTestSuiteBuilder.gd.uid index 1685cfbb..18f79cc7 100644 --- a/addons/gdUnit4/src/core/GdUnitTestSuiteBuilder.gd.uid +++ b/addons/gdUnit4/src/core/GdUnitTestSuiteBuilder.gd.uid @@ -1 +1 @@ -uid://05m8b2cn6hte +uid://bh5cpr2ix4agr diff --git a/addons/gdUnit4/src/core/GdUnitTestSuiteScanner.gd b/addons/gdUnit4/src/core/GdUnitTestSuiteScanner.gd index 63028970..345b7ed3 100644 --- a/addons/gdUnit4/src/core/GdUnitTestSuiteScanner.gd +++ b/addons/gdUnit4/src/core/GdUnitTestSuiteScanner.gd @@ -70,8 +70,14 @@ func scan_directory(resource_path: String) -> Array[Script]: func _scan_test_suites_scripts(dir: DirAccess, collected_suites: Array[Script]) -> Array[Script]: + # Skip excluded directories + if dir.file_exists(".gdignore"): + prints("Exclude directory %s, containing .gdignore file" % dir.get_current_dir()) + return [] + if exclude_scan_directories.has(dir.get_current_dir()): return collected_suites + var err := dir.list_dir_begin() if err != OK: push_error("Error on scanning directory %s" % dir.get_current_dir(), error_string(err)) diff --git a/addons/gdUnit4/src/core/GdUnitTestSuiteScanner.gd.uid b/addons/gdUnit4/src/core/GdUnitTestSuiteScanner.gd.uid index f886a792..ecdb759a 100644 --- a/addons/gdUnit4/src/core/GdUnitTestSuiteScanner.gd.uid +++ b/addons/gdUnit4/src/core/GdUnitTestSuiteScanner.gd.uid @@ -1 +1 @@ -uid://clah81rbv4svl +uid://b52dy3vgxi1c5 diff --git a/addons/gdUnit4/src/core/GdUnitTools.gd.uid b/addons/gdUnit4/src/core/GdUnitTools.gd.uid index b2c18b7e..0c0ffbfb 100644 --- a/addons/gdUnit4/src/core/GdUnitTools.gd.uid +++ b/addons/gdUnit4/src/core/GdUnitTools.gd.uid @@ -1 +1 @@ -uid://b8vfekq2yqc3g +uid://bgncark6ldufj diff --git a/addons/gdUnit4/src/core/GodotVersionFixures.gd.uid b/addons/gdUnit4/src/core/GodotVersionFixures.gd.uid index 7889a7a2..ce1d1205 100644 --- a/addons/gdUnit4/src/core/GodotVersionFixures.gd.uid +++ b/addons/gdUnit4/src/core/GodotVersionFixures.gd.uid @@ -1 +1 @@ -uid://dwudifytnnnrc +uid://csfcudb2n21u7 diff --git a/addons/gdUnit4/src/core/LocalTime.gd.uid b/addons/gdUnit4/src/core/LocalTime.gd.uid index fac34966..397396bb 100644 --- a/addons/gdUnit4/src/core/LocalTime.gd.uid +++ b/addons/gdUnit4/src/core/LocalTime.gd.uid @@ -1 +1 @@ -uid://t0ssl1sp7gio +uid://bjeqb6qy12drp diff --git a/addons/gdUnit4/src/core/_TestCase.gd b/addons/gdUnit4/src/core/_TestCase.gd index 58409e79..2ef07dca 100644 --- a/addons/gdUnit4/src/core/_TestCase.gd +++ b/addons/gdUnit4/src/core/_TestCase.gd @@ -9,7 +9,8 @@ var _attribute: TestCaseAttribute var _current_iteration: int = -1 var _expect_to_interupt := false var _timer: Timer -var _interupted: bool = false +var _interupted := false +var _terminated := false var _failed := false var _parameter_set_resolver: GdUnitTestParameterSetResolver var _is_disposed := false @@ -123,7 +124,7 @@ func do_interrupt() -> void: # We need to dispose manually the function state here GdObjects.dispose_function_state(_func_state) if not is_expect_interupted(): - var execution_context:= GdUnitThreadManager.get_current_context().get_execution_context() + var execution_context := GdUnitThreadManager.get_current_context().get_execution_context() if is_fuzzed(): execution_context.add_report(GdUnitReport.new()\ .create(GdUnitReport.INTERUPTED, line_number(), GdAssertMessages.fuzzer_interuped(_current_iteration, "timedout"))) @@ -133,6 +134,16 @@ func do_interrupt() -> void: completed.emit() +func do_terminate() -> void: + _terminated = true + # We need to dispose manually the function state here + GdObjects.dispose_function_state(_func_state) + var execution_context := GdUnitThreadManager.get_current_context().get_execution_context() + execution_context.add_report(GdUnitReport.new()\ + .create(GdUnitReport.TERMINATED, line_number(), GdAssertMessages.test_session_terminated())) + completed.emit() + + func _set_failure_handler() -> void: if not GdUnitSignals.instance().gdunit_set_test_failed.is_connected(_failure_received): @warning_ignore("return_value_discarded") @@ -172,6 +183,10 @@ func is_expect_interupted() -> bool: return _expect_to_interupt +func is_terminated() -> bool: + return _terminated + + func is_parameterized() -> bool: return _parameter_set_resolver.is_parameterized() @@ -192,11 +207,6 @@ func test_name() -> String: return _test_case.test_name -@warning_ignore("native_method_override") -func get_name() -> StringName: - return _test_case.test_name - - func line_number() -> int: return _test_case.line_number diff --git a/addons/gdUnit4/src/core/_TestCase.gd.uid b/addons/gdUnit4/src/core/_TestCase.gd.uid index be8def6a..c86b3f77 100644 --- a/addons/gdUnit4/src/core/_TestCase.gd.uid +++ b/addons/gdUnit4/src/core/_TestCase.gd.uid @@ -1 +1 @@ -uid://cyqyfl0hcfhug +uid://d4knvydfqs1ih diff --git a/addons/gdUnit4/src/core/attributes/TestCaseAttribute.gd.uid b/addons/gdUnit4/src/core/attributes/TestCaseAttribute.gd.uid index 2f6f116b..eb54a32b 100644 --- a/addons/gdUnit4/src/core/attributes/TestCaseAttribute.gd.uid +++ b/addons/gdUnit4/src/core/attributes/TestCaseAttribute.gd.uid @@ -1 +1 @@ -uid://x4lrqpt63ld0 +uid://dlubkgpamdsn4 diff --git a/addons/gdUnit4/src/core/command/GdUnitBaseCommand.gd b/addons/gdUnit4/src/core/command/GdUnitBaseCommand.gd new file mode 100644 index 00000000..f5c5ffb3 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitBaseCommand.gd @@ -0,0 +1,64 @@ +@abstract class_name GdUnitBaseCommand +extends Node + + +var id: String +var icon: Texture2D +var shortcut: Shortcut = null +var shortcut_type: GdUnitShortcut.ShortCut + + +func _init(p_id: String, p_shortcut: GdUnitShortcut.ShortCut = GdUnitShortcut.ShortCut.NONE) -> void: + id = p_id + shortcut_type = p_shortcut + _set_shortcut() + + +func _shortcut_input(event: InputEvent) -> void: + if is_running(): + return + + if shortcut and shortcut.matches_event(event): + execute() + get_viewport().set_input_as_handled() + + +func update_shortcut() -> void: + _set_shortcut() + + +func _set_shortcut() -> void: + if shortcut_type == GdUnitShortcut.ShortCut.NONE: + return + + var property_name := GdUnitShortcut.as_property(shortcut_type) + var property := GdUnitSettings.get_property(property_name) + var keys := GdUnitShortcut.default_keys(shortcut_type) + if property != null: + keys = property.value() + var inputEvent := _create_shortcut_input_even(keys) + + shortcut = Shortcut.new() + shortcut.set_events([inputEvent]) + + +func _create_shortcut_input_even(key_codes: PackedInt32Array) -> InputEventKey: + var inputEvent := InputEventKey.new() + inputEvent.pressed = true + for key_code in key_codes: + match key_code: + KEY_ALT: + inputEvent.alt_pressed = true + KEY_SHIFT: + inputEvent.shift_pressed = true + KEY_CTRL: + inputEvent.ctrl_pressed = true + _: + inputEvent.keycode = key_code as Key + inputEvent.physical_keycode = key_code as Key + return inputEvent + + +@abstract func is_running() -> bool + +@abstract func execute(...parameters: Array) -> void diff --git a/addons/gdUnit4/src/core/command/GdUnitBaseCommand.gd.uid b/addons/gdUnit4/src/core/command/GdUnitBaseCommand.gd.uid new file mode 100644 index 00000000..341b3457 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitBaseCommand.gd.uid @@ -0,0 +1 @@ +uid://cswkkmj7xy4fr diff --git a/addons/gdUnit4/src/core/command/GdUnitCommand.gd b/addons/gdUnit4/src/core/command/GdUnitCommand.gd deleted file mode 100644 index 659b6a3f..00000000 --- a/addons/gdUnit4/src/core/command/GdUnitCommand.gd +++ /dev/null @@ -1,41 +0,0 @@ -class_name GdUnitCommand -extends RefCounted - - -func _init(p_name :String, p_is_enabled: Callable, p_runnable: Callable, p_shortcut :GdUnitShortcut.ShortCut = GdUnitShortcut.ShortCut.NONE) -> void: - assert(p_name != null, "(%s) missing parameter 'name'" % p_name) - assert(p_is_enabled != null, "(%s) missing parameter 'is_enabled'" % p_name) - assert(p_runnable != null, "(%s) missing parameter 'runnable'" % p_name) - assert(p_shortcut != null, "(%s) missing parameter 'shortcut'" % p_name) - self.name = p_name - self.is_enabled = p_is_enabled - self.shortcut = p_shortcut - self.runnable = p_runnable - - -var name: String: - set(value): - name = value - get: - return name - - -var shortcut: GdUnitShortcut.ShortCut: - set(value): - shortcut = value - get: - return shortcut - - -var is_enabled: Callable: - set(value): - is_enabled = value - get: - return is_enabled - - -var runnable: Callable: - set(value): - runnable = value - get: - return runnable diff --git a/addons/gdUnit4/src/core/command/GdUnitCommand.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommand.gd.uid deleted file mode 100644 index 05283d3b..00000000 --- a/addons/gdUnit4/src/core/command/GdUnitCommand.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://da20vybopa1xx diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandFileSystem.gd b/addons/gdUnit4/src/core/command/GdUnitCommandFileSystem.gd new file mode 100644 index 00000000..6a173c50 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandFileSystem.gd @@ -0,0 +1,42 @@ +@abstract class_name GdUnitCommandFileSystem +extends GdUnitBaseCommand + + +var _test_session_command: GdUnitCommandTestSession + +func _init(p_id: String, p_shortcut: GdUnitShortcut.ShortCut, test_session_command: GdUnitCommandTestSession) -> void: + super(p_id, p_shortcut) + _test_session_command = test_session_command + + +func is_running() -> bool: + return _test_session_command.is_running() + + +func execute_tests(paths: PackedStringArray, with_debug: bool) -> void: + var suite_scaner := GdUnitTestSuiteScanner.new() + var scripts: Array[Script] + + for resource_path in paths: + # directories and test-suites are valid to enable the menu + if DirAccess.dir_exists_absolute(resource_path): + scripts.append_array(suite_scaner.scan_directory(resource_path)) + continue + + var file_type := resource_path.get_extension() + if file_type == "gd" or file_type == "cs": + var script := GdUnitTestSuiteScanner.load_with_disabled_warnings(resource_path) + + if GdUnitTestSuiteScanner.is_test_suite(script): + scripts.append(script) + + GdUnitSignals.instance().gdunit_event.emit(GdUnitEventTestDiscoverStart.new()) + var tests_to_execute: Array[GdUnitTestCase] = [] + for script in scripts: + GdUnitTestDiscoverer.discover_tests(script, func(test_case: GdUnitTestCase) -> void: + tests_to_execute.append(test_case) + GdUnitTestDiscoverSink.discover(test_case) + ) + GdUnitSignals.instance().gdunit_event.emit(GdUnitEventTestDiscoverEnd.new(0, 0)) + GdUnitTestDiscoverer.console_log_discover_results(tests_to_execute) + _test_session_command.execute(tests_to_execute, with_debug) diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandFileSystem.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandFileSystem.gd.uid new file mode 100644 index 00000000..3f907757 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandFileSystem.gd.uid @@ -0,0 +1 @@ +uid://dv85tdkhc5xc3 diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandFileSystemDebugTests.gd b/addons/gdUnit4/src/core/command/GdUnitCommandFileSystemDebugTests.gd new file mode 100644 index 00000000..c4c553c5 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandFileSystemDebugTests.gd @@ -0,0 +1,17 @@ +class_name GdUnitCommandFileSystemDebugTests +extends GdUnitCommandFileSystem + + +const ID := "Debug FileSystem Tests" + + +func _init(test_session_command: GdUnitCommandTestSession) -> void: + super(ID, GdUnitShortcut.ShortCut.RUN_TESTSUITE_DEBUG, test_session_command) + icon = GdUnitUiTools.get_icon("PlayStart") + + +func execute(...parameters: Array) -> void: + if parameters.is_empty(): + return + var selected_paths: PackedStringArray = parameters[0] + execute_tests(selected_paths, true) diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandFileSystemDebugTests.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandFileSystemDebugTests.gd.uid new file mode 100644 index 00000000..bace7c47 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandFileSystemDebugTests.gd.uid @@ -0,0 +1 @@ +uid://b3f2q4okdrs7y diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandFileSystemRunTests.gd b/addons/gdUnit4/src/core/command/GdUnitCommandFileSystemRunTests.gd new file mode 100644 index 00000000..d17413fc --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandFileSystemRunTests.gd @@ -0,0 +1,15 @@ +class_name GdUnitCommandFileSystemRunTests +extends GdUnitCommandFileSystem + + +const ID := "Run FileSystem Tests" + + +func _init(test_session_command: GdUnitCommandTestSession) -> void: + super(ID, GdUnitShortcut.ShortCut.RUN_TESTSUITE, test_session_command) + icon = GdUnitUiTools.get_icon("Play") + + +func execute(...parameters: Array) -> void: + var selected_paths: PackedStringArray = parameters[0] + execute_tests(selected_paths, false) diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandFileSystemRunTests.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandFileSystemRunTests.gd.uid new file mode 100644 index 00000000..d09ca259 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandFileSystemRunTests.gd.uid @@ -0,0 +1 @@ +uid://b6q2233rqcdes diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandHandler.gd b/addons/gdUnit4/src/core/command/GdUnitCommandHandler.gd index 1f64e2ad..8e2b2f3e 100644 --- a/addons/gdUnit4/src/core/command/GdUnitCommandHandler.gd +++ b/addons/gdUnit4/src/core/command/GdUnitCommandHandler.gd @@ -1,62 +1,11 @@ class_name GdUnitCommandHandler extends Object -signal gdunit_runner_start() -signal gdunit_runner_stop(client_id :int) - const GdUnitTools := preload("res://addons/gdUnit4/src/core/GdUnitTools.gd") -const CMD_RUN_OVERALL = "Debug Overall TestSuites" -const CMD_RUN_TESTCASE = "Run TestCases" -const CMD_RUN_TESTCASE_DEBUG = "Run TestCases (Debug)" -const CMD_RUN_TESTSUITE = "Run TestSuites" -const CMD_RUN_TESTSUITE_DEBUG = "Run TestSuites (Debug)" -const CMD_RERUN_TESTS = "ReRun Tests" -const CMD_RERUN_TESTS_DEBUG = "ReRun Tests (Debug)" -const CMD_STOP_TEST_RUN = "Stop Test Run" -const CMD_CREATE_TESTCASE = "Create TestCase" - -const SETTINGS_SHORTCUT_MAPPING := { - "N/A" : GdUnitShortcut.ShortCut.NONE, - GdUnitSettings.SHORTCUT_INSPECTOR_RERUN_TEST : GdUnitShortcut.ShortCut.RERUN_TESTS, - GdUnitSettings.SHORTCUT_INSPECTOR_RERUN_TEST_DEBUG : GdUnitShortcut.ShortCut.RERUN_TESTS_DEBUG, - GdUnitSettings.SHORTCUT_INSPECTOR_RUN_TEST_OVERALL : GdUnitShortcut.ShortCut.RUN_TESTS_OVERALL, - GdUnitSettings.SHORTCUT_INSPECTOR_RUN_TEST_STOP : GdUnitShortcut.ShortCut.STOP_TEST_RUN, - GdUnitSettings.SHORTCUT_EDITOR_RUN_TEST : GdUnitShortcut.ShortCut.RUN_TESTCASE, - GdUnitSettings.SHORTCUT_EDITOR_RUN_TEST_DEBUG : GdUnitShortcut.ShortCut.RUN_TESTCASE_DEBUG, - GdUnitSettings.SHORTCUT_EDITOR_CREATE_TEST : GdUnitShortcut.ShortCut.CREATE_TEST, - GdUnitSettings.SHORTCUT_FILESYSTEM_RUN_TEST : GdUnitShortcut.ShortCut.RUN_TESTSUITE, - GdUnitSettings.SHORTCUT_FILESYSTEM_RUN_TEST_DEBUG : GdUnitShortcut.ShortCut.RUN_TESTSUITE_DEBUG -} - -const CommandMapping := { - GdUnitShortcut.ShortCut.RUN_TESTS_OVERALL: GdUnitCommandHandler.CMD_RUN_OVERALL, - GdUnitShortcut.ShortCut.RUN_TESTCASE: GdUnitCommandHandler.CMD_RUN_TESTCASE, - GdUnitShortcut.ShortCut.RUN_TESTCASE_DEBUG: GdUnitCommandHandler.CMD_RUN_TESTCASE_DEBUG, - GdUnitShortcut.ShortCut.RUN_TESTSUITE: GdUnitCommandHandler.CMD_RUN_TESTSUITE, - GdUnitShortcut.ShortCut.RUN_TESTSUITE_DEBUG: GdUnitCommandHandler.CMD_RUN_TESTSUITE_DEBUG, - GdUnitShortcut.ShortCut.RERUN_TESTS: GdUnitCommandHandler.CMD_RERUN_TESTS, - GdUnitShortcut.ShortCut.RERUN_TESTS_DEBUG: GdUnitCommandHandler.CMD_RERUN_TESTS_DEBUG, - GdUnitShortcut.ShortCut.STOP_TEST_RUN: GdUnitCommandHandler.CMD_STOP_TEST_RUN, - GdUnitShortcut.ShortCut.CREATE_TEST: GdUnitCommandHandler.CMD_CREATE_TESTCASE, -} - -# the current test runner config -var _runner_config := GdUnitRunnerConfig.new() - -# holds the current connected gdUnit runner client id -var _client_id: int -# if no debug mode we have an process id -var _current_runner_process_id: int = 0 -# hold is current an test running -var _is_running: bool = false -# holds if the current running tests started in debug mode -var _running_debug_mode: bool - -var _commands := {} -var _shortcuts := {} - +var _commnand_mappings: Dictionary[String, GdUnitBaseCommand]= {} +var test_session_command := GdUnitCommandTestSession.new() static func instance() -> GdUnitCommandHandler: return GdUnitSingleton.instance("GdUnitCommandHandler", func() -> GdUnitCommandHandler: return GdUnitCommandHandler.new()) @@ -64,28 +13,23 @@ static func instance() -> GdUnitCommandHandler: @warning_ignore("return_value_discarded") func _init() -> void: - assert_shortcut_mappings(SETTINGS_SHORTCUT_MAPPING) - GdUnitSignals.instance().gdunit_event.connect(_on_event) - GdUnitSignals.instance().gdunit_client_connected.connect(_on_client_connected) GdUnitSignals.instance().gdunit_client_disconnected.connect(_on_client_disconnected) GdUnitSignals.instance().gdunit_settings_changed.connect(_on_settings_changed) - # preload previous test execution - @warning_ignore("return_value_discarded") - _runner_config.load_config() - init_shortcuts() - var is_running := func(_script :Script) -> bool: return _is_running - var is_not_running := func(_script :Script) -> bool: return !_is_running - register_command(GdUnitCommand.new(CMD_RUN_OVERALL, is_not_running, cmd_run_overall.bind(true), GdUnitShortcut.ShortCut.RUN_TESTS_OVERALL)) - register_command(GdUnitCommand.new(CMD_RUN_TESTCASE, is_not_running, cmd_editor_run_test.bind(false), GdUnitShortcut.ShortCut.RUN_TESTCASE)) - register_command(GdUnitCommand.new(CMD_RUN_TESTCASE_DEBUG, is_not_running, cmd_editor_run_test.bind(true), GdUnitShortcut.ShortCut.RUN_TESTCASE_DEBUG)) - register_command(GdUnitCommand.new(CMD_RUN_TESTSUITE, is_not_running, cmd_run_test_suites.bind(false), GdUnitShortcut.ShortCut.RUN_TESTSUITE)) - register_command(GdUnitCommand.new(CMD_RUN_TESTSUITE_DEBUG, is_not_running, cmd_run_test_suites.bind(true), GdUnitShortcut.ShortCut.RUN_TESTSUITE_DEBUG)) - register_command(GdUnitCommand.new(CMD_RERUN_TESTS, is_not_running, cmd_run.bind(false), GdUnitShortcut.ShortCut.RERUN_TESTS)) - register_command(GdUnitCommand.new(CMD_RERUN_TESTS_DEBUG, is_not_running, cmd_run.bind(true), GdUnitShortcut.ShortCut.RERUN_TESTS_DEBUG)) - register_command(GdUnitCommand.new(CMD_CREATE_TESTCASE, is_not_running, cmd_create_test, GdUnitShortcut.ShortCut.CREATE_TEST)) - register_command(GdUnitCommand.new(CMD_STOP_TEST_RUN, is_running, cmd_stop.bind(_client_id), GdUnitShortcut.ShortCut.STOP_TEST_RUN)) + _register_command(test_session_command) + _register_command(GdUnitCommandStopTestSession.new(test_session_command)) + _register_command(GdUnitCommandInspectorRunTests.new(test_session_command)) + _register_command(GdUnitCommandInspectorDebugTests.new(test_session_command)) + _register_command(GdUnitCommandInspectorRerunTestsUntilFailure.new(test_session_command)) + _register_command(GdUnitCommandInspectorTreeCollapse.new()) + _register_command(GdUnitCommandInspectorTreeExpand.new()) + _register_command(GdUnitCommandScriptEditorRunTests.new(test_session_command)) + _register_command(GdUnitCommandScriptEditorDebugTests.new(test_session_command)) + _register_command(GdUnitCommandScriptEditorCreateTest.new()) + _register_command(GdUnitCommandFileSystemRunTests.new(test_session_command)) + _register_command(GdUnitCommandFileSystemDebugTests.new(test_session_command)) + _register_command(GdUnitCommandRunTestsOverall.new(test_session_command)) # schedule discover tests if enabled and running inside the editor if Engine.is_editor_hint() and GdUnitSettings.is_test_discover_enabled(): @@ -96,298 +40,79 @@ func _init() -> void: func _notification(what: int) -> void: if what == NOTIFICATION_PREDELETE: - _commands.clear() - _shortcuts.clear() + for command: GdUnitBaseCommand in _commnand_mappings.values(): + if Engine.is_editor_hint(): + EditorInterface.get_command_palette().remove_command("GdUnit4/"+command.id) + command.free() + _commnand_mappings.clear() func _do_process() -> void: - check_test_run_stopped_manually() - - -# is checking if the user has press the editor stop scene -func check_test_run_stopped_manually() -> void: - if is_test_running_but_stop_pressed(): + # Do stop test execution when the user has stoped the main scene manually + if test_session_command._is_debug and test_session_command.is_running() and not EditorInterface.is_playing_scene(): if GdUnitSettings.is_verbose_assert_warnings(): - push_warning("Test Runner scene was stopped manually, force stopping the current test run!") - cmd_stop(_client_id) - - -func is_test_running_but_stop_pressed() -> bool: - return _running_debug_mode and _is_running and not EditorInterface.is_playing_scene() - - -func assert_shortcut_mappings(mappings: Dictionary) -> void: - for shortcut: int in GdUnitShortcut.ShortCut.values(): - assert(mappings.values().has(shortcut), "missing settings mapping for shortcut '%s'!" % GdUnitShortcut.ShortCut.keys()[shortcut]) - - -func init_shortcuts() -> void: - for shortcut: int in GdUnitShortcut.ShortCut.values(): - if shortcut == GdUnitShortcut.ShortCut.NONE: - continue - var property_name: String = SETTINGS_SHORTCUT_MAPPING.find_key(shortcut) - var property := GdUnitSettings.get_property(property_name) - var keys := GdUnitShortcut.default_keys(shortcut) - if property != null: - keys = property.value() - var inputEvent := create_shortcut_input_even(keys) - register_shortcut(shortcut, inputEvent) - - -func create_shortcut_input_even(key_codes: PackedInt32Array) -> InputEventKey: - var inputEvent := InputEventKey.new() - inputEvent.pressed = true - for key_code in key_codes: - match key_code: - KEY_ALT: - inputEvent.alt_pressed = true - KEY_SHIFT: - inputEvent.shift_pressed = true - KEY_CTRL: - inputEvent.ctrl_pressed = true - _: - inputEvent.keycode = key_code as Key - inputEvent.physical_keycode = key_code as Key - return inputEvent - - -func register_shortcut(p_shortcut: GdUnitShortcut.ShortCut, p_input_event: InputEvent) -> void: - GdUnitTools.prints_verbose("register shortcut: '%s' to '%s'" % [GdUnitShortcut.ShortCut.keys()[p_shortcut], p_input_event.as_text()]) - var shortcut := Shortcut.new() - shortcut.set_events([p_input_event]) - var command_name := get_shortcut_command(p_shortcut) - _shortcuts[p_shortcut] = GdUnitShortcutAction.new(p_shortcut, shortcut, command_name) - - -func get_shortcut(shortcut_type: GdUnitShortcut.ShortCut) -> Shortcut: - return get_shortcut_action(shortcut_type).shortcut - - -func get_shortcut_action(shortcut_type: GdUnitShortcut.ShortCut) -> GdUnitShortcutAction: - return _shortcuts.get(shortcut_type) - - -func get_shortcut_command(p_shortcut: GdUnitShortcut.ShortCut) -> String: - return CommandMapping.get(p_shortcut, "unknown command") - - -func register_command(p_command: GdUnitCommand) -> void: - _commands[p_command.name] = p_command - - -func command(cmd_name: String) -> GdUnitCommand: - return _commands.get(cmd_name) - + print_debug("Test Runner scene was stopped manually, force stopping the current test run!") + command_execute(GdUnitCommandStopTestSession.ID) -func cmd_run_test_suites(scripts: Array[Script], debug: bool, rerun := false) -> void: - # Update test discovery - GdUnitSignals.instance().gdunit_event.emit(GdUnitEventTestDiscoverStart.new()) - var tests_to_execute: Array[GdUnitTestCase] = [] - for script in scripts: - GdUnitTestDiscoverer.discover_tests(script, func(test_case: GdUnitTestCase) -> void: - tests_to_execute.append(test_case) - GdUnitTestDiscoverSink.discover(test_case) - ) - GdUnitSignals.instance().gdunit_event.emit(GdUnitEventTestDiscoverEnd.new(0, 0)) - GdUnitTestDiscoverer.console_log_discover_results(tests_to_execute) - # create new runner runner_config for fresh run otherwise use saved one - if not rerun: - var result := _runner_config.clear()\ - .add_test_cases(tests_to_execute)\ - .save_config() - if result.is_error(): - push_error(result.error_message()) - return - cmd_run(debug) - - -func cmd_run_test_case(script: Script, test_case: String, test_param_index: int, debug: bool, rerun := false) -> void: - # Update test discovery - var tests_to_execute: Array[GdUnitTestCase] = [] - GdUnitSignals.instance().gdunit_event.emit(GdUnitEventTestDiscoverStart.new()) - GdUnitTestDiscoverer.discover_tests(script, func(test: GdUnitTestCase) -> void: - # We filter for a single test - if test.test_name == test_case: - # We only add selected parameterized test to the execution list - if test_param_index == -1: - tests_to_execute.append(test) - elif test.attribute_index == test_param_index: - tests_to_execute.append(test) - GdUnitTestDiscoverSink.discover(test) - ) - GdUnitSignals.instance().gdunit_event.emit(GdUnitEventTestDiscoverEnd.new(0, 0)) - GdUnitTestDiscoverer.console_log_discover_results(tests_to_execute) - - # create new runner config for fresh run otherwise use saved one - if not rerun: - var result := _runner_config.clear()\ - .add_test_cases(tests_to_execute)\ - .save_config() - if result.is_error(): - push_error(result.error_message()) - return - cmd_run(debug) - - -func cmd_run_tests(tests_to_execute: Array[GdUnitTestCase], debug: bool) -> void: - # Save tests to runner config before execute - var result := _runner_config.clear()\ - .add_test_cases(tests_to_execute)\ - .save_config() - if result.is_error(): - push_error(result.error_message()) +func command_icon(command_id: String) -> Texture2D: + if not _commnand_mappings.has(command_id): + push_error("GdUnitCommandHandler:command_icon(): No command id '%s' is registered." % command_id) + print_stack() return - cmd_run(debug) + return _commnand_mappings[command_id].icon -func cmd_run_overall(debug: bool) -> void: - var tests_to_execute := await GdUnitTestDiscoverer.run() - var result := _runner_config.clear()\ - .add_test_cases(tests_to_execute)\ - .save_config() - if result.is_error(): - push_error(result.error_message()) +func command_shortcut(command_id: String) -> Shortcut: + if not _commnand_mappings.has(command_id): + push_error("GdUnitCommandHandler:command_shortcut(): No command id '%s' is registered." % command_id) + print_stack() return - cmd_run(debug) + return _commnand_mappings[command_id].shortcut -func cmd_run(debug: bool) -> void: - # don't start is already running - if _is_running: +func command_execute(...parameters: Array) -> void: + if parameters.is_empty(): + push_error("Invalid arguments used on CommandHandler:execute()! Expecting []") + print_stack() return - # save current selected excution config - var server_port: int = Engine.get_meta("gdunit_server_port") - var result := _runner_config.set_server_port(server_port).save_config() - if result.is_error(): - push_error(result.error_message()) + var command_id: String = parameters.pop_front() + if not _commnand_mappings.has(command_id): + push_error("GdUnitCommandHandler:command_execute(): No command id '%s' is registered." % command_id) + print_stack() return - # before start we have to save all changes - ScriptEditorControls.save_all_open_script() - gdunit_runner_start.emit() - _current_runner_process_id = -1 - _running_debug_mode = debug - if debug: - run_debug_mode() - else: - run_release_mode() + await _commnand_mappings[command_id].callv("execute", parameters) -func cmd_stop(client_id: int) -> void: - # don't stop if is already stopped - if not _is_running: +func _register_command(command: GdUnitBaseCommand) -> void: + # first verify the command is not already registerd + if _commnand_mappings.has(command.id): + push_error("GdUnitCommandHandler:_register_command(): Command with id '%s' is already registerd!" % command.id) return - _is_running = false - gdunit_runner_stop.emit(client_id) - if _running_debug_mode: - EditorInterface.stop_playing_scene() - elif _current_runner_process_id > 0: - if OS.is_process_running(_current_runner_process_id): - var result := OS.kill(_current_runner_process_id) - if result != OK: - push_error("ERROR checked stopping GdUnit Test Runner. error code: %s" % result) - _current_runner_process_id = -1 - - -func cmd_editor_run_test(debug: bool) -> void: - if is_active_script_editor(): - var cursor_line := active_base_editor().get_caret_line() - #run test case? - var regex := RegEx.new() - @warning_ignore("return_value_discarded") - regex.compile("(^func[ ,\t])(test_[a-zA-Z0-9_]*)") - var result := regex.search(active_base_editor().get_line(cursor_line)) - if result: - var func_name := result.get_string(2).strip_edges() - if func_name.begins_with("test_"): - cmd_run_test_case(active_script(), func_name, -1, debug) - return - # otherwise run the full test suite - var selected_test_suites: Array[Script] = [active_script()] - cmd_run_test_suites(selected_test_suites, debug) - -func cmd_create_test() -> void: - if not is_active_script_editor(): - return - var cursor_line := active_base_editor().get_caret_line() - var result := GdUnitTestSuiteBuilder.create(active_script(), cursor_line) - if result.is_error(): - # show error dialog - push_error("Failed to create test case: %s" % result.error_message()) - return - var info: Dictionary = result.value() - var script_path: String = info.get("path") - var script_line: int = info.get("line") - ScriptEditorControls.edit_script(script_path, script_line) + _commnand_mappings[command.id] = command + if Engine.is_editor_hint(): + EditorInterface.get_base_control().add_child(command) + EditorInterface.get_command_palette().add_command(command.id, "GdUnit4/"+command.id, command.execute, command.shortcut.get_as_text() if command.shortcut else "None") func cmd_discover_tests() -> void: await GdUnitTestDiscoverer.run() -func run_debug_mode() -> void: - EditorInterface.play_custom_scene("res://addons/gdUnit4/src/core/runners/GdUnitTestRunner.tscn") - _is_running = true - - -func run_release_mode() -> void: - var arguments := Array() - if OS.is_stdout_verbose(): - arguments.append("--verbose") - arguments.append("--no-window") - arguments.append("--path") - arguments.append(ProjectSettings.globalize_path("res://")) - arguments.append("res://addons/gdUnit4/src/core/runners/GdUnitTestRunner.tscn") - _current_runner_process_id = OS.create_process(OS.get_executable_path(), arguments, false); - _is_running = true - - -func is_active_script_editor() -> bool: - return EditorInterface.get_script_editor().get_current_editor() != null - - -func active_base_editor() -> TextEdit: - return EditorInterface.get_script_editor().get_current_editor().get_base_editor() - - -func active_script() -> Script: - return EditorInterface.get_script_editor().get_current_script() - - - ################################################################################ # signals handles ################################################################################ func _on_event(event: GdUnitEvent) -> void: if event.type() == GdUnitEvent.SESSION_CLOSE: - cmd_stop(_client_id) - - -func _on_stop_pressed() -> void: - cmd_stop(_client_id) - - -func _on_run_pressed(debug := false) -> void: - cmd_run(debug) - - -func _on_run_overall_pressed(_debug := false) -> void: - cmd_run_overall(true) + command_execute(GdUnitCommandStopTestSession.ID) func _on_settings_changed(property: GdUnitProperty) -> void: - if SETTINGS_SHORTCUT_MAPPING.has(property.name()): - var shortcut :GdUnitShortcut.ShortCut = SETTINGS_SHORTCUT_MAPPING.get(property.name()) - var value: PackedInt32Array = property.value() - var input_event := create_shortcut_input_even(value) - prints("Shortcut changed: '%s' to '%s'" % [GdUnitShortcut.ShortCut.keys()[shortcut], input_event.as_text()]) - var action := get_shortcut_action(shortcut) - if action != null: - action.update_shortcut(input_event) - else: - register_shortcut(shortcut, input_event) + for command: GdUnitBaseCommand in _commnand_mappings.values(): + command.update_shortcut() + if property.name() == GdUnitSettings.TEST_DISCOVER_ENABLED: var timer :SceneTreeTimer = (Engine.get_main_loop() as SceneTree).create_timer(3) @warning_ignore("return_value_discarded") @@ -397,12 +122,5 @@ func _on_settings_changed(property: GdUnitProperty) -> void: ################################################################################ # Network stuff ################################################################################ -func _on_client_connected(client_id: int) -> void: - _client_id = client_id - - -func _on_client_disconnected(client_id: int) -> void: - # only stops is not in debug mode running and the current client - if not _running_debug_mode and _client_id == client_id: - cmd_stop(client_id) - _client_id = -1 +func _on_client_disconnected(_client_id: int) -> void: + command_execute(GdUnitCommandStopTestSession.ID) diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandHandler.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandHandler.gd.uid index e5383285..6398bf5d 100644 --- a/addons/gdUnit4/src/core/command/GdUnitCommandHandler.gd.uid +++ b/addons/gdUnit4/src/core/command/GdUnitCommandHandler.gd.uid @@ -1 +1 @@ -uid://cgo8wyef7556y +uid://bny5a2j154abe diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandInspectorDebugTests.gd b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorDebugTests.gd new file mode 100644 index 00000000..cb4a6343 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorDebugTests.gd @@ -0,0 +1,27 @@ +class_name GdUnitCommandInspectorDebugTests +extends GdUnitBaseCommand + +const InspectorTreeMainPanel := preload("res://addons/gdUnit4/src/ui/parts/InspectorTreeMainPanel.gd") +const ID := "Debug Inspector Tests" + + +var _test_session_command: GdUnitCommandTestSession + + +func _init(test_session_command: GdUnitCommandTestSession) -> void: + super(ID, GdUnitShortcut.ShortCut.RERUN_TESTS_DEBUG) + icon = GdUnitUiTools.get_icon("PlayStart") + _test_session_command = test_session_command + + +func is_running() -> bool: + return _test_session_command.is_running() + + +func execute(..._parameters: Array) -> void: + var base_control := EditorInterface.get_base_control() + var inspector: InspectorTreeMainPanel = base_control.get_meta("GdUnit4Inspector") + var selected_item := inspector._tree.get_selected() + var tests_to_execute := inspector.collect_test_cases(selected_item) + + _test_session_command.execute(tests_to_execute, true) diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandInspectorDebugTests.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorDebugTests.gd.uid new file mode 100644 index 00000000..28ef7d57 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorDebugTests.gd.uid @@ -0,0 +1 @@ +uid://bbk581r1psi8s diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandInspectorRerunTestsUntilFailure.gd b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorRerunTestsUntilFailure.gd new file mode 100644 index 00000000..e2ec5e4a --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorRerunTestsUntilFailure.gd @@ -0,0 +1,57 @@ +class_name GdUnitCommandInspectorRerunTestsUntilFailure +extends GdUnitBaseCommand + + +signal session_closed() + + +const InspectorTreeMainPanel := preload("res://addons/gdUnit4/src/ui/parts/InspectorTreeMainPanel.gd") +const ID := "Rerun Inspector Tests Until Failure" + + +var _test_session_command: GdUnitCommandTestSession +var _current_execution_count := 0 + + +func _init(test_session_command: GdUnitCommandTestSession) -> void: + super(ID, GdUnitShortcut.ShortCut.RERUN_TESTS_UNTIL_FAILURE) + icon = GdUnitUiTools.get_icon("Play") + _test_session_command = test_session_command + + +func is_running() -> bool: + return _test_session_command.is_running() + + +func execute(..._parameters: Array) -> void: + var base_control := EditorInterface.get_base_control() + var inspector: InspectorTreeMainPanel = base_control.get_meta("GdUnit4Inspector") + var selected_item := inspector._tree.get_selected() + var tests_to_execute := inspector.collect_test_cases(selected_item) + var rerun_until_failure_count := GdUnitSettings.get_rerun_max_retries() + var saved_settings: bool = ProjectSettings.get_setting(GdUnitSettings.TEST_FLAKY_CHECK) + ProjectSettings.set_setting(GdUnitSettings.TEST_FLAKY_CHECK, false) + + GdUnitSignals.instance().gdunit_event.connect(_on_test_event) + _current_execution_count = 0 + + _test_session_command._is_fail_fast = true + while _current_execution_count < rerun_until_failure_count: + _test_session_command.execute(tests_to_execute, true) + await session_closed + _test_session_command._is_fail_fast = false + + ProjectSettings.set_setting(GdUnitSettings.TEST_FLAKY_CHECK, saved_settings) + GdUnitSignals.instance().gdunit_event.disconnect(_on_test_event) + + +func _on_test_event(event: GdUnitEvent) -> void: + if event.type() == GdUnitEvent.SESSION_START: + _current_execution_count += 1 + GdUnitSignals.instance().gdunit_message.emit("[color=RED]Execution Mode: ReRun until failure! (iteration %d)[/color]" % _current_execution_count) + if event.type() == GdUnitEvent.SESSION_CLOSE: + session_closed.emit() + if event.type() == GdUnitEvent.TESTCASE_AFTER: + if not event.is_success(): + GdUnitSignals.instance().gdunit_message.emit(" [color=RED](iteration: %d)[/color]" % _current_execution_count) + _current_execution_count = 9999 diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandInspectorRerunTestsUntilFailure.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorRerunTestsUntilFailure.gd.uid new file mode 100644 index 00000000..4d607eff --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorRerunTestsUntilFailure.gd.uid @@ -0,0 +1 @@ +uid://cw8d5ecv2y7av diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandInspectorRunTests.gd b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorRunTests.gd new file mode 100644 index 00000000..c0cb733f --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorRunTests.gd @@ -0,0 +1,26 @@ +class_name GdUnitCommandInspectorRunTests +extends GdUnitBaseCommand + +const InspectorTreeMainPanel := preload("res://addons/gdUnit4/src/ui/parts/InspectorTreeMainPanel.gd") +const ID := "Run Inspector Tests" + + +var _test_session_command: GdUnitCommandTestSession + + +func _init(test_session_command: GdUnitCommandTestSession) -> void: + super(ID, GdUnitShortcut.ShortCut.RERUN_TESTS) + icon = GdUnitUiTools.get_icon("Play") + _test_session_command = test_session_command + + +func is_running() -> bool: + return _test_session_command.is_running() + + +func execute(..._parameters: Array) -> void: + var base_control := EditorInterface.get_base_control() + var inspector: InspectorTreeMainPanel = base_control.get_meta("GdUnit4Inspector") + var selected_item := inspector._tree.get_selected() + var tests_to_execute := inspector.collect_test_cases(selected_item) + _test_session_command.execute(tests_to_execute, false) diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandInspectorRunTests.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorRunTests.gd.uid new file mode 100644 index 00000000..fc948d73 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorRunTests.gd.uid @@ -0,0 +1 @@ +uid://b7kbv0eus2ugy diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandInspectorTreeCollapse.gd b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorTreeCollapse.gd new file mode 100644 index 00000000..fa784f8a --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorTreeCollapse.gd @@ -0,0 +1,26 @@ +class_name GdUnitCommandInspectorTreeCollapse +extends GdUnitBaseCommand + +const InspectorTreeMainPanel := preload("res://addons/gdUnit4/src/ui/parts/InspectorTreeMainPanel.gd") +const ID := "Inspector Tree Collapse" + + +func _init() -> void: + super(ID, GdUnitShortcut.ShortCut.NONE) + icon = GdUnitUiTools.get_icon("CollapseTree") + + +func is_running() -> bool: + return false + + +func execute(..._parameters: Array) -> void: + var inspector: InspectorTreeMainPanel = EditorInterface.get_base_control().get_meta("GdUnit4Inspector") + var selected_item := inspector._tree.get_selected() + if selected_item == null: + selected_item = inspector._tree.get_root() + else: + selected_item = selected_item.get_parent() + + inspector.do_collapse_all(false, selected_item) + inspector.do_collapse_all(true, selected_item) diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandInspectorTreeCollapse.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorTreeCollapse.gd.uid new file mode 100644 index 00000000..eedd68cd --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorTreeCollapse.gd.uid @@ -0,0 +1 @@ +uid://dr6aej7k6mew5 diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandInspectorTreeExpand.gd b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorTreeExpand.gd new file mode 100644 index 00000000..76f8d0bd --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorTreeExpand.gd @@ -0,0 +1,25 @@ +class_name GdUnitCommandInspectorTreeExpand +extends GdUnitBaseCommand + +const InspectorTreeMainPanel := preload("res://addons/gdUnit4/src/ui/parts/InspectorTreeMainPanel.gd") +const ID := "Inspector Tree Expand" + + +func _init() -> void: + super(ID, GdUnitShortcut.ShortCut.NONE) + icon = GdUnitUiTools.get_icon("ExpandTree") + + +func is_running() -> bool: + return false + + +func execute(..._parameters: Array) -> void: + var inspector: InspectorTreeMainPanel = EditorInterface.get_base_control().get_meta("GdUnit4Inspector") + var selected_item := inspector._tree.get_selected() + if selected_item == null: + selected_item = inspector._tree.get_root() + else: + selected_item = selected_item.get_parent() + + inspector.do_collapse_all(false, selected_item) diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandInspectorTreeExpand.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorTreeExpand.gd.uid new file mode 100644 index 00000000..3223f7c7 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandInspectorTreeExpand.gd.uid @@ -0,0 +1 @@ +uid://dmetwq70lqb3v diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandRunTestsOverall.gd b/addons/gdUnit4/src/core/command/GdUnitCommandRunTestsOverall.gd new file mode 100644 index 00000000..daf534b6 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandRunTestsOverall.gd @@ -0,0 +1,22 @@ +class_name GdUnitCommandRunTestsOverall +extends GdUnitBaseCommand + +const ID := "Run Tests Overall" + + +var _test_session_command: GdUnitCommandTestSession + + +func _init(test_session_command: GdUnitCommandTestSession) -> void: + super(ID, GdUnitShortcut.ShortCut.RUN_TESTS_OVERALL) + icon = GdUnitUiTools.get_run_overall_icon() + _test_session_command = test_session_command + + +func is_running() -> bool: + return _test_session_command.is_running() + + +func execute(..._parameters: Array) -> void: + var tests_to_execute := await GdUnitTestDiscoverer.run() + _test_session_command.execute(tests_to_execute, true) diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandRunTestsOverall.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandRunTestsOverall.gd.uid new file mode 100644 index 00000000..484f61b0 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandRunTestsOverall.gd.uid @@ -0,0 +1 @@ +uid://k5na6oqamsfj diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditor.gd b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditor.gd new file mode 100644 index 00000000..5504fa73 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditor.gd @@ -0,0 +1,56 @@ +@abstract class_name GdUnitCommandScriptEditor +extends GdUnitBaseCommand + +var _test_session_command: GdUnitCommandTestSession + +func _init(p_id: String, p_shortcut: GdUnitShortcut.ShortCut, test_session_command: GdUnitCommandTestSession) -> void: + super(p_id, p_shortcut) + _test_session_command = test_session_command + + +func is_running() -> bool: + return _test_session_command.is_running() + + +func execute_tests(with_debug: bool) -> void: + var selected_tests := PackedStringArray() + if _is_active_script_editor(): + var cursor_line := _active_base_editor().get_caret_line() + #run test case? + var regex := RegEx.new() + @warning_ignore("return_value_discarded") + regex.compile("(^func[ ,\t])(test_[a-zA-Z0-9_]*)") + var result := regex.search(_active_base_editor().get_line(cursor_line)) + if result: + var func_name := result.get_string(2).strip_edges() + if func_name.begins_with("test_"): + selected_tests.append(func_name) + + var tests_to_execute := _collect_tests(_active_script(), selected_tests) + _test_session_command.execute(tests_to_execute, with_debug) + + +func _collect_tests(script: Script, tests: PackedStringArray) -> Array[GdUnitTestCase]: + # Update test discovery + var tests_to_execute: Array[GdUnitTestCase] = [] + GdUnitSignals.instance().gdunit_event.emit(GdUnitEventTestDiscoverStart.new()) + GdUnitTestDiscoverer.discover_tests(script, func(test: GdUnitTestCase) -> void: + if tests.is_empty() or tests.has(test.test_name): + tests_to_execute.append(test) + GdUnitTestDiscoverSink.discover(test) + ) + GdUnitSignals.instance().gdunit_event.emit(GdUnitEventTestDiscoverEnd.new(0, 0)) + GdUnitTestDiscoverer.console_log_discover_results(tests_to_execute) + return tests_to_execute + + +func _is_active_script_editor() -> bool: + return EditorInterface.get_script_editor().get_current_editor() != null + + +func _active_base_editor() -> TextEdit: + return EditorInterface.get_script_editor().get_current_editor().get_base_editor() + + +func _active_script() -> Script: + return EditorInterface.get_script_editor().get_current_script() diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditor.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditor.gd.uid new file mode 100644 index 00000000..38f3ffc8 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditor.gd.uid @@ -0,0 +1 @@ +uid://yy77vt28e8sn diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorCreateTest.gd b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorCreateTest.gd new file mode 100644 index 00000000..17876ca9 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorCreateTest.gd @@ -0,0 +1,41 @@ +class_name GdUnitCommandScriptEditorCreateTest +extends GdUnitBaseCommand + + +const ID := "Create Test" + + +func _init() -> void: + super(ID, GdUnitShortcut.ShortCut.CREATE_TEST) + icon = GdUnitUiTools.get_icon("New") + + +func is_running() -> bool: + return false + + +func execute(..._parameters: Array) -> void: + if not _is_active_script_editor(): + return + var cursor_line := _active_base_editor().get_caret_line() + var result := GdUnitTestSuiteBuilder.create(_active_script(), cursor_line) + if result.is_error(): + # show error dialog + push_error("Failed to create test case: %s" % result.error_message()) + return + var info: Dictionary = result.value() + var script_path: String = info.get("path") + var script_line: int = info.get("line") + ScriptEditorControls.edit_script(script_path, script_line) + + +func _is_active_script_editor() -> bool: + return EditorInterface.get_script_editor().get_current_editor() != null + + +func _active_base_editor() -> TextEdit: + return EditorInterface.get_script_editor().get_current_editor().get_base_editor() + + +func _active_script() -> Script: + return EditorInterface.get_script_editor().get_current_script() diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorCreateTest.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorCreateTest.gd.uid new file mode 100644 index 00000000..6d4c2e81 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorCreateTest.gd.uid @@ -0,0 +1 @@ +uid://bp2krb6fdxvpv diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorDebugTests.gd b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorDebugTests.gd new file mode 100644 index 00000000..8ab9f24b --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorDebugTests.gd @@ -0,0 +1,14 @@ +class_name GdUnitCommandScriptEditorDebugTests +extends GdUnitCommandScriptEditor + + +const ID := "Debug ScriptEditor Tests" + + +func _init(test_session_command: GdUnitCommandTestSession) -> void: + super(ID, GdUnitShortcut.ShortCut.RUN_TESTCASE_DEBUG, test_session_command) + icon = GdUnitUiTools.get_icon("PlayStart") + + +func execute(..._parameters: Array) -> void: + execute_tests(true) diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorDebugTests.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorDebugTests.gd.uid new file mode 100644 index 00000000..882c5170 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorDebugTests.gd.uid @@ -0,0 +1 @@ +uid://bhqkg1ciewrou diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorRunTests.gd b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorRunTests.gd new file mode 100644 index 00000000..a18851a7 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorRunTests.gd @@ -0,0 +1,14 @@ +class_name GdUnitCommandScriptEditorRunTests +extends GdUnitCommandScriptEditor + + +const ID := "Run ScriptEditor Tests" + + +func _init(test_session_command: GdUnitCommandTestSession) -> void: + super(ID, GdUnitShortcut.ShortCut.RUN_TESTCASE, test_session_command) + icon = GdUnitUiTools.get_icon("Play") + + +func execute(..._parameters: Array) -> void: + execute_tests(false) diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorRunTests.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorRunTests.gd.uid new file mode 100644 index 00000000..fbc82d29 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandScriptEditorRunTests.gd.uid @@ -0,0 +1 @@ +uid://ohh8x6wljivj diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandStopTestSession.gd b/addons/gdUnit4/src/core/command/GdUnitCommandStopTestSession.gd new file mode 100644 index 00000000..50a6df7b --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandStopTestSession.gd @@ -0,0 +1,21 @@ +class_name GdUnitCommandStopTestSession +extends GdUnitBaseCommand + +const ID := "Stop Test Session" + + +var _test_session_command: GdUnitCommandTestSession + + +func _init(test_session_command: GdUnitCommandTestSession) -> void: + super(ID, GdUnitShortcut.ShortCut.STOP_TEST_RUN) + icon = GdUnitUiTools.get_icon("Stop") + _test_session_command = test_session_command + + +func is_running() -> bool: + return _test_session_command.is_running() + + +func execute(..._parameters: Array) -> void: + await _test_session_command.stop() diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandStopTestSession.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandStopTestSession.gd.uid new file mode 100644 index 00000000..9dcee7f3 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandStopTestSession.gd.uid @@ -0,0 +1 @@ +uid://dthpsdne0x5ew diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandTestSession.gd b/addons/gdUnit4/src/core/command/GdUnitCommandTestSession.gd new file mode 100644 index 00000000..53d74ed8 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandTestSession.gd @@ -0,0 +1,124 @@ +class_name GdUnitCommandTestSession +extends GdUnitBaseCommand + + +const ID := "Start Test Session" + + +var _current_runner_process_id: int +var _is_running: bool +var _is_debug: bool +var _is_fail_fast: bool + + +func _init() -> void: + super(ID, GdUnitShortcut.ShortCut.NONE) + _is_running = false + _is_fail_fast = false + + +func is_running() -> bool: + return _is_running + + +func stop() -> void: + if not is_running(): + return + _is_running = false + + if _is_debug: + force_pause_scene() + + GdUnitSignals.instance().gdunit_test_session_terminate.emit() + # Give the API time to commit terminate to the client + await get_tree().create_timer(.5).timeout + + if _is_debug and EditorInterface.is_playing_scene(): + EditorInterface.stop_playing_scene() + # We need finaly to send the test session close event because the current run is hard aborted. + GdUnitSignals.instance().gdunit_event.emit(GdUnitSessionClose.new()) + elif OS.is_process_running(_current_runner_process_id): + var result := OS.kill(_current_runner_process_id) + if result != OK: + push_error("ERROR checked stopping GdUnit Test Runner. error code: %s" % result) + _current_runner_process_id = -1 + # We need finaly to send the test session close event because the current run is hard aborted. + GdUnitSignals.instance().gdunit_event.emit(GdUnitSessionClose.new()) + + +## Forces the running scene to unpause when the debugger hits a breakpoint.[br] +## [br] +## When the Godot debugger stops at a breakpoint during test execution, it blocks[br] +## the main thread. This prevents signals and TCP communications from being processed,[br] +## which can cause GdUnit4 tests to hang or fail to communicate properly with the[br] +## test runner. This function programmatically unpauses the scene to restore[br] +## main thread execution while maintaining debugger functionality. [br] +## [br] +## [b]Technical Background:[/b][br] +## - Debugger breakpoints freeze the main thread to allow inspection[br] +## - Frozen main thread blocks signal processing and network communications[br] +## - GdUnit4 requires active signal/TCP processing for test coordination[br] +## - This function finds and triggers the editor's pause button to resume execution[br] +## [br] +## [b]How It Works:[/b][br] +## 1. Locates the EditorRunBar in the Godot editor UI hierarchy[br] +## 2. Searches for the pause button by matching its icon[br] +## 3. Unpresses the button if it's currently pressed (paused state)[br] +## 4. Manually triggers the button's connected callbacks to resume execution[br] +func force_pause_scene() -> bool: + var nodes := EditorInterface.get_base_control().find_children("*", "EditorRunBar", true, false) + if nodes.size() != 1: + push_error("GdUnitCommandTestSession:force_pause_scene() Can't find Editor component 'EditorRunBar'") + return false + var editor_run_bar := nodes[0] + var containers := editor_run_bar.find_children("*", "HBoxContainer", true, false) + var pause_icon := GdUnitUiTools.get_icon("Pause") + + for container in containers: + for child in container.get_children(): + if child is Button: + var button: Button = child + if pause_icon == button.icon: + button.set_pressed(false) + + var connected_signals := button.get_signal_connection_list("pressed") + if not connected_signals.is_empty(): + for signal_ in connected_signals: + var cb: Callable = signal_["callable"] + cb.call() + return true + push_error("GdUnitCommandTestSession:force_pause_scene() Can't find Editor component 'EditorRunBar'") + return false + + +func execute(...parameters: Array) -> void: + var tests_to_execute: Array[GdUnitTestCase] = parameters[0] + _is_debug = parameters[1] + + _prepare_test_session(tests_to_execute) + if _is_debug: + EditorInterface.play_custom_scene("res://addons/gdUnit4/src/core/runners/GdUnitTestRunner.tscn") + else: + var arguments := Array() + if OS.is_stdout_verbose(): + arguments.append("--verbose") + arguments.append("--no-window") + arguments.append("--path") + arguments.append(ProjectSettings.globalize_path("res://")) + arguments.append("res://addons/gdUnit4/src/core/runners/GdUnitTestRunner.tscn") + _current_runner_process_id = OS.create_process(OS.get_executable_path(), arguments, false); + _is_running = true + + +func _prepare_test_session(tests_to_execute: Array[GdUnitTestCase]) -> void: + var server_port: int = Engine.get_meta("gdunit_server_port") + var result := GdUnitRunnerConfig.new() \ + .set_server_port(server_port) \ + .do_fail_fast(_is_fail_fast) \ + .add_test_cases(tests_to_execute) \ + .save_config() + if result.is_error(): + push_error(result.error_message()) + return + # before start we have to save all scrpt changes + ScriptEditorControls.save_all_open_script() diff --git a/addons/gdUnit4/src/core/command/GdUnitCommandTestSession.gd.uid b/addons/gdUnit4/src/core/command/GdUnitCommandTestSession.gd.uid new file mode 100644 index 00000000..96186784 --- /dev/null +++ b/addons/gdUnit4/src/core/command/GdUnitCommandTestSession.gd.uid @@ -0,0 +1 @@ +uid://8720s4iqqktl diff --git a/addons/gdUnit4/src/core/command/GdUnitShortcut.gd b/addons/gdUnit4/src/core/command/GdUnitShortcut.gd index 0535869b..33af0823 100644 --- a/addons/gdUnit4/src/core/command/GdUnitShortcut.gd +++ b/addons/gdUnit4/src/core/command/GdUnitShortcut.gd @@ -11,6 +11,7 @@ enum ShortCut { RUN_TESTSUITE_DEBUG, RERUN_TESTS, RERUN_TESTS_DEBUG, + RERUN_TESTS_UNTIL_FAILURE, STOP_TEST_RUN, CREATE_TEST, } @@ -19,30 +20,50 @@ const DEFAULTS_MACOS := { ShortCut.NONE : [], ShortCut.RUN_TESTCASE : [Key.KEY_META, Key.KEY_ALT, Key.KEY_F5], ShortCut.RUN_TESTCASE_DEBUG : [Key.KEY_META, Key.KEY_ALT, Key.KEY_F6], - ShortCut.RUN_TESTSUITE : [Key.KEY_META, Key.KEY_ALT, Key.KEY_F5], - ShortCut.RUN_TESTSUITE_DEBUG : [Key.KEY_META, Key.KEY_ALT, Key.KEY_F6], - ShortCut.RUN_TESTS_OVERALL : [Key.KEY_META, Key.KEY_F7], - ShortCut.STOP_TEST_RUN : [Key.KEY_META, Key.KEY_F8], - ShortCut.RERUN_TESTS : [Key.KEY_META, Key.KEY_F5], - ShortCut.RERUN_TESTS_DEBUG : [Key.KEY_META, Key.KEY_F6], + ShortCut.RUN_TESTSUITE : [Key.KEY_ALT, Key.KEY_META, Key.KEY_F5], + ShortCut.RUN_TESTSUITE_DEBUG : [Key.KEY_ALT, Key.KEY_META, Key.KEY_F6], + ShortCut.RUN_TESTS_OVERALL : [Key.KEY_ALT, Key.KEY_F7], + ShortCut.STOP_TEST_RUN : [Key.KEY_ALT, Key.KEY_F8], + ShortCut.RERUN_TESTS : [Key.KEY_ALT, Key.KEY_F5], + ShortCut.RERUN_TESTS_DEBUG : [Key.KEY_ALT, Key.KEY_F6], + ShortCut.RERUN_TESTS_UNTIL_FAILURE : [Key.KEY_ALT, Key.KEY_META, Key.KEY_F5], ShortCut.CREATE_TEST : [Key.KEY_META, Key.KEY_ALT, Key.KEY_F10], } const DEFAULTS_WINDOWS := { ShortCut.NONE : [], ShortCut.RUN_TESTCASE : [Key.KEY_CTRL, Key.KEY_ALT, Key.KEY_F5], - ShortCut.RUN_TESTCASE_DEBUG : [Key.KEY_CTRL,Key.KEY_ALT, Key.KEY_F6], - ShortCut.RUN_TESTSUITE : [Key.KEY_CTRL, Key.KEY_ALT, Key.KEY_F5], - ShortCut.RUN_TESTSUITE_DEBUG : [Key.KEY_CTRL,Key.KEY_ALT, Key.KEY_F6], - ShortCut.RUN_TESTS_OVERALL : [Key.KEY_CTRL, Key.KEY_F7], - ShortCut.STOP_TEST_RUN : [Key.KEY_CTRL, Key.KEY_F8], - ShortCut.RERUN_TESTS : [Key.KEY_CTRL, Key.KEY_F5], - ShortCut.RERUN_TESTS_DEBUG : [Key.KEY_CTRL, Key.KEY_F6], + ShortCut.RUN_TESTCASE_DEBUG : [Key.KEY_CTRL, Key.KEY_ALT, Key.KEY_F6], + ShortCut.RUN_TESTSUITE : [Key.KEY_ALT, Key.KEY_SHIFT, Key.KEY_F5], + ShortCut.RUN_TESTSUITE_DEBUG : [Key.KEY_ALT, Key.KEY_SHIFT, Key.KEY_F6], + ShortCut.RUN_TESTS_OVERALL : [Key.KEY_ALT, Key.KEY_F7], + ShortCut.STOP_TEST_RUN : [Key.KEY_ALT, Key.KEY_F8], + ShortCut.RERUN_TESTS : [Key.KEY_ALT, Key.KEY_F5], + ShortCut.RERUN_TESTS_DEBUG : [Key.KEY_ALT, Key.KEY_F6], + ShortCut.RERUN_TESTS_UNTIL_FAILURE : [Key.KEY_CTRL, Key.KEY_ALT, Key.KEY_F5], ShortCut.CREATE_TEST : [Key.KEY_CTRL, Key.KEY_ALT, Key.KEY_F10], } -static func default_keys(shortcut :ShortCut) -> PackedInt32Array: +const SETTINGS_MAPPING: Dictionary[ShortCut, String] = { + ShortCut.RUN_TESTCASE : GdUnitSettings.SHORTCUT_EDITOR_RUN_TEST, + ShortCut.RUN_TESTCASE_DEBUG : GdUnitSettings.SHORTCUT_EDITOR_RUN_TEST_DEBUG, + ShortCut.CREATE_TEST : GdUnitSettings.SHORTCUT_EDITOR_CREATE_TEST, + ShortCut.RERUN_TESTS : GdUnitSettings.SHORTCUT_INSPECTOR_RERUN_TEST, + ShortCut.RERUN_TESTS_DEBUG : GdUnitSettings.SHORTCUT_INSPECTOR_RERUN_TEST_DEBUG, + ShortCut.RERUN_TESTS_UNTIL_FAILURE : GdUnitSettings.SHORTCUT_INSPECTOR_RERUN_TEST_UNTIL_FAILURE, + ShortCut.STOP_TEST_RUN : GdUnitSettings.SHORTCUT_INSPECTOR_RUN_TEST_STOP, + ShortCut.RUN_TESTS_OVERALL : GdUnitSettings.SHORTCUT_INSPECTOR_RUN_TEST_OVERALL, + ShortCut.RUN_TESTSUITE : GdUnitSettings.SHORTCUT_FILESYSTEM_RUN_TEST, + ShortCut.RUN_TESTSUITE_DEBUG : GdUnitSettings.SHORTCUT_FILESYSTEM_RUN_TEST_DEBUG +} + + +static func as_property(sortcut: ShortCut) -> String: + return SETTINGS_MAPPING[sortcut] + + +static func default_keys(shortcut: ShortCut) -> PackedInt32Array: match OS.get_name().to_lower(): 'windows': return DEFAULTS_WINDOWS[shortcut] diff --git a/addons/gdUnit4/src/core/command/GdUnitShortcut.gd.uid b/addons/gdUnit4/src/core/command/GdUnitShortcut.gd.uid index 152b6733..9cb1e407 100644 --- a/addons/gdUnit4/src/core/command/GdUnitShortcut.gd.uid +++ b/addons/gdUnit4/src/core/command/GdUnitShortcut.gd.uid @@ -1 +1 @@ -uid://4474hld76v4k +uid://dctta8yb8myvp diff --git a/addons/gdUnit4/src/core/command/GdUnitShortcutAction.gd b/addons/gdUnit4/src/core/command/GdUnitShortcutAction.gd deleted file mode 100644 index c49e83e5..00000000 --- a/addons/gdUnit4/src/core/command/GdUnitShortcutAction.gd +++ /dev/null @@ -1,40 +0,0 @@ -class_name GdUnitShortcutAction -extends RefCounted - - -func _init(p_type :GdUnitShortcut.ShortCut, p_shortcut :Shortcut, p_command :String) -> void: - assert(p_type != null, "missing parameter 'type'") - assert(p_shortcut != null, "missing parameter 'shortcut'") - assert(p_command != null, "missing parameter 'command'") - self.type = p_type - self.shortcut = p_shortcut - self.command = p_command - - -var type: GdUnitShortcut.ShortCut: - set(value): - type = value - get: - return type - - -var shortcut: Shortcut: - set(value): - shortcut = value - get: - return shortcut - - -var command: String: - set(value): - command = value - get: - return command - - -func update_shortcut(input_event: InputEventKey) -> void: - shortcut.set_events([input_event]) - - -func _to_string() -> String: - return "GdUnitShortcutAction: %s (%s) -> %s" % [GdUnitShortcut.ShortCut.keys()[type], shortcut.get_as_text(), command] diff --git a/addons/gdUnit4/src/core/command/GdUnitShortcutAction.gd.uid b/addons/gdUnit4/src/core/command/GdUnitShortcutAction.gd.uid deleted file mode 100644 index e469addf..00000000 --- a/addons/gdUnit4/src/core/command/GdUnitShortcutAction.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://duy84b0dubou0 diff --git a/addons/gdUnit4/src/core/discovery/GdUnitGUID.gd.uid b/addons/gdUnit4/src/core/discovery/GdUnitGUID.gd.uid index 1d4bb3cb..7e57eb9c 100644 --- a/addons/gdUnit4/src/core/discovery/GdUnitGUID.gd.uid +++ b/addons/gdUnit4/src/core/discovery/GdUnitGUID.gd.uid @@ -1 +1 @@ -uid://djg12w0iicfai +uid://woptrmtubm02 diff --git a/addons/gdUnit4/src/core/discovery/GdUnitTestCase.gd.uid b/addons/gdUnit4/src/core/discovery/GdUnitTestCase.gd.uid index 24a3b713..5ec8420e 100644 --- a/addons/gdUnit4/src/core/discovery/GdUnitTestCase.gd.uid +++ b/addons/gdUnit4/src/core/discovery/GdUnitTestCase.gd.uid @@ -1 +1 @@ -uid://xpqoaxpt8ndk +uid://dqv0v5bmpnqvo diff --git a/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverGuard.gd.uid b/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverGuard.gd.uid index 938d3e7d..bd78ed2f 100644 --- a/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverGuard.gd.uid +++ b/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverGuard.gd.uid @@ -1 +1 @@ -uid://6p5153acn0jg +uid://cswsqvbj1wkbq diff --git a/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverSink.gd.uid b/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverSink.gd.uid index 563f17d1..3ec59483 100644 --- a/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverSink.gd.uid +++ b/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverSink.gd.uid @@ -1 +1 @@ -uid://b56m02detescl +uid://dltfmiqmto4sc diff --git a/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverer.gd b/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverer.gd index 0d911fef..cb3e4071 100644 --- a/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverer.gd +++ b/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverer.gd @@ -150,6 +150,8 @@ static func scan_test_directories(base_directory: String, test_directory: String if directory.begins_with("."): continue var current_directory := normalize_path(base_directory + "/" + directory) + if FileAccess.file_exists(current_directory + "/.gdignore"): + continue if GdUnitTestSuiteScanner.exclude_scan_directories.has(current_directory): continue if match_test_directory(directory, test_directory): diff --git a/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverer.gd.uid b/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverer.gd.uid index 31dcc7fb..f9e047af 100644 --- a/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverer.gd.uid +++ b/addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverer.gd.uid @@ -1 +1 @@ -uid://d4fcciiaycjg0 +uid://bhn5aljh3eh2c diff --git a/addons/gdUnit4/src/core/event/GdUnitEvent.gd b/addons/gdUnit4/src/core/event/GdUnitEvent.gd index 6bec1059..fb5a3a68 100644 --- a/addons/gdUnit4/src/core/event/GdUnitEvent.gd +++ b/addons/gdUnit4/src/core/event/GdUnitEvent.gd @@ -63,9 +63,10 @@ func test_before(p_guid: GdUnitGUID) -> GdUnitEvent: return self -func test_after(p_guid: GdUnitGUID, p_statistics: Dictionary = {}, p_reports :Array[GdUnitReport] = []) -> GdUnitEvent: +func test_after(p_guid: GdUnitGUID, name: String, p_statistics: Dictionary = {}, p_reports :Array[GdUnitReport] = []) -> GdUnitEvent: _event_type = TESTCASE_AFTER _guid = p_guid + _test_name = name _statistics = p_statistics _reports = p_reports return self @@ -132,7 +133,7 @@ func is_success() -> bool: func is_warning() -> bool: - return _statistics.get(WARNINGS, false) + return _statistics.get(WARNINGS, false) or orphan_nodes() > 0 func is_failed() -> bool: diff --git a/addons/gdUnit4/src/core/event/GdUnitEvent.gd.uid b/addons/gdUnit4/src/core/event/GdUnitEvent.gd.uid index 2ec6e8e6..379fe1ad 100644 --- a/addons/gdUnit4/src/core/event/GdUnitEvent.gd.uid +++ b/addons/gdUnit4/src/core/event/GdUnitEvent.gd.uid @@ -1 +1 @@ -uid://0vyuxbifi0mn +uid://cpldpbhgudsag diff --git a/addons/gdUnit4/src/core/event/GdUnitEventInit.gd.uid b/addons/gdUnit4/src/core/event/GdUnitEventInit.gd.uid index 04fac6a6..9d6a8bb9 100644 --- a/addons/gdUnit4/src/core/event/GdUnitEventInit.gd.uid +++ b/addons/gdUnit4/src/core/event/GdUnitEventInit.gd.uid @@ -1 +1 @@ -uid://dk6pvrtk6e1mj +uid://c061vwno81dyw diff --git a/addons/gdUnit4/src/core/event/GdUnitEventStop.gd.uid b/addons/gdUnit4/src/core/event/GdUnitEventStop.gd.uid index 07e0e005..503b8110 100644 --- a/addons/gdUnit4/src/core/event/GdUnitEventStop.gd.uid +++ b/addons/gdUnit4/src/core/event/GdUnitEventStop.gd.uid @@ -1 +1 @@ -uid://cehbqsaxr3w47 +uid://cpsn5cqqrk7pe diff --git a/addons/gdUnit4/src/core/event/GdUnitEventTestDiscoverEnd.gd.uid b/addons/gdUnit4/src/core/event/GdUnitEventTestDiscoverEnd.gd.uid index b0baa5a9..acb4d8b4 100644 --- a/addons/gdUnit4/src/core/event/GdUnitEventTestDiscoverEnd.gd.uid +++ b/addons/gdUnit4/src/core/event/GdUnitEventTestDiscoverEnd.gd.uid @@ -1 +1 @@ -uid://bpkndiebfgl3f +uid://becojbr4un5v3 diff --git a/addons/gdUnit4/src/core/event/GdUnitEventTestDiscoverStart.gd.uid b/addons/gdUnit4/src/core/event/GdUnitEventTestDiscoverStart.gd.uid index d740982b..8fa0c635 100644 --- a/addons/gdUnit4/src/core/event/GdUnitEventTestDiscoverStart.gd.uid +++ b/addons/gdUnit4/src/core/event/GdUnitEventTestDiscoverStart.gd.uid @@ -1 +1 @@ -uid://muefohw1yx1y +uid://cl0qtbb3qdxwq diff --git a/addons/gdUnit4/src/core/event/GdUnitSessionClose.gd.uid b/addons/gdUnit4/src/core/event/GdUnitSessionClose.gd.uid index b40198bb..512f721b 100644 --- a/addons/gdUnit4/src/core/event/GdUnitSessionClose.gd.uid +++ b/addons/gdUnit4/src/core/event/GdUnitSessionClose.gd.uid @@ -1 +1 @@ -uid://5s7oep23ihpf +uid://cuxxkokby7oxu diff --git a/addons/gdUnit4/src/core/event/GdUnitSessionStart.gd.uid b/addons/gdUnit4/src/core/event/GdUnitSessionStart.gd.uid index a06cbb41..85c07171 100644 --- a/addons/gdUnit4/src/core/event/GdUnitSessionStart.gd.uid +++ b/addons/gdUnit4/src/core/event/GdUnitSessionStart.gd.uid @@ -1 +1 @@ -uid://cnfcailp3aaoh +uid://bru0ngis7fgkh diff --git a/addons/gdUnit4/src/core/execution/GdUnitExecutionContext.gd b/addons/gdUnit4/src/core/execution/GdUnitExecutionContext.gd index 457fd678..844561b1 100644 --- a/addons/gdUnit4/src/core/execution/GdUnitExecutionContext.gd +++ b/addons/gdUnit4/src/core/execution/GdUnitExecutionContext.gd @@ -22,7 +22,6 @@ var _name: String var _test_execution_iteration: int = 0 var _flaky_test_check := GdUnitSettings.is_test_flaky_check_enabled() var _flaky_test_retries := GdUnitSettings.get_flaky_max_retries() -var _orphans := -1 var error_monitor: GodotGdErrorMonitor = null: @@ -53,7 +52,11 @@ func _init(name: StringName, parent_context: GdUnitExecutionContext = null) -> v _parent_context = parent_context _timer = LocalTime.now() _orphan_monitor = GdUnitOrphanNodesMonitor.new(name) - _orphan_monitor.start() + + if parent_context != null: + parent_context._orphan_monitor.add_child_monitor(_orphan_monitor) + orphan_monitor_start() + _memory_observer = GdUnitMemoryObserver.new() _report_collector = GdUnitTestReportCollector.new() if parent_context != null: @@ -61,6 +64,8 @@ func _init(name: StringName, parent_context: GdUnitExecutionContext = null) -> v func dispose() -> void: + if test_suite != null: + test_suite.free() _timer = null _orphan_monitor = null _report_collector = null @@ -77,6 +82,11 @@ func dispose_sub_contexts() -> void: _sub_context.clear() +func terminate() -> void: + if test_case: + test_case.do_terminate() + + static func of(pe: GdUnitExecutionContext) -> GdUnitExecutionContext: var context := GdUnitExecutionContext.new(pe._test_case_name, pe) context._test_case_name = pe._test_case_name @@ -84,16 +94,9 @@ static func of(pe: GdUnitExecutionContext) -> GdUnitExecutionContext: return context -static func of_test_suite(p_test_suite: GdUnitTestSuite) -> GdUnitExecutionContext: - assert(p_test_suite, "test_suite is null") - var context := GdUnitExecutionContext.new(p_test_suite.get_name()) - context.test_suite = p_test_suite - return context - - static func of_test_case(pe: GdUnitExecutionContext, p_test_case: _TestCase) -> GdUnitExecutionContext: assert(p_test_case, "test_case is null") - var context := GdUnitExecutionContext.new(p_test_case.get_name(), pe) + var context := GdUnitExecutionContext.new(p_test_case.test_name(), pe) context.test_case = p_test_case return context @@ -124,7 +127,7 @@ func error_monitor_start() -> void: func error_monitor_stop() -> void: - await error_monitor.scan() + error_monitor.stop() for error_report in error_monitor.to_reports(): if error_report.is_error(): _report_collector.push_back(error_report) @@ -134,6 +137,10 @@ func orphan_monitor_start() -> void: _orphan_monitor.start() +func orphan_monitor_collect() -> void: + _orphan_monitor.collect() + + func orphan_monitor_stop() -> void: _orphan_monitor.stop() @@ -165,8 +172,8 @@ func calculate_statistics(reports_: Array[GdUnitReport]) -> Dictionary: var error_count := GdUnitTestReportCollector.count_errors(reports_) var warn_count := GdUnitTestReportCollector.count_warnings(reports_) var skip_count := GdUnitTestReportCollector.count_skipped(reports_) + var orphan_count := GdUnitTestReportCollector.count_orphans(reports_) var is_failed := !is_success() - var orphan_count := _count_orphans() var elapsed_time := _timer.elapsed_since_ms() var retries := 1 if _parent_context == null else _sub_context.size() # Mark as flaky if it is successful, but errors were counted @@ -213,22 +220,6 @@ func is_interupted() -> bool: return false if test_case == null else test_case.is_interupted() -func _count_orphans() -> int: - if _orphans != -1: - return _orphans - - var orphans := 0 - for c in _sub_context: - if _orphan_monitor.orphan_nodes() != c._orphan_monitor.orphan_nodes(): - orphans += c._count_orphans() - - _orphans = _orphan_monitor.orphan_nodes() - if _orphan_monitor.orphan_nodes() != orphans: - _orphans -= orphans - - return _orphans - - func sum(accum: int, number: int) -> int: return accum + number @@ -251,19 +242,33 @@ func gc(gc_orphan_check: GC_ORPHANS_CHECK = GC_ORPHANS_CHECK.NONE) -> void: await _memory_observer.gc() orphan_monitor_stop() - var orphans := _count_orphans() match(gc_orphan_check): GC_ORPHANS_CHECK.SUITE_HOOK_AFTER: - if orphans > 0: - reports().push_front(GdUnitReport.new() \ - .create(GdUnitReport.WARN, 1, GdAssertMessages.orphan_detected_on_suite_setup(orphans))) + _orphan_monitor.collect() + var orphan_infos := _orphan_monitor.detected_orphans() + if orphan_infos.is_empty(): + return + reports().push_front(GdUnitReport.new() \ + .create(GdUnitReport.ORPHAN, 1, GdAssertMessages.orphan_detected_on_suite_setup(orphan_infos)) + .with_current_value(orphan_infos.size())) GC_ORPHANS_CHECK.TEST_HOOK_AFTER: - if orphans > 0: + _orphan_monitor.collect() + var orphans := _orphan_monitor.detected_orphans() + if not orphans.is_empty(): reports().push_front(GdUnitReport.new()\ - .create(GdUnitReport.WARN, 1, GdAssertMessages.orphan_detected_on_test_setup(orphans))) + .create(GdUnitReport.ORPHAN, 1, GdAssertMessages.orphan_detected_on_test_setup(orphans)) + .with_current_value(orphans.size())) GC_ORPHANS_CHECK.TEST_CASE: - if orphans > 0: + var orphans := _orphan_monitor.detected_orphans() + if orphans.is_empty(): + var orphans_count := _orphan_monitor.orphans_count() + if orphans_count > 0: + reports().push_front(GdUnitReport.new() \ + .create(GdUnitReport.ORPHAN, test_case.line_number(), GdAssertMessages.orphan_warning(orphans_count)) + .with_current_value(orphans_count)) + else: reports().push_front(GdUnitReport.new()\ - .create(GdUnitReport.WARN, test_case.line_number(), GdAssertMessages.orphan_detected_on_test(orphans))) + .create(GdUnitReport.ORPHAN, test_case.line_number(), GdAssertMessages.orphan_detected_on_test(orphans)) + .with_current_value(orphans.size())) diff --git a/addons/gdUnit4/src/core/execution/GdUnitExecutionContext.gd.uid b/addons/gdUnit4/src/core/execution/GdUnitExecutionContext.gd.uid index 4f44133e..1e720f6a 100644 --- a/addons/gdUnit4/src/core/execution/GdUnitExecutionContext.gd.uid +++ b/addons/gdUnit4/src/core/execution/GdUnitExecutionContext.gd.uid @@ -1 +1 @@ -uid://233mffe3wskq +uid://cljds2cgglwrc diff --git a/addons/gdUnit4/src/core/execution/GdUnitMemoryObserver.gd.uid b/addons/gdUnit4/src/core/execution/GdUnitMemoryObserver.gd.uid index 34c0dbd8..17accaf5 100644 --- a/addons/gdUnit4/src/core/execution/GdUnitMemoryObserver.gd.uid +++ b/addons/gdUnit4/src/core/execution/GdUnitMemoryObserver.gd.uid @@ -1 +1 @@ -uid://baqhilf43vgeg +uid://budgjoc6da01j diff --git a/addons/gdUnit4/src/core/execution/GdUnitTestReportCollector.gd b/addons/gdUnit4/src/core/execution/GdUnitTestReportCollector.gd index 5f42d148..91247bd0 100644 --- a/addons/gdUnit4/src/core/execution/GdUnitTestReportCollector.gd +++ b/addons/gdUnit4/src/core/execution/GdUnitTestReportCollector.gd @@ -22,6 +22,10 @@ static func __filter_is_skipped(report :GdUnitReport) -> bool: return report.is_skipped() +static func __filter_is_orphan(report: GdUnitReport) -> bool: + return report.is_orphan() + + static func count_failures(reports_: Array[GdUnitReport]) -> int: return reports_.filter(__filter_is_failure).size() @@ -38,6 +42,17 @@ static func count_skipped(reports_: Array[GdUnitReport]) -> int: return reports_.filter(__filter_is_skipped).size() +static func count_orphans(reports_: Array[GdUnitReport]) -> int: + var orphan_reports := reports_.filter(__filter_is_orphan) + if orphan_reports.is_empty(): + return 0 + ## Collect orphan count from the reports + var orphans := 0 + for report: GdUnitReport in orphan_reports: + orphans += report._current_value + return orphans + + func has_failures() -> bool: return _reports.any(__filter_is_failure) diff --git a/addons/gdUnit4/src/core/execution/GdUnitTestReportCollector.gd.uid b/addons/gdUnit4/src/core/execution/GdUnitTestReportCollector.gd.uid index 0cd4ec82..1f1f1230 100644 --- a/addons/gdUnit4/src/core/execution/GdUnitTestReportCollector.gd.uid +++ b/addons/gdUnit4/src/core/execution/GdUnitTestReportCollector.gd.uid @@ -1 +1 @@ -uid://b4r7exritngk4 +uid://curlrrucku7sn diff --git a/addons/gdUnit4/src/core/execution/GdUnitTestSuiteExecutor.gd b/addons/gdUnit4/src/core/execution/GdUnitTestSuiteExecutor.gd index e3fd510c..dfb4441e 100644 --- a/addons/gdUnit4/src/core/execution/GdUnitTestSuiteExecutor.gd +++ b/addons/gdUnit4/src/core/execution/GdUnitTestSuiteExecutor.gd @@ -7,37 +7,45 @@ class_name GdUnitTestSuiteExecutor var _assertions := GdUnitAssertions.new() var _executeStage := GdUnitTestSuiteExecutionStage.new() var _debug_mode : bool +var _terminated := false -func _init(debug_mode :bool = false) -> void: +func _init(debug_mode: bool = false) -> void: _executeStage.set_debug_mode(debug_mode) _debug_mode = debug_mode + GdUnitSignals.instance().gdunit_test_session_terminate.connect(_on_testsession_terminated) -func execute(test_suite :GdUnitTestSuite) -> void: - var orphan_detection_enabled := GdUnitSettings.is_verbose_orphans() - if not orphan_detection_enabled: - prints("!!! Reporting orphan nodes is disabled. Please check GdUnit settings.") - - (Engine.get_main_loop() as SceneTree).root.call_deferred("add_child", test_suite) - await (Engine.get_main_loop() as SceneTree).process_frame - await _executeStage.execute(GdUnitExecutionContext.of_test_suite(test_suite)) +func _on_testsession_terminated() -> void: + _terminated = true + GdUnitThreadManager.interrupt() func run_and_wait(tests: Array[GdUnitTestCase]) -> void: if !_debug_mode: GdUnitSignals.instance().gdunit_event.emit(GdUnitInit.new()) + + var orphan_detection_enabled := GdUnitSettings.is_verbose_orphans() + if not orphan_detection_enabled: + prints("!!! Reporting orphan nodes is disabled. Please check GdUnit settings.") + # first we group all tests by resource path var grouped_by_suites := GdArrayTools.group_by(tests, func(test: GdUnitTestCase) -> String: return test.suite_resource_path ) var scanner := GdUnitTestSuiteScanner.new() for suite_path: String in grouped_by_suites.keys(): + if _terminated: + break @warning_ignore("unsafe_call_argument") var suite_tests: Array[GdUnitTestCase] = Array(grouped_by_suites[suite_path], TYPE_OBJECT, "RefCounted", GdUnitTestCase) var script := GdUnitTestSuiteScanner.load_with_disabled_warnings(suite_path) if script.get_class() == "GDScript": + var context := GdUnitExecutionContext.new(suite_path) var test_suite := scanner.load_suite(script as GDScript, suite_tests) - await execute(test_suite) + context.test_suite = test_suite + (Engine.get_main_loop() as SceneTree).root.add_child(test_suite) + await _executeStage.execute(context) + context.dispose() else: await GdUnit4CSharpApiLoader.execute(suite_tests) if !_debug_mode: diff --git a/addons/gdUnit4/src/core/execution/GdUnitTestSuiteExecutor.gd.uid b/addons/gdUnit4/src/core/execution/GdUnitTestSuiteExecutor.gd.uid index 76b29c18..b6fc0137 100644 --- a/addons/gdUnit4/src/core/execution/GdUnitTestSuiteExecutor.gd.uid +++ b/addons/gdUnit4/src/core/execution/GdUnitTestSuiteExecutor.gd.uid @@ -1 +1 @@ -uid://cun41u3qp3uh3 +uid://bp1vqsqrqf8rh diff --git a/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseAfterStage.gd b/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseAfterStage.gd index d3c62455..f106f217 100644 --- a/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseAfterStage.gd +++ b/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseAfterStage.gd @@ -19,4 +19,4 @@ func _execute(context: GdUnitExecutionContext) -> void: await test_suite.after_test() await context.gc(GdUnitExecutionContext.GC_ORPHANS_CHECK.TEST_HOOK_AFTER) - await context.error_monitor_stop() + context.error_monitor_stop() diff --git a/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseAfterStage.gd.uid b/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseAfterStage.gd.uid index a8670ef7..4ad3acc0 100644 --- a/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseAfterStage.gd.uid +++ b/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseAfterStage.gd.uid @@ -1 +1 @@ -uid://ctphbbips41gc +uid://c28y70hng16gm diff --git a/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseBeforeStage.gd b/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseBeforeStage.gd index 4e04fad2..d7790a9c 100644 --- a/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseBeforeStage.gd +++ b/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseBeforeStage.gd @@ -10,10 +10,11 @@ func _init(call_stage := true) -> void: _call_stage = call_stage -func _execute(context :GdUnitExecutionContext) -> void: +func _execute(context: GdUnitExecutionContext) -> void: var test_suite := context.test_suite if _call_stage: @warning_ignore("redundant_await") await test_suite.before_test() + context.error_monitor_start() diff --git a/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseBeforeStage.gd.uid b/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseBeforeStage.gd.uid index 5efe8349..1f7bea21 100644 --- a/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseBeforeStage.gd.uid +++ b/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseBeforeStage.gd.uid @@ -1 +1 @@ -uid://ccgmqswkrrdkn +uid://scxtekq1fmsl diff --git a/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseExecutionStage.gd b/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseExecutionStage.gd index 12cc6fde..473f1e2e 100644 --- a/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseExecutionStage.gd +++ b/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseExecutionStage.gd @@ -24,7 +24,7 @@ func _execute(context :GdUnitExecutionContext) -> void: await _stage_single_test.execute(context) await context.gc() - await context.error_monitor_stop() + context.error_monitor_stop() # finally free the test instance if is_instance_valid(context.test_case): diff --git a/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseExecutionStage.gd.uid b/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseExecutionStage.gd.uid index 496b38fe..378a66c4 100644 --- a/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseExecutionStage.gd.uid +++ b/addons/gdUnit4/src/core/execution/stages/GdUnitTestCaseExecutionStage.gd.uid @@ -1 +1 @@ -uid://cjm7hukt5g0dk +uid://cy61fdxp2c1tp diff --git a/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteAfterStage.gd.uid b/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteAfterStage.gd.uid index 2fe086f9..5f3c254b 100644 --- a/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteAfterStage.gd.uid +++ b/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteAfterStage.gd.uid @@ -1 +1 @@ -uid://cvdniahcsrvks +uid://sntd0kdr0bfl diff --git a/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteBeforeStage.gd b/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteBeforeStage.gd index e9fa7186..a6ed8c5f 100644 --- a/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteBeforeStage.gd +++ b/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteBeforeStage.gd @@ -4,7 +4,7 @@ class_name GdUnitTestSuiteBeforeStage extends IGdUnitExecutionStage -func _execute(context :GdUnitExecutionContext) -> void: +func _execute(context: GdUnitExecutionContext) -> void: var test_suite := context.test_suite fire_event(GdUnitEvent.new()\ diff --git a/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteBeforeStage.gd.uid b/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteBeforeStage.gd.uid index 5eb7403e..d58de9bc 100644 --- a/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteBeforeStage.gd.uid +++ b/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteBeforeStage.gd.uid @@ -1 +1 @@ -uid://c4tq8tfwh8irb +uid://dp8arq8n4r3j8 diff --git a/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteExecutionStage.gd b/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteExecutionStage.gd index ac921e07..07e3779d 100644 --- a/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteExecutionStage.gd +++ b/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteExecutionStage.gd @@ -28,9 +28,10 @@ func _execute(context :GdUnitExecutionContext) -> void: if not is_instance_valid(test_case): continue context.test_suite.set_active_test_case(test_case.test_name()) - await _stage_test.execute(GdUnitExecutionContext.of_test_case(context, test_case)) + var test_case_context := GdUnitExecutionContext.of_test_case(context, test_case) + await _stage_test.execute(test_case_context) # stop on first error or if fail fast is enabled - if _fail_fast and not context.is_success(): + if test_case.is_terminated() or (_fail_fast and not test_case_context.is_success()): break if test_case.is_interupted(): # it needs to go this hard way to kill the outstanding awaits of a test case when the test timed out @@ -39,9 +40,8 @@ func _execute(context :GdUnitExecutionContext) -> void: context.test_suite = await clone_test_suite(context.test_suite) await _stage_after.execute(context) GdUnitMemoryObserver.unguard_instance(context.test_suite.__awaiter) + await (Engine.get_main_loop() as SceneTree).process_frame - context.test_suite.free() - context.dispose() # clones a test suite and moves the test cases to new instance @@ -133,7 +133,7 @@ func fire_test_skipped(context: GdUnitExecutionContext, skip_count := 1) -> void } var report := GdUnitReport.new() \ .create(GdUnitReport.SKIPPED, test_case.line_number(), GdAssertMessages.test_skipped("Skipped from the entire test suite")) - fire_event(GdUnitEvent.new().test_after(test_case.id(), statistics, [report])) + fire_event(GdUnitEvent.new().test_after(test_case.id(), test_case.test_name(), statistics, [report])) func set_debug_mode(debug_mode :bool = false) -> void: diff --git a/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteExecutionStage.gd.uid b/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteExecutionStage.gd.uid index 11b78802..fc7aef13 100644 --- a/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteExecutionStage.gd.uid +++ b/addons/gdUnit4/src/core/execution/stages/GdUnitTestSuiteExecutionStage.gd.uid @@ -1 +1 @@ -uid://mo6jkmhhcegj +uid://lnip7drnb25d diff --git a/addons/gdUnit4/src/core/execution/stages/IGdUnitExecutionStage.gd b/addons/gdUnit4/src/core/execution/stages/IGdUnitExecutionStage.gd index 39de3809..a04f7e78 100644 --- a/addons/gdUnit4/src/core/execution/stages/IGdUnitExecutionStage.gd +++ b/addons/gdUnit4/src/core/execution/stages/IGdUnitExecutionStage.gd @@ -1,7 +1,7 @@ ## The interface of execution stage.[br] ## An execution stage is defined as an encapsulated task that can execute 1-n substages covered by its own execution context.[br] ## Execution stage are always called synchronously. -class_name IGdUnitExecutionStage +@abstract class_name IGdUnitExecutionStage extends RefCounted var _debug_mode := false @@ -13,14 +13,14 @@ var _debug_mode := false ## # waits for 100ms ## await MyExecutionStage.new().execute() ## [/codeblock][br] -func execute(context :GdUnitExecutionContext) -> void: +func execute(context: GdUnitExecutionContext) -> void: GdUnitThreadManager.get_current_context().set_execution_context(context) @warning_ignore("redundant_await") await _execute(context) ## Sends the event to registered listeners -func fire_event(event :GdUnitEvent) -> void: +func fire_event(event: GdUnitEvent) -> void: if _debug_mode: GdUnitSignals.instance().gdunit_event_debug.emit(event) else: @@ -29,11 +29,9 @@ func fire_event(event :GdUnitEvent) -> void: ## Internal testing stuff.[br] ## Sets the executor into debug mode to emit `GdUnitEvent` via signal `gdunit_event_debug` -func set_debug_mode(debug_mode :bool) -> void: +func set_debug_mode(debug_mode: bool) -> void: _debug_mode = debug_mode ## The execution phase to be carried out. -func _execute(_context :GdUnitExecutionContext) -> void: - @warning_ignore("assert_always_false") - assert(false, "The execution stage is not implemented") +@abstract func _execute(context: GdUnitExecutionContext) -> void diff --git a/addons/gdUnit4/src/core/execution/stages/IGdUnitExecutionStage.gd.uid b/addons/gdUnit4/src/core/execution/stages/IGdUnitExecutionStage.gd.uid index aea3ad8c..2a7463d1 100644 --- a/addons/gdUnit4/src/core/execution/stages/IGdUnitExecutionStage.gd.uid +++ b/addons/gdUnit4/src/core/execution/stages/IGdUnitExecutionStage.gd.uid @@ -1 +1 @@ -uid://bnkyt48dv3qpg +uid://b2m0618ruybo2 diff --git a/addons/gdUnit4/src/core/execution/stages/fuzzed/GdUnitTestCaseFuzzedExecutionStage.gd b/addons/gdUnit4/src/core/execution/stages/fuzzed/GdUnitTestCaseFuzzedExecutionStage.gd index 73a7a66e..c1e09241 100644 --- a/addons/gdUnit4/src/core/execution/stages/fuzzed/GdUnitTestCaseFuzzedExecutionStage.gd +++ b/addons/gdUnit4/src/core/execution/stages/fuzzed/GdUnitTestCaseFuzzedExecutionStage.gd @@ -25,7 +25,7 @@ func _execute(context :GdUnitExecutionContext) -> void: else: var reports: = context.collect_reports(true) var statistics := context.calculate_statistics(reports) - fire_event(GdUnitEvent.new().test_after(context.test_case.id(), statistics, reports)) + fire_event(GdUnitEvent.new().test_after(context.test_case.id(), context.test_case.test_name(), statistics, reports)) func set_debug_mode(debug_mode :bool = false) -> void: super.set_debug_mode(debug_mode) @@ -49,4 +49,4 @@ func fire_test_skipped(context: GdUnitExecutionContext) -> void: } var report := GdUnitReport.new() \ .create(GdUnitReport.SKIPPED, test_case.line_number(), GdAssertMessages.test_skipped(test_case.skip_info())) - fire_event(GdUnitEvent.new().test_after(test_case.id(), statistics, [report])) + fire_event(GdUnitEvent.new().test_after(test_case.id(), test_case.test_name(), statistics, [report])) diff --git a/addons/gdUnit4/src/core/execution/stages/fuzzed/GdUnitTestCaseFuzzedExecutionStage.gd.uid b/addons/gdUnit4/src/core/execution/stages/fuzzed/GdUnitTestCaseFuzzedExecutionStage.gd.uid index fd4dd62a..409b435c 100644 --- a/addons/gdUnit4/src/core/execution/stages/fuzzed/GdUnitTestCaseFuzzedExecutionStage.gd.uid +++ b/addons/gdUnit4/src/core/execution/stages/fuzzed/GdUnitTestCaseFuzzedExecutionStage.gd.uid @@ -1 +1 @@ -uid://c217e5ynlwht4 +uid://bgug23rrkt1u8 diff --git a/addons/gdUnit4/src/core/execution/stages/fuzzed/GdUnitTestCaseFuzzedTestStage.gd.uid b/addons/gdUnit4/src/core/execution/stages/fuzzed/GdUnitTestCaseFuzzedTestStage.gd.uid index bab9094a..5a5d4565 100644 --- a/addons/gdUnit4/src/core/execution/stages/fuzzed/GdUnitTestCaseFuzzedTestStage.gd.uid +++ b/addons/gdUnit4/src/core/execution/stages/fuzzed/GdUnitTestCaseFuzzedTestStage.gd.uid @@ -1 +1 @@ -uid://ba5cr0pv2m03r +uid://bgvixkdcfbyuc diff --git a/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleExecutionStage.gd b/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleExecutionStage.gd index 70d687f4..03f8fa53 100644 --- a/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleExecutionStage.gd +++ b/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleExecutionStage.gd @@ -25,7 +25,7 @@ func _execute(context :GdUnitExecutionContext) -> void: else: var reports: = context.collect_reports(true) var statistics := context.calculate_statistics(reports) - fire_event(GdUnitEvent.new().test_after(context.test_case.id(), statistics, reports)) + fire_event(GdUnitEvent.new().test_after(context.test_case.id(), context.test_case.test_name(), statistics, reports)) func set_debug_mode(debug_mode :bool = false) -> void: @@ -50,4 +50,4 @@ func fire_test_skipped(context: GdUnitExecutionContext) -> void: } var report := GdUnitReport.new() \ .create(GdUnitReport.SKIPPED, test_case.line_number(), GdAssertMessages.test_skipped(test_case.skip_info())) - fire_event(GdUnitEvent.new().test_after(test_case.id(), statistics, [report])) + fire_event(GdUnitEvent.new().test_after(test_case.id(), test_case.test_name(), statistics, [report])) diff --git a/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleExecutionStage.gd.uid b/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleExecutionStage.gd.uid index 9328ca9a..c5467b06 100644 --- a/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleExecutionStage.gd.uid +++ b/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleExecutionStage.gd.uid @@ -1 +1 @@ -uid://de2bb4vcpcdw2 +uid://c0hknx7awg3xx diff --git a/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleTestStage.gd b/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleTestStage.gd index 9006b368..b8ace502 100644 --- a/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleTestStage.gd +++ b/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleTestStage.gd @@ -6,6 +6,6 @@ extends IGdUnitExecutionStage ## Executes a single test case 'test_()'.[br] ## It executes synchronized following stages[br] ## -> test_case() [br] -func _execute(context :GdUnitExecutionContext) -> void: +func _execute(context: GdUnitExecutionContext) -> void: await context.test_case.execute() await context.gc(GdUnitExecutionContext.GC_ORPHANS_CHECK.TEST_CASE) diff --git a/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleTestStage.gd.uid b/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleTestStage.gd.uid index e7ac1174..e6b79c68 100644 --- a/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleTestStage.gd.uid +++ b/addons/gdUnit4/src/core/execution/stages/single/GdUnitTestCaseSingleTestStage.gd.uid @@ -1 +1 @@ -uid://bpfmb4aqyf2ow +uid://cu5udd6xflo1a diff --git a/addons/gdUnit4/src/core/hooks/GdUnitBaseReporterTestSessionHook.gd.uid b/addons/gdUnit4/src/core/hooks/GdUnitBaseReporterTestSessionHook.gd.uid index f734e4d7..83999075 100644 --- a/addons/gdUnit4/src/core/hooks/GdUnitBaseReporterTestSessionHook.gd.uid +++ b/addons/gdUnit4/src/core/hooks/GdUnitBaseReporterTestSessionHook.gd.uid @@ -1 +1 @@ -uid://bl4f3it63fcpf +uid://d37xqqbnc71nr diff --git a/addons/gdUnit4/src/core/hooks/GdUnitHtmlReporterTestSessionHook.gd.uid b/addons/gdUnit4/src/core/hooks/GdUnitHtmlReporterTestSessionHook.gd.uid index 5ee5fcff..d721c70c 100644 --- a/addons/gdUnit4/src/core/hooks/GdUnitHtmlReporterTestSessionHook.gd.uid +++ b/addons/gdUnit4/src/core/hooks/GdUnitHtmlReporterTestSessionHook.gd.uid @@ -1 +1 @@ -uid://duosr8em0lcfx +uid://cwnew6viljalv diff --git a/addons/gdUnit4/src/core/hooks/GdUnitTestSessionHook.gd.uid b/addons/gdUnit4/src/core/hooks/GdUnitTestSessionHook.gd.uid index 52dac476..5df8de7a 100644 --- a/addons/gdUnit4/src/core/hooks/GdUnitTestSessionHook.gd.uid +++ b/addons/gdUnit4/src/core/hooks/GdUnitTestSessionHook.gd.uid @@ -1 +1 @@ -uid://twyg7v88rnfo +uid://cw3pkan8olvdj diff --git a/addons/gdUnit4/src/core/hooks/GdUnitTestSessionHookService.gd.uid b/addons/gdUnit4/src/core/hooks/GdUnitTestSessionHookService.gd.uid index b9b56b89..c26822b4 100644 --- a/addons/gdUnit4/src/core/hooks/GdUnitTestSessionHookService.gd.uid +++ b/addons/gdUnit4/src/core/hooks/GdUnitTestSessionHookService.gd.uid @@ -1 +1 @@ -uid://dwndskvuv87il +uid://c7mkhhl3ddj2i diff --git a/addons/gdUnit4/src/core/hooks/GdUnitXMLReporterTestSessionHook.gd.uid b/addons/gdUnit4/src/core/hooks/GdUnitXMLReporterTestSessionHook.gd.uid index 1aa819db..7eff95a2 100644 --- a/addons/gdUnit4/src/core/hooks/GdUnitXMLReporterTestSessionHook.gd.uid +++ b/addons/gdUnit4/src/core/hooks/GdUnitXMLReporterTestSessionHook.gd.uid @@ -1 +1 @@ -uid://bsxf0ve5hw76y +uid://btbjbdm13bbmf diff --git a/addons/gdUnit4/src/core/parse/GdClassDescriptor.gd.uid b/addons/gdUnit4/src/core/parse/GdClassDescriptor.gd.uid index c0853a49..e575e29c 100644 --- a/addons/gdUnit4/src/core/parse/GdClassDescriptor.gd.uid +++ b/addons/gdUnit4/src/core/parse/GdClassDescriptor.gd.uid @@ -1 +1 @@ -uid://do5rfsltevx33 +uid://c0g6kkpeg8fvp diff --git a/addons/gdUnit4/src/core/parse/GdDefaultValueDecoder.gd.uid b/addons/gdUnit4/src/core/parse/GdDefaultValueDecoder.gd.uid index 1e8d0744..c5189b89 100644 --- a/addons/gdUnit4/src/core/parse/GdDefaultValueDecoder.gd.uid +++ b/addons/gdUnit4/src/core/parse/GdDefaultValueDecoder.gd.uid @@ -1 +1 @@ -uid://c6ne3cfhftlbk +uid://djge6mxnpibc4 diff --git a/addons/gdUnit4/src/core/parse/GdFunctionArgument.gd.uid b/addons/gdUnit4/src/core/parse/GdFunctionArgument.gd.uid index 96970ff2..0e42203d 100644 --- a/addons/gdUnit4/src/core/parse/GdFunctionArgument.gd.uid +++ b/addons/gdUnit4/src/core/parse/GdFunctionArgument.gd.uid @@ -1 +1 @@ -uid://5d82r5ehvht4 +uid://bfhpehi7mxcxr diff --git a/addons/gdUnit4/src/core/parse/GdFunctionDescriptor.gd.uid b/addons/gdUnit4/src/core/parse/GdFunctionDescriptor.gd.uid index ca0e8a09..570a5b95 100644 --- a/addons/gdUnit4/src/core/parse/GdFunctionDescriptor.gd.uid +++ b/addons/gdUnit4/src/core/parse/GdFunctionDescriptor.gd.uid @@ -1 +1 @@ -uid://b2r5u0pn3l550 +uid://ni7v10l6nkn5 diff --git a/addons/gdUnit4/src/core/parse/GdFunctionParameterSetResolver.gd.uid b/addons/gdUnit4/src/core/parse/GdFunctionParameterSetResolver.gd.uid index de18aca8..a5ed8471 100644 --- a/addons/gdUnit4/src/core/parse/GdFunctionParameterSetResolver.gd.uid +++ b/addons/gdUnit4/src/core/parse/GdFunctionParameterSetResolver.gd.uid @@ -1 +1 @@ -uid://dyskimjijmyhk +uid://4rjggswaungi diff --git a/addons/gdUnit4/src/core/parse/GdScriptParser.gd.uid b/addons/gdUnit4/src/core/parse/GdScriptParser.gd.uid index adfb2239..a208df2a 100644 --- a/addons/gdUnit4/src/core/parse/GdScriptParser.gd.uid +++ b/addons/gdUnit4/src/core/parse/GdScriptParser.gd.uid @@ -1 +1 @@ -uid://ds5dvjko4ds3c +uid://dordq57aybmhh diff --git a/addons/gdUnit4/src/core/parse/GdUnitExpressionRunner.gd.uid b/addons/gdUnit4/src/core/parse/GdUnitExpressionRunner.gd.uid index 0eed0d87..a8364e5e 100644 --- a/addons/gdUnit4/src/core/parse/GdUnitExpressionRunner.gd.uid +++ b/addons/gdUnit4/src/core/parse/GdUnitExpressionRunner.gd.uid @@ -1 +1 @@ -uid://dmuh4qf6rolkc +uid://bn2qnmtt7j4u8 diff --git a/addons/gdUnit4/src/core/parse/GdUnitTestParameterSetResolver.gd.uid b/addons/gdUnit4/src/core/parse/GdUnitTestParameterSetResolver.gd.uid index bcd6981a..d594d24b 100644 --- a/addons/gdUnit4/src/core/parse/GdUnitTestParameterSetResolver.gd.uid +++ b/addons/gdUnit4/src/core/parse/GdUnitTestParameterSetResolver.gd.uid @@ -1 +1 @@ -uid://c7xulu5ucwm8 +uid://cotphsljemq3f diff --git a/addons/gdUnit4/src/core/report/GdUnitReport.gd b/addons/gdUnit4/src/core/report/GdUnitReport.gd index eb7ed2e5..aaf309ff 100644 --- a/addons/gdUnit4/src/core/report/GdUnitReport.gd +++ b/addons/gdUnit4/src/core/report/GdUnitReport.gd @@ -16,6 +16,7 @@ enum { var _type :int var _line_number :int var _message :String +var _current_value: Variant func create(p_type :int, p_line_number :int, p_message :String) -> GdUnitReport: @@ -25,6 +26,11 @@ func create(p_type :int, p_line_number :int, p_message :String) -> GdUnitReport: return self +func with_current_value(value: Variant) -> GdUnitReport: + _current_value = value + return self + + func type() -> int: return _type @@ -53,6 +59,10 @@ func is_error() -> bool: return _type == TERMINATED or _type == INTERUPTED or _type == ABORT +func is_orphan() -> bool: + return _type == ORPHAN + + func _to_string() -> String: if _line_number == -1: return "[color=green]line [/color][color=aqua]:[/color] %s" % [_message] diff --git a/addons/gdUnit4/src/core/report/GdUnitReport.gd.uid b/addons/gdUnit4/src/core/report/GdUnitReport.gd.uid index e7643688..6f6f1b4e 100644 --- a/addons/gdUnit4/src/core/report/GdUnitReport.gd.uid +++ b/addons/gdUnit4/src/core/report/GdUnitReport.gd.uid @@ -1 +1 @@ -uid://df752hdjfqiq8 +uid://5uq7ycmqiust diff --git a/addons/gdUnit4/src/core/runners/GdUnitTestCIRunner.gd.uid b/addons/gdUnit4/src/core/runners/GdUnitTestCIRunner.gd.uid index 7dba971d..0db51186 100644 --- a/addons/gdUnit4/src/core/runners/GdUnitTestCIRunner.gd.uid +++ b/addons/gdUnit4/src/core/runners/GdUnitTestCIRunner.gd.uid @@ -1 +1 @@ -uid://calfs70rbig0l +uid://dagqvojliqpkj diff --git a/addons/gdUnit4/src/core/runners/GdUnitTestRunner.gd b/addons/gdUnit4/src/core/runners/GdUnitTestRunner.gd index 5af6c9b9..0fd8fc7b 100644 --- a/addons/gdUnit4/src/core/runners/GdUnitTestRunner.gd +++ b/addons/gdUnit4/src/core/runners/GdUnitTestRunner.gd @@ -1,3 +1,4 @@ +@tool extends "res://addons/gdUnit4/src/core/runners/GdUnitTestSessionRunner.gd" ## Runner implementation used by the editor UI.[br] ## [br] @@ -29,8 +30,9 @@ func _ready() -> void: _state = EXIT return @warning_ignore("return_value_discarded") - _client.connect("connection_failed", _on_connection_failed) + _client.connection_failed.connect(_on_connection_failed) GdUnitSignals.instance().gdunit_message.connect(_on_send_message) + _executor.fail_fast(_runner_config.is_fail_fast()) var result := _client.start("127.0.0.1", _runner_config.server_port()) if result.is_error(): push_error(result.error_message()) @@ -44,6 +46,7 @@ func quit(code: int) -> void: if code != RETURN_SUCCESS: _state = EXIT await GdUnitMemoryObserver.gc_on_guarded_instances() + await super.quit(code) ## Called when the TCP connection to the GdUnit server fails.[br] diff --git a/addons/gdUnit4/src/core/runners/GdUnitTestRunner.gd.uid b/addons/gdUnit4/src/core/runners/GdUnitTestRunner.gd.uid index 62334ce6..3ff22c8f 100644 --- a/addons/gdUnit4/src/core/runners/GdUnitTestRunner.gd.uid +++ b/addons/gdUnit4/src/core/runners/GdUnitTestRunner.gd.uid @@ -1 +1 @@ -uid://bi04qg8kl1bqq +uid://d06w1biw2bu1b diff --git a/addons/gdUnit4/src/core/runners/GdUnitTestSession.gd.uid b/addons/gdUnit4/src/core/runners/GdUnitTestSession.gd.uid index 03c78148..2b654de4 100644 --- a/addons/gdUnit4/src/core/runners/GdUnitTestSession.gd.uid +++ b/addons/gdUnit4/src/core/runners/GdUnitTestSession.gd.uid @@ -1 +1 @@ -uid://d1um8x1nfq6nb +uid://b37naxwncu2nl diff --git a/addons/gdUnit4/src/core/runners/GdUnitTestSessionRunner.gd.uid b/addons/gdUnit4/src/core/runners/GdUnitTestSessionRunner.gd.uid index 2aad1f14..06e81c23 100644 --- a/addons/gdUnit4/src/core/runners/GdUnitTestSessionRunner.gd.uid +++ b/addons/gdUnit4/src/core/runners/GdUnitTestSessionRunner.gd.uid @@ -1 +1 @@ -uid://j58ly6b5wy6x +uid://bjfhwjcpiaef1 diff --git a/addons/gdUnit4/src/core/templates/test_suite/GdUnitTestSuiteDefaultTemplate.gd.uid b/addons/gdUnit4/src/core/templates/test_suite/GdUnitTestSuiteDefaultTemplate.gd.uid index 76f99573..0a3f23aa 100644 --- a/addons/gdUnit4/src/core/templates/test_suite/GdUnitTestSuiteDefaultTemplate.gd.uid +++ b/addons/gdUnit4/src/core/templates/test_suite/GdUnitTestSuiteDefaultTemplate.gd.uid @@ -1 +1 @@ -uid://1vff42r7mww3 +uid://01uaegsfwhoa diff --git a/addons/gdUnit4/src/core/templates/test_suite/GdUnitTestSuiteTemplate.gd.uid b/addons/gdUnit4/src/core/templates/test_suite/GdUnitTestSuiteTemplate.gd.uid index 92c886ba..7ef72d1b 100644 --- a/addons/gdUnit4/src/core/templates/test_suite/GdUnitTestSuiteTemplate.gd.uid +++ b/addons/gdUnit4/src/core/templates/test_suite/GdUnitTestSuiteTemplate.gd.uid @@ -1 +1 @@ -uid://c2818yqqryxs4 +uid://tnlrrdk54qpa diff --git a/addons/gdUnit4/src/core/thread/GdUnitThreadContext.gd b/addons/gdUnit4/src/core/thread/GdUnitThreadContext.gd index f2b2672c..402199b6 100644 --- a/addons/gdUnit4/src/core/thread/GdUnitThreadContext.gd +++ b/addons/gdUnit4/src/core/thread/GdUnitThreadContext.gd @@ -1,15 +1,15 @@ class_name GdUnitThreadContext extends RefCounted -var _thread :Thread -var _thread_name :String -var _thread_id :int -var _signal_collector :GdUnitSignalCollector -var _execution_context :GdUnitExecutionContext +var _thread: Thread +var _thread_name: String +var _thread_id: int +var _signal_collector: GdUnitSignalCollector +var _execution_context: GdUnitExecutionContext var _asserts := [] -func _init(thread :Thread = null) -> void: +func _init(thread: Thread = null) -> void: if thread != null: _thread = thread _thread_name = thread.get_meta("name") @@ -29,11 +29,15 @@ func dispose() -> void: _thread = null +func terminate() -> void: + _execution_context.terminate() + + func clear_assert() -> void: _asserts.clear() -func set_assert(value :GdUnitAssert) -> void: +func set_assert(value: GdUnitAssert) -> void: if value != null: _asserts.append(value) @@ -42,7 +46,7 @@ func get_assert() -> GdUnitAssert: return null if _asserts.is_empty() else _asserts[-1] -func set_execution_context(context :GdUnitExecutionContext) -> void: +func set_execution_context(context: GdUnitExecutionContext) -> void: _execution_context = context diff --git a/addons/gdUnit4/src/core/thread/GdUnitThreadContext.gd.uid b/addons/gdUnit4/src/core/thread/GdUnitThreadContext.gd.uid index b52fea1f..35041395 100644 --- a/addons/gdUnit4/src/core/thread/GdUnitThreadContext.gd.uid +++ b/addons/gdUnit4/src/core/thread/GdUnitThreadContext.gd.uid @@ -1 +1 @@ -uid://cswl465sy52f0 +uid://b485tn63cuos diff --git a/addons/gdUnit4/src/core/thread/GdUnitThreadManager.gd b/addons/gdUnit4/src/core/thread/GdUnitThreadManager.gd index 31b10782..2e694e25 100644 --- a/addons/gdUnit4/src/core/thread/GdUnitThreadManager.gd +++ b/addons/gdUnit4/src/core/thread/GdUnitThreadManager.gd @@ -3,7 +3,7 @@ class_name GdUnitThreadManager extends Object ## { = } -var _thread_context_by_id := {} +var _thread_context_by_id: Dictionary[int, GdUnitThreadContext] = {} ## holds the current thread id var _current_thread_id :int = -1 @@ -25,6 +25,11 @@ static func run(name :String, cb :Callable) -> Variant: return await instance()._run(name, cb) +static func interrupt() -> void: + for thread_context: GdUnitThreadContext in instance()._thread_context_by_id.values(): + thread_context.terminate() + + ## Returns the current valid thread context static func get_current_context() -> GdUnitThreadContext: return instance()._get_current_context() diff --git a/addons/gdUnit4/src/core/thread/GdUnitThreadManager.gd.uid b/addons/gdUnit4/src/core/thread/GdUnitThreadManager.gd.uid index 961dc0ce..d26050ff 100644 --- a/addons/gdUnit4/src/core/thread/GdUnitThreadManager.gd.uid +++ b/addons/gdUnit4/src/core/thread/GdUnitThreadManager.gd.uid @@ -1 +1 @@ -uid://cyv5806buvk6h +uid://ctlsqdd4tpwj4 diff --git a/addons/gdUnit4/src/core/writers/GdUnitCSIMessageWriter.gd b/addons/gdUnit4/src/core/writers/GdUnitCSIMessageWriter.gd index be5d1e5b..cc93ee2b 100644 --- a/addons/gdUnit4/src/core/writers/GdUnitCSIMessageWriter.gd +++ b/addons/gdUnit4/src/core/writers/GdUnitCSIMessageWriter.gd @@ -1,6 +1,6 @@ @tool class_name GdUnitCSIMessageWriter -extends GdUnitMessageWritter +extends GdUnitMessageWriter ## A message writer implementation using ANSI/CSI escape codes for console output.[br] ## [br] ## This writer provides formatted message output using CSI (Control Sequence Introducer) codes.[br] @@ -150,7 +150,7 @@ func _print_message(_message: String, _color: Color, _indent: int, _flags: int) var text := _bbcode_tags_to_csi_codes(_message) var indent_text := "".lpad(_indent * 2) var _style := _apply_style_flags(_flags) - printraw("%s[38;2;%d;%d;%dm%s%s" % [indent_text, _color.r8, _color.g8, _color.b8, _style, text] ) + printraw("%s[38;2;%d;%d;%dm%s%s" % [indent_text, _color.r8, _color.g8, _color.b8, _style, text]) _current_pos += _indent * 2 + text.length() @@ -162,17 +162,17 @@ func _println_message(_message: String, _color: Color, _indent: int, _flags: int ## Implementation of positioned message output with formatting. -func _print_at(_message: String, cursor_pos: int, _color: Color, _effect: Effect, _align: Align, _flags: int) -> void: +func _print_at(_message: String, cursor_pos: int, _color: Color, _effect: GdUnitMessageWriter.Effect, _align: Align, _flags: int) -> void: if _align == Align.RIGHT: cursor_pos = cursor_pos - _message.length() if cursor_pos > _current_pos: - printraw("[%dG" % cursor_pos) # Move cursor to absolute position + printraw("[%dG" % cursor_pos) # Move cursor to absolute position else: _message = " " + _message var _style := _apply_style_flags(_flags) - printraw("[38;2;%d;%d;%dm%s%s" % [_color.r8, _color.g8, _color.b8, _style, _message] ) + printraw("[38;2;%d;%d;%dm%s%s" % [_color.r8, _color.g8, _color.b8, _style, _message]) _current_pos = cursor_pos + _message.length() @@ -198,7 +198,7 @@ func restore_cursor() -> GdUnitCSIMessageWriter: ## Clears screen content and resets cursor position. func clear() -> void: - printraw("") # Clear screen and move cursor to home + printraw("") # Clear screen and move cursor to home _current_pos = 0 @@ -211,7 +211,7 @@ func _print_color_table() -> void: for green in range(0, 6): for red in range(0, 6): for blue in range(0, 6): - color(Color8(red*42, green*42, blue*42)).println_message("████████ ") + color(Color8(red * 42, green * 42, blue * 42)).println_message("████████ ") new_line() new_line() @@ -220,7 +220,7 @@ func _print_color_table() -> void: for green in range(0, 6): for red in range(0, 6): for blue in range(0, 6): - color(Color8(red*42, green*42, blue*42)).println_message("████████ ") + color(Color8(red * 42, green * 42, blue * 42)).println_message("████████ ") new_line() new_line() _color_mode = COLOR_TABLE diff --git a/addons/gdUnit4/src/core/writers/GdUnitCSIMessageWriter.gd.uid b/addons/gdUnit4/src/core/writers/GdUnitCSIMessageWriter.gd.uid index d5f12f35..f936e4a2 100644 --- a/addons/gdUnit4/src/core/writers/GdUnitCSIMessageWriter.gd.uid +++ b/addons/gdUnit4/src/core/writers/GdUnitCSIMessageWriter.gd.uid @@ -1 +1 @@ -uid://k3kgm7osx44n +uid://cdbikmk07d5rg diff --git a/addons/gdUnit4/src/core/writers/GdUnitMessageWriter.gd b/addons/gdUnit4/src/core/writers/GdUnitMessageWriter.gd index 2ae94a46..5244efa4 100644 --- a/addons/gdUnit4/src/core/writers/GdUnitMessageWriter.gd +++ b/addons/gdUnit4/src/core/writers/GdUnitMessageWriter.gd @@ -1,5 +1,5 @@ @tool -class_name GdUnitMessageWritter +class_name GdUnitMessageWriter extends RefCounted ## Base interface class for writing formatted messages to different outputs.[br] ## [br] @@ -64,14 +64,14 @@ var _current_flags := 0 var _current_align := Align.LEFT ## The current text effect to be used for the next output operation -var _current_effect := Effect.NONE +var _current_effect := GdUnitMessageWriter.Effect.NONE ## Sets the text color for the next output operation.[br] ## [br] ## [param value] The color to be used for the text. ## Returns self for method chaining. -func color(value: Color) -> GdUnitMessageWritter: +func color(value: Color) -> GdUnitMessageWriter: _current_color = value return self @@ -80,7 +80,7 @@ func color(value: Color) -> GdUnitMessageWritter: ## [br] ## [param value] The number of indentation levels, where each level equals two spaces. ## Returns self for method chaining. -func indent(value: int) -> GdUnitMessageWritter: +func indent(value: int) -> GdUnitMessageWriter: _current_indent = value return self @@ -89,7 +89,7 @@ func indent(value: int) -> GdUnitMessageWritter: ## [br] ## [param value] A combination of style flags (BOLD, ITALIC, UNDERLINE). ## Returns self for method chaining. -func style(value: int) -> GdUnitMessageWritter: +func style(value: int) -> GdUnitMessageWriter: _current_flags = value return self @@ -98,7 +98,7 @@ func style(value: int) -> GdUnitMessageWritter: ## [br] ## [param value] The effect to apply to the text (NONE, WAVE). ## Returns self for method chaining. -func effect(value: Effect) -> GdUnitMessageWritter: +func effect(value: GdUnitMessageWriter.Effect) -> GdUnitMessageWriter: _current_effect = value return self @@ -107,7 +107,7 @@ func effect(value: Effect) -> GdUnitMessageWritter: ## [br] ## [param value] The alignment to use (LEFT, RIGHT). ## Returns self for method chaining. -func align(value: Align) -> GdUnitMessageWritter: +func align(value: Align) -> GdUnitMessageWriter: _current_align = value return self @@ -121,7 +121,7 @@ func align(value: Align) -> GdUnitMessageWritter: ## - align: LEFT[br] ## - effect: NONE[br] ## Returns self for method chaining. -func reset() -> GdUnitMessageWritter: +func reset() -> GdUnitMessageWriter: _current_color = Color.WHITE _current_indent = 0 _current_flags = 0 @@ -203,7 +203,7 @@ func _println_message(_message: String, _color: Color, _indent: int, _flags: int ## [param effect] The effect to apply.[br] ## [param align] The text alignment.[br] ## [param flags] The style flags to apply. -func _print_at(_message: String, _cursor_pos: int, _color: Color, _effect: Effect, _align: Align, _flags: int) -> void: +func _print_at(_message: String, _cursor_pos: int, _color: Color, _effect: GdUnitMessageWriter.Effect, _align: Align, _flags: int) -> void: pass diff --git a/addons/gdUnit4/src/core/writers/GdUnitMessageWriter.gd.uid b/addons/gdUnit4/src/core/writers/GdUnitMessageWriter.gd.uid index 3347ea24..f2dd7962 100644 --- a/addons/gdUnit4/src/core/writers/GdUnitMessageWriter.gd.uid +++ b/addons/gdUnit4/src/core/writers/GdUnitMessageWriter.gd.uid @@ -1 +1 @@ -uid://du462w7gv1gst +uid://dlkfkxu45qadu diff --git a/addons/gdUnit4/src/core/writers/GdUnitRichTextMessageWriter.gd b/addons/gdUnit4/src/core/writers/GdUnitRichTextMessageWriter.gd index 64793bbe..b9f79e49 100644 --- a/addons/gdUnit4/src/core/writers/GdUnitRichTextMessageWriter.gd +++ b/addons/gdUnit4/src/core/writers/GdUnitRichTextMessageWriter.gd @@ -1,6 +1,6 @@ @tool class_name GdUnitRichTextMessageWriter -extends GdUnitMessageWritter +extends GdUnitMessageWriter ## A message writer implementation using [RichTextLabel] for the test report UI.[br] ## [br] ## This writer implementation writes formatted messages to a [RichTextLabel] using BBCode.[br] @@ -85,7 +85,7 @@ func _println_message(message: String, _color: Color, _indent: int, flags: int) ## [param _effect] The text effect to apply (e.g. wave).[br] ## [param _align] The text alignment (left or right).[br] ## [param flags] The text style flags to apply. -func _print_at(message: String, cursor_pos: int, _color: Color, _effect: Effect, _align: Align, flags: int) -> void: +func _print_at(message: String, cursor_pos: int, _color: Color, _effect: GdUnitMessageWriter.Effect, _align: Align, flags: int) -> void: if _align == Align.RIGHT: cursor_pos = cursor_pos - message.length() diff --git a/addons/gdUnit4/src/core/writers/GdUnitRichTextMessageWriter.gd.uid b/addons/gdUnit4/src/core/writers/GdUnitRichTextMessageWriter.gd.uid index a2ba7bcd..87fd06fd 100644 --- a/addons/gdUnit4/src/core/writers/GdUnitRichTextMessageWriter.gd.uid +++ b/addons/gdUnit4/src/core/writers/GdUnitRichTextMessageWriter.gd.uid @@ -1 +1 @@ -uid://0m5cuc7dd8l1 +uid://csy8tqy7efxr2 diff --git a/addons/gdUnit4/src/dotnet/GdUnit4CSharpApi.cs b/addons/gdUnit4/src/dotnet/GdUnit4CSharpApi.cs index 14a1355b..096e83c7 100644 --- a/addons/gdUnit4/src/dotnet/GdUnit4CSharpApi.cs +++ b/addons/gdUnit4/src/dotnet/GdUnit4CSharpApi.cs @@ -21,7 +21,7 @@ namespace gdUnit4.addons.gdUnit4.src.dotnet; /// /// The GdUnit4 GDScript - C# API wrapper. /// -public partial class GdUnit4CSharpApi : GdUnit4NetApiGodotBridge +public partial class GdUnit4CSharpApi : RefCounted { /// /// The signal to be emitted when the execution is completed. @@ -52,7 +52,7 @@ public static Array DiscoverTests(CSharpScript sourceScript) try { // Get the list of test case descriptors from the API - var testCaseDescriptors = DiscoverTestsFromScript(sourceScript); + var testCaseDescriptors = GdUnit4NetApiGodotBridge.DiscoverTestsFromScript(sourceScript); // Convert each TestCaseDescriptor to a Dictionary return testCaseDescriptors @@ -70,11 +70,13 @@ public static Array DiscoverTests(CSharpScript sourceScript) ["fully_qualified_name"] = descriptor.FullyQualifiedName, ["assembly_location"] = descriptor.AssemblyPath }) - .Aggregate(new Array(), (array, dict) => - { - array.Add(dict); - return array; - }); + .Aggregate( + new Array(), + (array, dict) => + { + array.Add(dict); + return array; + }); } #pragma warning disable CA1031 catch (Exception e) @@ -87,6 +89,23 @@ public static Array DiscoverTests(CSharpScript sourceScript) } } + /// + /// Creates a test suite based on the specified source path and line number. + /// + /// The path to the source file from which to create the test suite. + /// The line number in the source file where the method to test is defined. + /// The path where the test suite should be created. + /// A dictionary containing information about the created test suite. + public static Dictionary CreateTestSuite(string sourcePath, int lineNumber, string testSuitePath) + => GdUnit4NetApiGodotBridge.CreateTestSuite(sourcePath, lineNumber, testSuitePath); + + /// + /// Gets the version of the GdUnit4 assembly. + /// + /// The version string of the GdUnit4 assembly. + public static string Version() + => GdUnit4NetApiGodotBridge.Version(); + /// public override void _Notification(int what) { @@ -114,7 +133,7 @@ public void ExecuteAsync(Array tests, Callable listener) Debug.Assert(tests != null, nameof(tests) + " != null"); var testSuiteNodes = new List { BuildTestSuiteNodeFrom(tests) }; - ExecuteAsync(testSuiteNodes, listener, executionCts.Token) + GdUnit4NetApiGodotBridge.ExecuteAsync(testSuiteNodes, listener, executionCts.Token) .GetAwaiter() .OnCompleted(() => EmitSignal(SignalName.ExecutionCompleted)); } diff --git a/addons/gdUnit4/src/dotnet/GdUnit4CSharpApiLoader.gd.uid b/addons/gdUnit4/src/dotnet/GdUnit4CSharpApiLoader.gd.uid index 7e91d829..e5a97f84 100644 --- a/addons/gdUnit4/src/dotnet/GdUnit4CSharpApiLoader.gd.uid +++ b/addons/gdUnit4/src/dotnet/GdUnit4CSharpApiLoader.gd.uid @@ -1 +1 @@ -uid://yjqvv8qmpsfw +uid://nk4275tmrlqh diff --git a/addons/gdUnit4/src/doubler/CallableDoubler.gd.uid b/addons/gdUnit4/src/doubler/CallableDoubler.gd.uid index 2d1ed3b1..64240ac0 100644 --- a/addons/gdUnit4/src/doubler/CallableDoubler.gd.uid +++ b/addons/gdUnit4/src/doubler/CallableDoubler.gd.uid @@ -1 +1 @@ -uid://c6o7cdywxfvmw +uid://dta4mxd7nbor4 diff --git a/addons/gdUnit4/src/doubler/GdFunctionDoubler.gd.uid b/addons/gdUnit4/src/doubler/GdFunctionDoubler.gd.uid index 9c3f79f4..2a65590a 100644 --- a/addons/gdUnit4/src/doubler/GdFunctionDoubler.gd.uid +++ b/addons/gdUnit4/src/doubler/GdFunctionDoubler.gd.uid @@ -1 +1 @@ -uid://o28h6licvkyl +uid://bln7tgrw4ywag diff --git a/addons/gdUnit4/src/doubler/GdUnitClassDoubler.gd.uid b/addons/gdUnit4/src/doubler/GdUnitClassDoubler.gd.uid index d1c10b2f..c3835d3e 100644 --- a/addons/gdUnit4/src/doubler/GdUnitClassDoubler.gd.uid +++ b/addons/gdUnit4/src/doubler/GdUnitClassDoubler.gd.uid @@ -1 +1 @@ -uid://dvtlfu2xqa3r4 +uid://djs5lhspu7f1o diff --git a/addons/gdUnit4/src/doubler/GdUnitFunctionDoublerBuilder.gd.uid b/addons/gdUnit4/src/doubler/GdUnitFunctionDoublerBuilder.gd.uid index 76f41c81..0d12763a 100644 --- a/addons/gdUnit4/src/doubler/GdUnitFunctionDoublerBuilder.gd.uid +++ b/addons/gdUnit4/src/doubler/GdUnitFunctionDoublerBuilder.gd.uid @@ -1 +1 @@ -uid://d0gu2bl276yma +uid://c63mqq6bsij2k diff --git a/addons/gdUnit4/src/doubler/GdUnitMockFunctionDoubler.gd.uid b/addons/gdUnit4/src/doubler/GdUnitMockFunctionDoubler.gd.uid index 213959b3..e34049cf 100644 --- a/addons/gdUnit4/src/doubler/GdUnitMockFunctionDoubler.gd.uid +++ b/addons/gdUnit4/src/doubler/GdUnitMockFunctionDoubler.gd.uid @@ -1 +1 @@ -uid://dt5imoxi1ivhq +uid://hkkf85luqspd diff --git a/addons/gdUnit4/src/doubler/GdUnitObjectInteractions.gd.uid b/addons/gdUnit4/src/doubler/GdUnitObjectInteractions.gd.uid index c42f8be3..3965e0e7 100644 --- a/addons/gdUnit4/src/doubler/GdUnitObjectInteractions.gd.uid +++ b/addons/gdUnit4/src/doubler/GdUnitObjectInteractions.gd.uid @@ -1 +1 @@ -uid://dqnpoju1aekta +uid://c1inx1805han1 diff --git a/addons/gdUnit4/src/doubler/GdUnitObjectInteractionsVerifier.gd.uid b/addons/gdUnit4/src/doubler/GdUnitObjectInteractionsVerifier.gd.uid index e0a44b63..b04e3732 100644 --- a/addons/gdUnit4/src/doubler/GdUnitObjectInteractionsVerifier.gd.uid +++ b/addons/gdUnit4/src/doubler/GdUnitObjectInteractionsVerifier.gd.uid @@ -1 +1 @@ -uid://mx32fl26kcdv +uid://cqs07clk6f4nr diff --git a/addons/gdUnit4/src/doubler/GdUnitSpyFunctionDoubler.gd.uid b/addons/gdUnit4/src/doubler/GdUnitSpyFunctionDoubler.gd.uid index ef88b2a0..aa5bd751 100644 --- a/addons/gdUnit4/src/doubler/GdUnitSpyFunctionDoubler.gd.uid +++ b/addons/gdUnit4/src/doubler/GdUnitSpyFunctionDoubler.gd.uid @@ -1 +1 @@ -uid://bbyhhuy8113m2 +uid://cwe61shgk0xor diff --git a/addons/gdUnit4/src/extractors/GdUnitFuncValueExtractor.gd.uid b/addons/gdUnit4/src/extractors/GdUnitFuncValueExtractor.gd.uid index 578ce5f3..0bc205fe 100644 --- a/addons/gdUnit4/src/extractors/GdUnitFuncValueExtractor.gd.uid +++ b/addons/gdUnit4/src/extractors/GdUnitFuncValueExtractor.gd.uid @@ -1 +1 @@ -uid://cx4fl8vhtadto +uid://lq1psordtsp1 diff --git a/addons/gdUnit4/src/fuzzers/BoolFuzzer.gd b/addons/gdUnit4/src/fuzzers/BoolFuzzer.gd new file mode 100644 index 00000000..906ee2c5 --- /dev/null +++ b/addons/gdUnit4/src/fuzzers/BoolFuzzer.gd @@ -0,0 +1,24 @@ +## A fuzzer that generates random boolean values for testing.[br] +## +## This is useful for testing code paths that +## depend on boolean conditions, flags, or toggle states.[br] +## +## [b]Usage example:[/b] +## [codeblock] +## func test_toggle_feature(fuzzer := BoolFuzzer.new(), _fuzzer_iterations = 100): +## var enabled := fuzzer.next_value() +## my_feature.set_enabled(enabled) +## assert_bool(my_feature.is_enabled()),is_equal(enabled) +## [/codeblock] +class_name BoolFuzzer +extends Fuzzer + + +## Generates a random boolean value.[br] +## +## Returns either [code]true[/code] or [code]false[/code] with equal probability. +## This method is called automatically during fuzz testing iterations.[br] +## +## @returns A randomly generated boolean value ([code]true[/code] or [code]false[/code]). +func next_value() -> bool: + return randi() % 2 diff --git a/addons/gdUnit4/src/fuzzers/BoolFuzzer.gd.uid b/addons/gdUnit4/src/fuzzers/BoolFuzzer.gd.uid new file mode 100644 index 00000000..77e13245 --- /dev/null +++ b/addons/gdUnit4/src/fuzzers/BoolFuzzer.gd.uid @@ -0,0 +1 @@ +uid://cr4eigtxtligk diff --git a/addons/gdUnit4/src/fuzzers/FloatFuzzer.gd b/addons/gdUnit4/src/fuzzers/FloatFuzzer.gd index 347513f3..5da1a777 100644 --- a/addons/gdUnit4/src/fuzzers/FloatFuzzer.gd +++ b/addons/gdUnit4/src/fuzzers/FloatFuzzer.gd @@ -1,7 +1,24 @@ +## A fuzzer that generates random floating-point values within a specified range.[br] +## +## This is particularly useful for testing numerical calculations, +## physics simulations, shader parameters, or any code that processes floating-point +## values.[br] +## +## [b]Usage example:[/b] +## [codeblock] +## func test_calculate_damage(fuzzer := FloatFuzzer.new(0.0, 100.0), _fuzzer_iterations := 500): +## var damage := fuzzer.next_value() +## var result = calculate_damage_reduction(damage) +## assert_float(result).is_between(0.0, damage) +## [/codeblock] +## [br] +## [b]Note:[/b] The range is inclusive on both ends, and values are uniformly distributed. class_name FloatFuzzer extends Fuzzer +## Minimum value (inclusive) for generated floats. var _from: float = 0 +## Maximum value (inclusive) for generated floats. var _to: float = 0 func _init(from: float, to: float) -> void: @@ -9,5 +26,12 @@ func _init(from: float, to: float) -> void: _from = from _to = to + +## Generates a random float value within the configured range.[br] +## +## Returns a uniformly distributed random float between [member _from] and +## [member _to] (inclusive). Each call produces a new random value.[br] +## +## @returns A random float value within the specified range. func next_value() -> float: return randf_range(_from, _to) diff --git a/addons/gdUnit4/src/fuzzers/FloatFuzzer.gd.uid b/addons/gdUnit4/src/fuzzers/FloatFuzzer.gd.uid index fecc471b..d17b54ab 100644 --- a/addons/gdUnit4/src/fuzzers/FloatFuzzer.gd.uid +++ b/addons/gdUnit4/src/fuzzers/FloatFuzzer.gd.uid @@ -1 +1 @@ -uid://m0toqy7leklg +uid://dqxvfh1tchp08 diff --git a/addons/gdUnit4/src/fuzzers/Fuzzer.gd b/addons/gdUnit4/src/fuzzers/Fuzzer.gd index 7cd6a588..e4e597d0 100644 --- a/addons/gdUnit4/src/fuzzers/Fuzzer.gd +++ b/addons/gdUnit4/src/fuzzers/Fuzzer.gd @@ -1,39 +1,80 @@ -# Base interface for fuzz testing -# https://en.wikipedia.org/wiki/Fuzzing +## Base interface for fuzz testing.[br] +## +## Fuzzer is an abstract base class that provides the foundation for creating +## custom fuzzers used in automated testing. Fuzz testing (fuzzing) is a software +## testing technique that involves providing invalid, unexpected, or random data +## as inputs to a program to find bugs and potential security vulnerabilities. +## [br][br] +## To use a fuzzer in your test cases, add optional parameters to your test function: +## [codeblock] +## func test_foo(fuzzer := Fuzzers.randomInt(), _fuzzer_iterations := 10, _fuzzer_seed := 12345): +## var value := fuzzer.next_value() +## # Test logic using the fuzzed value +## [/codeblock] +## [br] +## @tutorial(Fuzzing on Wikipedia): https://en.wikipedia.org/wiki/Fuzzing +@abstract class_name Fuzzer extends RefCounted -# To run a test with a specific fuzzer you have to add defailt argument checked your test case -# all arguments are optional [] -# syntax: -# func test_foo([fuzzer = ], [fuzzer_iterations=], [fuzzer_seed=]) -# example: -# # runs the test 'test_foo' 10 times with a random int value generated by the IntFuzzer -# func test_foo(fuzzer = Fuzzers.randomInt(), fuzzer_iterations=10) -# -# # runs the test 'test_foo2' 1000 times as default with a random seed='101010101' -# func test_foo2(fuzzer = Fuzzers.randomInt(), fuzzer_seed=101010101) - -const ITERATION_DEFAULT_COUNT = 1000 + +## Default number of iterations for fuzz testing when not specified. +const ITERATION_DEFAULT_COUNT := 1000 +## Parameter name for passing the fuzzer instance to test functions. const ARGUMENT_FUZZER_INSTANCE := "fuzzer" +## Parameter name for specifying the number of iterations in test functions. const ARGUMENT_ITERATIONS := "fuzzer_iterations" +## Parameter name for specifying the random seed in test functions. const ARGUMENT_SEED := "fuzzer_seed" -var _iteration_index :int = 0 -var _iteration_limit :int = ITERATION_DEFAULT_COUNT +## Current iteration index during fuzzing execution. +var _iteration_index := 0 +## Maximum number of iterations to run for this fuzzer. +var _iteration_limit := ITERATION_DEFAULT_COUNT -# generates the next fuzz value -# needs to be implement -func next_value() -> Variant: - push_error("Invalid vall. Fuzzer not implemented 'next_value()'") - return null +## Generates the next fuzz value.[br] +## +## This abstract method must be implemented by derived classes to provide +## the specific fuzzing logic for generating test values.[br] +## +## [b]Example implementation:[/b] +## [codeblock] +## func next_value() -> int: +## return randi_range(0, 100) +## [/codeblock] +## +## @returns The next generated fuzz value. The type depends on the specific fuzzer implementation. +@abstract +func next_value() -> Variant -# returns the current iteration index +## Returns the current iteration index.[br] +## +## Useful for tracking progress during fuzzing or for debugging purposes +## when a specific iteration causes a failure.[br] +## +## [b]Example:[/b] +## [codeblock] +## if fuzzer.iteration_index() % 100 == 0: +## print("Processed %d iterations" % fuzzer.iteration_index()) +## [/codeblock] +## +## @returns The current iteration index, starting from 0. func iteration_index() -> int: return _iteration_index -# returns the amount of iterations where the fuzzer will be run +## Returns the maximum number of iterations for this fuzzer.[br] +## +## This value determines how many times the fuzzer will generate values +## during a test run. It can be overridden by the [code]fuzzer_iterations[/code] +## parameter in test functions.[br] +## +## [b]Example:[/b] +## [codeblock] +## print("Running %d fuzzing iterations" % fuzzer.iteration_limit()) +## [/codeblock] +## +## @returns The maximum number of iterations to be executed. func iteration_limit() -> int: return _iteration_limit diff --git a/addons/gdUnit4/src/fuzzers/Fuzzer.gd.uid b/addons/gdUnit4/src/fuzzers/Fuzzer.gd.uid index ceeca79b..b4bc2842 100644 --- a/addons/gdUnit4/src/fuzzers/Fuzzer.gd.uid +++ b/addons/gdUnit4/src/fuzzers/Fuzzer.gd.uid @@ -1 +1 @@ -uid://br2qgptogixyk +uid://l7i147a4f78i diff --git a/addons/gdUnit4/src/fuzzers/IntFuzzer.gd b/addons/gdUnit4/src/fuzzers/IntFuzzer.gd index 064dc20a..4100d514 100644 --- a/addons/gdUnit4/src/fuzzers/IntFuzzer.gd +++ b/addons/gdUnit4/src/fuzzers/IntFuzzer.gd @@ -1,24 +1,69 @@ +## A fuzzer that generates random integer values with optional even/odd constraints.[br] +## +## It supports three modes: normal (any integer), even-only, +## and odd-only generation. This is useful for testing array indices, loop counters, +## enumeration values, or any code that processes integer values.[br] +## +## [b]Usage example:[/b] +## [codeblock] +## # Test with any integer in range +## func test_array_access(fuzzer = IntFuzzer.new(0, 99), fuzzer_iterations = 100): +## var index = fuzzer.next_value() +## var array = create_array(100) +## assert(array[index] != null) +## +## # Test with only even numbers +## func test_even_processing(fuzzer := IntFuzzer.new(0, 100, IntFuzzer.EVEN)): +## var even_num := fuzzer.next_value() +## assert_int(even_num % 2).is_equal(0) +## [/codeblock] class_name IntFuzzer extends Fuzzer + +## Generates any integer within the range. enum { - NORMAL, - EVEN, - ODD + NORMAL, ## Generate any integer within the specified range. + EVEN, ## Generate only even integers within the specified range. + ODD ## Generate only odd integers within the specified range. } -var _from :int = 0 -var _to : int = 0 -var _mode : int = NORMAL + +## Minimum value (inclusive) for generated integers. +var _from: int = 0 +## Maximum value (inclusive) for generated integers. +var _to: int = 0 +## Generation mode: NORMAL, EVEN, or ODD. +var _mode: int = NORMAL -func _init(from: int, to: int, mode :int = NORMAL) -> void: +func _init(from: int, to: int, mode: int = NORMAL) -> void: assert(from <= to, "Invalid range!") _from = from _to = to _mode = mode +## Generates a random integer value based on the configured mode.[br] +## +## Returns a random integer between [member _from] and [member _to] (inclusive).[br] +## The value will be constrained according to the [member _mode]:[br] +## - [constant NORMAL]: Any integer in the range[br] +## - [constant EVEN]: Only even integers[br] +## - [constant ODD]: Only odd integers[br] +## +## [b]Example:[/b] +## [codeblock] +## var normal_fuzzer = IntFuzzer.new(1, 10, IntFuzzer.NORMAL) +## var even_fuzzer = IntFuzzer.new(1, 10, IntFuzzer.EVEN) +## var odd_fuzzer = IntFuzzer.new(1, 10, IntFuzzer.ODD) +## +## print(normal_fuzzer.next_value()) # Could be any: 1, 2, 3, ..., 10 +## print(even_fuzzer.next_value()) # Only even: 2, 4, 6, 8, 10 +## print(odd_fuzzer.next_value()) # Only odd: 1, 3, 5, 7, 9 +## [/codeblock] +## +## @returns A random integer value within the specified range and mode func next_value() -> int: var value := randi_range(_from, _to) match _mode: diff --git a/addons/gdUnit4/src/fuzzers/IntFuzzer.gd.uid b/addons/gdUnit4/src/fuzzers/IntFuzzer.gd.uid index d562334f..2a0e7cf1 100644 --- a/addons/gdUnit4/src/fuzzers/IntFuzzer.gd.uid +++ b/addons/gdUnit4/src/fuzzers/IntFuzzer.gd.uid @@ -1 +1 @@ -uid://dptsthe3tjyxa +uid://dxmca8ntv2vij diff --git a/addons/gdUnit4/src/fuzzers/StringFuzzer.gd b/addons/gdUnit4/src/fuzzers/StringFuzzer.gd index d0634949..277b4ac6 100644 --- a/addons/gdUnit4/src/fuzzers/StringFuzzer.gd +++ b/addons/gdUnit4/src/fuzzers/StringFuzzer.gd @@ -1,11 +1,39 @@ +## A fuzzer that generates random strings with configurable length and character sets.[br] +## +## It supports custom character sets defined by patterns or ranges, +## making it ideal for testing input validation, text processing, parsers, or any +## code that handles string data.[br] +## +## The fuzzer uses a pattern syntax to define allowed characters:[br] +## - Single characters: [code]abc[/code] allows 'a', 'b', 'c'[br] +## - Ranges: [code]a-z[/code] allows lowercase letters[br] +## - Special patterns: [code]\\w[/code] (word chars), [code]\\p{L}[/code] (letters), [code]\\p{N}[/code] (numbers)[br] +## +## [b]Usage example:[/b] +## [codeblock] +## # Test with alphanumeric strings +## func test_username(fuzzer := StringFuzzer.new(3, 20, "a-zA-Z0-9"), _fuzzer_iterations := 100): +## var username _= fuzzer.next_value() +## assert_bool(validate_username(username)).is_true() +## +## # Test with special characters +## func test_password(fuzzer := StringFuzzer.new(8, 32, "a-zA-Z0-9!@#$%"), _fuzzer_iterations := 100) -> void: +## var password := fuzzer.next_value() +## assert_str(password).has_length(8, Comparator.GREATER_EQUAL).has_length(32, Comparator.LESS_EQUAL) +## [/codeblock] class_name StringFuzzer extends Fuzzer - +## Default character set pattern including word characters, letters, numbers, and common symbols.[br] +## Includes: word characters (\\w), Unicode letters (\\p{L}), Unicode numbers (\\p{N}), +## and the characters: +, -, _, ' const DEFAULT_CHARSET = "\\w\\p{L}\\p{N}+-_'" +## Minimum length for generated strings (inclusive). var _min_length: int +## Maximum length for generated strings (inclusive). var _max_length: int +## Array of character codes that can be used in generated strings. var _charset: PackedInt32Array @@ -14,10 +42,39 @@ func _init(min_length: int, max_length: int, pattern: String = DEFAULT_CHARSET) _max_length = max_length + 1 # +1 for inclusive assert(not null or not pattern.is_empty()) assert(_min_length > 0 and _min_length < _max_length) - _charset = StringFuzzer.extract_charset(pattern) + _charset = _extract_charset(pattern) + + +## Generates a random string based on configured parameters.[br] +## +## Creates a string with random length between [member _min_length] and +## [member _max_length], using only characters from the configured charset. +## Each character is selected randomly and independently.[br] +## +## [b]Example:[/b] +## [codeblock] +## var fuzzer = StringFuzzer.new(5, 10, "ABC") +## for i in range(5): +## var str = fuzzer.next_value() +## print("Generated: ", str) +## # Possible outputs: "ABCAB", "BCAABCA", "CCCBAA", etc. +## assert(str.length() >= 5 and str.length() <= 10) +## for c in str: +## assert(c in ["A", "B", "C"]) +## [/codeblock] +## +## @returns A random string matching the configured constraints. +func next_value() -> String: + var value := PackedInt32Array() + var max_char := len(_charset) + var length: int = max(_min_length, randi() % _max_length) + for i in length: + @warning_ignore("return_value_discarded") + value.append(_charset[randi() % max_char]) + return value.to_byte_array().get_string_from_utf32() -static func extract_charset(pattern: String) -> PackedInt32Array: +static func _extract_charset(pattern: String) -> PackedInt32Array: var reg := RegEx.new() if reg.compile(pattern) != OK: push_error("Invalid pattern to generate Strings! Use e.g '\\w\\p{L}\\p{N}+-_'") @@ -37,7 +94,7 @@ static func extract_charset(pattern: String) -> PackedInt32Array: # range starts if char_current == 45 and char_before != -1: var char_next := pattern.unicode_at(index) - var characters := build_chars(char_before, char_next) + var characters := _build_chars(char_before, char_next) for character in characters: charset.append(character) char_before = -1 @@ -48,18 +105,8 @@ static func extract_charset(pattern: String) -> PackedInt32Array: return charset -static func build_chars(from: int, to: int) -> PackedInt32Array: +static func _build_chars(from: int, to: int) -> PackedInt32Array: var characters := PackedInt32Array() for character in range(from+1, to+1): characters.append(character) return characters - - -func next_value() -> String: - var value := PackedInt32Array() - var max_char := len(_charset) - var length: int = max(_min_length, randi() % _max_length) - for i in length: - @warning_ignore("return_value_discarded") - value.append(_charset[randi() % max_char]) - return value.to_byte_array().get_string_from_utf32() diff --git a/addons/gdUnit4/src/fuzzers/StringFuzzer.gd.uid b/addons/gdUnit4/src/fuzzers/StringFuzzer.gd.uid index d19f488e..fdab8112 100644 --- a/addons/gdUnit4/src/fuzzers/StringFuzzer.gd.uid +++ b/addons/gdUnit4/src/fuzzers/StringFuzzer.gd.uid @@ -1 +1 @@ -uid://djuhpoeijubuc +uid://3i80c3jypja1 diff --git a/addons/gdUnit4/src/fuzzers/Vector2Fuzzer.gd b/addons/gdUnit4/src/fuzzers/Vector2Fuzzer.gd index 855cf6a9..70ef31b7 100644 --- a/addons/gdUnit4/src/fuzzers/Vector2Fuzzer.gd +++ b/addons/gdUnit4/src/fuzzers/Vector2Fuzzer.gd @@ -1,9 +1,27 @@ +## A fuzzer that generates random Vector2 values within a specified rectangular range.[br] +## +## This is particularly useful for testing 2D physics, movement +## systems, UI positioning, sprite coordinates, or any code that processes 2D vectors.[br] +## +## The fuzzer generates vectors where each component (x, y) is independently randomized +## within its respective range, creating a uniform distribution over the rectangular area.[br] +## +## [b]Usage example:[/b] +## [codeblock] +## # Test 2D movement within screen bounds +## func test_movement(fuzzer := Vector2Fuzzer.new(Vector2.ZERO, Vector2(1920, 1080)), _fuzzer_iterations := 200) -> void: +## var position := fuzzer.next_value() +## player.set_position(position) +## +## [/codeblock] class_name Vector2Fuzzer extends Fuzzer -var _from :Vector2 -var _to : Vector2 +## Minimum bounds for the generated vectors (inclusive for both x and y). +var _from: Vector2 +## Maximum bounds for the generated vectors (inclusive for both x and y). +var _to: Vector2 func _init(from: Vector2, to: Vector2) -> void: @@ -12,6 +30,15 @@ func _init(from: Vector2, to: Vector2) -> void: _to = to +## Generates a random Vector2 within the configured rectangular range.[br] +## +## Returns a Vector2 where each component is independently randomized:[br] +## - x: random float between [code]_from.x[/code] and [code]_to.x[/code][br] +## - y: random float between [code]_from.y[/code] and [code]_to.y[/code][br] +## +## The distribution is uniform over the rectangular area defined by the bounds.[br] +## +## @returns A random Vector2 within the specified range. func next_value() -> Vector2: var x := randf_range(_from.x, _to.x) var y := randf_range(_from.y, _to.y) diff --git a/addons/gdUnit4/src/fuzzers/Vector2Fuzzer.gd.uid b/addons/gdUnit4/src/fuzzers/Vector2Fuzzer.gd.uid index a30f72e2..68b0bc99 100644 --- a/addons/gdUnit4/src/fuzzers/Vector2Fuzzer.gd.uid +++ b/addons/gdUnit4/src/fuzzers/Vector2Fuzzer.gd.uid @@ -1 +1 @@ -uid://d4f0tjvqrvv8d +uid://bo2o4vdvuyyql diff --git a/addons/gdUnit4/src/fuzzers/Vector3Fuzzer.gd b/addons/gdUnit4/src/fuzzers/Vector3Fuzzer.gd index c773ab51..b54870d1 100644 --- a/addons/gdUnit4/src/fuzzers/Vector3Fuzzer.gd +++ b/addons/gdUnit4/src/fuzzers/Vector3Fuzzer.gd @@ -1,9 +1,28 @@ +## A fuzzer that generates random Vector3 values within a specified box range.[br] +## +## This is particularly useful for testing 3D physics, spatial +## positioning, camera systems, particle effects, or any code that processes 3D vectors.[br] +## +## The fuzzer generates vectors where each component (x, y, z) is independently +## randomized within its respective range, creating a uniform distribution over the +## 3D box volume.[br] +## +## [b]Usage example:[/b] +## [codeblock] +## # Test 3D object placement within world bounds +## func test_spawn_position(fuzzer := Vector3Fuzzer.new(Vector3(-100, 0, -100), Vector3(100, 50, 100)), _fuzzer_iterations := 300): +## var position := fuzzer.next_value() +## var object = spawn_object(position) +## +## [/codeblock] class_name Vector3Fuzzer extends Fuzzer -var _from :Vector3 -var _to : Vector3 +## Minimum bounds for the generated vectors (inclusive for x, y, and z). +var _from: Vector3 +## Maximum bounds for the generated vectors (inclusive for x, y, and z). +var _to: Vector3 func _init(from: Vector3, to: Vector3) -> void: @@ -12,6 +31,16 @@ func _init(from: Vector3, to: Vector3) -> void: _to = to +## Generates a random Vector3 within the configured box range.[br] +## +## Returns a Vector3 where each component is independently randomized:[br] +## - x: random float between [code]_from.x[/code] and [code]_to.x[/code][br] +## - y: random float between [code]_from.y[/code] and [code]_to.y[/code][br] +## - z: random float between [code]_from.z[/code] and [code]_to.z[/code][br] +## +## The distribution is uniform over the 3D box volume defined by the bounds.[br] +## +## @returns A random Vector3 within the specified range. func next_value() -> Vector3: var x := randf_range(_from.x, _to.x) var y := randf_range(_from.y, _to.y) diff --git a/addons/gdUnit4/src/fuzzers/Vector3Fuzzer.gd.uid b/addons/gdUnit4/src/fuzzers/Vector3Fuzzer.gd.uid index dd137b8c..4fd67e07 100644 --- a/addons/gdUnit4/src/fuzzers/Vector3Fuzzer.gd.uid +++ b/addons/gdUnit4/src/fuzzers/Vector3Fuzzer.gd.uid @@ -1 +1 @@ -uid://dr8kd48a7dmgf +uid://caupnpat15uc3 diff --git a/addons/gdUnit4/src/matchers/AnyArgumentMatcher.gd.uid b/addons/gdUnit4/src/matchers/AnyArgumentMatcher.gd.uid index e07334ab..6632d8c9 100644 --- a/addons/gdUnit4/src/matchers/AnyArgumentMatcher.gd.uid +++ b/addons/gdUnit4/src/matchers/AnyArgumentMatcher.gd.uid @@ -1 +1 @@ -uid://j3cf8pj7e2hx +uid://diudoa6653k5g diff --git a/addons/gdUnit4/src/matchers/AnyBuildInTypeArgumentMatcher.gd.uid b/addons/gdUnit4/src/matchers/AnyBuildInTypeArgumentMatcher.gd.uid index 52b9b2b6..642ff33e 100644 --- a/addons/gdUnit4/src/matchers/AnyBuildInTypeArgumentMatcher.gd.uid +++ b/addons/gdUnit4/src/matchers/AnyBuildInTypeArgumentMatcher.gd.uid @@ -1 +1 @@ -uid://dutfy1fdybu6g +uid://cti7yje311tr diff --git a/addons/gdUnit4/src/matchers/AnyClazzArgumentMatcher.gd.uid b/addons/gdUnit4/src/matchers/AnyClazzArgumentMatcher.gd.uid index 5d3daaff..c16d66c2 100644 --- a/addons/gdUnit4/src/matchers/AnyClazzArgumentMatcher.gd.uid +++ b/addons/gdUnit4/src/matchers/AnyClazzArgumentMatcher.gd.uid @@ -1 +1 @@ -uid://br5inj0c3yeka +uid://6cq1lhv4a4q1 diff --git a/addons/gdUnit4/src/matchers/ChainedArgumentMatcher.gd.uid b/addons/gdUnit4/src/matchers/ChainedArgumentMatcher.gd.uid index 71f32a45..2f34029b 100644 --- a/addons/gdUnit4/src/matchers/ChainedArgumentMatcher.gd.uid +++ b/addons/gdUnit4/src/matchers/ChainedArgumentMatcher.gd.uid @@ -1 +1 @@ -uid://cqs4p1xlav5pq +uid://b003i2el1rtgf diff --git a/addons/gdUnit4/src/matchers/EqualsArgumentMatcher.gd.uid b/addons/gdUnit4/src/matchers/EqualsArgumentMatcher.gd.uid index 882a249a..5d43334d 100644 --- a/addons/gdUnit4/src/matchers/EqualsArgumentMatcher.gd.uid +++ b/addons/gdUnit4/src/matchers/EqualsArgumentMatcher.gd.uid @@ -1 +1 @@ -uid://rjupecr2iu8f +uid://dlkrdvmgnqt40 diff --git a/addons/gdUnit4/src/matchers/GdUnitArgumentMatcher.gd.uid b/addons/gdUnit4/src/matchers/GdUnitArgumentMatcher.gd.uid index 5a05a8b9..d6640083 100644 --- a/addons/gdUnit4/src/matchers/GdUnitArgumentMatcher.gd.uid +++ b/addons/gdUnit4/src/matchers/GdUnitArgumentMatcher.gd.uid @@ -1 +1 @@ -uid://bch01ucnnvm5 +uid://1mqm4qoc7m1q diff --git a/addons/gdUnit4/src/matchers/GdUnitArgumentMatchers.gd.uid b/addons/gdUnit4/src/matchers/GdUnitArgumentMatchers.gd.uid index 18b987c1..83c18f54 100644 --- a/addons/gdUnit4/src/matchers/GdUnitArgumentMatchers.gd.uid +++ b/addons/gdUnit4/src/matchers/GdUnitArgumentMatchers.gd.uid @@ -1 +1 @@ -uid://knmpyvp6ugc5 +uid://cl3p7i6if0xja diff --git a/addons/gdUnit4/src/mocking/GdUnitMock.gd.uid b/addons/gdUnit4/src/mocking/GdUnitMock.gd.uid index 6a24597a..9d7f59c3 100644 --- a/addons/gdUnit4/src/mocking/GdUnitMock.gd.uid +++ b/addons/gdUnit4/src/mocking/GdUnitMock.gd.uid @@ -1 +1 @@ -uid://6ypywv8vtlp8 +uid://bb651fjm77clt diff --git a/addons/gdUnit4/src/mocking/GdUnitMockBuilder.gd.uid b/addons/gdUnit4/src/mocking/GdUnitMockBuilder.gd.uid index 3b5f4856..d3c48992 100644 --- a/addons/gdUnit4/src/mocking/GdUnitMockBuilder.gd.uid +++ b/addons/gdUnit4/src/mocking/GdUnitMockBuilder.gd.uid @@ -1 +1 @@ -uid://devdv6fxsu4cm +uid://p6d3jhrs7dgm diff --git a/addons/gdUnit4/src/mocking/GdUnitMockImpl.gd.uid b/addons/gdUnit4/src/mocking/GdUnitMockImpl.gd.uid index 01f3c33a..f1c35d78 100644 --- a/addons/gdUnit4/src/mocking/GdUnitMockImpl.gd.uid +++ b/addons/gdUnit4/src/mocking/GdUnitMockImpl.gd.uid @@ -1 +1 @@ -uid://dyeukucg26ye +uid://cbjg1pk3jrok4 diff --git a/addons/gdUnit4/src/monitor/ErrorLogEntry.gd b/addons/gdUnit4/src/monitor/ErrorLogEntry.gd index 5ee14878..ebbc93f9 100644 --- a/addons/gdUnit4/src/monitor/ErrorLogEntry.gd +++ b/addons/gdUnit4/src/monitor/ErrorLogEntry.gd @@ -11,15 +11,6 @@ enum TYPE { const GdUnitTools := preload("res://addons/gdUnit4/src/core/GdUnitTools.gd") -const PATTERN_SCRIPT_ERROR := "USER SCRIPT ERROR:" -const PATTERN_PUSH_ERROR := "USER ERROR:" -const PATTERN_PUSH_WARNING := "USER WARNING:" -# With Godot 4.4 the pattern has changed -const PATTERN_4x4_SCRIPT_ERROR := "SCRIPT ERROR:" -const PATTERN_4x4_PUSH_ERROR := "ERROR:" -const PATTERN_4x4_PUSH_WARNING := "WARNING:" - -static var _regex_parse_error_line_number: RegEx var _type: TYPE var _line: int @@ -34,39 +25,17 @@ func _init(type: TYPE, line: int, message: String, details: String) -> void: _details = details -static func is_godot4x4() -> bool: - return Engine.get_version_info().hex >= 0x40400 - - -static func extract_push_warning(records: PackedStringArray, index: int) -> ErrorLogEntry: - var pattern := PATTERN_4x4_PUSH_WARNING if is_godot4x4() else PATTERN_PUSH_WARNING - return _extract(records, index, TYPE.PUSH_WARNING, pattern) - - -static func extract_push_error(records: PackedStringArray, index: int) -> ErrorLogEntry: - var pattern := PATTERN_4x4_PUSH_ERROR if is_godot4x4() else PATTERN_PUSH_ERROR - return _extract(records, index, TYPE.PUSH_ERROR, pattern) +func _to_string() -> String: + return _message -static func extract_error(records: PackedStringArray, index: int) -> ErrorLogEntry: - var pattern := PATTERN_4x4_SCRIPT_ERROR if is_godot4x4() else PATTERN_SCRIPT_ERROR - return _extract(records, index, TYPE.SCRIPT_ERROR, pattern) +static func of_push_warning(line: int, message: String, stack_trace: PackedStringArray) -> ErrorLogEntry: + return ErrorLogEntry.new(TYPE.PUSH_WARNING, line, message, "\n".join(stack_trace)) -static func _extract(records: PackedStringArray, index: int, type: TYPE, pattern: String) -> ErrorLogEntry: - var message := records[index] - if message.begins_with(pattern): - var error := message.replace(pattern, "").strip_edges() - var details := records[index+1].strip_edges() - var line := _parse_error_line_number(details) - return ErrorLogEntry.new(type, line, error, details) - return null +static func of_push_error(line: int, message: String, stack_trace: PackedStringArray) -> ErrorLogEntry: + return ErrorLogEntry.new(TYPE.PUSH_ERROR, line, message, "\n".join(stack_trace)) -static func _parse_error_line_number(record: String) -> int: - if _regex_parse_error_line_number == null: - _regex_parse_error_line_number = GdUnitTools.to_regex("at: .*res://.*:(\\d+)") - var matches := _regex_parse_error_line_number.search(record) - if matches != null: - return matches.get_string(1).to_int() - return -1 +static func of_script_error(line: int, message: String, stack_trace: PackedStringArray) -> ErrorLogEntry: + return ErrorLogEntry.new(TYPE.SCRIPT_ERROR, line, message, "\n".join(stack_trace)) diff --git a/addons/gdUnit4/src/monitor/ErrorLogEntry.gd.uid b/addons/gdUnit4/src/monitor/ErrorLogEntry.gd.uid index 9113b5d3..853fc8ea 100644 --- a/addons/gdUnit4/src/monitor/ErrorLogEntry.gd.uid +++ b/addons/gdUnit4/src/monitor/ErrorLogEntry.gd.uid @@ -1 +1 @@ -uid://dc01q4bwjrlbj +uid://b52fac8u71oob diff --git a/addons/gdUnit4/src/monitor/GdUnitMonitor.gd.uid b/addons/gdUnit4/src/monitor/GdUnitMonitor.gd.uid index fdb90719..8cd84e0d 100644 --- a/addons/gdUnit4/src/monitor/GdUnitMonitor.gd.uid +++ b/addons/gdUnit4/src/monitor/GdUnitMonitor.gd.uid @@ -1 +1 @@ -uid://ith4leeqnc2e +uid://cxbv220ht8r0s diff --git a/addons/gdUnit4/src/monitor/GdUnitOrphanNodeInfo.gd b/addons/gdUnit4/src/monitor/GdUnitOrphanNodeInfo.gd new file mode 100644 index 00000000..c195760e --- /dev/null +++ b/addons/gdUnit4/src/monitor/GdUnitOrphanNodeInfo.gd @@ -0,0 +1,70 @@ +class_name GdUnitOrphanNodeInfo +extends RefCounted + +enum GdUnitOrphanType { + member, + variable, + unknown +} + + +var _id: int +var _orphan_type: GdUnitOrphanType +var _type: String +var _name: String +var _script_ref: String +var _func_ref: String +var _next: GdUnitOrphanNodeInfo + +const text_color := Color.ANTIQUE_WHITE +const function_color := Color.SKY_BLUE +const member_variable_color := Color.SALMON +const engine_type_color := Color.LIGHT_GREEN +const script_path_color := Color.CORNFLOWER_BLUE + + +func _init(orphan_type: GdUnitOrphanType, id: int, type: String, name: String, script_ref: String, func_ref: String = "") -> void: + _orphan_type = orphan_type + _id = id + _type = type + _name = name + _script_ref = script_ref + _func_ref = func_ref + + +func as_trace(info: GdUnitOrphanNodeInfo, show_orphan_id := true) -> String: + var trace := "" + if show_orphan_id: + trace += "• <%s> Id:%s\n" % [ + _colored(info._type, engine_type_color), + _colored(info._id, engine_type_color)] + match info._orphan_type: + GdUnitOrphanType.member: + return trace + " at %s script: %s" % [ + _colored(info._name, member_variable_color), + _colored(info._script_ref, script_path_color) + ] + sub_info(info._next) + GdUnitOrphanType.variable: + return trace + " at %s script: %s.%s()" % [ + _colored(info._name, member_variable_color), + _colored(info._script_ref, script_path_color), + _colored(info._func_ref, function_color), + ] + GdUnitOrphanType.unknown: + return trace + " %s" % [ + _colored(info._name, member_variable_color) + ] + + _: + return trace + " No details available" + + +func sub_info(next: GdUnitOrphanNodeInfo) -> String: + if next == null: + return "" + + return "\n" + as_trace(next, false) + + +static func _colored(value: Variant, color: Color) -> String: + return "[color=%s]%s[/color]" % [color.to_html(), value] diff --git a/addons/gdUnit4/src/monitor/GdUnitOrphanNodeInfo.gd.uid b/addons/gdUnit4/src/monitor/GdUnitOrphanNodeInfo.gd.uid new file mode 100644 index 00000000..eb2f21c0 --- /dev/null +++ b/addons/gdUnit4/src/monitor/GdUnitOrphanNodeInfo.gd.uid @@ -0,0 +1 @@ +uid://c57l3cv136otf diff --git a/addons/gdUnit4/src/monitor/GdUnitOrphanNodesMonitor.gd b/addons/gdUnit4/src/monitor/GdUnitOrphanNodesMonitor.gd index 725dd1fb..05f11cd5 100644 --- a/addons/gdUnit4/src/monitor/GdUnitOrphanNodesMonitor.gd +++ b/addons/gdUnit4/src/monitor/GdUnitOrphanNodesMonitor.gd @@ -1,27 +1,221 @@ class_name GdUnitOrphanNodesMonitor extends GdUnitMonitor -var _initial_count := 0 -var _orphan_count := 0 +const excluded_frame_files: PackedStringArray = [ + "GdUnitOrphanNodesMonitor", + "GdUnitExecutionContext", + "_TestCase", + "IGdUnitExecutionStage", + "GdUnitTestCaseSingleTestStage", + "GdUnitTestCaseSingleExecutionStage", + "GdUnitTestCaseExecutionStage", + "GdUnitTestSuiteExecutionStage", + "GdUnitTestSuiteExecutor" +] + +var _child_monitors: Array[GdUnitOrphanNodesMonitor] = [] var _orphan_detection_enabled :bool +var _initial_orphans: Array[int] = [] +var _orphan_ids_at_start: Array[int] = [] +var _orphan_ids_at_stop: Array[int] = [] +var _collected_orphan_infos: Array[GdUnitOrphanNodeInfo] = [] -func _init(name :String = "") -> void: +func _init(name: String) -> void: super("OrphanNodesMonitor:" + name) _orphan_detection_enabled = GdUnitSettings.is_verbose_orphans() + _initial_orphans = _get_orphan_node_ids() + + +func add_child_monitor(monitor: GdUnitOrphanNodesMonitor) -> void: + if not _orphan_detection_enabled: + return + _child_monitors.append(monitor) func start() -> void: - _initial_count = _orphans() + if not _orphan_detection_enabled: + return + _collected_orphan_infos.clear() + # Collect current orphan id's to be filtered out at `stop` + _orphan_ids_at_start = _get_orphan_node_ids() func stop() -> void: - _orphan_count = max(0, _orphans() - _initial_count) + if not _orphan_detection_enabled: + return + # Collect only new detected orphan id's, we want only to collect orphans between start and stop time + _orphan_ids_at_stop = _get_orphan_node_ids().filter(func(element: int) -> bool: + # Excluding sub monitores orphans + if _collect_child_orphan_ids().has(element): + return false + # Excluding orphans at start + return not _orphan_ids_at_start.has(element) and not _initial_orphans.has(element) + ) + + +func _collect_child_orphan_ids() -> Array[int]: + var collected_ids: Array[int] = [] + for child_monitor in _child_monitors: + collected_ids.append_array(child_monitor._orphan_ids_at_stop) + collected_ids.append_array(child_monitor._collect_child_orphan_ids()) + return collected_ids + + +func detected_orphans() -> Array[GdUnitOrphanNodeInfo]: + if not _orphan_detection_enabled: + return [] + return _collected_orphan_infos.filter(func(info: GdUnitOrphanNodeInfo) -> bool: + return info._id in _orphan_ids_at_stop + ) + + +func orphans_count() -> int: + if not _orphan_detection_enabled: + return 0 + return _orphan_ids_at_stop.size() + + +func collect() -> void: + if not _orphan_detection_enabled: + return + for orphan_id in _get_orphan_node_ids(): + var orphan_to_find := instance_from_id(orphan_id) + _collect_orphan_info(orphan_to_find) + + +func _collect_orphan_info(orphan_to_find: Object) -> void: + if orphan_to_find == null: + return + + var orphan_node := _find_orphan_on_backtraces(orphan_to_find) + if orphan_node: + _collected_orphan_infos.append(orphan_node) + return + + if Engine.has_meta("GdUnitSceneRunner"): + var current_scene_runner:GdUnitSceneRunner = Engine.get_meta("GdUnitSceneRunner") + if is_instance_valid(current_scene_runner): + orphan_node = _find_orphan_at_node(orphan_to_find, current_scene_runner.scene()) + if orphan_node: + _collected_orphan_infos.append(orphan_node) + return + + # not able to find the orphan node via backtrace loaded nodeds + var message := "No details found. Verify called functions manually." + if not EngineDebugger.is_active(): + message = "No details available. [color=yellow]Run tests in debug mode to collect details.[/color]" + + _collected_orphan_infos.append(GdUnitOrphanNodeInfo.new( + GdUnitOrphanNodeInfo.GdUnitOrphanType.unknown, + orphan_to_find.get_instance_id(), + orphan_to_find.get_class(), + message, + "")) + + +func _find_orphan_at_node(orphan_to_find: Object, node: Node) -> GdUnitOrphanNodeInfo: + var script: Script = node.get_script() + if script is not GDScript: + return null + + # First search over all properties + for property in script.get_script_property_list(): + var property_name: String = property["name"] + var property_type: int = property["type"] + # Is untyped or type object + if property_type in [TYPE_NIL, TYPE_OBJECT]: + var property_instance: Variant = node.get(property_name) + @warning_ignore("unsafe_cast") + var property_as_node := property_instance as Node if property_instance != null else null + if property_as_node == null: + continue + if property_as_node == orphan_to_find: + return GdUnitOrphanNodeInfo.new( + GdUnitOrphanNodeInfo.GdUnitOrphanType.member, + orphan_to_find.get_instance_id(), + orphan_to_find.get_class(), + property_name, + script.resource_path) + + # Search on node childs + var orphan_node_info := _find_orphan_at_node(orphan_to_find, property_as_node) + if orphan_node_info: + orphan_node_info._next = GdUnitOrphanNodeInfo.new( + GdUnitOrphanNodeInfo.GdUnitOrphanType.member, + orphan_to_find.get_instance_id(), + orphan_to_find.get_class(), + property_name, + script.resource_path) + return orphan_node_info + + # Second over all children + for child_node in node.get_children(): + var orphan_node_info := _find_orphan_at_node(orphan_to_find, child_node) + if orphan_node_info: + return orphan_node_info + return null + + +func _is_frame_file_excluded(frame_file: String) -> bool: + for file in excluded_frame_files: + if frame_file.contains(file): + return true + return false + + +func _find_orphan_on_backtraces(orphan_to_find: Object) -> GdUnitOrphanNodeInfo: + for script_backtrace in Engine.capture_script_backtraces(true): + for frame in script_backtrace.get_frame_count(): + var frame_file := script_backtrace.get_frame_file(frame) + if _is_frame_file_excluded(frame_file): + continue + # Scan function variables + for l_index in script_backtrace.get_local_variable_count(frame): + var variable_instance: Variant = script_backtrace.get_local_variable_value(frame, l_index) + var variable_name := script_backtrace.get_local_variable_name(frame, l_index) + if typeof(variable_instance) in [TYPE_NIL, TYPE_OBJECT]: + @warning_ignore("unsafe_cast") + var node := variable_instance as Node + if node == null: + continue + if variable_instance == orphan_to_find: + return GdUnitOrphanNodeInfo.new( + GdUnitOrphanNodeInfo.GdUnitOrphanType.variable, + orphan_to_find.get_instance_id(), + orphan_to_find.get_class(), + variable_name, + script_backtrace.get_frame_file(frame), + script_backtrace.get_frame_function(frame)) + else: + var orphan_node_info := _find_orphan_at_node(orphan_to_find, node) + if orphan_node_info: + return orphan_node_info -func _orphans() -> int: - return Performance.get_monitor(Performance.OBJECT_ORPHAN_NODE_COUNT) as int + # Scan class members + for m_index in script_backtrace.get_member_variable_count(frame): + var member_instance: Variant = script_backtrace.get_member_variable_value(frame, m_index) + var member_name := script_backtrace.get_member_variable_name(frame, m_index) + if typeof(member_instance) in [TYPE_NIL, TYPE_OBJECT]: + @warning_ignore("unsafe_cast") + var node := member_instance as Node + if node == null: + continue + if member_instance == orphan_to_find: + return GdUnitOrphanNodeInfo.new( + GdUnitOrphanNodeInfo.GdUnitOrphanType.member, + orphan_to_find.get_instance_id(), + orphan_to_find.get_class(), + member_name, + script_backtrace.get_frame_file(frame)) + else: + var orphan_node_info := _find_orphan_at_node(orphan_to_find, node) + if orphan_node_info: + return orphan_node_info + return null -func orphan_nodes() -> int: - return _orphan_count if _orphan_detection_enabled else 0 +static func _get_orphan_node_ids() -> Array[int]: + @warning_ignore("unsafe_property_access", "unsafe_method_access") + return Engine.get_main_loop().root.get_orphan_node_ids() diff --git a/addons/gdUnit4/src/monitor/GdUnitOrphanNodesMonitor.gd.uid b/addons/gdUnit4/src/monitor/GdUnitOrphanNodesMonitor.gd.uid index 3a4c14a9..46ebad20 100644 --- a/addons/gdUnit4/src/monitor/GdUnitOrphanNodesMonitor.gd.uid +++ b/addons/gdUnit4/src/monitor/GdUnitOrphanNodesMonitor.gd.uid @@ -1 +1 @@ -uid://bwi5ola574pol +uid://ryjb5pbypvv2 diff --git a/addons/gdUnit4/src/monitor/GodotGdErrorMonitor.gd b/addons/gdUnit4/src/monitor/GodotGdErrorMonitor.gd index 16db4582..b1b28d7f 100644 --- a/addons/gdUnit4/src/monitor/GodotGdErrorMonitor.gd +++ b/addons/gdUnit4/src/monitor/GodotGdErrorMonitor.gd @@ -1,103 +1,122 @@ class_name GodotGdErrorMonitor extends GdUnitMonitor -var _godot_log_file: String -var _eof: int -var _report_enabled := false -var _entries: Array[ErrorLogEntry] = [] + +var _logger: GdUnitLogger + + +class GdUnitLogger extends Logger: + var _entries: Array[ErrorLogEntry] = [] + var _line_number: int + var _is_report_push_errors: bool + var _is_report_script_errors: bool + + + func _init(is_report_push_errors: bool, is_report_script_errors: bool) -> void: + _is_report_push_errors = is_report_push_errors + _is_report_script_errors = is_report_script_errors + OS.add_logger(self) + + + func entries() -> Array[ErrorLogEntry]: + return _entries + + func erase_log_entry(log_entry: ErrorLogEntry) -> void: + for entry in _entries: + if entry._type == log_entry._type and entry._message == log_entry._message: + _entries.erase(entry) + return + + + func _log_error( + _function: String, + _file: String, + _line: int, + message: String, + _rationale: String, + _editor_notify: bool, + error_type: int, + script_backtraces: Array[ScriptBacktrace] + ) -> void: + match error_type: + ErrorType.ERROR_TYPE_WARNING: + if _is_report_push_errors: + var stack_trace := _build_stack_trace(script_backtraces) + _entries.append(ErrorLogEntry.of_push_warning(_line_number, message, stack_trace)) + + ErrorType.ERROR_TYPE_ERROR: + if _is_report_push_errors: + var stack_trace := _build_stack_trace(script_backtraces) + _entries.append(ErrorLogEntry.of_push_error(_line_number, message, stack_trace)) + + ErrorType.ERROR_TYPE_SCRIPT: + if _is_report_script_errors: + var stack_trace := _build_stack_trace(script_backtraces) + _entries.append(ErrorLogEntry.of_script_error(_line_number, message, stack_trace)) + + ErrorType.ERROR_TYPE_SHADER: + pass + _: + prints("Unknwon log type", message) + + func _log_message(_message: String, _error: bool) -> void: + pass + + func _build_stack_trace(script_backtraces: Array[ScriptBacktrace]) -> PackedStringArray: + for sb in script_backtraces: + for frame in sb.get_frame_count(): + # Find start of test stack + if sb.get_frame_file(frame) == "res://addons/gdUnit4/src/core/_TestCase.gd": + var stack_trace := PackedStringArray() + for test_case_frame in range(0, frame): + _line_number = sb.get_frame_line(test_case_frame) + stack_trace.append(" at %s:%s" % [sb.get_frame_file(test_case_frame), sb.get_frame_line(test_case_frame)]) + return stack_trace + # if no stack trace collected, we in an await function call + var sb := script_backtraces[0] + return [" at %s:%s" % [sb.get_frame_file(0), sb.get_frame_line(0)]] func _init() -> void: - super("GodotGdErrorMonitor") - _godot_log_file = GdUnitSettings.get_log_path() - _report_enabled = _is_reporting_enabled() + super("GdUnitLoggerMonitor") + _logger = GdUnitLogger.new(GdUnitSettings.is_report_push_errors(), GdUnitSettings.is_report_script_errors()) func start() -> void: - var file := FileAccess.open(_godot_log_file, FileAccess.READ) - if file: - file.seek_end(0) - _eof = file.get_length() + clear_logs() func stop() -> void: pass +func log_entries() -> Array[ErrorLogEntry]: + return _logger.entries() + + +func erase_log_entry(log_entry: ErrorLogEntry) -> void: + _logger.erase_log_entry(log_entry) + + func to_reports() -> Array[GdUnitReport]: var reports_: Array[GdUnitReport] = [] - if _report_enabled: - reports_.assign(_entries.map(_to_report)) - _entries.clear() + + reports_.assign(log_entries().map(_to_report)) + return reports_ static func _to_report(errorLog: ErrorLogEntry) -> GdUnitReport: - var failure := "%s\n\t%s\n%s %s" % [ + var failure := """ + %s + %s %s + %s""".dedent().trim_prefix("\n") % [ GdAssertMessages._error("Godot Runtime Error !"), - GdAssertMessages._colored_value(errorLog._details), GdAssertMessages._error("Error:"), - GdAssertMessages._colored_value(errorLog._message)] + GdAssertMessages._colored_value(errorLog._message), + GdAssertMessages._colored(errorLog._details, GdAssertMessages.VALUE_COLOR)] return GdUnitReport.new().create(GdUnitReport.ABORT, errorLog._line, failure) -func scan(force_collect_reports := false) -> Array[ErrorLogEntry]: - await (Engine.get_main_loop() as SceneTree).process_frame - await (Engine.get_main_loop() as SceneTree).physics_frame - _entries.append_array(_collect_log_entries(force_collect_reports)) - return _entries - - -func erase_log_entry(entry: ErrorLogEntry) -> void: - _entries.erase(entry) - - -func collect_full_logs() -> PackedStringArray: - await (Engine.get_main_loop() as SceneTree).process_frame - await (Engine.get_main_loop() as SceneTree).physics_frame - - var file := FileAccess.open(_godot_log_file, FileAccess.READ) - file.seek(_eof) - var records := PackedStringArray() - while not file.eof_reached(): - @warning_ignore("return_value_discarded") - records.append(file.get_line()) - - return records - - -func _collect_log_entries(force_collect_reports: bool) -> Array[ErrorLogEntry]: - var file := FileAccess.open(_godot_log_file, FileAccess.READ) - if not file: - # Log file might not be available. - return [] - file.seek(_eof) - var records := PackedStringArray() - while not file.eof_reached(): - @warning_ignore("return_value_discarded") - records.append(file.get_line()) - file.seek_end(0) - _eof = file.get_length() - var log_entries: Array[ErrorLogEntry]= [] - var is_report_errors := force_collect_reports or _is_report_push_errors() - var is_report_script_errors := force_collect_reports or _is_report_script_errors() - for index in records.size(): - if force_collect_reports: - log_entries.append(ErrorLogEntry.extract_push_warning(records, index)) - if is_report_errors: - log_entries.append(ErrorLogEntry.extract_push_error(records, index)) - if is_report_script_errors: - log_entries.append(ErrorLogEntry.extract_error(records, index)) - return log_entries.filter(func(value: ErrorLogEntry) -> bool: return value != null ) - - -func _is_reporting_enabled() -> bool: - return _is_report_script_errors() or _is_report_push_errors() - - -func _is_report_push_errors() -> bool: - return GdUnitSettings.is_report_push_errors() - - -func _is_report_script_errors() -> bool: - return GdUnitSettings.is_report_script_errors() +func clear_logs() -> void: + log_entries().clear() diff --git a/addons/gdUnit4/src/monitor/GodotGdErrorMonitor.gd.uid b/addons/gdUnit4/src/monitor/GodotGdErrorMonitor.gd.uid index e501bf48..519004e9 100644 --- a/addons/gdUnit4/src/monitor/GodotGdErrorMonitor.gd.uid +++ b/addons/gdUnit4/src/monitor/GodotGdErrorMonitor.gd.uid @@ -1 +1 @@ -uid://ddu7re3nhfovr +uid://cgyttjah3afgb diff --git a/addons/gdUnit4/src/network/GdUnitServer.gd b/addons/gdUnit4/src/network/GdUnitServer.gd index 6d878a01..4ce2f488 100644 --- a/addons/gdUnit4/src/network/GdUnitServer.gd +++ b/addons/gdUnit4/src/network/GdUnitServer.gd @@ -1,7 +1,9 @@ @tool extends Node -@onready var _server :GdUnitTcpServer = $TcpServer +var _client_id: int + +@onready var _server: GdUnitTcpServer = $TcpServer @warning_ignore("return_value_discarded") @@ -15,10 +17,10 @@ func _ready() -> void: _server.client_connected.connect(_on_client_connected) _server.client_disconnected.connect(_on_client_disconnected) _server.rpc_data.connect(_receive_rpc_data) - GdUnitCommandHandler.instance().gdunit_runner_stop.connect(_on_gdunit_runner_stop) func _on_client_connected(client_id: int) -> void: + _client_id = client_id GdUnitSignals.instance().gdunit_client_connected.emit(client_id) @@ -26,11 +28,6 @@ func _on_client_disconnected(client_id: int) -> void: GdUnitSignals.instance().gdunit_client_disconnected.emit(client_id) -func _on_gdunit_runner_stop(client_id: int) -> void: - if _server: - _server.disconnect_client(client_id) - - func _receive_rpc_data(p_rpc: RPC) -> void: if p_rpc is RPCMessage: var rpc_message: RPCMessage = p_rpc @@ -38,5 +35,7 @@ func _receive_rpc_data(p_rpc: RPC) -> void: return if p_rpc is RPCGdUnitEvent: var rpc_event: RPCGdUnitEvent = p_rpc - GdUnitSignals.instance().gdunit_event.emit(rpc_event.event()) - return + var event := rpc_event.event() + GdUnitSignals.instance().gdunit_event.emit(event) + if event.type() == GdUnitEvent.SESSION_CLOSE and _server != null: + _server.disconnect_client(_client_id) diff --git a/addons/gdUnit4/src/network/GdUnitServer.gd.uid b/addons/gdUnit4/src/network/GdUnitServer.gd.uid index 61029602..c998102b 100644 --- a/addons/gdUnit4/src/network/GdUnitServer.gd.uid +++ b/addons/gdUnit4/src/network/GdUnitServer.gd.uid @@ -1 +1 @@ -uid://bou8b3qboxmmw +uid://qqbnyp4e5rd2 diff --git a/addons/gdUnit4/src/network/GdUnitServerConstants.gd.uid b/addons/gdUnit4/src/network/GdUnitServerConstants.gd.uid index 95037212..d5a8b0a5 100644 --- a/addons/gdUnit4/src/network/GdUnitServerConstants.gd.uid +++ b/addons/gdUnit4/src/network/GdUnitServerConstants.gd.uid @@ -1 +1 @@ -uid://dvt8r46i4soe3 +uid://l5nq0vyxf3rh diff --git a/addons/gdUnit4/src/network/GdUnitTask.gd.uid b/addons/gdUnit4/src/network/GdUnitTask.gd.uid index 4e3c3bd5..508df8f6 100644 --- a/addons/gdUnit4/src/network/GdUnitTask.gd.uid +++ b/addons/gdUnit4/src/network/GdUnitTask.gd.uid @@ -1 +1 @@ -uid://cphown6d22alc +uid://oflygfefywtd diff --git a/addons/gdUnit4/src/network/GdUnitTcpClient.gd b/addons/gdUnit4/src/network/GdUnitTcpClient.gd index 2cf32a37..d6c8a42d 100644 --- a/addons/gdUnit4/src/network/GdUnitTcpClient.gd +++ b/addons/gdUnit4/src/network/GdUnitTcpClient.gd @@ -1,3 +1,4 @@ +@tool class_name GdUnitTcpClient extends GdUnitTcpNode @@ -100,7 +101,8 @@ func process_rpc() -> void: if _stream.get_available_bytes() > 0: var rpc_data := rpc_receive() if rpc_data is RPCClientDisconnect: - stop() + console("RPCClientDisconnect") + GdUnitSignals.instance().gdunit_test_session_terminate.emit.call_deferred() func send(data: RPC) -> void: diff --git a/addons/gdUnit4/src/network/GdUnitTcpClient.gd.uid b/addons/gdUnit4/src/network/GdUnitTcpClient.gd.uid index ba4d61a9..619d64c4 100644 --- a/addons/gdUnit4/src/network/GdUnitTcpClient.gd.uid +++ b/addons/gdUnit4/src/network/GdUnitTcpClient.gd.uid @@ -1 +1 @@ -uid://cghxfus00xqqa +uid://bbx58dwn6q4j0 diff --git a/addons/gdUnit4/src/network/GdUnitTcpNode.gd.uid b/addons/gdUnit4/src/network/GdUnitTcpNode.gd.uid index 8d4d4867..1fb4403c 100644 --- a/addons/gdUnit4/src/network/GdUnitTcpNode.gd.uid +++ b/addons/gdUnit4/src/network/GdUnitTcpNode.gd.uid @@ -1 +1 @@ -uid://oi0ifevw4c4y +uid://ceptogsxbe85g diff --git a/addons/gdUnit4/src/network/GdUnitTcpServer.gd b/addons/gdUnit4/src/network/GdUnitTcpServer.gd index 4687ac19..997d6e30 100644 --- a/addons/gdUnit4/src/network/GdUnitTcpServer.gd +++ b/addons/gdUnit4/src/network/GdUnitTcpServer.gd @@ -51,6 +51,12 @@ class TcpConnection extends GdUnitTcpNode: ) + func disconnect_from_server() -> void: + if _stream == null or _stream.get_status() != StreamPeerTCP.STATUS_CONNECTED: + return + rpc_send(_stream, RPCClientDisconnect.new().with_id(_id)) + + func console(_value: Variant) -> void: #print_debug("TCP Server: ", value) pass @@ -58,6 +64,11 @@ class TcpConnection extends GdUnitTcpNode: func _init(server_name := "GdUnit4 TCP Server") -> void: _server_name = server_name + GdUnitSignals.instance().gdunit_test_session_terminate.connect(func() -> void: + for connection in get_children(): + if connection is TcpConnection: + (connection as TcpConnection).disconnect_from_server() + ) func _ready() -> void: diff --git a/addons/gdUnit4/src/network/GdUnitTcpServer.gd.uid b/addons/gdUnit4/src/network/GdUnitTcpServer.gd.uid index b5ed67a5..9ec9f48e 100644 --- a/addons/gdUnit4/src/network/GdUnitTcpServer.gd.uid +++ b/addons/gdUnit4/src/network/GdUnitTcpServer.gd.uid @@ -1 +1 @@ -uid://clfnvhrjrv8w6 +uid://8lmvrgssbq62 diff --git a/addons/gdUnit4/src/network/rpc/RPC.gd.uid b/addons/gdUnit4/src/network/rpc/RPC.gd.uid index 99972c67..05d1c723 100644 --- a/addons/gdUnit4/src/network/rpc/RPC.gd.uid +++ b/addons/gdUnit4/src/network/rpc/RPC.gd.uid @@ -1 +1 @@ -uid://cx0qfmxtj4bwt +uid://clqpcv7vfl5by diff --git a/addons/gdUnit4/src/network/rpc/RPCClientConnect.gd.uid b/addons/gdUnit4/src/network/rpc/RPCClientConnect.gd.uid index be2f995a..35d62445 100644 --- a/addons/gdUnit4/src/network/rpc/RPCClientConnect.gd.uid +++ b/addons/gdUnit4/src/network/rpc/RPCClientConnect.gd.uid @@ -1 +1 @@ -uid://bdio43gdelu1i +uid://7vo4fbwd8iho diff --git a/addons/gdUnit4/src/network/rpc/RPCClientDisconnect.gd.uid b/addons/gdUnit4/src/network/rpc/RPCClientDisconnect.gd.uid index 3afe53ee..bad40940 100644 --- a/addons/gdUnit4/src/network/rpc/RPCClientDisconnect.gd.uid +++ b/addons/gdUnit4/src/network/rpc/RPCClientDisconnect.gd.uid @@ -1 +1 @@ -uid://di7wbudqfl7m1 +uid://bf2hk545tryxp diff --git a/addons/gdUnit4/src/network/rpc/RPCGdUnitEvent.gd.uid b/addons/gdUnit4/src/network/rpc/RPCGdUnitEvent.gd.uid index 8e059d97..db6d9440 100644 --- a/addons/gdUnit4/src/network/rpc/RPCGdUnitEvent.gd.uid +++ b/addons/gdUnit4/src/network/rpc/RPCGdUnitEvent.gd.uid @@ -1 +1 @@ -uid://b27fgxch4ycbf +uid://dsdvopul4f8di diff --git a/addons/gdUnit4/src/network/rpc/RPCMessage.gd.uid b/addons/gdUnit4/src/network/rpc/RPCMessage.gd.uid index 1bafd738..49bc77a9 100644 --- a/addons/gdUnit4/src/network/rpc/RPCMessage.gd.uid +++ b/addons/gdUnit4/src/network/rpc/RPCMessage.gd.uid @@ -1 +1 @@ -uid://b6el6katlkf8w +uid://dqpiqk2bxeapi diff --git a/addons/gdUnit4/src/reporters/GdUnitReportSummary.gd.uid b/addons/gdUnit4/src/reporters/GdUnitReportSummary.gd.uid index 6de596a5..5febda1e 100644 --- a/addons/gdUnit4/src/reporters/GdUnitReportSummary.gd.uid +++ b/addons/gdUnit4/src/reporters/GdUnitReportSummary.gd.uid @@ -1 +1 @@ -uid://cxt40diesh6pc +uid://cobf2mqj7kct5 diff --git a/addons/gdUnit4/src/reporters/GdUnitReportWriter.gd.uid b/addons/gdUnit4/src/reporters/GdUnitReportWriter.gd.uid index 4a5e1129..8fc10104 100644 --- a/addons/gdUnit4/src/reporters/GdUnitReportWriter.gd.uid +++ b/addons/gdUnit4/src/reporters/GdUnitReportWriter.gd.uid @@ -1 +1 @@ -uid://cbquy7r2ye33l +uid://bxmtc2e08f0al diff --git a/addons/gdUnit4/src/reporters/GdUnitTestCaseReport.gd.uid b/addons/gdUnit4/src/reporters/GdUnitTestCaseReport.gd.uid index 69af8bb9..8a2e273f 100644 --- a/addons/gdUnit4/src/reporters/GdUnitTestCaseReport.gd.uid +++ b/addons/gdUnit4/src/reporters/GdUnitTestCaseReport.gd.uid @@ -1 +1 @@ -uid://hhn8rwdgali0 +uid://xof7hime4phe diff --git a/addons/gdUnit4/src/reporters/GdUnitTestReporter.gd.uid b/addons/gdUnit4/src/reporters/GdUnitTestReporter.gd.uid index 40ce8574..cf612c8c 100644 --- a/addons/gdUnit4/src/reporters/GdUnitTestReporter.gd.uid +++ b/addons/gdUnit4/src/reporters/GdUnitTestReporter.gd.uid @@ -1 +1 @@ -uid://2ympkqu6j2hl +uid://7x8ws4esbecc diff --git a/addons/gdUnit4/src/reporters/GdUnitTestSuiteReport.gd.uid b/addons/gdUnit4/src/reporters/GdUnitTestSuiteReport.gd.uid index 7fa6c605..b38dc484 100644 --- a/addons/gdUnit4/src/reporters/GdUnitTestSuiteReport.gd.uid +++ b/addons/gdUnit4/src/reporters/GdUnitTestSuiteReport.gd.uid @@ -1 +1 @@ -uid://ttn5oyc7esh5 +uid://ucldcy60nevk diff --git a/addons/gdUnit4/src/reporters/console/GdUnitConsoleTestReporter.gd b/addons/gdUnit4/src/reporters/console/GdUnitConsoleTestReporter.gd index 8b54aac0..9978deb3 100644 --- a/addons/gdUnit4/src/reporters/console/GdUnitConsoleTestReporter.gd +++ b/addons/gdUnit4/src/reporters/console/GdUnitConsoleTestReporter.gd @@ -15,7 +15,7 @@ var test_session: GdUnitTestSession: test_session.test_event.connect(on_gdunit_event) -var _writer: GdUnitMessageWritter +var _writer: GdUnitMessageWriter var _reporter: GdUnitTestReporter = GdUnitTestReporter.new() var _status_indent := 86 var _detailed: bool @@ -24,7 +24,7 @@ var _function_color: Color = Color.ANTIQUE_WHITE var _engine_type_color: Color = Color.ANTIQUE_WHITE -func _init(writer: GdUnitMessageWritter, detailed := false) -> void: +func _init(writer: GdUnitMessageWriter, detailed := false) -> void: _writer = writer _writer.clear() _detailed = detailed @@ -56,7 +56,7 @@ func on_gdunit_event(event: GdUnitEvent) -> void: println_message(build_executed_test_case_msg(total_test_count(), total_skipped_count()), Color.DARK_SALMON) println_message("Total execution time: %s" % LocalTime.elapsed(elapsed_time()), Color.DARK_SALMON) # We need finally to set the wave effect to enable the animations - _writer.effect(GdUnitMessageWritter.Effect.WAVE).print_at("", 0) + _writer.effect(GdUnitMessageWriter.Effect.WAVE).print_at("", 0) GdUnitEvent.TESTSUITE_BEFORE: _reporter.init_statistics() @@ -65,10 +65,10 @@ func on_gdunit_event(event: GdUnitEvent) -> void: GdUnitEvent.TESTSUITE_AFTER: if not event.reports().is_empty(): - _writer.color(Color.DARK_SALMON)\ - .style(GdUnitMessageWritter.BOLD)\ - .println_message(event.suite_name()+":finalze") - _print_failure_report(event.reports()) + _writer.indent(1).color(_engine_type_color).print_message(event._suite_name) + print_message(" > ") + print_message("finalize()", _function_color) + _print_failure_report(event.reports()) _print_statistics(_reporter.build_test_suite_statisitcs(event)) _print_status(event) println_message("") @@ -108,23 +108,23 @@ func _print_test_path(test: GdUnitTestCase, uid: GdUnitGUID) -> void: func _print_status(event: GdUnitEvent) -> void: if event.is_flaky() and event.is_success(): var retries: int = event.statistic(GdUnitEvent.RETRY_COUNT) - _writer.color(Color.GREEN_YELLOW)\ - .style(GdUnitMessageWritter.ITALIC)\ + _writer.color(Color.GREEN_YELLOW) \ + .style(GdUnitMessageWriter.ITALIC) \ .print_at("FLAKY (%d retries)" % retries, _status_indent) elif event.is_success(): _writer.color(Color.FOREST_GREEN).print_at("PASSED", _status_indent) elif event.is_skipped(): - _writer.color(Color.GOLDENROD).style(GdUnitMessageWritter.ITALIC).print_at("SKIPPED", _status_indent) + _writer.color(Color.GOLDENROD).style(GdUnitMessageWriter.ITALIC).print_at("SKIPPED", _status_indent) elif event.is_failed() or event.is_error(): - var retries :int = event.statistic(GdUnitEvent.RETRY_COUNT) + var retries: int = event.statistic(GdUnitEvent.RETRY_COUNT) var message := "FAILED (retry %d)" % retries if retries > 1 else "FAILED" - _writer.color(Color.FIREBRICK)\ - .style(GdUnitMessageWritter.BOLD)\ - .effect(GdUnitMessageWritter.Effect.WAVE)\ + _writer.color(Color.FIREBRICK) \ + .style(GdUnitMessageWriter.BOLD) \ + .effect(GdUnitMessageWriter.Effect.WAVE) \ .print_at(message, _status_indent) elif event.is_warning(): - _writer.color(Color.GOLDENROD)\ - .style(GdUnitMessageWritter.UNDERLINE)\ + _writer.color(Color.GOLDENROD) \ + .style(GdUnitMessageWriter.UNDERLINE) \ .print_at("WARNING", _status_indent) println_message(" %s" % LocalTime.elapsed(event.elapsed_time()), Color.CORNFLOWER_BLUE) @@ -137,10 +137,11 @@ func _print_failure_report(reports: Array[GdUnitReport]) -> void: or report.is_error() or report.is_warning() or report.is_skipped() + or report.is_orphan() ): - _writer.indent(1)\ - .color(Color.DARK_TURQUOISE)\ - .style(GdUnitMessageWritter.BOLD | GdUnitMessageWritter.UNDERLINE)\ + _writer.indent(1) \ + .color(Color.DARK_TURQUOISE) \ + .style(GdUnitMessageWriter.BOLD | GdUnitMessageWriter.UNDERLINE) \ .println_message("Report:") var text := str(report) for line in text.split("\n", false): @@ -152,7 +153,7 @@ func _print_failure_report(reports: Array[GdUnitReport]) -> void: func _print_statistics(statistics: Dictionary) -> void: print_message("Statistics:", Color.DODGER_BLUE) - print_message(" %d test cases | %d errors | %d failures | %d flaky | %d skipped | %d orphans |" %\ + print_message(" %d test cases | %d errors | %d failures | %d flaky | %d skipped | %d orphans |" % \ [statistics["total_count"], statistics["error_count"], statistics["failed_count"], @@ -163,7 +164,7 @@ func _print_statistics(statistics: Dictionary) -> void: func _print_summary() -> void: print_message("Overall Summary:", Color.DODGER_BLUE) - _writer\ + _writer \ .println_message(" %d test cases | %d errors | %d failures | %d flaky | %d skipped | %d orphans |" % [ total_test_count(), total_error_count(), @@ -183,7 +184,7 @@ func build_executed_test_suite_msg(executed_count: int, total_count: int) -> Str func build_executed_test_case_msg(total_count: int, p_skipped_count: int) -> String: if p_skipped_count == 0: return "Executed test cases : (%d/%d)" % [total_count, total_count] - return "Executed test cases : (%d/%d), %d skipped" % [total_count-p_skipped_count, total_count, p_skipped_count] + return "Executed test cases : (%d/%d), %d skipped" % [total_count - p_skipped_count, total_count, p_skipped_count] func print_message(message: String, color: Color = _text_color) -> void: diff --git a/addons/gdUnit4/src/reporters/console/GdUnitConsoleTestReporter.gd.uid b/addons/gdUnit4/src/reporters/console/GdUnitConsoleTestReporter.gd.uid index df22f258..75bdd473 100644 --- a/addons/gdUnit4/src/reporters/console/GdUnitConsoleTestReporter.gd.uid +++ b/addons/gdUnit4/src/reporters/console/GdUnitConsoleTestReporter.gd.uid @@ -1 +1 @@ -uid://b6xkrfskcc6a2 +uid://dhf8pn02q1kwf diff --git a/addons/gdUnit4/src/reporters/html/GdUnitByPathReport.gd.uid b/addons/gdUnit4/src/reporters/html/GdUnitByPathReport.gd.uid index f6ecfc8b..2c3a7cb9 100644 --- a/addons/gdUnit4/src/reporters/html/GdUnitByPathReport.gd.uid +++ b/addons/gdUnit4/src/reporters/html/GdUnitByPathReport.gd.uid @@ -1 +1 @@ -uid://b153cs0yh0lwm +uid://cfyma14vknf7q diff --git a/addons/gdUnit4/src/reporters/html/GdUnitHtmlPatterns.gd.uid b/addons/gdUnit4/src/reporters/html/GdUnitHtmlPatterns.gd.uid index 255109ed..55b0fe5c 100644 --- a/addons/gdUnit4/src/reporters/html/GdUnitHtmlPatterns.gd.uid +++ b/addons/gdUnit4/src/reporters/html/GdUnitHtmlPatterns.gd.uid @@ -1 +1 @@ -uid://dreawonplort +uid://beu8w7ac54wtn diff --git a/addons/gdUnit4/src/reporters/html/GdUnitHtmlReportWriter.gd.uid b/addons/gdUnit4/src/reporters/html/GdUnitHtmlReportWriter.gd.uid index d56c2aef..ec33d03f 100644 --- a/addons/gdUnit4/src/reporters/html/GdUnitHtmlReportWriter.gd.uid +++ b/addons/gdUnit4/src/reporters/html/GdUnitHtmlReportWriter.gd.uid @@ -1 +1 @@ -uid://d0gn8sltoi8nm +uid://db4mi0fc11575 diff --git a/addons/gdUnit4/src/reporters/xml/JUnitXmlReportWriter.gd.uid b/addons/gdUnit4/src/reporters/xml/JUnitXmlReportWriter.gd.uid index 18df0ee7..38440708 100644 --- a/addons/gdUnit4/src/reporters/xml/JUnitXmlReportWriter.gd.uid +++ b/addons/gdUnit4/src/reporters/xml/JUnitXmlReportWriter.gd.uid @@ -1 +1 @@ -uid://drb733xw634rd +uid://clkydfmu7ojh diff --git a/addons/gdUnit4/src/reporters/xml/XmlElement.gd.uid b/addons/gdUnit4/src/reporters/xml/XmlElement.gd.uid index 8fbd8da7..d4204455 100644 --- a/addons/gdUnit4/src/reporters/xml/XmlElement.gd.uid +++ b/addons/gdUnit4/src/reporters/xml/XmlElement.gd.uid @@ -1 +1 @@ -uid://6vceptdvowpg +uid://3tvam5spapts diff --git a/addons/gdUnit4/src/spy/GdUnitSpyBuilder.gd.uid b/addons/gdUnit4/src/spy/GdUnitSpyBuilder.gd.uid index 63068f4f..cfdf20ec 100644 --- a/addons/gdUnit4/src/spy/GdUnitSpyBuilder.gd.uid +++ b/addons/gdUnit4/src/spy/GdUnitSpyBuilder.gd.uid @@ -1 +1 @@ -uid://lnb8k70lrdt1 +uid://cicyjnaqb2w3j diff --git a/addons/gdUnit4/src/spy/GdUnitSpyImpl.gd.uid b/addons/gdUnit4/src/spy/GdUnitSpyImpl.gd.uid index 9eee162c..c270eb7c 100644 --- a/addons/gdUnit4/src/spy/GdUnitSpyImpl.gd.uid +++ b/addons/gdUnit4/src/spy/GdUnitSpyImpl.gd.uid @@ -1 +1 @@ -uid://o7r8i8uino0m +uid://it0u1luk1tk5 diff --git a/addons/gdUnit4/src/ui/GdUnitConsole.gd.uid b/addons/gdUnit4/src/ui/GdUnitConsole.gd.uid index 8b316595..e1ad9b00 100644 --- a/addons/gdUnit4/src/ui/GdUnitConsole.gd.uid +++ b/addons/gdUnit4/src/ui/GdUnitConsole.gd.uid @@ -1 +1 @@ -uid://dm710bg0dhn4o +uid://gnyub3q4vanm diff --git a/addons/gdUnit4/src/ui/GdUnitFonts.gd.uid b/addons/gdUnit4/src/ui/GdUnitFonts.gd.uid index 734f7c91..ea977b57 100644 --- a/addons/gdUnit4/src/ui/GdUnitFonts.gd.uid +++ b/addons/gdUnit4/src/ui/GdUnitFonts.gd.uid @@ -1 +1 @@ -uid://1r0ywt2xtb25 +uid://cu1d1pquh12l5 diff --git a/addons/gdUnit4/src/ui/GdUnitInspector.gd b/addons/gdUnit4/src/ui/GdUnitInspector.gd index a6d53f9b..81d896f1 100644 --- a/addons/gdUnit4/src/ui/GdUnitInspector.gd +++ b/addons/gdUnit4/src/ui/GdUnitInspector.gd @@ -4,12 +4,16 @@ extends Panel var _command_handler := GdUnitCommandHandler.instance() +var _wait_time := 0.0 func _ready() -> void: @warning_ignore("return_value_discarded") - GdUnitCommandHandler.instance().gdunit_runner_start.connect(func() -> void: - var control :Control = get_parent_control() + GdUnitSignals.instance().gdunit_event.connect(func(event: GdUnitEvent) -> void: + if event.type() != GdUnitEvent.SESSION_START: + return + + var control: Control = get_parent_control() # if the tab is floating we dont need to set as current if control is TabContainer: var tab_container :TabContainer = control @@ -22,10 +26,9 @@ func _ready() -> void: @warning_ignore("unsafe_property_access", "unsafe_method_access") %MainPanel.test_counters_changed.connect(%ProgressBar._on_test_counter_changed) -func _process(_delta: float) -> void: - _command_handler._do_process() - -@warning_ignore("redundant_await") -func _on_status_bar_request_discover_tests() -> void: - await _command_handler.cmd_discover_tests() +func _process(delta: float) -> void: + _wait_time += delta + if _wait_time > 5.0: + _wait_time = 0 + _command_handler._do_process() diff --git a/addons/gdUnit4/src/ui/GdUnitInspector.gd.uid b/addons/gdUnit4/src/ui/GdUnitInspector.gd.uid index eb4459ff..ab61398e 100644 --- a/addons/gdUnit4/src/ui/GdUnitInspector.gd.uid +++ b/addons/gdUnit4/src/ui/GdUnitInspector.gd.uid @@ -1 +1 @@ -uid://dlur1qir5aduv +uid://b4gmm88c2hxra diff --git a/addons/gdUnit4/src/ui/GdUnitInspector.tscn b/addons/gdUnit4/src/ui/GdUnitInspector.tscn index 2dcb9505..537c7dc0 100644 --- a/addons/gdUnit4/src/ui/GdUnitInspector.tscn +++ b/addons/gdUnit4/src/ui/GdUnitInspector.tscn @@ -58,7 +58,6 @@ layout_mode = 2 [node name="event_server" parent="." instance=ExtResource("7_721no")] -[connection signal="request_discover_tests" from="VBoxContainer/Header/StatusBar" to="." method="_on_status_bar_request_discover_tests"] [connection signal="select_error_next" from="VBoxContainer/Header/StatusBar" to="VBoxContainer/MainPanel" method="_on_select_next_item_by_state" binds= [7]] [connection signal="select_error_prevous" from="VBoxContainer/Header/StatusBar" to="VBoxContainer/MainPanel" method="_on_select_previous_item_by_state" binds= [7]] [connection signal="select_failure_next" from="VBoxContainer/Header/StatusBar" to="VBoxContainer/MainPanel" method="_on_select_next_item_by_state" binds= [6]] diff --git a/addons/gdUnit4/src/ui/GdUnitInspectorTreeConstants.gd.uid b/addons/gdUnit4/src/ui/GdUnitInspectorTreeConstants.gd.uid index cdf3a7e4..77196a5b 100644 --- a/addons/gdUnit4/src/ui/GdUnitInspectorTreeConstants.gd.uid +++ b/addons/gdUnit4/src/ui/GdUnitInspectorTreeConstants.gd.uid @@ -1 +1 @@ -uid://catqq5jt2ac2e +uid://wiqsq354np64 diff --git a/addons/gdUnit4/src/ui/GdUnitUiTools.gd.uid b/addons/gdUnit4/src/ui/GdUnitUiTools.gd.uid index bf36456e..38dd50e3 100644 --- a/addons/gdUnit4/src/ui/GdUnitUiTools.gd.uid +++ b/addons/gdUnit4/src/ui/GdUnitUiTools.gd.uid @@ -1 +1 @@ -uid://dug2bl60wnj6b +uid://bfb0pndqutnqx diff --git a/addons/gdUnit4/src/ui/ScriptEditorControls.gd.uid b/addons/gdUnit4/src/ui/ScriptEditorControls.gd.uid index 89d0f274..e1810163 100644 --- a/addons/gdUnit4/src/ui/ScriptEditorControls.gd.uid +++ b/addons/gdUnit4/src/ui/ScriptEditorControls.gd.uid @@ -1 +1 @@ -uid://1n82qpd4r6x5 +uid://cuods3rre6f1t diff --git a/addons/gdUnit4/src/ui/menu/EditorFileSystemContextMenuHandler.gd b/addons/gdUnit4/src/ui/menu/EditorFileSystemContextMenuHandler.gd deleted file mode 100644 index 044b9efc..00000000 --- a/addons/gdUnit4/src/ui/menu/EditorFileSystemContextMenuHandler.gd +++ /dev/null @@ -1,79 +0,0 @@ -@tool -extends Control - -var _context_menus := Dictionary() -var _command_handler := GdUnitCommandHandler.instance() - - -func _init() -> void: - set_name("EditorFileSystemContextMenuHandler") - - var is_test_suite := func is_visible(script: Script, is_ts: bool) -> bool: - if script == null: - return false - return GdUnitTestSuiteScanner.is_test_suite(script) == is_ts - var context_menus :Array[GdUnitContextMenuItem] = [ - GdUnitContextMenuItem.new(GdUnitContextMenuItem.MENU_ID.TEST_RUN, "Run Testsuites", "Play", is_test_suite.bind(true), _command_handler.command(GdUnitCommandHandler.CMD_RUN_TESTSUITE)), - GdUnitContextMenuItem.new(GdUnitContextMenuItem.MENU_ID.TEST_DEBUG, "Debug Testsuites", "PlayStart", is_test_suite.bind(true), _command_handler.command(GdUnitCommandHandler.CMD_RUN_TESTSUITE_DEBUG)), - ] - for menu in context_menus: - _context_menus[menu.id] = menu - var popup := _menu_popup() - var file_tree := _file_tree() - @warning_ignore("return_value_discarded") - popup.about_to_popup.connect(on_context_menu_show.bind(popup, file_tree)) - @warning_ignore("return_value_discarded") - popup.id_pressed.connect(on_context_menu_pressed.bind(file_tree)) - - -func on_context_menu_show(context_menu: PopupMenu, file_tree: Tree) -> void: - context_menu.add_separator() - var current_index := context_menu.get_item_count() - - for menu_id: int in _context_menus.keys(): - var menu_item: GdUnitContextMenuItem = _context_menus[menu_id] - - context_menu.add_item(menu_item.name, menu_id) - #context_menu.set_item_icon_modulate(current_index, Color.MEDIUM_PURPLE) - context_menu.set_item_disabled(current_index, !menu_item.is_enabled(null)) - context_menu.set_item_icon(current_index, GdUnitUiTools.get_icon(menu_item.icon)) - current_index += 1 - - -func on_context_menu_pressed(id: int, file_tree: Tree) -> void: - if !_context_menus.has(id): - return - var menu_item: GdUnitContextMenuItem = _context_menus[id] - var test_suites := collect_testsuites(menu_item, file_tree) - - menu_item.execute([test_suites]) - - -func collect_testsuites(_menu_item: GdUnitContextMenuItem, file_tree: Tree) -> Array[Script]: - var file_system := EditorInterface.get_resource_filesystem() - var selected_item := file_tree.get_selected() - var selected_test_suites: Array[Script] = [] - var suite_scaner := GdUnitTestSuiteScanner.new() - - while selected_item: - var resource_path: String = selected_item.get_metadata(0) - var file_type := file_system.get_file_type(resource_path) - var is_dir := DirAccess.dir_exists_absolute(resource_path) - if is_dir: - selected_test_suites.append_array(suite_scaner.scan_directory(resource_path)) - elif is_dir or file_type == "GDScript" or file_type == "CSharpScript": - # find a performant way to check if the selected item a testsuite - var resource: Script = ResourceLoader.load(resource_path, "Script", ResourceLoader.CACHE_MODE_REUSE) - if _menu_item.is_visible(resource): - @warning_ignore("return_value_discarded") - selected_test_suites.append(resource) - selected_item = file_tree.get_next_selected(selected_item) - return selected_test_suites - - -func _file_tree() -> Tree: - return GdObjects.find_nodes_by_class(EditorInterface.get_file_system_dock(), "Tree", true)[-1] - - -func _menu_popup() -> PopupMenu: - return GdObjects.find_nodes_by_class(EditorInterface.get_file_system_dock(), "PopupMenu")[-1] diff --git a/addons/gdUnit4/src/ui/menu/EditorFileSystemContextMenuHandler.gd.uid b/addons/gdUnit4/src/ui/menu/EditorFileSystemContextMenuHandler.gd.uid deleted file mode 100644 index ff582094..00000000 --- a/addons/gdUnit4/src/ui/menu/EditorFileSystemContextMenuHandler.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cq7lcsiitaupx diff --git a/addons/gdUnit4/src/ui/menu/EditorFileSystemContextMenuHandlerV44.gdx b/addons/gdUnit4/src/ui/menu/EditorFileSystemContextMenuHandlerV44.gdx deleted file mode 100644 index 108450e5..00000000 --- a/addons/gdUnit4/src/ui/menu/EditorFileSystemContextMenuHandlerV44.gdx +++ /dev/null @@ -1,47 +0,0 @@ -@tool -extends EditorContextMenuPlugin - -var _context_menus := Dictionary() -var _command_handler := GdUnitCommandHandler.instance() - - -func _init() -> void: - var is_test_suite := func is_visible(script: Script, is_ts: bool) -> bool: - if script == null: - return false - return GdUnitTestSuiteScanner.is_test_suite(script) == is_ts - _context_menus[GdUnitContextMenuItem.MENU_ID.TEST_RUN] = GdUnitContextMenuItem.new(GdUnitContextMenuItem.MENU_ID.TEST_RUN, "Run Testsuites", "Play", is_test_suite.bind(true), _command_handler.command(GdUnitCommandHandler.CMD_RUN_TESTSUITE)) - _context_menus[GdUnitContextMenuItem.MENU_ID.TEST_DEBUG] = GdUnitContextMenuItem.new(GdUnitContextMenuItem.MENU_ID.TEST_DEBUG, "Debug Testsuites", "PlayStart", is_test_suite.bind(true), _command_handler.command(GdUnitCommandHandler.CMD_RUN_TESTSUITE_DEBUG)) - - # setup shortcuts - for menu_item: GdUnitContextMenuItem in _context_menus.values(): - var cb := func call(files: Array) -> void: - menu_item.execute([files]) - add_menu_shortcut(menu_item.shortcut(), cb) - - -func _popup_menu(paths: PackedStringArray) -> void: - var test_suites: Array[Script] = [] - var suite_scaner := GdUnitTestSuiteScanner.new() - - for resource_path in paths: - # directories and test-suites are valid to enable the menu - if DirAccess.dir_exists_absolute(resource_path): - test_suites.append_array(suite_scaner.scan_directory(resource_path)) - continue - - var file_type := resource_path.get_extension() - if file_type == "gd" or file_type == "cs": - var script: Script = ResourceLoader.load(resource_path, "Script", ResourceLoader.CACHE_MODE_REUSE) - if GdUnitTestSuiteScanner.is_test_suite(script): - test_suites.append(script) - - # no direcory or test-suites selected? - if test_suites.is_empty(): - return - - for menu_item: GdUnitContextMenuItem in _context_menus.values(): - @warning_ignore("unused_parameter") - var cb := func call(files: Array) -> void: - menu_item.execute([test_suites]) - add_context_menu_item(menu_item.name, cb, GdUnitUiTools.get_icon(menu_item.icon)) diff --git a/addons/gdUnit4/src/ui/menu/GdUnitContextMenuItem.gd b/addons/gdUnit4/src/ui/menu/GdUnitContextMenuItem.gd index 2f89c61e..3849e31d 100644 --- a/addons/gdUnit4/src/ui/menu/GdUnitContextMenuItem.gd +++ b/addons/gdUnit4/src/ui/menu/GdUnitContextMenuItem.gd @@ -1,18 +1,11 @@ class_name GdUnitContextMenuItem -enum MENU_ID { - UNDEFINED = 0, - TEST_RUN = 1000, - TEST_DEBUG = 1001, - TEST_RERUN = 1002, - CREATE_TEST = 1010, -} -var id: MENU_ID = MENU_ID.UNDEFINED: +var command_id: String: set(value): - id = value + command_id = value get: - return id + return command_id var name: StringName: set(value): @@ -20,50 +13,33 @@ var name: StringName: get: return name -var command: GdUnitCommand: - set(value): - command = value - get: - return command - var visible: Callable: set(value): visible = value get: return visible -var icon: String: - set(value): - icon = value +var icon: Texture2D: get: - return icon + return GdUnitCommandHandler.instance().command_icon(command_id) -func _init(p_id: MENU_ID, p_name: StringName, p_icon :String, p_is_visible: Callable, p_command: GdUnitCommand) -> void: - assert(p_id != null, "(%s) missing parameter 'MENU_ID'" % p_name) +func _init(p_command_id: String, p_name: StringName, p_is_visible: Callable) -> void: + assert(p_command_id != null and not p_command_id.is_empty(), "(%s) missing command id " % p_command_id) assert(p_is_visible != null, "(%s) missing parameter 'GdUnitCommand'" % p_name) - assert(p_command != null, "(%s) missing parameter 'GdUnitCommand'" % p_name) - self.id = p_id + + self.command_id = p_command_id self.name = p_name - self.icon = p_icon - self.command = p_command self.visible = p_is_visible func shortcut() -> Shortcut: - return GdUnitCommandHandler.instance().get_shortcut(command.shortcut) - - -func is_enabled(script: Script) -> bool: - return command.is_enabled.call(script) + return GdUnitCommandHandler.instance().command_shortcut(command_id) -func is_visible(script: Script) -> bool: - return visible.call(script) +func is_visible(...args: Array) -> bool: + return visible.callv(args) -func execute(arguments:=[]) -> void: - if arguments.is_empty(): - command.runnable.call() - else: - command.runnable.callv(arguments) +func execute(...args: Array) -> void: + GdUnitCommandHandler.instance().command_execute(command_id, args) diff --git a/addons/gdUnit4/src/ui/menu/GdUnitContextMenuItem.gd.uid b/addons/gdUnit4/src/ui/menu/GdUnitContextMenuItem.gd.uid index 655c8391..2ff147c0 100644 --- a/addons/gdUnit4/src/ui/menu/GdUnitContextMenuItem.gd.uid +++ b/addons/gdUnit4/src/ui/menu/GdUnitContextMenuItem.gd.uid @@ -1 +1 @@ -uid://cr4b1qj3gpmy2 +uid://dfm15wq8tktpo diff --git a/addons/gdUnit4/src/ui/menu/GdUnitEditorFileSystemContextMenuHandler.gd b/addons/gdUnit4/src/ui/menu/GdUnitEditorFileSystemContextMenuHandler.gd new file mode 100644 index 00000000..0c92b923 --- /dev/null +++ b/addons/gdUnit4/src/ui/menu/GdUnitEditorFileSystemContextMenuHandler.gd @@ -0,0 +1,37 @@ +@tool +extends EditorContextMenuPlugin + +var _context_menus: Array[GdUnitContextMenuItem] = [] + + +func _init() -> void: + var is_test_suite := func is_visible(script: Script, is_ts: bool) -> bool: + if script == null: + return false + return GdUnitTestSuiteScanner.is_test_suite(script) == is_ts + _context_menus.append(GdUnitContextMenuItem.new( + GdUnitCommandFileSystemRunTests.ID, + "Run Testsuites", + is_test_suite.bind(true) + )) + _context_menus.append(GdUnitContextMenuItem.new( + GdUnitCommandFileSystemDebugTests.ID, + "Debug Testsuites", + is_test_suite.bind(true) + )) + + # setup shortcuts + for menu_item in _context_menus: + if menu_item.shortcut(): + var cb := func call(...files: Array) -> void: + var paths: Array = files[0] + menu_item.execute.callv(paths) + add_menu_shortcut(menu_item.shortcut(), cb) + + +func _popup_menu(paths: PackedStringArray) -> void: + for menu_item in _context_menus: + if menu_item.shortcut(): + add_context_menu_item_from_shortcut(menu_item.name, menu_item.shortcut(), menu_item.icon) + else: + add_context_menu_item(menu_item.name, menu_item.execute.bindv(paths).unbind(1), menu_item.icon) diff --git a/addons/gdUnit4/src/ui/menu/GdUnitEditorFileSystemContextMenuHandler.gd.uid b/addons/gdUnit4/src/ui/menu/GdUnitEditorFileSystemContextMenuHandler.gd.uid new file mode 100644 index 00000000..21b8f7c7 --- /dev/null +++ b/addons/gdUnit4/src/ui/menu/GdUnitEditorFileSystemContextMenuHandler.gd.uid @@ -0,0 +1 @@ +uid://dnkehrpjpqu8n diff --git a/addons/gdUnit4/src/ui/menu/GdUnitInspectorContextMenu.gd b/addons/gdUnit4/src/ui/menu/GdUnitInspectorContextMenu.gd new file mode 100644 index 00000000..2d6071a4 --- /dev/null +++ b/addons/gdUnit4/src/ui/menu/GdUnitInspectorContextMenu.gd @@ -0,0 +1,63 @@ +@tool +class_name GdUnitInspectorContextMenu +extends PopupMenu + + +const CONTEXT_MENU_RUN_ID = 0 +const CONTEXT_MENU_DEBUG_ID = 1 +const CONTEXT_MENU_RERUN_UNTIL_ID = 2 +# id 3 is the seperator +const CONTEXT_MENU_COLLAPSE_ALL = 4 +const CONTEXT_MENU_EXPAND_ALL = 5 + + +var command_handler: GdUnitCommandHandler + + +func _ready() -> void: + if not Engine.is_editor_hint(): + return + command_handler = GdUnitCommandHandler.instance() + _setup_item(CONTEXT_MENU_RUN_ID, "Run Tests", GdUnitCommandInspectorRunTests.ID) + _setup_item(CONTEXT_MENU_DEBUG_ID, "Debug Tests", GdUnitCommandInspectorDebugTests.ID) + _setup_item(CONTEXT_MENU_RERUN_UNTIL_ID, "Run Tests Until Fail", GdUnitCommandInspectorRerunTestsUntilFailure.ID) + _setup_item(CONTEXT_MENU_EXPAND_ALL, "Expand All", GdUnitCommandInspectorTreeExpand.ID) + _setup_item(CONTEXT_MENU_COLLAPSE_ALL, "Collapse All", GdUnitCommandInspectorTreeCollapse.ID) + + +func _setup_item(item_id: int, item_name: String, command_id: String) -> void: + set_item_text(item_id, item_name) + set_item_icon(item_id, command_handler.command_icon(command_id)) + set_item_shortcut(item_id, command_handler.command_shortcut(command_id)) + + +func disable_items() -> void: + set_item_disabled(CONTEXT_MENU_RUN_ID, true) + set_item_disabled(CONTEXT_MENU_DEBUG_ID, true) + set_item_disabled(CONTEXT_MENU_RERUN_UNTIL_ID, true) + + +func enable_items() -> void: + set_item_disabled(CONTEXT_MENU_RUN_ID, false) + set_item_disabled(CONTEXT_MENU_DEBUG_ID, false) + set_item_disabled(CONTEXT_MENU_RERUN_UNTIL_ID, false) + + +func _on_tree_item_mouse_selected(mouse_position: Vector2, mouse_button_index: int, source: Tree) -> void: + if mouse_button_index == MOUSE_BUTTON_RIGHT: + position = source.get_screen_position() + mouse_position + popup() + + +func _on_index_pressed(index: int) -> void: + match index: + CONTEXT_MENU_RUN_ID: + command_handler.command_execute(GdUnitCommandInspectorRunTests.ID) + CONTEXT_MENU_DEBUG_ID: + command_handler.command_execute(GdUnitCommandInspectorDebugTests.ID) + CONTEXT_MENU_RERUN_UNTIL_ID: + command_handler.command_execute(GdUnitCommandInspectorRerunTestsUntilFailure.ID) + CONTEXT_MENU_EXPAND_ALL: + command_handler.command_execute(GdUnitCommandInspectorTreeExpand.ID) + CONTEXT_MENU_COLLAPSE_ALL: + command_handler.command_execute(GdUnitCommandInspectorTreeCollapse.ID) diff --git a/addons/gdUnit4/src/ui/menu/GdUnitInspectorContextMenu.gd.uid b/addons/gdUnit4/src/ui/menu/GdUnitInspectorContextMenu.gd.uid new file mode 100644 index 00000000..be9f974b --- /dev/null +++ b/addons/gdUnit4/src/ui/menu/GdUnitInspectorContextMenu.gd.uid @@ -0,0 +1 @@ +uid://docil6li3gcog diff --git a/addons/gdUnit4/src/ui/menu/GdUnitInspectorContextMenu.tscn b/addons/gdUnit4/src/ui/menu/GdUnitInspectorContextMenu.tscn new file mode 100644 index 00000000..5d87a413 --- /dev/null +++ b/addons/gdUnit4/src/ui/menu/GdUnitInspectorContextMenu.tscn @@ -0,0 +1,70 @@ +[gd_scene format=3 uid="uid://bjcc71p2h1trr"] + +[ext_resource type="Script" path="res://addons/gdUnit4/src/ui/menu/GdUnitInspectorContextMenu.gd" id="1_0x0vc"] + +[sub_resource type="DPITexture" id="DPITexture_miuuy"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) +} + +[sub_resource type="DPITexture" id="DPITexture_ern2r"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) +} + +[sub_resource type="DPITexture" id="DPITexture_qdci2"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) +} + +[sub_resource type="DPITexture" id="DPITexture_hed0i"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) +} + +[node name="contextMenu" type="PopupMenu" unique_id=1824556050] +auto_translate_mode = 2 +oversampling_override = 1.0 +size = Vector2i(241, 170) +visible = true +item_count = 6 +item_0/text = "Run Tests" +item_0/icon = SubResource("DPITexture_miuuy") +item_0/id = 0 +item_1/text = "Debug Tests" +item_1/icon = SubResource("DPITexture_ern2r") +item_1/id = 1 +item_2/text = "Run Tests Until Fail" +item_2/icon = SubResource("DPITexture_miuuy") +item_2/id = 2 +item_3/id = 3 +item_3/separator = true +item_4/text = "Collapse All" +item_4/icon = SubResource("DPITexture_qdci2") +item_4/id = 4 +item_5/text = "Expand All" +item_5/icon = SubResource("DPITexture_hed0i") +item_5/id = 5 +script = ExtResource("1_0x0vc") + +[connection signal="index_pressed" from="." to="." method="_on_index_pressed"] diff --git a/addons/gdUnit4/src/ui/menu/GdUnitScriptEditorContextMenuHandler.gd b/addons/gdUnit4/src/ui/menu/GdUnitScriptEditorContextMenuHandler.gd new file mode 100644 index 00000000..26f5612e --- /dev/null +++ b/addons/gdUnit4/src/ui/menu/GdUnitScriptEditorContextMenuHandler.gd @@ -0,0 +1,41 @@ +@tool +extends EditorContextMenuPlugin + + +var _context_menus: Array[GdUnitContextMenuItem] = [] + + +func _init() -> void: + var is_test_suite := func is_visible(script: Script, is_ts: bool) -> bool: + return GdUnitTestSuiteScanner.is_test_suite(script) == is_ts + _context_menus.append(GdUnitContextMenuItem.new( + GdUnitCommandScriptEditorRunTests.ID, + "Run Tests", + is_test_suite.bind(true) + )) + _context_menus.append(GdUnitContextMenuItem.new( + GdUnitCommandScriptEditorDebugTests.ID, + "Debug Tests", + is_test_suite.bind(true) + )) + _context_menus.append(GdUnitContextMenuItem.new( + GdUnitCommandScriptEditorCreateTest.ID, + "Create Test", + is_test_suite.bind(false) + )) + + # setup shortcuts + for menu_item in _context_menus: + if menu_item.shortcut(): + add_menu_shortcut(menu_item.shortcut(), menu_item.execute.unbind(1)) + + +func _popup_menu(_paths: PackedStringArray) -> void: + var current_script := EditorInterface.get_script_editor().get_current_script() + + for menu_item in _context_menus: + if menu_item.is_visible(current_script): + if menu_item.shortcut(): + add_context_menu_item_from_shortcut(menu_item.name, menu_item.shortcut()) + else: + add_context_menu_item(menu_item.name, menu_item.execute.unbind(1)) diff --git a/addons/gdUnit4/src/ui/menu/GdUnitScriptEditorContextMenuHandler.gd.uid b/addons/gdUnit4/src/ui/menu/GdUnitScriptEditorContextMenuHandler.gd.uid new file mode 100644 index 00000000..2d189fd1 --- /dev/null +++ b/addons/gdUnit4/src/ui/menu/GdUnitScriptEditorContextMenuHandler.gd.uid @@ -0,0 +1 @@ +uid://pa7kacqkw534 diff --git a/addons/gdUnit4/src/ui/menu/ScriptEditorContextMenuHandler.gd b/addons/gdUnit4/src/ui/menu/ScriptEditorContextMenuHandler.gd deleted file mode 100644 index 550c6d61..00000000 --- a/addons/gdUnit4/src/ui/menu/ScriptEditorContextMenuHandler.gd +++ /dev/null @@ -1,81 +0,0 @@ -@tool -extends Control - -var _context_menus := Dictionary() -var _editor: ScriptEditor -var _command_handler := GdUnitCommandHandler.instance() - - -func _init() -> void: - set_name("ScriptEditorContextMenuHandler") - - var is_test_suite := func is_visible(script: Script, is_ts: bool) -> bool: - return GdUnitTestSuiteScanner.is_test_suite(script) == is_ts - var context_menus :Array[GdUnitContextMenuItem] = [ - GdUnitContextMenuItem.new(GdUnitContextMenuItem.MENU_ID.TEST_RUN, "Run Tests", "Play", is_test_suite.bind(true), _command_handler.command(GdUnitCommandHandler.CMD_RUN_TESTCASE)), - GdUnitContextMenuItem.new(GdUnitContextMenuItem.MENU_ID.TEST_DEBUG, "Debug Tests", "PlayStart", is_test_suite.bind(true), _command_handler.command(GdUnitCommandHandler.CMD_RUN_TESTCASE_DEBUG)), - GdUnitContextMenuItem.new(GdUnitContextMenuItem.MENU_ID.CREATE_TEST, "Create Test", "New", is_test_suite.bind(false), _command_handler.command(GdUnitCommandHandler.CMD_CREATE_TESTCASE)) - ] - for menu in context_menus: - _context_menus[menu.id] = menu - _editor = EditorInterface.get_script_editor() - @warning_ignore("return_value_discarded") - _editor.editor_script_changed.connect(on_script_changed) - on_script_changed(active_script()) - - -func _input(event: InputEvent) -> void: - if event is InputEventKey and event.is_pressed(): - for action: GdUnitContextMenuItem in _context_menus.values(): - if action.shortcut().matches_event(event) and action.is_visible(active_script()): - #if not has_editor_focus(): - # return - action.execute() - accept_event() - return - - -func has_editor_focus() -> bool: - return (Engine.get_main_loop() as SceneTree).root.gui_get_focus_owner() == active_base_editor() - - -func on_script_changed(script: Script) -> void: - if script is Script: - var popups: Array[Node] = GdObjects.find_nodes_by_class(active_editor(), "PopupMenu", true) - for popup: PopupMenu in popups: - if not popup.about_to_popup.is_connected(on_context_menu_show): - popup.about_to_popup.connect(on_context_menu_show.bind(script, popup)) - if not popup.id_pressed.is_connected(on_context_menu_pressed): - popup.id_pressed.connect(on_context_menu_pressed) - - -func on_context_menu_show(script: Script, context_menu: PopupMenu) -> void: - #prints("on_context_menu_show", _context_menus.keys(), context_menu, self) - context_menu.add_separator() - var current_index := context_menu.get_item_count() - for menu_id: int in _context_menus.keys(): - var menu_item: GdUnitContextMenuItem = _context_menus[menu_id] - if menu_item.is_visible(script): - context_menu.add_item(menu_item.name, menu_id) - context_menu.set_item_disabled(current_index, !menu_item.is_enabled(script)) - context_menu.set_item_shortcut(current_index, menu_item.shortcut(), true) - current_index += 1 - - -func on_context_menu_pressed(id: int) -> void: - if !_context_menus.has(id): - return - var menu_item: GdUnitContextMenuItem = _context_menus[id] - menu_item.execute() - - -func active_editor() -> ScriptEditorBase: - return _editor.get_current_editor() - - -func active_base_editor() -> TextEdit: - return active_editor().get_base_editor() - - -func active_script() -> Script: - return _editor.get_current_script() diff --git a/addons/gdUnit4/src/ui/menu/ScriptEditorContextMenuHandler.gd.uid b/addons/gdUnit4/src/ui/menu/ScriptEditorContextMenuHandler.gd.uid deleted file mode 100644 index ab3bd591..00000000 --- a/addons/gdUnit4/src/ui/menu/ScriptEditorContextMenuHandler.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://d3x1ev5shdb5q diff --git a/addons/gdUnit4/src/ui/menu/ScriptEditorContextMenuHandlerV44.gdx b/addons/gdUnit4/src/ui/menu/ScriptEditorContextMenuHandlerV44.gdx deleted file mode 100644 index a879e378..00000000 --- a/addons/gdUnit4/src/ui/menu/ScriptEditorContextMenuHandlerV44.gdx +++ /dev/null @@ -1,33 +0,0 @@ -@tool -extends EditorContextMenuPlugin - -var _context_menus := Dictionary() -var _editor: ScriptEditor -var _command_handler := GdUnitCommandHandler.instance() - - -func _init() -> void: - var is_test_suite := func is_visible(script: Script, is_ts: bool) -> bool: - return GdUnitTestSuiteScanner.is_test_suite(script) == is_ts - var context_menus :Array[GdUnitContextMenuItem] = [ - GdUnitContextMenuItem.new(GdUnitContextMenuItem.MENU_ID.TEST_RUN, "Run Tests", "Play", is_test_suite.bind(true), _command_handler.command(GdUnitCommandHandler.CMD_RUN_TESTCASE)), - GdUnitContextMenuItem.new(GdUnitContextMenuItem.MENU_ID.TEST_DEBUG, "Debug Tests", "PlayStart", is_test_suite.bind(true), _command_handler.command(GdUnitCommandHandler.CMD_RUN_TESTCASE_DEBUG)), - GdUnitContextMenuItem.new(GdUnitContextMenuItem.MENU_ID.CREATE_TEST, "Create Test", "New", is_test_suite.bind(false), _command_handler.command(GdUnitCommandHandler.CMD_CREATE_TESTCASE)) - ] - for menu in context_menus: - _context_menus[menu.id] = menu - _editor = EditorInterface.get_script_editor() - @warning_ignore("return_value_discarded") - - -func _popup_menu(paths: PackedStringArray) -> void: - var script_path := paths[0] - var script: Script = ResourceLoader.load(script_path, "Script", ResourceLoader.CACHE_MODE_REUSE) - - for menu_id: int in _context_menus.keys(): - var menu_item: GdUnitContextMenuItem = _context_menus[menu_id] - if menu_item.is_visible(script): - add_context_menu_item(menu_item.name, - func call(files: Array) -> void: - menu_item.execute([script_path]), - GdUnitUiTools.get_icon(menu_item.icon)) diff --git a/addons/gdUnit4/src/ui/parts/InspectorMonitor.gd.uid b/addons/gdUnit4/src/ui/parts/InspectorMonitor.gd.uid index 7edd2ccd..8485298b 100644 --- a/addons/gdUnit4/src/ui/parts/InspectorMonitor.gd.uid +++ b/addons/gdUnit4/src/ui/parts/InspectorMonitor.gd.uid @@ -1 +1 @@ -uid://dcndxbt413dpn +uid://c1v33376gwdte diff --git a/addons/gdUnit4/src/ui/parts/InspectorProgressBar.gd.uid b/addons/gdUnit4/src/ui/parts/InspectorProgressBar.gd.uid index 3211d0b3..726f05b1 100644 --- a/addons/gdUnit4/src/ui/parts/InspectorProgressBar.gd.uid +++ b/addons/gdUnit4/src/ui/parts/InspectorProgressBar.gd.uid @@ -1 +1 @@ -uid://c71226knir1y +uid://rpsib775cxv6 diff --git a/addons/gdUnit4/src/ui/parts/InspectorStatusBar.gd b/addons/gdUnit4/src/ui/parts/InspectorStatusBar.gd index dfed5204..18634595 100644 --- a/addons/gdUnit4/src/ui/parts/InspectorStatusBar.gd +++ b/addons/gdUnit4/src/ui/parts/InspectorStatusBar.gd @@ -9,7 +9,6 @@ signal select_flaky_next() signal select_flaky_prevous() signal select_skipped_next() signal select_skipped_prevous() -signal request_discover_tests() @warning_ignore("unused_signal") signal tree_view_mode_changed(flat :bool) @@ -65,10 +64,6 @@ func _ready() -> void: _set_view_mode_menu_options() GdUnitSignals.instance().gdunit_event.connect(_on_gdunit_event) GdUnitSignals.instance().gdunit_settings_changed.connect(_on_settings_changed) - var command_handler := GdUnitCommandHandler.instance() - command_handler.gdunit_runner_start.connect(_on_gdunit_runner_start) - command_handler.gdunit_runner_stop.connect(_on_gdunit_runner_stop) - func _set_sort_mode_menu_options() -> void: @@ -151,6 +146,12 @@ func _on_gdunit_event(event: GdUnitEvent) -> void: GdUnitEvent.TESTSUITE_AFTER: status_changed(event.error_count(), event.failed_count(), event.is_flaky(), 0) + GdUnitEvent.SESSION_START: + disable_buttons(true) + + GdUnitEvent.SESSION_CLOSE: + disable_buttons(false) + func _on_btn_error_up_pressed() -> void: select_error_prevous.emit() @@ -184,8 +185,8 @@ func _on_btn_skipped_down_pressed() -> void: select_skipped_next.emit() -func _on_tree_sync_pressed() -> void: - request_discover_tests.emit() +func _on_btn_tree_sync_pressed() -> void: + await GdUnitTestDiscoverer.run() func _on_sort_mode_changed(index: int) -> void: @@ -201,14 +202,6 @@ func _on_tree_view_mode_changed(index: int) ->void: ################################################################################ # external signal receiver ################################################################################ -func _on_gdunit_runner_start() -> void: - disable_buttons(true) - - -func _on_gdunit_runner_stop(_client_id: int) -> void: - disable_buttons(false) - - func _on_settings_changed(property :GdUnitProperty) -> void: if property.name() == GdUnitSettings.INSPECTOR_TREE_SORT_MODE: _set_sort_mode_menu_options() diff --git a/addons/gdUnit4/src/ui/parts/InspectorStatusBar.gd.uid b/addons/gdUnit4/src/ui/parts/InspectorStatusBar.gd.uid index 53a3d755..a13afc57 100644 --- a/addons/gdUnit4/src/ui/parts/InspectorStatusBar.gd.uid +++ b/addons/gdUnit4/src/ui/parts/InspectorStatusBar.gd.uid @@ -1 +1 @@ -uid://cvqyv45dvlqko +uid://0p3tho13fov diff --git a/addons/gdUnit4/src/ui/parts/InspectorStatusBar.tscn b/addons/gdUnit4/src/ui/parts/InspectorStatusBar.tscn index baf6a9fb..d4ed816f 100644 --- a/addons/gdUnit4/src/ui/parts/InspectorStatusBar.tscn +++ b/addons/gdUnit4/src/ui/parts/InspectorStatusBar.tscn @@ -1,46 +1,58 @@ -[gd_scene load_steps=30 format=3 uid="uid://c22l4odk7qesc"] +[gd_scene load_steps=26 format=3 uid="uid://c22l4odk7qesc"] [ext_resource type="Script" path="res://addons/gdUnit4/src/ui/parts/InspectorStatusBar.gd" id="3"] -[sub_resource type="Image" id="Image_mb3ih"] -data = { -"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 160, 230, 230, 230, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 213, 225, 225, 225, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 225, 225, 75, 224, 224, 224, 188, 224, 224, 224, 238, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 245, 224, 224, 224, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 225, 225, 133, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 245, 226, 226, 226, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 226, 226, 77, 224, 224, 224, 255, 224, 224, 224, 253, 225, 225, 225, 117, 224, 224, 224, 32, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 212, 225, 225, 225, 42, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 129, 226, 226, 226, 70, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 189, 224, 224, 224, 255, 224, 224, 224, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 225, 225, 159, 230, 230, 230, 10, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 73, 224, 224, 224, 255, 224, 224, 224, 185, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 242, 224, 224, 224, 255, 224, 224, 224, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 225, 225, 25, 224, 224, 224, 255, 224, 224, 224, 238, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 243, 224, 224, 224, 254, 233, 233, 233, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 229, 229, 29, 224, 224, 224, 255, 224, 224, 224, 236, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 189, 224, 224, 224, 255, 225, 225, 225, 68, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 10, 224, 224, 224, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 121, 224, 224, 224, 255, 224, 224, 224, 181, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 72, 224, 224, 224, 121, 0, 0, 0, 0, 0, 0, 0, 0, 226, 226, 226, 43, 224, 224, 224, 213, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 227, 227, 227, 36, 225, 225, 225, 124, 224, 224, 224, 254, 224, 224, 224, 255, 226, 226, 226, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 96, 224, 224, 224, 245, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 226, 226, 95, 224, 224, 224, 245, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 237, 224, 224, 224, 185, 226, 226, 226, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 225, 225, 42, 224, 224, 224, 213, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 10, 225, 225, 225, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 +[sub_resource type="DPITexture" id="DPITexture_mb3ih"] +_source = " +" +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(1, 0.87, 0.4, 1) } -[sub_resource type="ImageTexture" id="ImageTexture_wo03e"] -image = SubResource("Image_mb3ih") - -[sub_resource type="Image" id="Image_ixycx"] -data = { -"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 233, 233, 23, 224, 224, 224, 198, 224, 224, 224, 201, 224, 224, 224, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 233, 233, 233, 23, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 215, 224, 224, 224, 24, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 196, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 171, 224, 224, 224, 195, 224, 224, 224, 253, 224, 224, 224, 255, 224, 224, 224, 195, 225, 225, 225, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 176, 224, 224, 224, 200, 224, 224, 224, 253, 224, 224, 224, 255, 225, 225, 225, 199, 224, 224, 224, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 194, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 212, 232, 232, 232, 22, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 231, 231, 21, 224, 224, 224, 194, 224, 224, 224, 196, 232, 232, 232, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 +[sub_resource type="DPITexture" id="DPITexture_wo03e"] +_source = " +" +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(1, 0.87, 0.4, 1) } -[sub_resource type="ImageTexture" id="ImageTexture_c80wp"] -image = SubResource("Image_ixycx") +[sub_resource type="DPITexture" id="DPITexture_ixycx"] +_source = " +" +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(1, 0.87, 0.4, 1) +} -[sub_resource type="Image" id="Image_eis20"] +[sub_resource type="Image" id="Image_c80wp"] data = { -"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), +"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 231, 231, 21, 224, 224, 224, 194, 224, 224, 224, 196, 232, 232, 232, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 212, 232, 232, 232, 22, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 194, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 176, 224, 224, 224, 200, 224, 224, 224, 253, 224, 224, 224, 255, 225, 225, 225, 199, 224, 224, 224, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 171, 224, 224, 224, 195, 224, 224, 224, 253, 224, 224, 224, 255, 224, 224, 224, 195, 225, 225, 225, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 196, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 233, 233, 23, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 215, 224, 224, 224, 24, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 233, 233, 23, 224, 224, 224, 198, 224, 224, 224, 201, 224, 224, 224, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), "format": "RGBA8", "height": 16, "mipmaps": false, "width": 16 } -[sub_resource type="ImageTexture" id="ImageTexture_t2qd7"] -image = SubResource("Image_eis20") +[sub_resource type="ImageTexture" id="ImageTexture_eis20"] +image = SubResource("Image_c80wp") + +[sub_resource type="DPITexture" id="DPITexture_t2qd7"] +_source = " +" +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(1, 0.87, 0.4, 1) +} [sub_resource type="Image" id="Image_jh28t"] data = { -"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 231, 231, 21, 224, 224, 224, 194, 224, 224, 224, 196, 232, 232, 232, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 212, 232, 232, 232, 22, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 194, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 176, 224, 224, 224, 200, 224, 224, 224, 253, 224, 224, 224, 255, 225, 225, 225, 199, 224, 224, 224, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 252, 224, 224, 224, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 171, 224, 224, 224, 195, 224, 224, 224, 253, 224, 224, 224, 255, 224, 224, 224, 195, 225, 225, 225, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 196, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 233, 233, 23, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 215, 224, 224, 224, 24, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 233, 233, 23, 224, 224, 224, 198, 224, 224, 224, 201, 224, 224, 224, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), +"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 248, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 248, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), "format": "RGBA8", "height": 16, "mipmaps": false, @@ -52,7 +64,7 @@ image = SubResource("Image_jh28t") [sub_resource type="Image" id="Image_lpjla"] data = { -"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 224, 224, 224, 105, 224, 224, 224, 192, 224, 224, 224, 244, 224, 224, 224, 238, 224, 224, 224, 197, 224, 224, 224, 105, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 233, 233, 23, 225, 225, 225, 207, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 198, 226, 226, 226, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 224, 224, 224, 205, 224, 224, 224, 255, 224, 224, 224, 218, 225, 225, 225, 83, 237, 237, 237, 14, 237, 237, 237, 14, 224, 224, 224, 82, 224, 224, 224, 220, 224, 224, 224, 255, 224, 224, 224, 197, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 225, 225, 102, 224, 224, 224, 255, 224, 224, 224, 218, 227, 227, 227, 18, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 224, 224, 224, 16, 224, 224, 224, 221, 224, 224, 224, 255, 225, 225, 225, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 198, 224, 224, 224, 255, 225, 225, 225, 84, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 0, 0, 0, 0, 0, 0, 0, 0, 226, 226, 226, 86, 224, 224, 224, 255, 224, 224, 224, 194, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 4, 224, 224, 224, 238, 224, 224, 224, 255, 227, 227, 227, 18, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 229, 229, 229, 19, 224, 224, 224, 255, 224, 224, 224, 233, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 160, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 159, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 230, 230, 230, 20, 224, 224, 224, 255, 224, 224, 224, 237, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 10, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 212, 230, 230, 230, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 90, 224, 224, 224, 255, 224, 224, 224, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 225, 225, 42, 224, 224, 224, 245, 224, 224, 224, 245, 225, 225, 225, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 232, 232, 22, 224, 224, 224, 224, 224, 224, 224, 255, 224, 224, 224, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 96, 226, 226, 226, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 20, 224, 224, 224, 88, 224, 224, 224, 221, 224, 224, 224, 255, 225, 225, 225, 199, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 200, 227, 227, 227, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 236, 224, 224, 224, 195, 224, 224, 224, 96, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), +"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 248, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 248, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), "format": "RGBA8", "height": 16, "mipmaps": false, @@ -64,7 +76,7 @@ image = SubResource("Image_lpjla") [sub_resource type="Image" id="Image_bwbka"] data = { -"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 248, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 248, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), +"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 249, 255, 230, 246, 246, 252, 230, 249, 249, 255, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 246, 252, 237, 246, 246, 252, 255, 246, 246, 252, 248, 0, 0, 0, 0, 246, 246, 252, 254, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 246, 252, 236, 246, 246, 252, 254, 246, 246, 252, 247, 0, 0, 0, 0, 246, 246, 252, 254, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 246, 253, 231, 246, 246, 253, 232, 246, 246, 252, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 246, 252, 243, 246, 246, 252, 255, 246, 246, 252, 242, 246, 246, 252, 230, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 246, 252, 242, 246, 246, 252, 253, 246, 246, 252, 241, 246, 246, 252, 230, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 246, 252, 244, 246, 246, 252, 255, 246, 246, 252, 241, 246, 246, 252, 230, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 246, 252, 244, 246, 246, 252, 255, 246, 246, 252, 241, 246, 246, 252, 230, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), "format": "RGBA8", "height": 16, "mipmaps": false, @@ -76,7 +88,7 @@ image = SubResource("Image_bwbka") [sub_resource type="Image" id="Image_ki3oo"] data = { -"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 248, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 237, 247, 245, 248, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 237, 247, 245, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), +"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 232, 151, 12, 11, 242, 151, 12, 11, 250, 151, 12, 11, 254, 151, 12, 11, 254, 151, 12, 11, 250, 151, 12, 11, 242, 151, 12, 10, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 10, 238, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 11, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 237, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 10, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 10, 232, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 240, 151, 12, 10, 234, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 11, 234, 151, 12, 11, 241, 151, 12, 11, 255, 151, 12, 11, 253, 151, 11, 10, 232, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 242, 151, 12, 11, 255, 151, 12, 11, 254, 151, 12, 10, 234, 0, 0, 0, 0, 151, 12, 10, 234, 151, 12, 11, 253, 151, 12, 11, 253, 151, 12, 11, 234, 0, 0, 0, 0, 151, 12, 11, 234, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 241, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 250, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 10, 234, 0, 0, 0, 0, 151, 12, 10, 234, 151, 12, 10, 234, 0, 0, 0, 0, 151, 12, 11, 234, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 250, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 10, 234, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 234, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 10, 234, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 10, 234, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 250, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 11, 234, 0, 0, 0, 0, 151, 12, 11, 234, 151, 12, 10, 234, 0, 0, 0, 0, 151, 12, 11, 234, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 250, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 242, 151, 12, 11, 255, 151, 12, 11, 254, 151, 12, 11, 234, 0, 0, 0, 0, 151, 12, 11, 234, 151, 12, 11, 253, 151, 12, 11, 253, 151, 12, 11, 234, 0, 0, 0, 0, 151, 12, 11, 234, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 10, 241, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 10, 232, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 241, 151, 12, 11, 234, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 11, 234, 151, 12, 11, 241, 151, 12, 11, 255, 151, 12, 11, 253, 151, 11, 10, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 237, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 237, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 11, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 232, 151, 12, 11, 242, 151, 12, 11, 250, 151, 12, 11, 253, 151, 12, 11, 253, 151, 12, 11, 250, 151, 12, 11, 241, 151, 11, 10, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), "format": "RGBA8", "height": 16, "mipmaps": false, @@ -88,30 +100,6 @@ image = SubResource("Image_ki3oo") [sub_resource type="Image" id="Image_uqb0l"] data = { -"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 249, 255, 230, 246, 246, 252, 230, 249, 249, 255, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 246, 252, 237, 246, 246, 252, 255, 246, 246, 252, 248, 0, 0, 0, 0, 246, 246, 252, 254, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 246, 252, 236, 246, 246, 252, 254, 246, 246, 252, 247, 0, 0, 0, 0, 246, 246, 252, 254, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 246, 253, 231, 246, 246, 253, 232, 246, 246, 252, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 246, 252, 243, 246, 246, 252, 255, 246, 246, 252, 242, 246, 246, 252, 230, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 246, 252, 242, 246, 246, 252, 253, 246, 246, 252, 241, 246, 246, 252, 230, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 246, 252, 244, 246, 246, 252, 255, 246, 246, 252, 241, 246, 246, 252, 230, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 246, 252, 244, 246, 246, 252, 255, 246, 246, 252, 241, 246, 246, 252, 230, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 246, 246, 252, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_j00vj"] -image = SubResource("Image_uqb0l") - -[sub_resource type="Image" id="Image_0oden"] -data = { -"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 232, 151, 12, 11, 242, 151, 12, 11, 250, 151, 12, 11, 254, 151, 12, 11, 254, 151, 12, 11, 250, 151, 12, 11, 242, 151, 12, 10, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 10, 238, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 11, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 237, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 10, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 10, 232, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 240, 151, 12, 10, 234, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 11, 234, 151, 12, 11, 241, 151, 12, 11, 255, 151, 12, 11, 253, 151, 11, 10, 232, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 242, 151, 12, 11, 255, 151, 12, 11, 254, 151, 12, 10, 234, 0, 0, 0, 0, 151, 12, 10, 234, 151, 12, 11, 253, 151, 12, 11, 253, 151, 12, 11, 234, 0, 0, 0, 0, 151, 12, 11, 234, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 241, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 250, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 10, 234, 0, 0, 0, 0, 151, 12, 10, 234, 151, 12, 10, 234, 0, 0, 0, 0, 151, 12, 11, 234, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 250, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 10, 234, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 234, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 10, 234, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 10, 234, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 250, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 11, 234, 0, 0, 0, 0, 151, 12, 11, 234, 151, 12, 10, 234, 0, 0, 0, 0, 151, 12, 11, 234, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 250, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 242, 151, 12, 11, 255, 151, 12, 11, 254, 151, 12, 11, 234, 0, 0, 0, 0, 151, 12, 11, 234, 151, 12, 11, 253, 151, 12, 11, 253, 151, 12, 11, 234, 0, 0, 0, 0, 151, 12, 11, 234, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 10, 241, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 10, 232, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 241, 151, 12, 11, 234, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 11, 234, 151, 12, 11, 241, 151, 12, 11, 255, 151, 12, 11, 253, 151, 11, 10, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 237, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 254, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 237, 151, 12, 11, 253, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 255, 151, 12, 11, 253, 151, 12, 11, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 12, 11, 232, 151, 12, 11, 242, 151, 12, 11, 250, 151, 12, 11, 253, 151, 12, 11, 253, 151, 12, 11, 250, 151, 12, 11, 241, 151, 11, 10, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_suo5c"] -image = SubResource("Image_0oden") - -[sub_resource type="Image" id="Image_ipq44"] -data = { "data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 255, 224, 224, 224, 255, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 211, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 211, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 211, 224, 224, 224, 255, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 195, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 224, 224, 224, 255, 224, 224, 224, 255, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 194, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 178, 224, 224, 224, 194, 230, 230, 230, 20, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 194, 224, 224, 224, 179, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 180, 224, 224, 224, 180, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), "format": "RGBA8", "height": 16, @@ -120,9 +108,9 @@ data = { } [sub_resource type="ImageTexture" id="ImageTexture_1oriu"] -image = SubResource("Image_ipq44") +image = SubResource("Image_uqb0l") -[sub_resource type="Image" id="Image_d5kq4"] +[sub_resource type="Image" id="Image_j00vj"] data = { "data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 181, 224, 224, 224, 180, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 180, 224, 224, 224, 195, 231, 231, 231, 21, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 195, 224, 224, 224, 178, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 195, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 224, 224, 224, 255, 224, 224, 224, 255, 231, 231, 231, 21, 224, 224, 224, 211, 224, 224, 224, 255, 224, 224, 224, 194, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 211, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 255, 224, 224, 224, 255, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), "format": "RGBA8", @@ -132,9 +120,9 @@ data = { } [sub_resource type="ImageTexture" id="ImageTexture_ikyhk"] -image = SubResource("Image_d5kq4") +image = SubResource("Image_j00vj") -[sub_resource type="Image" id="Image_8d0da"] +[sub_resource type="Image" id="Image_0oden"] data = { "data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 198, 223, 232, 147, 197, 222, 242, 147, 197, 222, 250, 147, 197, 222, 254, 147, 197, 222, 254, 147, 197, 222, 250, 147, 197, 222, 242, 147, 197, 222, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 197, 222, 238, 147, 197, 222, 254, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 253, 147, 197, 222, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 198, 222, 237, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 254, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 254, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 197, 222, 232, 147, 197, 222, 253, 147, 197, 222, 255, 147, 197, 222, 240, 147, 198, 222, 234, 147, 197, 222, 253, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 253, 147, 198, 222, 234, 147, 197, 222, 241, 147, 197, 222, 255, 147, 197, 222, 253, 147, 197, 222, 232, 0, 0, 0, 0, 0, 0, 0, 0, 147, 197, 222, 242, 147, 197, 222, 255, 147, 197, 222, 254, 147, 198, 222, 234, 0, 0, 0, 0, 147, 198, 222, 234, 147, 197, 222, 253, 147, 197, 222, 253, 147, 197, 222, 234, 0, 0, 0, 0, 147, 197, 222, 234, 147, 197, 222, 254, 147, 197, 222, 255, 147, 197, 222, 241, 0, 0, 0, 0, 0, 0, 0, 0, 147, 197, 222, 250, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 253, 147, 198, 222, 234, 0, 0, 0, 0, 147, 198, 222, 234, 147, 198, 222, 234, 0, 0, 0, 0, 147, 197, 222, 234, 147, 197, 222, 253, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 250, 0, 0, 0, 0, 0, 0, 0, 0, 147, 197, 222, 254, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 253, 147, 198, 222, 234, 0, 0, 0, 0, 0, 0, 0, 0, 147, 197, 222, 234, 147, 197, 222, 253, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 253, 0, 0, 0, 0, 0, 0, 0, 0, 147, 197, 222, 254, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 253, 147, 198, 222, 234, 0, 0, 0, 0, 0, 0, 0, 0, 147, 198, 222, 234, 147, 197, 222, 253, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 253, 0, 0, 0, 0, 0, 0, 0, 0, 147, 197, 222, 250, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 253, 147, 197, 222, 234, 0, 0, 0, 0, 147, 197, 222, 234, 147, 198, 222, 234, 0, 0, 0, 0, 147, 197, 222, 234, 147, 197, 222, 253, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 250, 0, 0, 0, 0, 0, 0, 0, 0, 147, 197, 222, 242, 147, 197, 222, 255, 147, 197, 222, 254, 147, 198, 222, 234, 0, 0, 0, 0, 147, 197, 222, 234, 147, 197, 222, 253, 147, 197, 222, 253, 147, 197, 222, 234, 0, 0, 0, 0, 147, 197, 222, 234, 147, 197, 222, 254, 147, 197, 222, 255, 147, 197, 222, 241, 0, 0, 0, 0, 0, 0, 0, 0, 147, 197, 222, 232, 147, 197, 222, 253, 147, 197, 222, 255, 147, 197, 222, 241, 147, 197, 222, 234, 147, 197, 222, 253, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 253, 147, 197, 222, 234, 147, 197, 222, 241, 147, 197, 222, 255, 147, 197, 222, 253, 147, 197, 221, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 198, 222, 237, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 254, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 254, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 197, 222, 237, 147, 197, 222, 253, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 255, 147, 197, 222, 253, 147, 197, 222, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 198, 222, 232, 147, 197, 222, 242, 147, 197, 222, 250, 147, 197, 222, 253, 147, 197, 222, 253, 147, 197, 222, 250, 147, 197, 222, 241, 147, 197, 222, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), "format": "RGBA8", @@ -143,10 +131,10 @@ data = { "width": 16 } -[sub_resource type="ImageTexture" id="ImageTexture_qagbu"] -image = SubResource("Image_8d0da") +[sub_resource type="ImageTexture" id="ImageTexture_suo5c"] +image = SubResource("Image_0oden") -[sub_resource type="Image" id="Image_oy0ff"] +[sub_resource type="Image" id="Image_ipq44"] data = { "data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 57, 237, 170, 253, 57, 252, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 254, 58, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 57, 252, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 254, 58, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 57, 255, 170, 253, 57, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 58, 234, 170, 253, 57, 247, 171, 255, 57, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 57, 255, 170, 253, 57, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 58, 234, 170, 253, 57, 253, 170, 253, 57, 255, 170, 254, 57, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 57, 255, 170, 253, 57, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 58, 234, 170, 253, 57, 253, 170, 253, 57, 255, 170, 254, 57, 247, 171, 255, 58, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 57, 255, 170, 253, 57, 255, 0, 0, 0, 0, 0, 0, 0, 0, 170, 254, 58, 232, 170, 254, 57, 232, 0, 0, 0, 0, 170, 253, 58, 234, 170, 253, 57, 253, 170, 253, 57, 255, 170, 254, 57, 247, 171, 255, 58, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 57, 255, 170, 253, 57, 255, 0, 0, 0, 0, 170, 254, 58, 232, 170, 253, 57, 251, 170, 253, 57, 251, 170, 254, 58, 236, 170, 253, 57, 253, 170, 253, 57, 255, 170, 254, 57, 247, 171, 255, 58, 230, 0, 0, 0, 0, 170, 254, 58, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 57, 255, 170, 253, 57, 255, 0, 0, 0, 0, 170, 254, 57, 232, 170, 253, 57, 251, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 254, 57, 247, 171, 255, 58, 230, 0, 0, 0, 0, 170, 254, 58, 242, 170, 253, 57, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 57, 255, 170, 253, 57, 255, 0, 0, 0, 0, 0, 0, 0, 0, 170, 254, 57, 232, 170, 253, 57, 251, 170, 253, 57, 255, 170, 254, 57, 247, 171, 255, 58, 230, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 57, 255, 170, 253, 57, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 57, 255, 170, 253, 57, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 254, 57, 232, 170, 253, 57, 244, 171, 255, 58, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 57, 255, 170, 253, 57, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 57, 255, 170, 253, 57, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 57, 255, 170, 253, 57, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 253, 57, 252, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 254, 57, 237, 170, 253, 57, 252, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 255, 170, 253, 57, 252, 170, 254, 57, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), "format": "RGBA8", @@ -155,10 +143,10 @@ data = { "width": 16 } -[sub_resource type="ImageTexture" id="ImageTexture_a4rkr"] -image = SubResource("Image_oy0ff") +[sub_resource type="ImageTexture" id="ImageTexture_d5kq4"] +image = SubResource("Image_ipq44") -[sub_resource type="Image" id="Image_iahim"] +[sub_resource type="Image" id="Image_8d0da"] data = { "data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 130, 237, 129, 139, 130, 252, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 130, 252, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 130, 255, 129, 139, 130, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 131, 234, 129, 139, 130, 247, 130, 141, 130, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 130, 255, 129, 139, 130, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 131, 234, 129, 139, 130, 253, 129, 139, 130, 255, 129, 139, 130, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 130, 255, 129, 139, 130, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 131, 234, 129, 139, 130, 253, 129, 139, 130, 255, 129, 139, 130, 247, 131, 141, 131, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 130, 255, 129, 139, 130, 255, 0, 0, 0, 0, 0, 0, 0, 0, 130, 140, 131, 232, 129, 140, 130, 232, 0, 0, 0, 0, 129, 139, 131, 234, 129, 139, 130, 253, 129, 139, 130, 255, 129, 139, 130, 247, 131, 141, 131, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 130, 255, 129, 139, 130, 255, 0, 0, 0, 0, 130, 140, 131, 232, 129, 139, 130, 251, 129, 139, 130, 251, 129, 139, 130, 236, 129, 139, 130, 253, 129, 139, 130, 255, 129, 139, 130, 247, 131, 141, 131, 230, 0, 0, 0, 0, 129, 139, 130, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 130, 255, 129, 139, 130, 255, 0, 0, 0, 0, 129, 140, 130, 232, 129, 139, 130, 251, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 247, 131, 141, 131, 230, 0, 0, 0, 0, 129, 139, 130, 242, 129, 139, 130, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 130, 255, 129, 139, 130, 255, 0, 0, 0, 0, 0, 0, 0, 0, 130, 140, 130, 232, 129, 139, 130, 251, 129, 139, 130, 255, 129, 139, 130, 247, 131, 141, 131, 230, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 130, 255, 129, 139, 130, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 130, 255, 129, 139, 130, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 140, 130, 232, 129, 139, 130, 244, 131, 141, 131, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 130, 255, 129, 139, 130, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 130, 255, 129, 139, 130, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 130, 255, 129, 139, 130, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 139, 130, 252, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 139, 130, 237, 129, 139, 130, 252, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 255, 129, 139, 130, 252, 129, 139, 130, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), "format": "RGBA8", @@ -167,8 +155,8 @@ data = { "width": 16 } -[sub_resource type="ImageTexture" id="ImageTexture_idt7c"] -image = SubResource("Image_iahim") +[sub_resource type="ImageTexture" id="ImageTexture_qagbu"] +image = SubResource("Image_8d0da") [node name="StatusBar" type="PanelContainer"] clip_contents = true @@ -207,30 +195,30 @@ layout_mode = 2 unique_name_in_owner = true layout_mode = 2 tooltip_text = "Run discover tests." -icon = SubResource("ImageTexture_wo03e") +icon = SubResource("DPITexture_mb3ih") [node name="btn_tree_sort" type="MenuButton" parent="VBoxContainer/tree_tools/tree_buttons"] unique_name_in_owner = true layout_mode = 2 tooltip_text = "Sets tree sorting mode." -icon = SubResource("ImageTexture_c80wp") +icon = SubResource("DPITexture_wo03e") flat = false item_count = 4 popup/item_0/text = "Unsorted" -popup/item_0/icon = SubResource("ImageTexture_t2qd7") +popup/item_0/icon = SubResource("DPITexture_ixycx") popup/item_0/checkable = 1 popup/item_0/id = 0 popup/item_1/text = "Name ascending" -popup/item_1/icon = SubResource("ImageTexture_c80wp") +popup/item_1/icon = SubResource("DPITexture_wo03e") popup/item_1/checkable = 1 popup/item_1/checked = true popup/item_1/id = 1 popup/item_2/text = "Name descending" -popup/item_2/icon = SubResource("ImageTexture_1mh1t") +popup/item_2/icon = SubResource("ImageTexture_eis20") popup/item_2/checkable = 1 popup/item_2/id = 2 popup/item_3/text = "Execution time" -popup/item_3/icon = SubResource("ImageTexture_bq8kn") +popup/item_3/icon = SubResource("DPITexture_t2qd7") popup/item_3/checkable = 1 popup/item_3/id = 3 @@ -238,16 +226,16 @@ popup/item_3/id = 3 unique_name_in_owner = true layout_mode = 2 tooltip_text = "Sets tree presentation mode." -icon = SubResource("ImageTexture_8lbfl") +icon = SubResource("ImageTexture_1mh1t") flat = false item_count = 2 popup/item_0/text = "Tree" -popup/item_0/icon = SubResource("ImageTexture_ivm1h") +popup/item_0/icon = SubResource("ImageTexture_bq8kn") popup/item_0/checkable = 1 popup/item_0/checked = true popup/item_0/id = 0 popup/item_1/text = "Flat" -popup/item_1/icon = SubResource("ImageTexture_j00vj") +popup/item_1/icon = SubResource("ImageTexture_8lbfl") popup/item_1/checkable = 1 popup/item_1/id = 1 @@ -276,7 +264,7 @@ layout_mode = 2 size_flags_horizontal = 10 size_flags_vertical = 4 tooltip_text = "Error Tests" -texture = SubResource("ImageTexture_suo5c") +texture = SubResource("ImageTexture_ivm1h") stretch_mode = 3 [node name="btn_up" type="Button" parent="VBoxContainer/status_bar/error/icon"] @@ -328,7 +316,7 @@ layout_mode = 2 size_flags_horizontal = 10 size_flags_vertical = 4 tooltip_text = "Failed Tests" -texture = SubResource("ImageTexture_qagbu") +texture = SubResource("ImageTexture_suo5c") stretch_mode = 3 [node name="btn_up" type="Button" parent="VBoxContainer/status_bar/failure/icon"] @@ -380,7 +368,7 @@ layout_mode = 2 size_flags_horizontal = 10 size_flags_vertical = 4 tooltip_text = "Flaky Tests" -texture = SubResource("ImageTexture_a4rkr") +texture = SubResource("ImageTexture_d5kq4") stretch_mode = 3 [node name="btn_up" type="Button" parent="VBoxContainer/status_bar/flaky/icon"] @@ -432,7 +420,7 @@ layout_mode = 2 size_flags_horizontal = 10 size_flags_vertical = 4 tooltip_text = "Skipped Tests" -texture = SubResource("ImageTexture_idt7c") +texture = SubResource("ImageTexture_qagbu") stretch_mode = 3 [node name="btn_up" type="Button" parent="VBoxContainer/status_bar/skipped/icon"] @@ -466,7 +454,7 @@ size_flags_vertical = 4 tooltip_text = "Jump to the next skipped test" icon = SubResource("ImageTexture_ikyhk") -[connection signal="pressed" from="VBoxContainer/tree_tools/tree_buttons/btn_tree_sync" to="." method="_on_tree_sync_pressed"] +[connection signal="pressed" from="VBoxContainer/tree_tools/tree_buttons/btn_tree_sync" to="." method="_on_btn_tree_sync_pressed"] [connection signal="pressed" from="VBoxContainer/status_bar/error/icon/btn_up" to="." method="_on_btn_error_up_pressed"] [connection signal="pressed" from="VBoxContainer/status_bar/error/counter/btn_down" to="." method="_on_btn_error_down_pressed"] [connection signal="pressed" from="VBoxContainer/status_bar/failure/icon/btn_up" to="." method="_on_failure_up_pressed"] diff --git a/addons/gdUnit4/src/ui/parts/InspectorToolBar.gd b/addons/gdUnit4/src/ui/parts/InspectorToolBar.gd index 0cca901a..4a92c528 100644 --- a/addons/gdUnit4/src/ui/parts/InspectorToolBar.gd +++ b/addons/gdUnit4/src/ui/parts/InspectorToolBar.gd @@ -1,9 +1,6 @@ @tool extends PanelContainer -signal run_overall_pressed(debug: bool) -signal run_pressed(debug: bool) -signal stop_pressed() const InspectorTreeMainPanel := preload("res://addons/gdUnit4/src/ui/parts/InspectorTreeMainPanel.gd") @@ -16,39 +13,32 @@ const InspectorTreeMainPanel := preload("res://addons/gdUnit4/src/ui/parts/Insp @onready var _button_stop: Button = %stop -const SETTINGS_SHORTCUT_MAPPING := { - GdUnitSettings.SHORTCUT_INSPECTOR_RERUN_TEST: GdUnitShortcut.ShortCut.RERUN_TESTS, - GdUnitSettings.SHORTCUT_INSPECTOR_RERUN_TEST_DEBUG: GdUnitShortcut.ShortCut.RERUN_TESTS_DEBUG, - GdUnitSettings.SHORTCUT_INSPECTOR_RUN_TEST_OVERALL: GdUnitShortcut.ShortCut.RUN_TESTS_OVERALL, - GdUnitSettings.SHORTCUT_INSPECTOR_RUN_TEST_STOP: GdUnitShortcut.ShortCut.STOP_TEST_RUN, -} +var inspector: InspectorTreeMainPanel +var command_handler: GdUnitCommandHandler func _ready() -> void: - var inspector :InspectorTreeMainPanel = get_parent().get_parent().find_child("MainPanel", false, false) + command_handler = GdUnitCommandHandler.instance() + inspector = get_parent().get_parent().find_child("MainPanel", false, false) if inspector == null: push_error("Internal error, can't connect to the test inspector!") else: inspector.tree_item_selected.connect(_on_inspector_selected) - run_pressed.connect(inspector._on_run_pressed) GdUnit4Version.init_version_label(_version_label) - var command_handler := GdUnitCommandHandler.instance() - run_overall_pressed.connect(command_handler._on_run_overall_pressed) - stop_pressed.connect(command_handler._on_stop_pressed) - command_handler.gdunit_runner_start.connect(_on_gdunit_runner_start) - command_handler.gdunit_runner_stop.connect(_on_gdunit_runner_stop) - GdUnitSignals.instance().gdunit_settings_changed.connect(_on_gdunit_settings_changed) - init_buttons() - init_shortcuts(command_handler) - - -func init_buttons() -> void: - _button_run_overall.icon = GdUnitUiTools.get_run_overall_icon() - _button_run_overall.visible = GdUnitSettings.is_inspector_toolbar_button_show() - _button_run.icon = GdUnitUiTools.get_icon("Play") - _button_run_debug.icon = GdUnitUiTools.get_icon("PlayStart") - _button_stop.icon = GdUnitUiTools.get_icon("Stop") + + GdUnitSignals.instance().gdunit_event.connect(_on_gdunit_event) + GdUnitSignals.instance().gdunit_settings_changed.connect(_on_settings_changed) + _init_buttons() + + +func _init_buttons() -> void: + _init_button(_button_run_overall, GdUnitCommandRunTestsOverall.ID) + _init_button(_button_run, GdUnitCommandInspectorRunTests.ID) + _init_button(_button_run_debug, GdUnitCommandInspectorDebugTests.ID) + _init_button(_button_stop, GdUnitCommandStopTestSession.ID) + + _button_stop.icon = command_handler.command_icon(GdUnitCommandStopTestSession.ID) _tool_button.icon = GdUnitUiTools.get_icon("Tools") _button_wiki.icon = GdUnitUiTools.get_icon("HelpSearch") # Set run buttons initial disabled @@ -56,14 +46,12 @@ func init_buttons() -> void: _button_run_debug.disabled = true -func init_shortcuts(command_handler: GdUnitCommandHandler) -> void: - _button_run.shortcut = command_handler.get_shortcut(GdUnitShortcut.ShortCut.RERUN_TESTS) - _button_run_overall.shortcut = command_handler.get_shortcut(GdUnitShortcut.ShortCut.RUN_TESTS_OVERALL) - _button_run_debug.shortcut = command_handler.get_shortcut(GdUnitShortcut.ShortCut.RERUN_TESTS_DEBUG) - _button_stop.shortcut = command_handler.get_shortcut(GdUnitShortcut.ShortCut.STOP_TEST_RUN) - # register for shortcut changes - @warning_ignore("return_value_discarded") - GdUnitSignals.instance().gdunit_settings_changed.connect(_on_settings_changed.bind(command_handler)) +func _init_button(button: Button, comand_id: String) -> void: + button.set_meta("GdUnitCommand", comand_id) + button.icon = command_handler.command_icon(comand_id) + button.shortcut = command_handler.command_shortcut(comand_id) + if button == _button_run_overall: + button.visible = GdUnitSettings.is_inspector_toolbar_button_show() func _on_inspector_selected(item: TreeItem) -> void: @@ -72,36 +60,25 @@ func _on_inspector_selected(item: TreeItem) -> void: _button_run_debug.disabled = button_disabled -func _on_runoverall_pressed(debug:=false) -> void: - run_overall_pressed.emit(debug) +func _on_gdunit_event(event: GdUnitEvent) -> void: + if event.type() == GdUnitEvent.SESSION_START: + _button_run_overall.disabled = true + _button_run.disabled = true + _button_run_debug.disabled = true + _button_stop.disabled = false + return + if event.type() == GdUnitEvent.SESSION_CLOSE: + _button_run_overall.disabled = false + _button_stop.disabled = true -func _on_run_pressed(debug := false) -> void: - run_pressed.emit(debug) - - -func _on_stop_pressed() -> void: - stop_pressed.emit() - - -func _on_gdunit_runner_start() -> void: - _button_run_overall.disabled = true - _button_run.disabled = true - _button_run_debug.disabled = true - _button_stop.disabled = false - - -func _on_gdunit_runner_stop(_client_id: int) -> void: - _button_run_overall.disabled = false - _button_stop.disabled = true - - -func _on_gdunit_settings_changed(_property: GdUnitProperty) -> void: - _button_run_overall.visible = GdUnitSettings.is_inspector_toolbar_button_show() +func _on_button_pressed(source: BaseButton) -> void: + var command_id: String = source.get_meta("GdUnitCommand") + await command_handler.command_execute(command_id) func _on_wiki_pressed() -> void: - var status := OS.shell_open("https://mikeschulze.github.io/gdUnit4/%s" % GdUnit4Version.current().documentation_version()) + var status := OS.shell_open("https://godot-gdunit-labs.github.io/gdUnit4/latest") if status != OK: push_error("Can't open GdUnit4 documentaion page: %s" % error_string(status)) @@ -114,17 +91,14 @@ func _on_btn_tool_pressed() -> void: settings_dlg.popup_centered_ratio(.60) -func _on_settings_changed(property: GdUnitProperty, command_handler: GdUnitCommandHandler) -> void: +func _on_settings_changed(property: GdUnitProperty) -> void: # needs to wait a frame to be command handler notified first for settings changes await get_tree().process_frame - if SETTINGS_SHORTCUT_MAPPING.has(property.name()): - var shortcut: GdUnitShortcut.ShortCut = SETTINGS_SHORTCUT_MAPPING.get(property.name(), GdUnitShortcut.ShortCut.NONE) - match shortcut: - GdUnitShortcut.ShortCut.RERUN_TESTS: - _button_run.shortcut = command_handler.get_shortcut(shortcut) - GdUnitShortcut.ShortCut.RUN_TESTS_OVERALL: - _button_run_overall.shortcut = command_handler.get_shortcut(shortcut) - GdUnitShortcut.ShortCut.RERUN_TESTS_DEBUG: - _button_run_debug.shortcut = command_handler.get_shortcut(shortcut) - GdUnitShortcut.ShortCut.STOP_TEST_RUN: - _button_stop.shortcut = command_handler.get_shortcut(shortcut) + + _button_run_overall.visible = GdUnitSettings.is_inspector_toolbar_button_show() + + if property.name().begins_with(GdUnitSettings.GROUP_SHORTCUT_INSPECTOR): + _button_run.shortcut = command_handler.command_shortcut(GdUnitCommandInspectorRunTests.ID) + _button_run_debug.shortcut = command_handler.command_shortcut(GdUnitCommandInspectorDebugTests.ID) + _button_run_overall.shortcut = command_handler.command_shortcut(GdUnitCommandRunTestsOverall.ID) + _button_stop.shortcut = command_handler.command_shortcut(GdUnitCommandStopTestSession.ID) diff --git a/addons/gdUnit4/src/ui/parts/InspectorToolBar.gd.uid b/addons/gdUnit4/src/ui/parts/InspectorToolBar.gd.uid index 5c6c7953..fa0cfd04 100644 --- a/addons/gdUnit4/src/ui/parts/InspectorToolBar.gd.uid +++ b/addons/gdUnit4/src/ui/parts/InspectorToolBar.gd.uid @@ -1 +1 @@ -uid://dfexdwfncg7ws +uid://1a14wvl3q2p6 diff --git a/addons/gdUnit4/src/ui/parts/InspectorToolBar.tscn b/addons/gdUnit4/src/ui/parts/InspectorToolBar.tscn index 5d75da02..8cd529e7 100644 --- a/addons/gdUnit4/src/ui/parts/InspectorToolBar.tscn +++ b/addons/gdUnit4/src/ui/parts/InspectorToolBar.tscn @@ -1,41 +1,35 @@ -[gd_scene load_steps=22 format=3 uid="uid://dx7xy4dgi3wwb"] +[gd_scene load_steps=17 format=3 uid="uid://dx7xy4dgi3wwb"] [ext_resource type="Script" path="res://addons/gdUnit4/src/ui/parts/InspectorToolBar.gd" id="3"] -[sub_resource type="Image" id="Image_c7rhl"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 36, 224, 224, 224, 168, 224, 224, 224, 233, 224, 224, 224, 236, 224, 224, 224, 170, 231, 231, 231, 31, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 36, 224, 224, 224, 234, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 239, 230, 230, 230, 30, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 168, 224, 224, 224, 255, 224, 224, 224, 186, 224, 224, 224, 32, 224, 224, 224, 33, 224, 224, 224, 187, 224, 224, 224, 255, 225, 225, 225, 167, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 237, 224, 224, 224, 255, 224, 224, 224, 33, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 36, 224, 224, 224, 255, 224, 224, 224, 234, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 237, 224, 224, 224, 255, 224, 224, 224, 33, 255, 255, 255, 0, 255, 255, 255, 0, 229, 229, 229, 38, 224, 224, 224, 255, 224, 224, 224, 229, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 164, 224, 224, 224, 255, 224, 224, 224, 187, 225, 225, 225, 34, 227, 227, 227, 36, 224, 224, 224, 192, 224, 224, 224, 255, 224, 224, 224, 162, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 225, 225, 225, 215, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 229, 224, 224, 224, 32, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 210, 224, 224, 224, 161, 224, 224, 224, 232, 224, 224, 224, 231, 225, 225, 225, 159, 230, 230, 230, 30, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 107, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 105, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 221, 224, 224, 224, 130, 255, 255, 255, 1, 255, 255, 255, 1, 225, 225, 225, 134, 224, 224, 224, 224, 225, 225, 225, 223, 224, 224, 224, 132, 255, 255, 255, 1, 255, 255, 255, 6, 224, 224, 224, 137, 224, 224, 224, 231, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 130, 225, 225, 225, 133, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 129, 224, 224, 224, 137, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 65, 224, 224, 224, 255, 224, 224, 224, 220, 225, 225, 225, 223, 224, 224, 224, 255, 226, 226, 226, 61, 224, 224, 224, 65, 224, 224, 224, 255, 224, 224, 224, 222, 224, 224, 224, 231, 224, 224, 224, 255, 227, 227, 227, 62, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 67, 224, 224, 224, 255, 224, 224, 224, 219, 224, 224, 224, 222, 224, 224, 224, 255, 227, 227, 227, 63, 225, 225, 225, 67, 224, 224, 224, 255, 224, 224, 224, 219, 224, 224, 224, 230, 224, 224, 224, 255, 227, 227, 227, 63, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 127, 224, 224, 224, 129, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 126, 225, 225, 225, 135, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 221, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 1, 224, 224, 224, 128, 224, 224, 224, 220, 224, 224, 224, 219, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 5, 225, 225, 225, 134, 224, 224, 224, 229, 224, 224, 224, 255, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 +[sub_resource type="DPITexture" id="DPITexture_c7rhl"] +_source = " +" +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(1, 0.87, 0.4, 1) } -[sub_resource type="ImageTexture" id="ImageTexture_t52y3"] -image = SubResource("Image_c7rhl") - -[sub_resource type="Image" id="Image_3erui"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 64, 224, 224, 224, 255, 227, 227, 227, 63, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 5, 225, 225, 225, 142, 255, 255, 255, 0, 255, 255, 255, 2, 224, 224, 224, 138, 255, 255, 255, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 192, 224, 224, 224, 255, 225, 225, 225, 191, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 142, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 2, 224, 224, 224, 255, 224, 224, 224, 137, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 192, 224, 224, 224, 255, 225, 225, 225, 191, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 236, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 64, 224, 224, 224, 255, 227, 227, 227, 63, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 235, 224, 224, 224, 255, 224, 224, 224, 65, 225, 225, 225, 67, 224, 224, 224, 255, 224, 224, 224, 230, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 140, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 134, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 224, 224, 224, 137, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 135, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 247, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 246, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 183, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 179, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 179, 224, 224, 224, 237, 224, 224, 224, 179, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 190, 224, 224, 224, 188, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 +[sub_resource type="DPITexture" id="DPITexture_3erui"] +_source = " +" +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(1, 0.87, 0.4, 1) } -[sub_resource type="ImageTexture" id="ImageTexture_wip2b"] -image = SubResource("Image_3erui") - -[sub_resource type="InputEventKey" id="InputEventKey_6jdrj"] -ctrl_pressed = true +[sub_resource type="InputEventKey" id="InputEventKey_p22nw"] +alt_pressed = true pressed = true keycode = 4194338 physical_keycode = 4194338 -[sub_resource type="Shortcut" id="Shortcut_t0ytp"] -events = [SubResource("InputEventKey_6jdrj")] +[sub_resource type="Shortcut" id="Shortcut_3lcek"] +events = [SubResource("InputEventKey_p22nw")] -[sub_resource type="Image" id="Image_p22nw"] +[sub_resource type="Image" id="Image_ndw0i"] data = { "data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 195, 224, 224, 224, 210, 224, 224, 224, 56, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 195, 224, 224, 224, 210, 224, 224, 224, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 224, 224, 224, 139, 224, 224, 224, 8, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 224, 224, 224, 139, 224, 224, 224, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 215, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 215, 224, 224, 224, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 224, 224, 224, 139, 224, 224, 224, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 252, 225, 225, 225, 134, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 212, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 212, 226, 226, 226, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 252, 225, 225, 225, 134, 255, 255, 255, 6, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 252, 225, 225, 225, 134, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 225, 225, 191, 224, 224, 224, 206, 226, 226, 226, 52, 0, 0, 0, 0, 0, 0, 0, 0, 225, 225, 225, 191, 224, 224, 224, 206, 226, 226, 226, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), "format": "RGBA8", @@ -44,72 +38,63 @@ data = { "width": 16 } -[sub_resource type="ImageTexture" id="ImageTexture_mggmt"] -image = SubResource("Image_p22nw") +[sub_resource type="ImageTexture" id="ImageTexture_eoihf"] +image = SubResource("Image_ndw0i") -[sub_resource type="InputEventKey" id="InputEventKey_pl3pi"] -ctrl_pressed = true +[sub_resource type="InputEventKey" id="InputEventKey_6gwbs"] +alt_pressed = true pressed = true keycode = 4194336 physical_keycode = 4194336 -[sub_resource type="Shortcut" id="Shortcut_77xhn"] -events = [SubResource("InputEventKey_pl3pi")] +[sub_resource type="Shortcut" id="Shortcut_2i8uq"] +events = [SubResource("InputEventKey_6gwbs")] -[sub_resource type="Image" id="Image_3lcek"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 195, 224, 224, 224, 210, 224, 224, 224, 56, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 224, 224, 224, 139, 224, 224, 224, 8, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 215, 224, 224, 224, 56, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 224, 224, 224, 139, 224, 224, 224, 8, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 183, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 182, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 252, 225, 225, 225, 134, 255, 255, 255, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 212, 226, 226, 226, 52, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 252, 225, 225, 225, 134, 255, 255, 255, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 191, 224, 224, 224, 206, 226, 226, 226, 52, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 +[sub_resource type="DPITexture" id="DPITexture_87jj1"] +_source = " +" +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(1, 0.87, 0.4, 1) } -[sub_resource type="ImageTexture" id="ImageTexture_q6qbp"] -image = SubResource("Image_3lcek") - -[sub_resource type="InputEventKey" id="InputEventKey_qk8q5"] -ctrl_pressed = true +[sub_resource type="InputEventKey" id="InputEventKey_fewwl"] +alt_pressed = true pressed = true keycode = 4194337 physical_keycode = 4194337 -[sub_resource type="Shortcut" id="Shortcut_ae6em"] -events = [SubResource("InputEventKey_qk8q5")] +[sub_resource type="Shortcut" id="Shortcut_f3lkx"] +events = [SubResource("InputEventKey_fewwl")] -[sub_resource type="Image" id="Image_ndw0i"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 184, 224, 224, 224, 255, 224, 224, 224, 181, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 184, 224, 224, 224, 202, 228, 228, 228, 37, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 239, 224, 224, 224, 74, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 224, 224, 224, 123, 255, 255, 255, 1, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 173, 234, 234, 234, 12, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 188, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 185, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 168, 230, 230, 230, 10, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 252, 225, 225, 225, 118, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 237, 226, 226, 226, 70, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 181, 224, 224, 224, 255, 224, 224, 224, 180, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 188, 224, 224, 224, 201, 225, 225, 225, 34, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 +[sub_resource type="DPITexture" id="DPITexture_7oobd"] +_source = " +" +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(1, 0.87, 0.4, 1) } -[sub_resource type="ImageTexture" id="ImageTexture_q0wt0"] -image = SubResource("Image_ndw0i") - -[sub_resource type="InputEventKey" id="InputEventKey_l8obn"] -ctrl_pressed = true +[sub_resource type="InputEventKey" id="InputEventKey_lvbnb"] +alt_pressed = true pressed = true keycode = 4194339 physical_keycode = 4194339 -[sub_resource type="Shortcut" id="Shortcut_2mb87"] -events = [SubResource("InputEventKey_l8obn")] +[sub_resource type="Shortcut" id="Shortcut_6idxu"] +events = [SubResource("InputEventKey_lvbnb")] -[sub_resource type="Image" id="Image_eoihf"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 176, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 177, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 177, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 176, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 +[sub_resource type="DPITexture" id="DPITexture_qf2s1"] +_source = " +" +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(1, 0.87, 0.4, 1) } -[sub_resource type="ImageTexture" id="ImageTexture_1wiyx"] -image = SubResource("Image_eoihf") - [node name="ToolBar" type="PanelContainer"] anchors_preset = 10 anchor_right = 1.0 @@ -131,13 +116,13 @@ size_flags_vertical = 4 [node name="help" type="Button" parent="HBoxContainer/tools"] unique_name_in_owner = true layout_mode = 2 -icon = SubResource("ImageTexture_t52y3") +icon = SubResource("DPITexture_c7rhl") [node name="tool" type="Button" parent="HBoxContainer/tools"] unique_name_in_owner = true layout_mode = 2 tooltip_text = "GdUnit Settings" -icon = SubResource("ImageTexture_wip2b") +icon = SubResource("DPITexture_3erui") [node name="controls" type="HBoxContainer" parent="HBoxContainer"] layout_mode = 2 @@ -150,28 +135,32 @@ layout_mode = 2 [node name="run_overall" type="Button" parent="HBoxContainer/controls"] unique_name_in_owner = true -visible = false use_parent_material = true layout_mode = 2 tooltip_text = "Run overall tests" -shortcut = SubResource("Shortcut_t0ytp") -icon = SubResource("ImageTexture_mggmt") +shortcut = SubResource("Shortcut_3lcek") +icon = SubResource("ImageTexture_eoihf") +metadata/GdUnitCommand = "Run Tests Overall" [node name="run" type="Button" parent="HBoxContainer/controls"] unique_name_in_owner = true use_parent_material = true layout_mode = 2 tooltip_text = "Rerun unit tests" -shortcut = SubResource("Shortcut_77xhn") -icon = SubResource("ImageTexture_q6qbp") +disabled = true +shortcut = SubResource("Shortcut_2i8uq") +icon = SubResource("DPITexture_87jj1") +metadata/GdUnitCommand = "Run Inspector Tests" [node name="debug" type="Button" parent="HBoxContainer/controls"] unique_name_in_owner = true use_parent_material = true layout_mode = 2 tooltip_text = "Rerun unit tests (Debug)" -shortcut = SubResource("Shortcut_ae6em") -icon = SubResource("ImageTexture_q0wt0") +disabled = true +shortcut = SubResource("Shortcut_f3lkx") +icon = SubResource("DPITexture_7oobd") +metadata/GdUnitCommand = "Debug Inspector Tests" [node name="stop" type="Button" parent="HBoxContainer/controls"] unique_name_in_owner = true @@ -179,8 +168,9 @@ use_parent_material = true layout_mode = 2 tooltip_text = "Stops runing unit tests" disabled = true -shortcut = SubResource("Shortcut_2mb87") -icon = SubResource("ImageTexture_1wiyx") +shortcut = SubResource("Shortcut_6idxu") +icon = SubResource("DPITexture_qf2s1") +metadata/GdUnitCommand = "Stop Test Session" [node name="VSeparator4" type="VSeparator" parent="HBoxContainer/controls"] layout_mode = 2 @@ -194,19 +184,19 @@ alignment = 2 [node name="version" type="Label" parent="HBoxContainer/CenterContainer"] unique_name_in_owner = true +auto_translate_mode = 2 use_parent_material = true layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 13 -auto_translate = false localize_numeral_system = false -text = "gdUnit4 4.3.0" +text = "gdUnit4 6.1.0" horizontal_alignment = 1 justification_flags = 160 [connection signal="pressed" from="HBoxContainer/tools/help" to="." method="_on_wiki_pressed"] [connection signal="pressed" from="HBoxContainer/tools/tool" to="." method="_on_btn_tool_pressed"] -[connection signal="pressed" from="HBoxContainer/controls/run_overall" to="." method="_on_runoverall_pressed"] -[connection signal="pressed" from="HBoxContainer/controls/run" to="." method="_on_run_pressed"] -[connection signal="pressed" from="HBoxContainer/controls/debug" to="." method="_on_run_pressed" binds= [true]] -[connection signal="pressed" from="HBoxContainer/controls/stop" to="." method="_on_stop_pressed"] +[connection signal="pressed" from="HBoxContainer/controls/run_overall" to="." method="_on_button_pressed" flags=18] +[connection signal="pressed" from="HBoxContainer/controls/run" to="." method="_on_button_pressed" flags=18] +[connection signal="pressed" from="HBoxContainer/controls/debug" to="." method="_on_button_pressed" flags=18] +[connection signal="pressed" from="HBoxContainer/controls/stop" to="." method="_on_button_pressed" flags=18] diff --git a/addons/gdUnit4/src/ui/parts/InspectorTreeMainPanel.gd b/addons/gdUnit4/src/ui/parts/InspectorTreeMainPanel.gd index 536fe87f..f55dbeef 100644 --- a/addons/gdUnit4/src/ui/parts/InspectorTreeMainPanel.gd +++ b/addons/gdUnit4/src/ui/parts/InspectorTreeMainPanel.gd @@ -6,16 +6,10 @@ signal test_counters_changed(index: int, total: int, state: GdUnitInspectorTreeC signal tree_item_selected(item: TreeItem) -const CONTEXT_MENU_RUN_ID = 0 -const CONTEXT_MENU_DEBUG_ID = 1 -const CONTEXT_MENU_COLLAPSE_ALL = 3 -const CONTEXT_MENU_EXPAND_ALL = 4 - - @onready var _tree: Tree = $Panel/Tree @onready var _report_list: Node = $report/ScrollContainer/list @onready var _report_template: RichTextLabel = $report/report_template -@onready var _context_menu: PopupMenu = $contextMenu +@onready var _context_menu: GdUnitInspectorContextMenu = $contextMenu @onready var _discover_hint: Control = %discover_hint @onready var _spinner: Button = %spinner @@ -193,13 +187,9 @@ func disable_test_recovery() -> void: @warning_ignore("return_value_discarded") func _ready() -> void: - _context_menu.set_item_icon(CONTEXT_MENU_RUN_ID, GdUnitUiTools.get_icon("Play")) - _context_menu.set_item_icon(CONTEXT_MENU_DEBUG_ID, GdUnitUiTools.get_icon("PlayStart")) - _context_menu.set_item_icon(CONTEXT_MENU_EXPAND_ALL, GdUnitUiTools.get_icon("ExpandTree")) - _context_menu.set_item_icon(CONTEXT_MENU_COLLAPSE_ALL, GdUnitUiTools.get_icon("CollapseTree")) - # do colorize the icons - #for index in _context_menu.item_count: - # _context_menu.set_item_icon_modulate(index, Color.MEDIUM_PURPLE) + if Engine.is_editor_hint(): + var base_control := EditorInterface.get_base_control() + base_control.set_meta("GdUnit4Inspector", self) _spinner.icon = GdUnitUiTools.get_spinner() init_tree() @@ -208,8 +198,6 @@ func _ready() -> void: GdUnitSignals.instance().gdunit_test_discover_added.connect(on_test_case_discover_added) GdUnitSignals.instance().gdunit_test_discover_deleted.connect(on_test_case_discover_deleted) GdUnitSignals.instance().gdunit_test_discover_modified.connect(on_test_case_discover_modified) - var command_handler := GdUnitCommandHandler.instance() - command_handler.gdunit_runner_stop.connect(_on_gdunit_runner_stop) if _run_test_recovery: GdUnitTestDiscoverer.restore_last_session() @@ -708,7 +696,7 @@ func add_report(item: TreeItem, report: GdUnitReport) -> void: func abort_running(items:=_tree_root.get_children()) -> void: for item in items: - if is_state_running(item): + if item.get_icon(0) == ICON_SPINNER: set_state_aborted(item) abort_running(item.get_children()) @@ -758,7 +746,9 @@ func show_failed_report(selected_item: TreeItem) -> void: for report in get_item_reports(selected_item): var reportNode: RichTextLabel = _report_template.duplicate() _report_list.add_child(reportNode) + reportNode.push_color(Color.DARK_TURQUOISE) reportNode.append_text(report.to_string()) + reportNode.pop() reportNode.visible = true @@ -1119,6 +1109,22 @@ func collect_test_cases(item: TreeItem, tests: Array[GdUnitTestCase] = []) -> Ar return tests +func test_session_start() -> void: + _context_menu.disable_items() + reset_tree_state(_tree_root) + clear_reports() + + +func test_session_stop() -> void: + _context_menu.enable_items() + abort_running() + sort_tree_items(_tree_root) + # wait until the tree redraw + await get_tree().process_frame + var failure_item := _find_first_item_by_state(_tree_root, STATE.FAILED) + select_item( failure_item if failure_item else _current_selected_item) + + ################################################################################ # Tree signal receiver ################################################################################ @@ -1128,24 +1134,9 @@ func _on_tree_item_mouse_selected(mouse_position: Vector2, mouse_button_index: i _context_menu.popup() -func _on_run_pressed(run_debug: bool) -> void: - _context_menu.hide() - var item: = _tree.get_selected() - if item == null: - print_rich("[color=GOLDENROD]Abort Testrun, no test suite selected![/color]") - return - - var test_to_execute := collect_test_cases(item) - GdUnitCommandHandler.instance().cmd_run_tests(test_to_execute, run_debug) - - func _on_Tree_item_selected() -> void: - # only show report checked manual item selection - # we need to check the run mode here otherwise it will be called every selection - if not _context_menu.is_item_disabled(CONTEXT_MENU_RUN_ID): - var selected_item: TreeItem = _tree.get_selected() - show_failed_report(selected_item) _current_selected_item = _tree.get_selected() + show_failed_report(_current_selected_item) tree_item_selected.emit(_current_selected_item) @@ -1175,23 +1166,6 @@ func _on_Tree_item_activated() -> void: ################################################################################ # external signal receiver ################################################################################ -func _on_gdunit_runner_start() -> void: - _context_menu.set_item_disabled(CONTEXT_MENU_RUN_ID, true) - _context_menu.set_item_disabled(CONTEXT_MENU_DEBUG_ID, true) - reset_tree_state(_tree_root) - clear_reports() - - -func _on_gdunit_runner_stop(_id: int) -> void: - _context_menu.set_item_disabled(CONTEXT_MENU_RUN_ID, false) - _context_menu.set_item_disabled(CONTEXT_MENU_DEBUG_ID, false) - abort_running() - sort_tree_items(_tree_root) - # wait until the tree redraw - await get_tree().process_frame - var failure_item := _find_first_item_by_state(_tree_root, STATE.FAILED) - select_item( failure_item if failure_item else _current_selected_item) - func _on_gdunit_event(event: GdUnitEvent) -> void: match event.type(): @@ -1207,9 +1181,6 @@ func _on_gdunit_event(event: GdUnitEvent) -> void: _tree_root.visible = true #_dump_tree_as_json("tree_example_discovered") - GdUnitEvent.INIT: - _on_gdunit_runner_start() - GdUnitEvent.TESTCASE_BEFORE: update_test_case(event) @@ -1222,17 +1193,11 @@ func _on_gdunit_event(event: GdUnitEvent) -> void: GdUnitEvent.TESTSUITE_AFTER: update_test_suite(event) + GdUnitEvent.SESSION_START: + test_session_start() -func _on_context_m_index_pressed(index: int) -> void: - match index: - CONTEXT_MENU_DEBUG_ID: - _on_run_pressed(true) - CONTEXT_MENU_RUN_ID: - _on_run_pressed(false) - CONTEXT_MENU_EXPAND_ALL: - do_collapse_all(false) - CONTEXT_MENU_COLLAPSE_ALL: - do_collapse_all(true) + GdUnitEvent.SESSION_CLOSE: + await test_session_stop() func _on_settings_changed(property :GdUnitProperty) -> void: diff --git a/addons/gdUnit4/src/ui/parts/InspectorTreeMainPanel.gd.uid b/addons/gdUnit4/src/ui/parts/InspectorTreeMainPanel.gd.uid index e30f6deb..8f63ac29 100644 --- a/addons/gdUnit4/src/ui/parts/InspectorTreeMainPanel.gd.uid +++ b/addons/gdUnit4/src/ui/parts/InspectorTreeMainPanel.gd.uid @@ -1 +1 @@ -uid://bfxyodyfsh5dk +uid://bobmvycd4e60c diff --git a/addons/gdUnit4/src/ui/parts/InspectorTreePanel.tscn b/addons/gdUnit4/src/ui/parts/InspectorTreePanel.tscn index a4247706..2754f749 100644 --- a/addons/gdUnit4/src/ui/parts/InspectorTreePanel.tscn +++ b/addons/gdUnit4/src/ui/parts/InspectorTreePanel.tscn @@ -1,172 +1,149 @@ -[gd_scene load_steps=27 format=3 uid="uid://bqfpidewtpeg0"] +[gd_scene format=3 uid="uid://bqfpidewtpeg0"] [ext_resource type="Script" path="res://addons/gdUnit4/src/ui/parts/InspectorTreeMainPanel.gd" id="1"] - -[sub_resource type="Image" id="Image_466oo"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 226, 226, 226, 26, 224, 224, 224, 41, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 223, 224, 224, 224, 148, 228, 228, 228, 28, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 43, 225, 225, 225, 51, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 211, 255, 255, 255, 5, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 227, 227, 227, 9, 223, 223, 223, 47, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 221, 229, 229, 229, 29, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 226, 226, 226, 43, 227, 227, 227, 9, 255, 255, 255, 0, 227, 227, 227, 9, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 65, 229, 229, 229, 29, 255, 255, 255, 0, 227, 227, 227, 9, 226, 226, 226, 43, 192, 192, 192, 4, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 26, 225, 225, 225, 51, 223, 223, 223, 47, 227, 227, 227, 9, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 9, 228, 228, 228, 47, 225, 225, 225, 51, 225, 225, 225, 25, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 41, 225, 225, 225, 51, 225, 225, 225, 51, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 225, 225, 225, 51, 225, 225, 225, 51, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 255, 255, 255, 1, 255, 255, 255, 1, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 41, 225, 225, 225, 51, 225, 225, 225, 51, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 225, 225, 225, 51, 225, 225, 225, 51, 229, 229, 229, 39, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 26, 225, 225, 225, 51, 223, 223, 223, 47, 255, 255, 255, 8, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 9, 223, 223, 223, 47, 225, 225, 225, 51, 225, 225, 225, 25, 255, 255, 255, 0, 255, 255, 255, 0, 192, 192, 192, 4, 226, 226, 226, 43, 224, 224, 224, 8, 255, 255, 255, 0, 227, 227, 227, 9, 227, 227, 227, 18, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 227, 227, 227, 9, 255, 255, 255, 0, 227, 227, 227, 9, 226, 226, 226, 43, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 255, 255, 255, 0, 227, 227, 227, 9, 228, 228, 228, 47, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 1, 225, 225, 225, 51, 223, 223, 223, 47, 227, 227, 227, 9, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 43, 225, 225, 225, 51, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 1, 225, 225, 225, 51, 225, 225, 225, 51, 226, 226, 226, 43, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 192, 192, 192, 4, 226, 226, 226, 26, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 1, 229, 229, 229, 39, 225, 225, 225, 25, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 +[ext_resource type="PackedScene" path="res://addons/gdUnit4/src/ui/menu/GdUnitInspectorContextMenu.tscn" id="2_o6s0p"] + +[sub_resource type="DPITexture" id="DPITexture_miuuy"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) } -[sub_resource type="ImageTexture" id="ImageTexture_nwpuj"] -image = SubResource("Image_466oo") - -[sub_resource type="Image" id="Image_o6s0p"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 226, 226, 226, 26, 224, 224, 224, 41, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 41, 226, 226, 226, 26, 192, 192, 192, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 43, 225, 225, 225, 51, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 225, 225, 225, 51, 226, 226, 226, 43, 255, 255, 255, 1, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 227, 227, 227, 9, 223, 223, 223, 47, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 223, 223, 223, 47, 224, 224, 224, 8, 255, 255, 255, 0, 224, 224, 224, 8, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 226, 226, 226, 43, 227, 227, 227, 9, 255, 255, 255, 0, 227, 227, 227, 9, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 17, 255, 255, 255, 8, 255, 255, 255, 0, 224, 224, 224, 48, 224, 224, 224, 217, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 26, 225, 225, 225, 51, 223, 223, 223, 47, 227, 227, 227, 9, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 228, 228, 228, 47, 224, 224, 224, 236, 224, 224, 224, 255, 225, 225, 225, 125, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 41, 225, 225, 225, 51, 225, 225, 225, 51, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 86, 224, 224, 224, 252, 224, 224, 224, 252, 224, 224, 224, 194, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 41, 225, 225, 225, 51, 225, 225, 225, 51, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 225, 225, 225, 51, 225, 225, 225, 51, 230, 230, 230, 40, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 26, 225, 225, 225, 51, 223, 223, 223, 47, 255, 255, 255, 8, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 9, 223, 223, 223, 47, 225, 225, 225, 51, 225, 225, 225, 25, 255, 255, 255, 0, 255, 255, 255, 0, 192, 192, 192, 4, 226, 226, 226, 43, 224, 224, 224, 8, 255, 255, 255, 0, 227, 227, 227, 9, 227, 227, 227, 18, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 227, 227, 227, 9, 255, 255, 255, 0, 227, 227, 227, 9, 226, 226, 226, 43, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 255, 255, 255, 0, 227, 227, 227, 9, 228, 228, 228, 47, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 223, 223, 223, 47, 227, 227, 227, 9, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 43, 225, 225, 225, 51, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 225, 225, 225, 51, 226, 226, 226, 43, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 192, 192, 192, 4, 225, 225, 225, 25, 230, 230, 230, 40, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 40, 225, 225, 225, 25, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 +[sub_resource type="DPITexture" id="DPITexture_ern2r"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) } -[sub_resource type="ImageTexture" id="ImageTexture_pdcj5"] -image = SubResource("Image_o6s0p") - -[sub_resource type="Image" id="Image_miuuy"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 226, 226, 226, 26, 224, 224, 224, 41, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 41, 226, 226, 226, 26, 192, 192, 192, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 43, 225, 225, 225, 51, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 225, 225, 225, 51, 226, 226, 226, 43, 255, 255, 255, 1, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 227, 227, 227, 9, 223, 223, 223, 47, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 223, 223, 223, 47, 224, 224, 224, 8, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 226, 226, 226, 43, 227, 227, 227, 9, 255, 255, 255, 0, 227, 227, 227, 9, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 17, 255, 255, 255, 8, 255, 255, 255, 0, 227, 227, 227, 9, 226, 226, 226, 43, 192, 192, 192, 4, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 26, 225, 225, 225, 51, 223, 223, 223, 47, 227, 227, 227, 9, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 9, 228, 228, 228, 47, 225, 225, 225, 51, 225, 225, 225, 25, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 41, 225, 225, 225, 51, 225, 225, 225, 51, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 225, 225, 225, 51, 225, 225, 225, 51, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 41, 225, 225, 225, 51, 225, 225, 225, 51, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 89, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 200, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 26, 225, 225, 225, 51, 223, 223, 223, 47, 255, 255, 255, 8, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 42, 224, 224, 224, 233, 224, 224, 224, 255, 225, 225, 225, 124, 255, 255, 255, 0, 255, 255, 255, 0, 192, 192, 192, 4, 226, 226, 226, 43, 224, 224, 224, 8, 255, 255, 255, 0, 227, 227, 227, 9, 227, 227, 227, 18, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 227, 227, 227, 9, 255, 255, 255, 0, 225, 225, 225, 42, 224, 224, 224, 211, 238, 238, 238, 15, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 255, 255, 255, 0, 227, 227, 227, 9, 228, 228, 228, 47, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 1, 225, 225, 225, 51, 223, 223, 223, 47, 227, 227, 227, 9, 255, 255, 255, 0, 255, 255, 255, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 43, 225, 225, 225, 51, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 1, 225, 225, 225, 51, 225, 225, 225, 51, 226, 226, 226, 43, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 192, 192, 192, 4, 226, 226, 226, 26, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 1, 229, 229, 229, 39, 225, 225, 225, 25, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 +[sub_resource type="DPITexture" id="DPITexture_qdci2"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) } -[sub_resource type="ImageTexture" id="ImageTexture_o41n3"] -image = SubResource("Image_miuuy") - -[sub_resource type="Image" id="Image_ern2r"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 226, 226, 226, 26, 224, 224, 224, 41, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 41, 226, 226, 226, 26, 192, 192, 192, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 43, 225, 225, 225, 51, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 225, 225, 225, 51, 226, 226, 226, 43, 255, 255, 255, 1, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 227, 227, 227, 9, 223, 223, 223, 47, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 223, 223, 223, 47, 224, 224, 224, 8, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 226, 226, 226, 43, 227, 227, 227, 9, 255, 255, 255, 0, 227, 227, 227, 9, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 17, 255, 255, 255, 8, 255, 255, 255, 0, 227, 227, 227, 9, 226, 226, 226, 43, 192, 192, 192, 4, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 26, 225, 225, 225, 51, 223, 223, 223, 47, 227, 227, 227, 9, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 9, 228, 228, 228, 47, 225, 225, 225, 51, 225, 225, 225, 25, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 41, 225, 225, 225, 51, 225, 225, 225, 51, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 225, 225, 225, 51, 225, 225, 225, 51, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 41, 225, 225, 225, 51, 225, 225, 225, 51, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 225, 225, 225, 51, 225, 225, 225, 51, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 26, 225, 225, 225, 51, 223, 223, 223, 47, 255, 255, 255, 8, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 9, 223, 223, 223, 47, 225, 225, 225, 51, 225, 225, 225, 25, 255, 255, 255, 0, 255, 255, 255, 0, 192, 192, 192, 4, 226, 226, 226, 43, 224, 224, 224, 8, 255, 255, 255, 0, 227, 227, 227, 9, 227, 227, 227, 18, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 101, 224, 224, 224, 49, 255, 255, 255, 0, 227, 227, 227, 9, 226, 226, 226, 43, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 255, 255, 255, 0, 227, 227, 227, 9, 228, 228, 228, 47, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 238, 224, 224, 224, 49, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 43, 225, 225, 225, 51, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 209, 255, 255, 255, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 192, 192, 192, 4, 226, 226, 226, 26, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 188, 224, 224, 224, 112, 230, 230, 230, 10, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 +[sub_resource type="DPITexture" id="DPITexture_hed0i"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) } -[sub_resource type="ImageTexture" id="ImageTexture_6oiqe"] -image = SubResource("Image_ern2r") - -[sub_resource type="Image" id="Image_qdci2"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 226, 226, 226, 26, 224, 224, 224, 41, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 41, 226, 226, 226, 26, 192, 192, 192, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 43, 225, 225, 225, 51, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 225, 225, 225, 51, 226, 226, 226, 43, 255, 255, 255, 1, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 227, 227, 227, 9, 223, 223, 223, 47, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 223, 223, 223, 47, 224, 224, 224, 8, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 226, 226, 226, 43, 227, 227, 227, 9, 255, 255, 255, 0, 227, 227, 227, 9, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 17, 255, 255, 255, 8, 255, 255, 255, 0, 227, 227, 227, 9, 226, 226, 226, 43, 192, 192, 192, 4, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 26, 225, 225, 225, 51, 223, 223, 223, 47, 227, 227, 227, 9, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 9, 228, 228, 228, 47, 225, 225, 225, 51, 225, 225, 225, 25, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 41, 225, 225, 225, 51, 225, 225, 225, 51, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 225, 225, 225, 51, 225, 225, 225, 51, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 41, 225, 225, 225, 51, 225, 225, 225, 51, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 225, 225, 225, 51, 225, 225, 225, 51, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 26, 225, 225, 225, 51, 223, 223, 223, 47, 255, 255, 255, 8, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 9, 223, 223, 223, 47, 225, 225, 225, 51, 225, 225, 225, 25, 255, 255, 255, 0, 255, 255, 255, 0, 192, 192, 192, 4, 226, 226, 226, 43, 224, 224, 224, 8, 255, 255, 255, 0, 226, 226, 226, 52, 225, 225, 225, 101, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 227, 227, 227, 9, 255, 255, 255, 0, 227, 227, 227, 9, 226, 226, 226, 43, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 255, 255, 255, 0, 227, 227, 227, 53, 224, 224, 224, 239, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 1, 225, 225, 225, 51, 223, 223, 223, 47, 227, 227, 227, 9, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 7, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 1, 225, 225, 225, 51, 225, 225, 225, 51, 226, 226, 226, 43, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 11, 224, 224, 224, 113, 224, 224, 224, 188, 255, 255, 255, 0, 255, 255, 255, 1, 229, 229, 229, 39, 225, 225, 225, 25, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 +[sub_resource type="DPITexture" id="DPITexture_8v04w"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) } -[sub_resource type="ImageTexture" id="ImageTexture_l0amb"] -image = SubResource("Image_qdci2") +[sub_resource type="DPITexture" id="DPITexture_arwmg"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) +} -[sub_resource type="Image" id="Image_hed0i"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 226, 226, 226, 26, 224, 224, 224, 41, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 41, 226, 226, 226, 26, 192, 192, 192, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 43, 225, 225, 225, 51, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 225, 225, 225, 51, 226, 226, 226, 43, 255, 255, 255, 1, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 227, 227, 227, 9, 223, 223, 223, 47, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 223, 223, 223, 47, 224, 224, 224, 8, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 226, 226, 226, 43, 227, 227, 227, 9, 255, 255, 255, 0, 227, 227, 227, 9, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 17, 255, 255, 255, 8, 255, 255, 255, 0, 227, 227, 227, 9, 226, 226, 226, 43, 192, 192, 192, 4, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 26, 225, 225, 225, 51, 223, 223, 223, 47, 227, 227, 227, 9, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 9, 228, 228, 228, 47, 225, 225, 225, 51, 225, 225, 225, 25, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 41, 225, 225, 225, 51, 225, 225, 225, 51, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 225, 225, 225, 51, 225, 225, 225, 51, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 255, 255, 255, 1, 255, 255, 255, 1, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 202, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 85, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 225, 225, 225, 51, 225, 225, 225, 51, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 128, 224, 224, 224, 255, 224, 224, 224, 231, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 9, 223, 223, 223, 47, 225, 225, 225, 51, 225, 225, 225, 25, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 17, 224, 224, 224, 212, 229, 229, 229, 39, 255, 255, 255, 0, 227, 227, 227, 9, 227, 227, 227, 18, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 227, 227, 227, 9, 255, 255, 255, 0, 227, 227, 227, 9, 226, 226, 226, 43, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 5, 255, 255, 255, 0, 227, 227, 227, 9, 228, 228, 228, 47, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 223, 223, 223, 47, 227, 227, 227, 9, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 43, 225, 225, 225, 51, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 225, 225, 225, 51, 226, 226, 226, 43, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 192, 192, 192, 4, 225, 225, 225, 25, 230, 230, 230, 40, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 40, 225, 225, 225, 25, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 +[sub_resource type="DPITexture" id="DPITexture_rqglq"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) } -[sub_resource type="ImageTexture" id="ImageTexture_nonnc"] -image = SubResource("Image_hed0i") +[sub_resource type="DPITexture" id="DPITexture_ltb1l"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) +} -[sub_resource type="Image" id="Image_8v04w"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 226, 226, 226, 26, 224, 224, 224, 41, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 41, 226, 226, 226, 26, 192, 192, 192, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 43, 225, 225, 225, 51, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 225, 225, 225, 51, 226, 226, 226, 43, 255, 255, 255, 1, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 8, 255, 255, 255, 0, 227, 227, 227, 9, 223, 223, 223, 47, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 223, 223, 223, 47, 224, 224, 224, 8, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 229, 229, 229, 19, 224, 224, 224, 218, 227, 227, 227, 45, 255, 255, 255, 0, 227, 227, 227, 9, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 17, 255, 255, 255, 8, 255, 255, 255, 0, 227, 227, 227, 9, 226, 226, 226, 43, 192, 192, 192, 4, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 131, 224, 224, 224, 255, 224, 224, 224, 234, 227, 227, 227, 45, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 9, 228, 228, 228, 47, 225, 225, 225, 51, 225, 225, 225, 25, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 202, 224, 224, 224, 252, 224, 224, 224, 252, 224, 224, 224, 82, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 225, 225, 225, 51, 225, 225, 225, 51, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 41, 225, 225, 225, 51, 225, 225, 225, 51, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 225, 225, 225, 51, 225, 225, 225, 51, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 26, 225, 225, 225, 51, 223, 223, 223, 47, 255, 255, 255, 8, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 9, 223, 223, 223, 47, 225, 225, 225, 51, 225, 225, 225, 25, 255, 255, 255, 0, 255, 255, 255, 0, 192, 192, 192, 4, 226, 226, 226, 43, 224, 224, 224, 8, 255, 255, 255, 0, 227, 227, 227, 9, 227, 227, 227, 18, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 227, 227, 227, 9, 255, 255, 255, 0, 227, 227, 227, 9, 226, 226, 226, 43, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 255, 255, 255, 0, 227, 227, 227, 9, 228, 228, 228, 47, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 223, 223, 223, 47, 227, 227, 227, 9, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 43, 225, 225, 225, 51, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 225, 225, 225, 51, 226, 226, 226, 43, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 192, 192, 192, 4, 226, 226, 226, 26, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 40, 225, 225, 225, 25, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 +[sub_resource type="DPITexture" id="DPITexture_2lq8w"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) } -[sub_resource type="ImageTexture" id="ImageTexture_d2btj"] -image = SubResource("Image_8v04w") +[sub_resource type="DPITexture" id="DPITexture_kwwmp"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) +} -[sub_resource type="Image" id="Image_arwmg"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 230, 230, 230, 30, 225, 225, 225, 149, 224, 224, 224, 221, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 41, 226, 226, 226, 26, 192, 192, 192, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 7, 224, 224, 224, 214, 224, 224, 224, 255, 224, 224, 224, 253, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 225, 225, 225, 51, 226, 226, 226, 43, 255, 255, 255, 1, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 231, 231, 231, 31, 224, 224, 224, 224, 224, 224, 224, 252, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 51, 223, 223, 223, 47, 224, 224, 224, 8, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 226, 226, 226, 43, 227, 227, 227, 9, 255, 255, 255, 0, 224, 224, 224, 32, 227, 227, 227, 63, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 17, 255, 255, 255, 8, 255, 255, 255, 0, 227, 227, 227, 9, 226, 226, 226, 43, 192, 192, 192, 4, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 26, 225, 225, 225, 51, 223, 223, 223, 47, 227, 227, 227, 9, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 9, 228, 228, 228, 47, 225, 225, 225, 51, 225, 225, 225, 25, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 41, 225, 225, 225, 51, 225, 225, 225, 51, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 225, 225, 225, 51, 225, 225, 225, 51, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 41, 225, 225, 225, 51, 225, 225, 225, 51, 225, 225, 225, 17, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 225, 225, 225, 51, 225, 225, 225, 51, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 26, 225, 225, 225, 51, 223, 223, 223, 47, 255, 255, 255, 8, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 9, 223, 223, 223, 47, 225, 225, 225, 51, 225, 225, 225, 25, 255, 255, 255, 0, 255, 255, 255, 0, 192, 192, 192, 4, 226, 226, 226, 43, 224, 224, 224, 8, 255, 255, 255, 0, 227, 227, 227, 9, 227, 227, 227, 18, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 18, 227, 227, 227, 9, 255, 255, 255, 0, 227, 227, 227, 9, 226, 226, 226, 43, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 255, 255, 255, 0, 227, 227, 227, 9, 228, 228, 228, 47, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 1, 225, 225, 225, 51, 223, 223, 223, 47, 227, 227, 227, 9, 255, 255, 255, 0, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 43, 225, 225, 225, 51, 225, 225, 225, 51, 255, 255, 255, 0, 255, 255, 255, 1, 225, 225, 225, 51, 225, 225, 225, 51, 226, 226, 226, 43, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 192, 192, 192, 4, 226, 226, 226, 26, 224, 224, 224, 40, 255, 255, 255, 0, 255, 255, 255, 1, 229, 229, 229, 39, 225, 225, 225, 25, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 +[sub_resource type="DPITexture" id="DPITexture_t1rin"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) } -[sub_resource type="ImageTexture" id="ImageTexture_1bxo7"] -image = SubResource("Image_arwmg") +[sub_resource type="DPITexture" id="DPITexture_pi1kv"] +_source = " +" +saturation = 2.0 +color_map = { +Color(1, 0.37254903, 0.37254903, 1): Color(1, 0.47, 0.42, 1), +Color(0.37254903, 1, 0.5921569, 1): Color(0.45, 0.95, 0.5, 1), +Color(1, 0.8666667, 0.39607844, 1): Color(0.83, 0.78, 0.62, 1) +} -[sub_resource type="AnimatedTexture" id="AnimatedTexture_eylo1"] +[sub_resource type="AnimatedTexture" id="AnimatedTexture_eor1x"] frames = 8 speed_scale = 2.5 -frame_0/texture = SubResource("ImageTexture_nwpuj") +frame_0/texture = SubResource("DPITexture_8v04w") frame_0/duration = 0.2 -frame_1/texture = SubResource("ImageTexture_pdcj5") +frame_1/texture = SubResource("DPITexture_arwmg") frame_1/duration = 0.2 -frame_2/texture = SubResource("ImageTexture_o41n3") +frame_2/texture = SubResource("DPITexture_rqglq") frame_2/duration = 0.2 -frame_3/texture = SubResource("ImageTexture_6oiqe") +frame_3/texture = SubResource("DPITexture_ltb1l") frame_3/duration = 0.2 -frame_4/texture = SubResource("ImageTexture_l0amb") +frame_4/texture = SubResource("DPITexture_2lq8w") frame_4/duration = 0.2 -frame_5/texture = SubResource("ImageTexture_nonnc") +frame_5/texture = SubResource("DPITexture_kwwmp") frame_5/duration = 0.2 -frame_6/texture = SubResource("ImageTexture_d2btj") +frame_6/texture = SubResource("DPITexture_t1rin") frame_6/duration = 0.2 -frame_7/texture = SubResource("ImageTexture_1bxo7") +frame_7/texture = SubResource("DPITexture_pi1kv") frame_7/duration = 0.2 -[sub_resource type="Image" id="Image_rqglq"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 195, 224, 224, 224, 210, 224, 224, 224, 56, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 224, 224, 224, 139, 224, 224, 224, 8, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 215, 224, 224, 224, 56, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 224, 224, 224, 139, 224, 224, 224, 8, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 183, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 182, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 252, 225, 225, 225, 134, 255, 255, 255, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 212, 226, 226, 226, 52, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 252, 225, 225, 225, 134, 255, 255, 255, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 191, 224, 224, 224, 206, 226, 226, 226, 52, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_dr7yj"] -image = SubResource("Image_rqglq") - -[sub_resource type="Image" id="Image_ltb1l"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 184, 224, 224, 224, 255, 224, 224, 224, 181, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 184, 224, 224, 224, 202, 228, 228, 228, 37, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 239, 224, 224, 224, 74, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 224, 224, 224, 123, 255, 255, 255, 1, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 173, 234, 234, 234, 12, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 188, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 185, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 168, 230, 230, 230, 10, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 252, 225, 225, 225, 118, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 237, 226, 226, 226, 70, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 181, 224, 224, 224, 255, 224, 224, 224, 180, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 188, 224, 224, 224, 201, 225, 225, 225, 34, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_oh8cr"] -image = SubResource("Image_ltb1l") - -[sub_resource type="Image" id="Image_2lq8w"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 196, 224, 224, 224, 196, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 226, 226, 226, 60, 226, 226, 226, 60, 224, 224, 224, 255, 224, 224, 224, 255, 226, 226, 226, 60, 226, 226, 226, 60, 233, 233, 233, 23, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 5, 225, 225, 225, 134, 224, 224, 224, 254, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 254, 225, 225, 225, 133, 255, 255, 255, 5, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 67, 224, 224, 224, 231, 224, 224, 224, 230, 224, 224, 224, 66, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 71, 224, 224, 224, 236, 224, 224, 224, 236, 224, 224, 224, 236, 224, 224, 224, 236, 224, 224, 224, 236, 224, 224, 224, 236, 224, 224, 224, 236, 224, 224, 224, 236, 224, 224, 224, 236, 224, 224, 224, 236, 224, 224, 224, 236, 224, 224, 224, 236, 224, 224, 224, 236, 224, 224, 224, 236, 225, 225, 225, 67, 226, 226, 226, 69, 224, 224, 224, 232, 224, 224, 224, 232, 224, 224, 224, 232, 224, 224, 224, 232, 224, 224, 224, 232, 224, 224, 224, 232, 224, 224, 224, 232, 224, 224, 224, 232, 224, 224, 224, 232, 224, 224, 224, 232, 224, 224, 224, 232, 224, 224, 224, 232, 224, 224, 224, 232, 224, 224, 224, 232, 224, 224, 224, 66, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 65, 224, 224, 224, 229, 224, 224, 224, 229, 224, 224, 224, 64, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 224, 224, 224, 132, 224, 224, 224, 253, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 224, 224, 224, 130, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 64, 224, 224, 224, 64, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 64, 224, 224, 224, 64, 233, 233, 233, 23, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 200, 224, 224, 224, 200, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_x1ivs"] -image = SubResource("Image_2lq8w") - -[sub_resource type="Image" id="Image_kwwmp"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 237, 237, 237, 14, 224, 224, 224, 165, 224, 224, 224, 165, 237, 237, 237, 14, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 58, 225, 225, 225, 223, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 223, 225, 225, 225, 58, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 233, 233, 233, 23, 225, 225, 225, 124, 224, 224, 224, 128, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 128, 225, 225, 225, 124, 233, 233, 233, 23, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 233, 233, 233, 23, 225, 225, 225, 125, 224, 224, 224, 128, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 128, 225, 225, 225, 125, 233, 233, 233, 23, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 59, 224, 224, 224, 224, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 223, 225, 225, 225, 59, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 238, 238, 238, 15, 224, 224, 224, 165, 224, 224, 224, 165, 238, 238, 238, 15, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_i13wr"] -image = SubResource("Image_kwwmp") - -[node name="MainPanel" type="VSplitContainer"] +[node name="MainPanel" type="VSplitContainer" unique_id=1044515559] use_parent_material = true clip_contents = true anchors_preset = 15 @@ -177,33 +154,44 @@ grow_horizontal = 2 grow_vertical = 2 size_flags_horizontal = 3 size_flags_vertical = 3 +split_offsets = PackedInt32Array(200) split_offset = 200 script = ExtResource("1") -[node name="Panel" type="PanelContainer" parent="."] +[node name="contextMenu" parent="." unique_id=73764904 instance=ExtResource("2_o6s0p")] +visible = false +item_0/icon = SubResource("DPITexture_miuuy") +item_1/icon = SubResource("DPITexture_ern2r") +item_2/text = "Run Tests Until Fail" +item_2/icon = SubResource("DPITexture_miuuy") +item_4/icon = SubResource("DPITexture_qdci2") +item_5/icon = SubResource("DPITexture_hed0i") + +[node name="Panel" type="PanelContainer" parent="." unique_id=641912870] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 -[node name="Tree" type="Tree" parent="Panel"] +[node name="Tree" type="Tree" parent="Panel" unique_id=741772884] use_parent_material = true layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 theme_override_constants/icon_max_width = 16 columns = 2 +allow_reselect = true allow_rmb_select = true hide_root = true select_mode = 1 -[node name="discover_hint" type="HBoxContainer" parent="Panel"] +[node name="discover_hint" type="HBoxContainer" parent="Panel" unique_id=555683311] unique_name_in_owner = true visible = false use_parent_material = true layout_mode = 2 alignment = 1 -[node name="spinner" type="Button" parent="Panel/discover_hint"] +[node name="spinner" type="Button" parent="Panel/discover_hint" unique_id=200472082] unique_name_in_owner = true clip_contents = true custom_minimum_size = Vector2(64, 64) @@ -212,62 +200,41 @@ size_flags_stretch_ratio = 1.94 disabled = true button_mask = 0 text = "Discover Tests" -icon = SubResource("AnimatedTexture_eylo1") +icon = SubResource("AnimatedTexture_eor1x") flat = true alignment = 2 -[node name="report" type="PanelContainer" parent="."] +[node name="report" type="PanelContainer" parent="." unique_id=503703488] clip_contents = true layout_mode = 2 size_flags_horizontal = 11 size_flags_vertical = 11 -[node name="report_template" type="RichTextLabel" parent="report"] +[node name="report_template" type="RichTextLabel" parent="report" unique_id=817912164] +auto_translate_mode = 2 use_parent_material = true clip_contents = false layout_mode = 2 size_flags_horizontal = 3 -auto_translate = false localize_numeral_system = false focus_mode = 2 bbcode_enabled = true fit_content = true selection_enabled = true -[node name="ScrollContainer" type="ScrollContainer" parent="report"] +[node name="ScrollContainer" type="ScrollContainer" parent="report" unique_id=1479075289] use_parent_material = true custom_minimum_size = Vector2(0, 80) layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 11 -[node name="list" type="VBoxContainer" parent="report/ScrollContainer"] +[node name="list" type="VBoxContainer" parent="report/ScrollContainer" unique_id=1104634565] clip_contents = true layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 -[node name="contextMenu" type="PopupMenu" parent="."] -size = Vector2i(133, 120) -auto_translate = false -item_count = 5 -item_0/text = "Run" -item_0/icon = SubResource("ImageTexture_dr7yj") -item_0/id = 0 -item_1/text = "Debug" -item_1/icon = SubResource("ImageTexture_oh8cr") -item_1/id = 1 -item_2/text = "" -item_2/id = 2 -item_2/separator = true -item_3/text = "Collapse All" -item_3/icon = SubResource("ImageTexture_x1ivs") -item_3/id = 3 -item_4/text = "Expand All" -item_4/icon = SubResource("ImageTexture_i13wr") -item_4/id = 4 - [connection signal="item_activated" from="Panel/Tree" to="." method="_on_Tree_item_activated"] [connection signal="item_mouse_selected" from="Panel/Tree" to="." method="_on_tree_item_mouse_selected"] [connection signal="item_selected" from="Panel/Tree" to="." method="_on_Tree_item_selected"] -[connection signal="index_pressed" from="contextMenu" to="." method="_on_context_m_index_pressed"] diff --git a/addons/gdUnit4/src/ui/settings/GdUnitInputCapture.gd.uid b/addons/gdUnit4/src/ui/settings/GdUnitInputCapture.gd.uid index bfb37e65..2a2db7e4 100644 --- a/addons/gdUnit4/src/ui/settings/GdUnitInputCapture.gd.uid +++ b/addons/gdUnit4/src/ui/settings/GdUnitInputCapture.gd.uid @@ -1 +1 @@ -uid://c3erojmjbnikq +uid://brsfkerb326sh diff --git a/addons/gdUnit4/src/ui/settings/GdUnitSettingsDialog.gd.uid b/addons/gdUnit4/src/ui/settings/GdUnitSettingsDialog.gd.uid index d92713c9..afabbedd 100644 --- a/addons/gdUnit4/src/ui/settings/GdUnitSettingsDialog.gd.uid +++ b/addons/gdUnit4/src/ui/settings/GdUnitSettingsDialog.gd.uid @@ -1 +1 @@ -uid://cdptt8hmovee6 +uid://blp3apwqfd8o6 diff --git a/addons/gdUnit4/src/ui/settings/GdUnitSettingsTabHooks.gd.uid b/addons/gdUnit4/src/ui/settings/GdUnitSettingsTabHooks.gd.uid index 4355ff14..8dd0fe35 100644 --- a/addons/gdUnit4/src/ui/settings/GdUnitSettingsTabHooks.gd.uid +++ b/addons/gdUnit4/src/ui/settings/GdUnitSettingsTabHooks.gd.uid @@ -1 +1 @@ -uid://dc6wvyastotux +uid://c3igu74fy8t8x diff --git a/addons/gdUnit4/src/ui/templates/TestSuiteTemplate.gd.uid b/addons/gdUnit4/src/ui/templates/TestSuiteTemplate.gd.uid index 75567f51..66fe3bee 100644 --- a/addons/gdUnit4/src/ui/templates/TestSuiteTemplate.gd.uid +++ b/addons/gdUnit4/src/ui/templates/TestSuiteTemplate.gd.uid @@ -1 +1 @@ -uid://bm4782o8xvhx4 +uid://6nfo6w2wfdg8 diff --git a/addons/gdUnit4/src/update/GdMarkDownReader.gd.uid b/addons/gdUnit4/src/update/GdMarkDownReader.gd.uid index 57cf1105..ff4d16d8 100644 --- a/addons/gdUnit4/src/update/GdMarkDownReader.gd.uid +++ b/addons/gdUnit4/src/update/GdMarkDownReader.gd.uid @@ -1 +1 @@ -uid://dl510u7rvuvw6 +uid://dldfbcyuvjpxn diff --git a/addons/gdUnit4/src/update/GdUnitPatch.gd.uid b/addons/gdUnit4/src/update/GdUnitPatch.gd.uid index cded37cb..dcd528c4 100644 --- a/addons/gdUnit4/src/update/GdUnitPatch.gd.uid +++ b/addons/gdUnit4/src/update/GdUnitPatch.gd.uid @@ -1 +1 @@ -uid://bk020xoxjycd4 +uid://bhcmm610cy1db diff --git a/addons/gdUnit4/src/update/GdUnitPatcher.gd.uid b/addons/gdUnit4/src/update/GdUnitPatcher.gd.uid index 3c9f0b40..e39b5616 100644 --- a/addons/gdUnit4/src/update/GdUnitPatcher.gd.uid +++ b/addons/gdUnit4/src/update/GdUnitPatcher.gd.uid @@ -1 +1 @@ -uid://ts272bcr5vj0 +uid://pqnm4y7tnff2 diff --git a/addons/gdUnit4/src/update/GdUnitUpdate.gd.uid b/addons/gdUnit4/src/update/GdUnitUpdate.gd.uid index 2526f238..e7d07590 100644 --- a/addons/gdUnit4/src/update/GdUnitUpdate.gd.uid +++ b/addons/gdUnit4/src/update/GdUnitUpdate.gd.uid @@ -1 +1 @@ -uid://dcjl2bygjmfxi +uid://brtytkiijfldq diff --git a/addons/gdUnit4/src/update/GdUnitUpdateClient.gd.uid b/addons/gdUnit4/src/update/GdUnitUpdateClient.gd.uid index 0348691a..256bc5fb 100644 --- a/addons/gdUnit4/src/update/GdUnitUpdateClient.gd.uid +++ b/addons/gdUnit4/src/update/GdUnitUpdateClient.gd.uid @@ -1 +1 @@ -uid://6xqggom0yrfx +uid://n5l8b1mknuy8 diff --git a/addons/gdUnit4/src/update/GdUnitUpdateNotify.gd.uid b/addons/gdUnit4/src/update/GdUnitUpdateNotify.gd.uid index f585502c..9a151ce1 100644 --- a/addons/gdUnit4/src/update/GdUnitUpdateNotify.gd.uid +++ b/addons/gdUnit4/src/update/GdUnitUpdateNotify.gd.uid @@ -1 +1 @@ -uid://25cgn7r6fj5m +uid://datpg3ump0h6e diff --git a/examples/beehave_test_scene.tscn b/examples/beehave_test_scene.tscn index e5b1a65b..8e76a036 100644 --- a/examples/beehave_test_scene.tscn +++ b/examples/beehave_test_scene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=12 format=3 uid="uid://dxkotdttpvmb0"] +[gd_scene format=3 uid="uid://dxkotdttpvmb0"] [ext_resource type="Script" uid="uid://bpqetb2foys1g" path="res://examples/beehave_test_scene.gd" id="1_18xg1"] [ext_resource type="Texture2D" uid="uid://uq5muso23nn5" path="res://splash.png" id="2_2q57p"] @@ -14,108 +14,108 @@ [sub_resource type="CompressedTexture2D" id="CompressedTexture2D_atdvc"] load_path = "res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" -[node name="BeehaveTestScene" type="Node2D"] +[node name="BeehaveTestScene" type="Node2D" unique_id=2096344814] script = ExtResource("1_18xg1") -[node name="Background" type="Sprite2D" parent="."] +[node name="Background" type="Sprite2D" parent="." unique_id=518722372] modulate = Color(0.882353, 0.882353, 0.882353, 0.141176) position = Vector2(32, 46) scale = Vector2(2.63487, 2.57664) texture = ExtResource("2_2q57p") -[node name="ColorChangingSprite" type="Sprite2D" parent="."] +[node name="ColorChangingSprite" type="Sprite2D" parent="." unique_id=207714075] scale = Vector2(0.1, 0.1) texture = SubResource("CompressedTexture2D_atdvc") script = ExtResource("3_shmq8") -[node name="BeehaveTree" type="Node" parent="ColorChangingSprite" node_paths=PackedStringArray("blackboard", "actor")] +[node name="BeehaveTree" type="Node" parent="ColorChangingSprite" unique_id=1725372885 node_paths=PackedStringArray("blackboard", "actor")] unique_name_in_owner = true script = ExtResource("4_yb1gg") blackboard = NodePath("../../Blackboard") custom_monitor = true actor = NodePath("..") -[node name="SelectorComposite" type="Node" parent="ColorChangingSprite/BeehaveTree"] +[node name="SelectorComposite" type="Node" parent="ColorChangingSprite/BeehaveTree" unique_id=1704910474] script = ExtResource("5_l2xef") -[node name="SequenceComposite" type="Node" parent="ColorChangingSprite/BeehaveTree/SelectorComposite"] +[node name="SequenceComposite" type="Node" parent="ColorChangingSprite/BeehaveTree/SelectorComposite" unique_id=306526239] script = ExtResource("6_jtsdg") -[node name="HasPositivePosition" parent="ColorChangingSprite/BeehaveTree/SelectorComposite/SequenceComposite" instance=ExtResource("7_iqb0a")] +[node name="HasPositivePosition" parent="ColorChangingSprite/BeehaveTree/SelectorComposite/SequenceComposite" unique_id=196718881 instance=ExtResource("7_iqb0a")] -[node name="SetModulateColor" parent="ColorChangingSprite/BeehaveTree/SelectorComposite/SequenceComposite" instance=ExtResource("8_0v48s")] +[node name="SetModulateColor" parent="ColorChangingSprite/BeehaveTree/SelectorComposite/SequenceComposite" unique_id=471261335 instance=ExtResource("8_0v48s")] modulate_color = Color(1, 0, 0, 1) -[node name="SequenceComposite2" type="Node" parent="ColorChangingSprite/BeehaveTree/SelectorComposite"] +[node name="SequenceComposite2" type="Node" parent="ColorChangingSprite/BeehaveTree/SelectorComposite" unique_id=1981393086] script = ExtResource("6_jtsdg") -[node name="HasNegativePosition" parent="ColorChangingSprite/BeehaveTree/SelectorComposite/SequenceComposite2" instance=ExtResource("9_x8ohm")] +[node name="HasNegativePosition" parent="ColorChangingSprite/BeehaveTree/SelectorComposite/SequenceComposite2" unique_id=385742006 instance=ExtResource("9_x8ohm")] -[node name="SetModulateColor" parent="ColorChangingSprite/BeehaveTree/SelectorComposite/SequenceComposite2" instance=ExtResource("8_0v48s")] +[node name="SetModulateColor" parent="ColorChangingSprite/BeehaveTree/SelectorComposite/SequenceComposite2" unique_id=130470482 instance=ExtResource("8_0v48s")] modulate_color = Color(0, 0, 1, 1) -[node name="SetModulateColor" parent="ColorChangingSprite/BeehaveTree/SelectorComposite" instance=ExtResource("8_0v48s")] +[node name="SetModulateColor" parent="ColorChangingSprite/BeehaveTree/SelectorComposite" unique_id=1923180755 instance=ExtResource("8_0v48s")] -[node name="Camera2D" type="Camera2D" parent="ColorChangingSprite"] +[node name="Camera2D" type="Camera2D" parent="ColorChangingSprite" unique_id=1721053788] -[node name="Blackboard" type="Node" parent="."] +[node name="Blackboard" type="Node" parent="." unique_id=1923342068] script = ExtResource("10_y2p03") blackboard = { "key": 15.3 } -[node name="AnotherSprite" type="Sprite2D" parent="."] +[node name="AnotherSprite" type="Sprite2D" parent="." unique_id=295652806] position = Vector2(182, 180) scale = Vector2(0.1, 0.1) texture = SubResource("CompressedTexture2D_atdvc") -[node name="AnotherTree" type="Node" parent="AnotherSprite" node_paths=PackedStringArray("blackboard", "actor")] +[node name="AnotherTree" type="Node" parent="AnotherSprite" unique_id=121004362 node_paths=PackedStringArray("blackboard", "actor")] script = ExtResource("4_yb1gg") blackboard = NodePath("../../Blackboard") custom_monitor = null actor = NodePath("..") -[node name="SelectorComposite" type="Node" parent="AnotherSprite/AnotherTree"] +[node name="SelectorComposite" type="Node" parent="AnotherSprite/AnotherTree" unique_id=1026269734] script = ExtResource("5_l2xef") -[node name="SequenceComposite" type="Node" parent="AnotherSprite/AnotherTree/SelectorComposite"] +[node name="SequenceComposite" type="Node" parent="AnotherSprite/AnotherTree/SelectorComposite" unique_id=658677167] script = ExtResource("6_jtsdg") -[node name="HasPositivePosition" parent="AnotherSprite/AnotherTree/SelectorComposite/SequenceComposite" instance=ExtResource("7_iqb0a")] +[node name="HasPositivePosition" parent="AnotherSprite/AnotherTree/SelectorComposite/SequenceComposite" unique_id=445775796 instance=ExtResource("7_iqb0a")] -[node name="SetModulateColor" parent="AnotherSprite/AnotherTree/SelectorComposite/SequenceComposite" instance=ExtResource("8_0v48s")] +[node name="SetModulateColor" parent="AnotherSprite/AnotherTree/SelectorComposite/SequenceComposite" unique_id=473890792 instance=ExtResource("8_0v48s")] modulate_color = Color(1, 0, 0, 1) -[node name="SequenceComposite2" type="Node" parent="AnotherSprite/AnotherTree/SelectorComposite"] +[node name="SequenceComposite2" type="Node" parent="AnotherSprite/AnotherTree/SelectorComposite" unique_id=589972787] script = ExtResource("6_jtsdg") -[node name="HasNegativePosition" parent="AnotherSprite/AnotherTree/SelectorComposite/SequenceComposite2" instance=ExtResource("9_x8ohm")] +[node name="HasNegativePosition" parent="AnotherSprite/AnotherTree/SelectorComposite/SequenceComposite2" unique_id=2144731035 instance=ExtResource("9_x8ohm")] -[node name="SetModulateColor" parent="AnotherSprite/AnotherTree/SelectorComposite/SequenceComposite2" instance=ExtResource("8_0v48s")] +[node name="SetModulateColor" parent="AnotherSprite/AnotherTree/SelectorComposite/SequenceComposite2" unique_id=789896489 instance=ExtResource("8_0v48s")] modulate_color = Color(0, 0, 1, 1) -[node name="SequenceComposite2" type="Node" parent="AnotherSprite/AnotherTree/SelectorComposite/SequenceComposite2"] +[node name="SequenceComposite2" type="Node" parent="AnotherSprite/AnotherTree/SelectorComposite/SequenceComposite2" unique_id=682570510] script = ExtResource("6_jtsdg") -[node name="HasNegativePosition" parent="AnotherSprite/AnotherTree/SelectorComposite/SequenceComposite2/SequenceComposite2" instance=ExtResource("9_x8ohm")] +[node name="HasNegativePosition" parent="AnotherSprite/AnotherTree/SelectorComposite/SequenceComposite2/SequenceComposite2" unique_id=1511490354 instance=ExtResource("9_x8ohm")] -[node name="SetModulateColor" parent="AnotherSprite/AnotherTree/SelectorComposite/SequenceComposite2/SequenceComposite2" instance=ExtResource("8_0v48s")] +[node name="SetModulateColor" parent="AnotherSprite/AnotherTree/SelectorComposite/SequenceComposite2/SequenceComposite2" unique_id=531233566 instance=ExtResource("8_0v48s")] modulate_color = Color(0, 0, 1, 1) -[node name="SetModulateColor" parent="AnotherSprite/AnotherTree/SelectorComposite" instance=ExtResource("8_0v48s")] +[node name="SetModulateColor" parent="AnotherSprite/AnotherTree/SelectorComposite" unique_id=647321209 instance=ExtResource("8_0v48s")] -[node name="Camera2D" type="Camera2D" parent="AnotherSprite"] +[node name="Camera2D" type="Camera2D" parent="AnotherSprite" unique_id=1717544030] -[node name="CanvasLayer" type="CanvasLayer" parent="."] +[node name="CanvasLayer" type="CanvasLayer" parent="." unique_id=136287115] -[node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer"] +[node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer" unique_id=854776570] offset_right = 40.0 offset_bottom = 40.0 -[node name="ConditionLabel" type="Label" parent="CanvasLayer/VBoxContainer"] +[node name="ConditionLabel" type="Label" parent="CanvasLayer/VBoxContainer" unique_id=1554371457] unique_name_in_owner = true layout_mode = 2 -[node name="ActionLabel" type="Label" parent="CanvasLayer/VBoxContainer"] +[node name="ActionLabel" type="Label" parent="CanvasLayer/VBoxContainer" unique_id=1633893363] unique_name_in_owner = true layout_mode = 2 diff --git a/project.godot b/project.godot index c252e46e..1ac0cd50 100644 --- a/project.godot +++ b/project.godot @@ -8,19 +8,23 @@ config_version=5 +[animation] + +compatibility/default_parent_skeleton_in_mesh_instance_3d=true + [application] config/name="Beehave" run/main_scene="res://examples/beehave_test_scene.tscn" -config/features=PackedStringArray("4.5") -boot_splash/fullsize=false +config/features=PackedStringArray("4.6") +boot_splash/stretch_mode=0 boot_splash/image="res://splash.png" config/icon="res://icon.png" [autoload] -BeehaveGlobalMetrics="*res://addons/beehave/metrics/beehave_global_metrics.gd" -BeehaveGlobalDebugger="*res://addons/beehave/debug/global_debugger.gd" +BeehaveGlobalMetrics="*uid://c3ktl6ontsdt7" +BeehaveGlobalDebugger="*uid://bl3ma400hpvsh" [beehave]