diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/core/config/test_project_settings.h | 2 | ||||
-rw-r--r-- | tests/core/io/test_marshalls.h | 99 | ||||
-rw-r--r-- | tests/core/math/test_aabb.h | 2 | ||||
-rw-r--r-- | tests/core/math/test_color.h | 2 | ||||
-rw-r--r-- | tests/core/math/test_rect2.h | 2 | ||||
-rw-r--r-- | tests/core/object/test_object.h | 4 | ||||
-rw-r--r-- | tests/core/string/test_fuzzy_search.h | 83 | ||||
-rw-r--r-- | tests/core/string/test_string.h | 61 | ||||
-rw-r--r-- | tests/core/string/test_translation.h | 2 | ||||
-rw-r--r-- | tests/core/string/test_translation_server.h | 88 | ||||
-rw-r--r-- | tests/core/templates/test_a_hash_map.h | 295 | ||||
-rw-r--r-- | tests/core/variant/test_variant_utility.h | 2 | ||||
-rw-r--r-- | tests/data/fuzzy_search/project_dir_tree.txt | 999 | ||||
-rw-r--r-- | tests/scene/test_audio_stream_wav.h | 2 | ||||
-rw-r--r-- | tests/scene/test_primitives.h | 18 | ||||
-rw-r--r-- | tests/scene/test_tree.h | 126 | ||||
-rw-r--r-- | tests/scene/test_viewport.h | 2 | ||||
-rw-r--r-- | tests/servers/test_navigation_server_3d.h | 2 | ||||
-rw-r--r-- | tests/test_macros.h | 2 | ||||
-rw-r--r-- | tests/test_main.cpp | 2 |
20 files changed, 1742 insertions, 53 deletions
diff --git a/tests/core/config/test_project_settings.h b/tests/core/config/test_project_settings.h index 0e1058a626..5a000b19a0 100644 --- a/tests/core/config/test_project_settings.h +++ b/tests/core/config/test_project_settings.h @@ -40,7 +40,7 @@ class TestProjectSettingsInternalsAccessor { public: static String &resource_path() { return ProjectSettings::get_singleton()->resource_path; - }; + } }; namespace TestProjectSettings { diff --git a/tests/core/io/test_marshalls.h b/tests/core/io/test_marshalls.h index de8d6e1406..6716984681 100644 --- a/tests/core/io/test_marshalls.h +++ b/tests/core/io/test_marshalls.h @@ -160,7 +160,7 @@ TEST_CASE("[Marshalls] NIL Variant encoding") { uint8_t buffer[4]; CHECK(encode_variant(variant, buffer, r_len) == OK); - CHECK_MESSAGE(r_len == 4, "Length == 4 bytes for header"); + CHECK_MESSAGE(r_len == 4, "Length == 4 bytes for header."); CHECK_MESSAGE(buffer[0] == 0x00, "Variant::NIL"); CHECK(buffer[1] == 0x00); CHECK(buffer[2] == 0x00); @@ -174,7 +174,7 @@ TEST_CASE("[Marshalls] INT 32 bit Variant encoding") { uint8_t buffer[8]; CHECK(encode_variant(variant, buffer, r_len) == OK); - CHECK_MESSAGE(r_len == 8, "Length == 4 bytes for header + 4 bytes for int32_t"); + CHECK_MESSAGE(r_len == 8, "Length == 4 bytes for header + 4 bytes for `int32_t`."); CHECK_MESSAGE(buffer[0] == 0x02, "Variant::INT"); CHECK(buffer[1] == 0x00); CHECK(buffer[2] == 0x00); @@ -192,7 +192,7 @@ TEST_CASE("[Marshalls] INT 64 bit Variant encoding") { uint8_t buffer[12]; CHECK(encode_variant(variant, buffer, r_len) == OK); - CHECK_MESSAGE(r_len == 12, "Length == 4 bytes for header + 8 bytes for int64_t"); + CHECK_MESSAGE(r_len == 12, "Length == 4 bytes for header + 8 bytes for `int64_t`."); CHECK_MESSAGE(buffer[0] == 0x02, "Variant::INT"); CHECK(buffer[1] == 0x00); CHECK_MESSAGE(buffer[2] == 0x01, "HEADER_DATA_FLAG_64"); @@ -214,7 +214,7 @@ TEST_CASE("[Marshalls] FLOAT single precision Variant encoding") { uint8_t buffer[8]; CHECK(encode_variant(variant, buffer, r_len) == OK); - CHECK_MESSAGE(r_len == 8, "Length == 4 bytes for header + 4 bytes for float"); + CHECK_MESSAGE(r_len == 8, "Length == 4 bytes for header + 4 bytes for `float`."); CHECK_MESSAGE(buffer[0] == 0x03, "Variant::FLOAT"); CHECK(buffer[1] == 0x00); CHECK(buffer[2] == 0x00); @@ -232,7 +232,7 @@ TEST_CASE("[Marshalls] FLOAT double precision Variant encoding") { uint8_t buffer[12]; CHECK(encode_variant(variant, buffer, r_len) == OK); - CHECK_MESSAGE(r_len == 12, "Length == 4 bytes for header + 8 bytes for double"); + CHECK_MESSAGE(r_len == 12, "Length == 4 bytes for header + 8 bytes for `double`."); CHECK_MESSAGE(buffer[0] == 0x03, "Variant::FLOAT"); CHECK(buffer[1] == 0x00); CHECK_MESSAGE(buffer[2] == 0x01, "HEADER_DATA_FLAG_64"); @@ -335,10 +335,10 @@ TEST_CASE("[Marshalls] Typed array encoding") { uint8_t buffer[24]; CHECK(encode_variant(array, buffer, r_len) == OK); - CHECK_MESSAGE(r_len == 24, "Length == 4 bytes for header + 4 bytes for array type + 4 bytes for array size + 12 bytes for element"); + CHECK_MESSAGE(r_len == 24, "Length == 4 bytes for header + 4 bytes for array type + 4 bytes for array size + 12 bytes for element."); CHECK_MESSAGE(buffer[0] == 0x1c, "Variant::ARRAY"); CHECK(buffer[1] == 0x00); - CHECK_MESSAGE(buffer[2] == 0x01, "HEADER_DATA_FIELD_TYPED_ARRAY_BUILTIN"); + CHECK_MESSAGE(buffer[2] == 0x01, "CONTAINER_TYPE_KIND_BUILTIN"); CHECK(buffer[3] == 0x00); // Check array type. CHECK_MESSAGE(buffer[4] == 0x02, "Variant::INT"); @@ -370,7 +370,7 @@ TEST_CASE("[Marshalls] Typed array decoding") { Variant variant; int r_len; uint8_t buffer[] = { - 0x1c, 0x00, 0x01, 0x00, // Variant::ARRAY, HEADER_DATA_FIELD_TYPED_ARRAY_BUILTIN + 0x1c, 0x00, 0x01, 0x00, // Variant::ARRAY, CONTAINER_TYPE_KIND_BUILTIN 0x02, 0x00, 0x00, 0x00, // Array type (Variant::INT). 0x01, 0x00, 0x00, 0x00, // Array size. 0x02, 0x00, 0x01, 0x00, // Element type (Variant::INT, HEADER_DATA_FLAG_64). @@ -386,6 +386,89 @@ TEST_CASE("[Marshalls] Typed array decoding") { CHECK(array[0] == Variant(uint64_t(0x0f123456789abcdef))); } +TEST_CASE("[Marshalls] Typed dicttionary encoding") { + int r_len; + Dictionary dictionary; + dictionary.set_typed(Variant::INT, StringName(), Ref<Script>(), Variant::INT, StringName(), Ref<Script>()); + dictionary[Variant(uint64_t(0x0f123456789abcdef))] = Variant(uint64_t(0x0f123456789abcdef)); + uint8_t buffer[40]; + + CHECK(encode_variant(dictionary, buffer, r_len) == OK); + CHECK_MESSAGE(r_len == 40, "Length == 4 bytes for header + 8 bytes for dictionary type + 4 bytes for dictionary size + 24 bytes for key-value pair."); + CHECK_MESSAGE(buffer[0] == 0x1b, "Variant::DICTIONARY"); + CHECK(buffer[1] == 0x00); + CHECK_MESSAGE(buffer[2] == 0x05, "key: CONTAINER_TYPE_KIND_BUILTIN | value: CONTAINER_TYPE_KIND_BUILTIN"); + CHECK(buffer[3] == 0x00); + // Check dictionary key type. + CHECK_MESSAGE(buffer[4] == 0x02, "Variant::INT"); + CHECK(buffer[5] == 0x00); + CHECK(buffer[6] == 0x00); + CHECK(buffer[7] == 0x00); + // Check dictionary value type. + CHECK_MESSAGE(buffer[8] == 0x02, "Variant::INT"); + CHECK(buffer[9] == 0x00); + CHECK(buffer[10] == 0x00); + CHECK(buffer[11] == 0x00); + // Check dictionary size. + CHECK(buffer[12] == 0x01); + CHECK(buffer[13] == 0x00); + CHECK(buffer[14] == 0x00); + CHECK(buffer[15] == 0x00); + // Check key type. + CHECK_MESSAGE(buffer[16] == 0x02, "Variant::INT"); + CHECK(buffer[17] == 0x00); + CHECK_MESSAGE(buffer[18] == 0x01, "HEADER_DATA_FLAG_64"); + CHECK(buffer[19] == 0x00); + // Check key value. + CHECK(buffer[20] == 0xef); + CHECK(buffer[21] == 0xcd); + CHECK(buffer[22] == 0xab); + CHECK(buffer[23] == 0x89); + CHECK(buffer[24] == 0x67); + CHECK(buffer[25] == 0x45); + CHECK(buffer[26] == 0x23); + CHECK(buffer[27] == 0xf1); + // Check value type. + CHECK_MESSAGE(buffer[28] == 0x02, "Variant::INT"); + CHECK(buffer[29] == 0x00); + CHECK_MESSAGE(buffer[30] == 0x01, "HEADER_DATA_FLAG_64"); + CHECK(buffer[31] == 0x00); + // Check value value. + CHECK(buffer[32] == 0xef); + CHECK(buffer[33] == 0xcd); + CHECK(buffer[34] == 0xab); + CHECK(buffer[35] == 0x89); + CHECK(buffer[36] == 0x67); + CHECK(buffer[37] == 0x45); + CHECK(buffer[38] == 0x23); + CHECK(buffer[39] == 0xf1); +} + +TEST_CASE("[Marshalls] Typed dictionary decoding") { + Variant variant; + int r_len; + uint8_t buffer[] = { + 0x1b, 0x00, 0x05, 0x00, // Variant::DICTIONARY, key: CONTAINER_TYPE_KIND_BUILTIN | value: CONTAINER_TYPE_KIND_BUILTIN + 0x02, 0x00, 0x00, 0x00, // Dictionary key type (Variant::INT). + 0x02, 0x00, 0x00, 0x00, // Dictionary value type (Variant::INT). + 0x01, 0x00, 0x00, 0x00, // Dictionary size. + 0x02, 0x00, 0x01, 0x00, // Key type (Variant::INT, HEADER_DATA_FLAG_64). + 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0xf1, // Key value. + 0x02, 0x00, 0x01, 0x00, // Value type (Variant::INT, HEADER_DATA_FLAG_64). + 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0xf1, // Value value. + }; + + CHECK(decode_variant(variant, buffer, 40, &r_len) == OK); + CHECK(r_len == 40); + CHECK(variant.get_type() == Variant::DICTIONARY); + Dictionary dictionary = variant; + CHECK(dictionary.get_typed_key_builtin() == Variant::INT); + CHECK(dictionary.get_typed_value_builtin() == Variant::INT); + CHECK(dictionary.size() == 1); + CHECK(dictionary.has(Variant(uint64_t(0x0f123456789abcdef)))); + CHECK(dictionary[Variant(uint64_t(0x0f123456789abcdef))] == Variant(uint64_t(0x0f123456789abcdef))); +} + } // namespace TestMarshalls #endif // TEST_MARSHALLS_H diff --git a/tests/core/math/test_aabb.h b/tests/core/math/test_aabb.h index 741e6af5d4..eb6977fd69 100644 --- a/tests/core/math/test_aabb.h +++ b/tests/core/math/test_aabb.h @@ -48,7 +48,7 @@ TEST_CASE("[AABB] Constructor methods") { TEST_CASE("[AABB] String conversion") { CHECK_MESSAGE( - String(AABB(Vector3(-1.5, 2, -2.5), Vector3(4, 5, 6))) == "[P: (-1.5, 2, -2.5), S: (4, 5, 6)]", + String(AABB(Vector3(-1.5, 2, -2.5), Vector3(4, 5, 6))) == "[P: (-1.5, 2.0, -2.5), S: (4.0, 5.0, 6.0)]", "The string representation should match the expected value."); } diff --git a/tests/core/math/test_color.h b/tests/core/math/test_color.h index bd2d4f40e5..3d36079102 100644 --- a/tests/core/math/test_color.h +++ b/tests/core/math/test_color.h @@ -140,7 +140,7 @@ TEST_CASE("[Color] Conversion methods") { cyan.to_rgba64() == 0x0000'ffff'ffff'ffff, "The returned 64-bit BGR number should match the expected value."); CHECK_MESSAGE( - String(cyan) == "(0, 1, 1, 1)", + String(cyan) == "(0.0, 1.0, 1.0, 1.0)", "The string representation should match the expected value."); } diff --git a/tests/core/math/test_rect2.h b/tests/core/math/test_rect2.h index c4368808a6..a93bfeb71b 100644 --- a/tests/core/math/test_rect2.h +++ b/tests/core/math/test_rect2.h @@ -57,7 +57,7 @@ TEST_CASE("[Rect2] Constructor methods") { TEST_CASE("[Rect2] String conversion") { // Note: This also depends on the Vector2 string representation. CHECK_MESSAGE( - String(Rect2(0, 100, 1280, 720)) == "[P: (0, 100), S: (1280, 720)]", + String(Rect2(0, 100, 1280, 720)) == "[P: (0.0, 100.0), S: (1280.0, 720.0)]", "The string representation should match the expected value."); } diff --git a/tests/core/object/test_object.h b/tests/core/object/test_object.h index e703698ec6..55c53e2d03 100644 --- a/tests/core/object/test_object.h +++ b/tests/core/object/test_object.h @@ -95,10 +95,10 @@ public: } bool property_can_revert(const StringName &p_name) const override { return false; - }; + } bool property_get_revert(const StringName &p_name, Variant &r_ret) const override { return false; - }; + } void get_method_list(List<MethodInfo> *p_list) const override { } bool has_method(const StringName &p_method) const override { diff --git a/tests/core/string/test_fuzzy_search.h b/tests/core/string/test_fuzzy_search.h new file mode 100644 index 0000000000..d647ebdd1a --- /dev/null +++ b/tests/core/string/test_fuzzy_search.h @@ -0,0 +1,83 @@ +/**************************************************************************/ +/* test_fuzzy_search.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#ifndef TEST_FUZZY_SEARCH_H +#define TEST_FUZZY_SEARCH_H + +#include "core/string/fuzzy_search.h" +#include "tests/test_macros.h" + +namespace TestFuzzySearch { + +struct FuzzySearchTestCase { + String query; + String expected; +}; + +// Ideally each of these test queries should represent a different aspect, and potentially bottleneck, of the search process. +const FuzzySearchTestCase test_cases[] = { + // Short query, many matches, few adjacent characters + { "///gd", "./menu/hud/hud.gd" }, + // Filename match with typo + { "sm.png", "./entity/blood_sword/sam.png" }, + // Multipart filename word matches + { "ham ", "./entity/game_trap/ha_missed_me.wav" }, + // Single word token matches + { "push background", "./entity/background_zone1/background/push.png" }, + // Long token matches + { "background_freighter background png", "./entity/background_freighter/background/background.png" }, + // Many matches, many short tokens + { "menu menu characters wav", "./menu/menu/characters/smoker/0.wav" }, + // Maximize total matches + { "entity gd", "./entity/entity_man.gd" } +}; + +Vector<String> load_test_data() { + Ref<FileAccess> fp = FileAccess::open(TestUtils::get_data_path("fuzzy_search/project_dir_tree.txt"), FileAccess::READ); + REQUIRE(fp.is_valid()); + return fp->get_as_utf8_string().split("\n"); +} + +TEST_CASE("[FuzzySearch] Test fuzzy search results") { + FuzzySearch search; + Vector<FuzzySearchResult> results; + Vector<String> targets = load_test_data(); + + for (FuzzySearchTestCase test_case : test_cases) { + search.set_query(test_case.query); + search.search_all(targets, results); + CHECK_GT(results.size(), 0); + CHECK_EQ(results[0].target, test_case.expected); + } +} + +} //namespace TestFuzzySearch + +#endif // TEST_FUZZY_SEARCH_H diff --git a/tests/core/string/test_string.h b/tests/core/string/test_string.h index 8559737e74..9adc97e845 100644 --- a/tests/core/string/test_string.h +++ b/tests/core/string/test_string.h @@ -389,6 +389,19 @@ TEST_CASE("[String] Find") { MULTICHECK_STRING_INT_EQ(s, rfind, "", 15, -1); } +TEST_CASE("[String] Find character") { + String s = "racecar"; + CHECK_EQ(s.find_char('r'), 0); + CHECK_EQ(s.find_char('r', 1), 6); + CHECK_EQ(s.find_char('e'), 3); + CHECK_EQ(s.find_char('e', 4), -1); + + CHECK_EQ(s.rfind_char('r'), 6); + CHECK_EQ(s.rfind_char('r', 5), 0); + CHECK_EQ(s.rfind_char('e'), 3); + CHECK_EQ(s.rfind_char('e', 2), -1); +} + TEST_CASE("[String] Find case insensitive") { String s = "Pretty Whale Whale"; MULTICHECK_STRING_EQ(s, findn, "WHA", 7); @@ -455,16 +468,32 @@ TEST_CASE("[String] Erasing") { } TEST_CASE("[String] Number to string") { - CHECK(String::num(0) == "0"); - CHECK(String::num(0.0) == "0"); // No trailing zeros. - CHECK(String::num(-0.0) == "-0"); // Includes sign even for zero. + CHECK(String::num(0) == "0.0"); // The method takes double, so always add zeros. + CHECK(String::num(0.0) == "0.0"); + CHECK(String::num(-0.0) == "-0.0"); // Includes sign even for zero. CHECK(String::num(3.141593) == "3.141593"); CHECK(String::num(3.141593, 3) == "3.142"); + CHECK(String::num(42.100023, 4) == "42.1"); // No trailing zeros. CHECK(String::num_scientific(30000000) == "3e+07"); + + // String::num_int64 tests. CHECK(String::num_int64(3141593) == "3141593"); + CHECK(String::num_int64(-3141593) == "-3141593"); CHECK(String::num_int64(0xA141593, 16) == "a141593"); CHECK(String::num_int64(0xA141593, 16, true) == "A141593"); - CHECK(String::num(42.100023, 4) == "42.1"); // No trailing zeros. + ERR_PRINT_OFF; + CHECK(String::num_int64(3141593, 1) == ""); // Invalid base < 2. + CHECK(String::num_int64(3141593, 37) == ""); // Invalid base > 36. + ERR_PRINT_ON; + + // String::num_uint64 tests. + CHECK(String::num_uint64(4294967295) == "4294967295"); + CHECK(String::num_uint64(0xF141593, 16) == "f141593"); + CHECK(String::num_uint64(0xF141593, 16, true) == "F141593"); + ERR_PRINT_OFF; + CHECK(String::num_uint64(4294967295, 1) == ""); // Invalid base < 2. + CHECK(String::num_uint64(4294967295, 37) == ""); // Invalid base > 36. + ERR_PRINT_ON; // String::num_real tests. CHECK(String::num_real(1.0) == "1.0"); @@ -476,15 +505,15 @@ TEST_CASE("[String] Number to string") { CHECK(String::num_real(3.141593) == "3.141593"); CHECK(String::num_real(3.141) == "3.141"); // No trailing zeros. #ifdef REAL_T_IS_DOUBLE - CHECK_MESSAGE(String::num_real(123.456789) == "123.456789", "Prints the appropriate amount of digits for real_t = double."); - CHECK_MESSAGE(String::num_real(-123.456789) == "-123.456789", "Prints the appropriate amount of digits for real_t = double."); - CHECK_MESSAGE(String::num_real(Math_PI) == "3.14159265358979", "Prints the appropriate amount of digits for real_t = double."); - CHECK_MESSAGE(String::num_real(3.1415f) == "3.1414999961853", "Prints more digits of 32-bit float when real_t = double (ones that would be reliable for double) and no trailing zero."); + CHECK_MESSAGE(String::num_real(real_t(123.456789)) == "123.456789", "Prints the appropriate amount of digits for real_t = double."); + CHECK_MESSAGE(String::num_real(real_t(-123.456789)) == "-123.456789", "Prints the appropriate amount of digits for real_t = double."); + CHECK_MESSAGE(String::num_real(real_t(Math_PI)) == "3.14159265358979", "Prints the appropriate amount of digits for real_t = double."); + CHECK_MESSAGE(String::num_real(real_t(3.1415f)) == "3.1414999961853", "Prints more digits of 32-bit float when real_t = double (ones that would be reliable for double) and no trailing zero."); #else - CHECK_MESSAGE(String::num_real(123.456789) == "123.4568", "Prints the appropriate amount of digits for real_t = float."); - CHECK_MESSAGE(String::num_real(-123.456789) == "-123.4568", "Prints the appropriate amount of digits for real_t = float."); - CHECK_MESSAGE(String::num_real(Math_PI) == "3.141593", "Prints the appropriate amount of digits for real_t = float."); - CHECK_MESSAGE(String::num_real(3.1415f) == "3.1415", "Prints only reliable digits of 32-bit float when real_t = float."); + CHECK_MESSAGE(String::num_real(real_t(123.456789)) == "123.4568", "Prints the appropriate amount of digits for real_t = float."); + CHECK_MESSAGE(String::num_real(real_t(-123.456789)) == "-123.4568", "Prints the appropriate amount of digits for real_t = float."); + CHECK_MESSAGE(String::num_real(real_t(Math_PI)) == "3.141593", "Prints the appropriate amount of digits for real_t = float."); + CHECK_MESSAGE(String::num_real(real_t(3.1415f)) == "3.1415", "Prints only reliable digits of 32-bit float when real_t = float."); #endif // REAL_T_IS_DOUBLE // Checks doubles with many decimal places. @@ -493,7 +522,7 @@ TEST_CASE("[String] Number to string") { CHECK(String::num(-0.0000012345432123454321) == "-0.00000123454321"); CHECK(String::num(-10000.0000012345432123454321) == "-10000.0000012345"); CHECK(String::num(0.0000000000012345432123454321) == "0.00000000000123"); - CHECK(String::num(0.0000000000012345432123454321, 3) == "0"); + CHECK(String::num(0.0000000000012345432123454321, 3) == "0.0"); // Note: When relevant (remainder > 0.5), the last digit gets rounded up, // which can also lead to not include a trailing zero, e.g. "...89" -> "...9". @@ -1238,6 +1267,12 @@ TEST_CASE("[String] is_subsequence_of") { CHECK(String("Sub").is_subsequence_ofn(a)); } +TEST_CASE("[String] is_lowercase") { + CHECK(String("abcd1234 !@#$%^&*()_-=+,.<>/\\|[]{};':\"`~").is_lowercase()); + CHECK(String("").is_lowercase()); + CHECK(!String("abc_ABC").is_lowercase()); +} + TEST_CASE("[String] match") { CHECK(String("img1.png").match("*.png")); CHECK(!String("img1.jpeg").match("*.png")); diff --git a/tests/core/string/test_translation.h b/tests/core/string/test_translation.h index 7c389191e3..2b1069d40c 100644 --- a/tests/core/string/test_translation.h +++ b/tests/core/string/test_translation.h @@ -161,7 +161,7 @@ TEST_CASE("[TranslationCSV] CSV import") { List<String> gen_files; - Error result = import_csv_translation->import(TestUtils::get_data_path("translations.csv"), + Error result = import_csv_translation->import(0, TestUtils::get_data_path("translations.csv"), "", options, nullptr, &gen_files); CHECK(result == OK); CHECK(gen_files.size() == 4); diff --git a/tests/core/string/test_translation_server.h b/tests/core/string/test_translation_server.h index ac1599f2e8..6668a7b57b 100644 --- a/tests/core/string/test_translation_server.h +++ b/tests/core/string/test_translation_server.h @@ -37,27 +37,37 @@ namespace TestTranslationServer { TEST_CASE("[TranslationServer] Translation operations") { - Ref<Translation> t = memnew(Translation); - t->set_locale("uk"); - t->add_message("Good Morning", String::utf8("Добрий ранок")); + Ref<Translation> t1 = memnew(Translation); + t1->set_locale("uk"); + t1->add_message("Good Morning", String(U"Добрий ранок")); + + Ref<Translation> t2 = memnew(Translation); + t2->set_locale("uk"); + t2->add_message("Hello Godot", String(U"你好戈多")); TranslationServer *ts = TranslationServer::get_singleton(); + // Adds translation for UK locale for the first time. int l_count_before = ts->get_loaded_locales().size(); - ts->add_translation(t); + ts->add_translation(t1); int l_count_after = ts->get_loaded_locales().size(); - // Newly created Translation object should be added to the list, so the counter should increase, too. CHECK(l_count_after > l_count_before); - Ref<Translation> trans = ts->get_translation_object("uk"); - CHECK(trans.is_valid()); + // Adds translation for UK locale again. + ts->add_translation(t2); + CHECK_EQ(ts->get_loaded_locales().size(), l_count_after); + + // Removing that translation. + ts->remove_translation(t2); + CHECK_EQ(ts->get_loaded_locales().size(), l_count_after); + + CHECK(ts->get_translation_object("uk").is_valid()); ts->set_locale("uk"); CHECK(ts->translate("Good Morning") == String::utf8("Добрий ранок")); - ts->remove_translation(t); - trans = ts->get_translation_object("uk"); - CHECK(trans.is_null()); + ts->remove_translation(t1); + CHECK(ts->get_translation_object("uk").is_null()); // If no suitable Translation object has been found - the original message should be returned. CHECK(ts->translate("Good Morning") == "Good Morning"); } @@ -110,18 +120,50 @@ TEST_CASE("[TranslationServer] Comparing locales") { locale_a = "sr-Latn-CS"; locale_b = "sr-Latn-RS"; - // Two elements from locales match. + // Script matches (+1) but country doesn't (-1). res = ts->compare_locales(locale_a, locale_b); - CHECK(res == 2); + CHECK(res == 5); locale_a = "uz-Cyrl-UZ"; locale_b = "uz-Latn-UZ"; - // Two elements match, but they are not sequentual. + // Country matches (+1) but script doesn't (-1). + res = ts->compare_locales(locale_a, locale_b); + + CHECK(res == 5); + + locale_a = "aa-Latn-ER"; + locale_b = "aa-Latn-ER-saaho"; + + // Script and country match (+2) with variant on one locale (+0). res = ts->compare_locales(locale_a, locale_b); - CHECK(res == 2); + CHECK(res == 7); + + locale_a = "uz-Cyrl-UZ"; + locale_b = "uz-Latn-KG"; + + // Both script and country mismatched (-2). + res = ts->compare_locales(locale_a, locale_b); + + CHECK(res == 3); + + locale_a = "es-ES"; + locale_b = "es-AR"; + + // Mismatched country (-1). + res = ts->compare_locales(locale_a, locale_b); + + CHECK(res == 4); + + locale_a = "es"; + locale_b = "es-AR"; + + // No country for one locale (+0). + res = ts->compare_locales(locale_a, locale_b); + + CHECK(res == 5); locale_a = "es-EC"; locale_b = "fr-LU"; @@ -130,6 +172,24 @@ TEST_CASE("[TranslationServer] Comparing locales") { res = ts->compare_locales(locale_a, locale_b); CHECK(res == 0); + + locale_a = "zh-HK"; + locale_b = "zh"; + + // In full standardization, zh-HK becomes zh_Hant_HK and zh becomes + // zh_Hans_CN. Both script and country mismatch (-2). + res = ts->compare_locales(locale_a, locale_b); + + CHECK(res == 3); + + locale_a = "zh-CN"; + locale_b = "zh"; + + // In full standardization, zh and zh-CN both become zh_Hans_CN for an + // exact match. + res = ts->compare_locales(locale_a, locale_b); + + CHECK(res == 10); } } // namespace TestTranslationServer diff --git a/tests/core/templates/test_a_hash_map.h b/tests/core/templates/test_a_hash_map.h new file mode 100644 index 0000000000..e67ee7b441 --- /dev/null +++ b/tests/core/templates/test_a_hash_map.h @@ -0,0 +1,295 @@ +/**************************************************************************/ +/* test_a_hash_map.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#ifndef TEST_A_HASH_MAP_H +#define TEST_A_HASH_MAP_H + +#include "core/templates/a_hash_map.h" + +#include "tests/test_macros.h" + +namespace TestAHashMap { + +TEST_CASE("[AHashMap] Insert element") { + AHashMap<int, int> map; + AHashMap<int, int>::Iterator e = map.insert(42, 84); + + CHECK(e); + CHECK(e->key == 42); + CHECK(e->value == 84); + CHECK(map[42] == 84); + CHECK(map.has(42)); + CHECK(map.find(42)); +} + +TEST_CASE("[AHashMap] Overwrite element") { + AHashMap<int, int> map; + map.insert(42, 84); + map.insert(42, 1234); + + CHECK(map[42] == 1234); +} + +TEST_CASE("[AHashMap] Erase via element") { + AHashMap<int, int> map; + AHashMap<int, int>::Iterator e = map.insert(42, 84); + map.remove(e); + CHECK(!map.has(42)); + CHECK(!map.find(42)); +} + +TEST_CASE("[AHashMap] Erase via key") { + AHashMap<int, int> map; + map.insert(42, 84); + map.erase(42); + CHECK(!map.has(42)); + CHECK(!map.find(42)); +} + +TEST_CASE("[AHashMap] Size") { + AHashMap<int, int> map; + map.insert(42, 84); + map.insert(123, 84); + map.insert(123, 84); + map.insert(0, 84); + map.insert(123485, 84); + + CHECK(map.size() == 4); +} + +TEST_CASE("[AHashMap] Iteration") { + AHashMap<int, int> map; + + map.insert(42, 84); + map.insert(123, 12385); + map.insert(0, 12934); + map.insert(123485, 1238888); + map.insert(123, 111111); + + Vector<Pair<int, int>> expected; + expected.push_back(Pair<int, int>(42, 84)); + expected.push_back(Pair<int, int>(123, 111111)); + expected.push_back(Pair<int, int>(0, 12934)); + expected.push_back(Pair<int, int>(123485, 1238888)); + + int idx = 0; + for (const KeyValue<int, int> &E : map) { + CHECK(expected[idx] == Pair<int, int>(E.key, E.value)); + idx++; + } + + idx--; + for (AHashMap<int, int>::Iterator it = map.last(); it; --it) { + CHECK(expected[idx] == Pair<int, int>(it->key, it->value)); + idx--; + } +} + +TEST_CASE("[AHashMap] Const iteration") { + AHashMap<int, int> map; + map.insert(42, 84); + map.insert(123, 12385); + map.insert(0, 12934); + map.insert(123485, 1238888); + map.insert(123, 111111); + + const AHashMap<int, int> const_map = map; + + Vector<Pair<int, int>> expected; + expected.push_back(Pair<int, int>(42, 84)); + expected.push_back(Pair<int, int>(123, 111111)); + expected.push_back(Pair<int, int>(0, 12934)); + expected.push_back(Pair<int, int>(123485, 1238888)); + expected.push_back(Pair<int, int>(123, 111111)); + + int idx = 0; + for (const KeyValue<int, int> &E : const_map) { + CHECK(expected[idx] == Pair<int, int>(E.key, E.value)); + idx++; + } + + idx--; + for (AHashMap<int, int>::ConstIterator it = const_map.last(); it; --it) { + CHECK(expected[idx] == Pair<int, int>(it->key, it->value)); + idx--; + } +} + +TEST_CASE("[AHashMap] Replace key") { + AHashMap<int, int> map; + map.insert(42, 84); + map.insert(0, 12934); + CHECK(map.replace_key(0, 1)); + CHECK(map.has(1)); + CHECK(map[1] == 12934); +} + +TEST_CASE("[AHashMap] Clear") { + AHashMap<int, int> map; + map.insert(42, 84); + map.insert(123, 12385); + map.insert(0, 12934); + + map.clear(); + CHECK(!map.has(42)); + CHECK(map.size() == 0); + CHECK(map.is_empty()); +} + +TEST_CASE("[AHashMap] Get") { + AHashMap<int, int> map; + map.insert(42, 84); + map.insert(123, 12385); + map.insert(0, 12934); + + CHECK(map.get(123) == 12385); + map.get(123) = 10; + CHECK(map.get(123) == 10); + + CHECK(*map.getptr(0) == 12934); + *map.getptr(0) = 1; + CHECK(*map.getptr(0) == 1); + + CHECK(map.get(42) == 84); + CHECK(map.getptr(-10) == nullptr); +} + +TEST_CASE("[AHashMap] Insert, iterate and remove many elements") { + const int elem_max = 1234; + AHashMap<int, int> map; + for (int i = 0; i < elem_max; i++) { + map.insert(i, i); + } + + //insert order should have been kept + int idx = 0; + for (auto &K : map) { + CHECK(idx == K.key); + CHECK(idx == K.value); + CHECK(map.has(idx)); + idx++; + } + + Vector<int> elems_still_valid; + + for (int i = 0; i < elem_max; i++) { + if ((i % 5) == 0) { + map.erase(i); + } else { + elems_still_valid.push_back(i); + } + } + + CHECK(elems_still_valid.size() == map.size()); + + for (int i = 0; i < elems_still_valid.size(); i++) { + CHECK(map.has(elems_still_valid[i])); + } +} + +TEST_CASE("[AHashMap] Insert, iterate and remove many strings") { + const int elem_max = 432; + AHashMap<String, String> map; + for (int i = 0; i < elem_max; i++) { + map.insert(itos(i), itos(i)); + } + + //insert order should have been kept + int idx = 0; + for (auto &K : map) { + CHECK(itos(idx) == K.key); + CHECK(itos(idx) == K.value); + CHECK(map.has(itos(idx))); + idx++; + } + + Vector<String> elems_still_valid; + + for (int i = 0; i < elem_max; i++) { + if ((i % 5) == 0) { + map.erase(itos(i)); + } else { + elems_still_valid.push_back(itos(i)); + } + } + + CHECK(elems_still_valid.size() == map.size()); + + for (int i = 0; i < elems_still_valid.size(); i++) { + CHECK(map.has(elems_still_valid[i])); + } + + elems_still_valid.clear(); +} + +TEST_CASE("[AHashMap] Copy constructor") { + AHashMap<int, int> map0; + const uint32_t count = 5; + for (uint32_t i = 0; i < count; i++) { + map0.insert(i, i); + } + AHashMap<int, int> map1(map0); + CHECK(map0.size() == map1.size()); + CHECK(map0.get_capacity() == map1.get_capacity()); + CHECK(*map0.getptr(0) == *map1.getptr(0)); +} + +TEST_CASE("[AHashMap] Operator =") { + AHashMap<int, int> map0; + AHashMap<int, int> map1; + const uint32_t count = 5; + map1.insert(1234, 1234); + for (uint32_t i = 0; i < count; i++) { + map0.insert(i, i); + } + map1 = map0; + CHECK(map0.size() == map1.size()); + CHECK(map0.get_capacity() == map1.get_capacity()); + CHECK(*map0.getptr(0) == *map1.getptr(0)); +} + +TEST_CASE("[AHashMap] Array methods") { + AHashMap<int, int> map; + for (int i = 0; i < 100; i++) { + map.insert(100 - i, i); + } + for (int i = 0; i < 100; i++) { + CHECK(map.get_by_index(i).value == i); + } + int index = map.get_index(1); + CHECK(map.get_by_index(index).value == 99); + CHECK(map.erase_by_index(index)); + CHECK(!map.erase_by_index(index)); + CHECK(map.get_index(1) == -1); +} + +} // namespace TestAHashMap + +#endif // TEST_A_HASH_MAP_H diff --git a/tests/core/variant/test_variant_utility.h b/tests/core/variant/test_variant_utility.h index 93458b63f4..34b4880d51 100644 --- a/tests/core/variant/test_variant_utility.h +++ b/tests/core/variant/test_variant_utility.h @@ -89,7 +89,7 @@ TEST_CASE("[VariantUtility] Type conversion") { converted = VariantUtilityFunctions::type_convert(basis, Variant::Type::STRING); CHECK(converted.get_type() == Variant::Type::STRING); - CHECK(converted == Variant("[X: (1.2, 0, 0), Y: (0, 3.4, 0), Z: (0, 0, 5.6)]")); + CHECK(converted == Variant("[X: (1.2, 0.0, 0.0), Y: (0.0, 3.4, 0.0), Z: (0.0, 0.0, 5.6)]")); } { diff --git a/tests/data/fuzzy_search/project_dir_tree.txt b/tests/data/fuzzy_search/project_dir_tree.txt new file mode 100644 index 0000000000..153dd8802a --- /dev/null +++ b/tests/data/fuzzy_search/project_dir_tree.txt @@ -0,0 +1,999 @@ +./menu/home/home_menu.tscn +./menu/tooltips/tooltip_server.tscn +./menu/tooltips/tooltip_server.gd +./menu/tooltips/tooltip.gd +./menu/menu/characters/smoker/4.wav +./menu/menu/characters/smoker/6.wav +./menu/menu/characters/smoker/10.wav +./menu/menu/characters/smoker/smoker.tscn +./menu/menu/characters/smoker/8.wav +./menu/menu/characters/smoker/type.gd +./menu/menu/characters/smoker/9.wav +./menu/menu/characters/smoker/5.wav +./menu/menu/characters/smoker/0.wav +./menu/menu/characters/smoker/back_light.png +./menu/menu/characters/smoker/glasses.png +./menu/menu/characters/smoker/smoker.gd +./menu/menu/characters/smoker/cig.gd +./menu/menu/characters/smoker/eyes.png +./menu/menu/characters/smoker/3.wav +./menu/menu/characters/smoker/to_pixelate.gd +./menu/menu/characters/smoker/7.wav +./menu/menu/characters/smoker/cig.png +./menu/menu/characters/smoker/2.wav +./menu/menu/characters/smoker/1.wav +./menu/menu/characters/smoke.png +./menu/menu/characters/space_bandit.tres +./menu/menu/characters/dead_guy/blood_texture.png +./menu/menu/characters/dead_guy/head_gibbed.png +./menu/menu/characters/dead_guy/back_light.png +./menu/menu/characters/dead_guy/smoker.gd +./menu/menu/characters/dead_guy/eyes.png +./menu/menu/characters/dead_guy/to_pixelate.gd +./menu/menu/characters/dead_guy/dead_guy.gd +./menu/menu/characters/dead_guy/eyes.gd +./menu/menu/characters/dead_guy/x.png +./menu/menu/characters/dead_guy/dead_guy.tscn +./menu/menu/characters/dead_guy/mouth.png +./menu/menu/characters/dead_guy/dead_guy.tres +./menu/menu/characters/Label.gd +./menu/menu/characters/guns2.png +./menu/menu/characters/c.gd +./menu/menu/characters/smoke.gd +./menu/menu/characters/character.gd +./menu/menu/characters/space_bandit/eyes.tres +./menu/menu/characters/space_bandit/space_bandit_face_happy.png +./menu/menu/characters/space_bandit/space_bandit.gd +./menu/menu/characters/space_bandit/space_bandit.tscn +./menu/menu/characters/boss/smoker.tscn +./menu/menu/characters/boss/back_light.png +./menu/menu/characters/boss/glasses.png +./menu/menu/characters/boss/smoker.gd +./menu/menu/characters/boss/cig.gd +./menu/menu/characters/boss/eyes.png +./menu/menu/characters/boss/to_pixelate.gd +./menu/menu/characters/boss/x.png +./menu/menu/characters/boss/cig.png +./menu/menu/characters/eye.gd +./menu/menu/characters/space_bandit_face_happy.png +./menu/menu/characters/face.gd +./menu/menu/characters/color.tres +./menu/menu/characters/space_bandit.tscn +./menu/menu/characters/space_bandit_face_bloody.png +./menu/menu/characters/guns.png +./menu/menu/characters/eyes2.tres +./menu/options/controls/use.tres +./menu/options/controls/input_map_button.gd +./menu/options/controls/swap.tres +./menu/options/controls/teleport.tres +./menu/options/controls/joy_controls.tscn +./menu/options/controls/mouse_and_keyboard_controls.tscn +./menu/options/controls/input_map_button.tscn +./menu/options/controls/special.tres +./menu/options/controls/throw.tres +./menu/options/controls/center.tres +./menu/options/controls/input_action.gd +./menu/options/controls/move.tres +./menu/options/controls/melee.tres +./menu/options/controls/controls.gd +./menu/options/options.gd +./menu/options/options.tscn +./menu/options/graphics/graphics.tscn +./menu/options/graphics/graphics.gd +./menu/options/audio/audio.gd +./menu/options/audio/audio.tscn +./menu/options/game/game.gd +./menu/options/game/game.tscn +./menu/circle.tres +./menu/fonts/keys.png +./menu/fonts/rainbow_font.tres +./menu/fonts/fallback_font.tres +./menu/fonts/taxi_Driver.png +./menu/fonts/NotoSansJP-Regular.ttf +./menu/fonts/taxi_Driver_noise.png +./menu/fonts/rainbow_font_shader.tres +./menu/fonts/m5x7.ttf +./menu/colors.gd +./menu/toast_enter.wav +./menu/ui_colors.tres +./menu/pause/pause.gd +./menu/pause/rainbow.tres +./menu/pause/Label.gd +./menu/pause/label.tscn +./menu/pause/pause.tscn +./menu/hoola.wav +./menu/in_game_fallback.tres +./menu/widgets/next_unlock.gd +./menu/widgets/slider.gd +./menu/widgets/fade.tscn +./menu/widgets/background_hint.gd +./menu/widgets/panel_container_smoke.gd +./menu/widgets/wishlist_sticker.gd +./menu/widgets/smoke.tres +./menu/widgets/color_grade.gd +./menu/widgets/rich_text_button.gd +./menu/widgets/panel_container_smok2.tscn +./menu/widgets/slider.tscn +./menu/widgets/rich_text_heading.gd +./menu/widgets/background_hint.tscn +./menu/widgets/tip.tscn +./menu/widgets/rich_text_button.tscn +./menu/widgets/toggle.tscn +./menu/widgets/heading.tscn +./menu/widgets/hover.tscn +./menu/widgets/toggle.gd +./menu/widgets/smoke_panel_material.tres +./menu/widgets/confirm.gd +./menu/widgets/tip.gd +./menu/widgets/panel.gd +./menu/widgets/modal.gd +./menu/widgets/NinePatchRect.gd +./menu/widgets/smoke.shader +./menu/widgets/9patch.png +./menu/widgets/big_hint.gd +./menu/widgets/TDVB1i.png +./menu/widgets/color_grade.tscn +./menu/widgets/text.gd +./menu/widgets/panel_container_smoke.tscn +./menu/widgets/1x1.png +./menu/widgets/confirm.tscn +./menu/widgets/RichTextPanel.tscn +./menu/hud/cursor.png +./menu/hud/inventory/draggable.gd +./menu/hud/inventory/menu/characters/color.tres +./menu/hud/inventory/drop_zone.tscn +./menu/hud/inventory/RichTextLabel.gd +./menu/hud/inventory/hud_icon_mutation.tscn +./menu/hud/inventory/use_count.gd +./menu/hud/inventory/draggable.tscn +./menu/hud/inventory/black_shadow_font.tres +./menu/hud/inventory/x.png +./menu/hud/inventory/hud_icon_mutation.gd +./menu/hud/inventory/flash_parent.gd +./menu/hud/inventory/TextureRect4.gd +./menu/hud/cursor.tscn +./menu/hud/hud.tscn +./menu/hud/cursor.gd +./menu/hud/hud.gd +./menu/metal_text.tres +./menu/rich_text_effects/RichTextType.gd +./menu/rich_text_effects/RichTextPanel.gd +./menu/rich_text_effects/RichTextFlash.gd +./menu/rich_text_effects/RichTextTranslate.gd +./menu/in_game.tres +./menu/lcd_screen_font.tres +./menu/toast_exit.wav +./menu/stack/ahses_material.tres +./menu/stack/home.kra +./menu/stack/fade.gd +./menu/stack/stack.tscn +./menu/stack/stack.gd +./menu/stack/version.gd +./menu/stack/art.kra +./entity/unlock_skin_classic/icon.png +./entity/use.gd +./entity/chair/entity.tscn +./entity/chair/icon.png +./entity/chair/data.gd +./entity/man_desert/entity.tscn +./entity/man_desert/icon.png +./entity/man_desert/teleprompts/need_medbay.wav +./entity/man_desert/teleprompts/me_too.wav +./entity/man_desert/teleprompts/get_up_alt.wav +./entity/man_desert/teleprompts/getting_a_medpack.wav +./entity/man_desert/teleprompts/firstaid-incoming.wav +./entity/man_desert/teleprompts/batch_name.py +./entity/man_desert/teleprompts/what.wav +./entity/man_desert/teleprompts/oo.wav +./entity/man_desert/teleprompts/yell.wav +./entity/man_desert/teleprompts/rushing.wav +./entity/man_desert/teleprompts/ooo.wav +./entity/man_desert/teleprompts/coming_to_heal_ya.wav +./entity/man_desert/teleprompts/where_is_the_medpack.wav +./entity/man_desert/teleprompts/ah.wav +./entity/man_desert/teleprompts/no.wav +./entity/man_desert/teleprompts/going_to_camp_medbay.wav +./entity/man_desert/teleprompts/aa.wav +./entity/man_desert/teleprompts/pirate_alt.wav +./entity/man_desert/teleprompts/take_morphine.wav +./entity/man_desert/teleprompts/ee.wav +./entity/man_desert/teleprompts/get_up.wav +./entity/man_desert/teleprompts/aw.wav +./entity/man_desert/teleprompts/easy.wav +./entity/man_desert/teleprompts/intruder.wav +./entity/man_desert/teleprompts/amateur.wav +./entity/man_desert/teleprompts/hes_not_moving.wav +./entity/man_desert/teleprompts/pirate.wav +./entity/man_desert/teleprompts/i_dont_know.wav +./entity/man_desert/teleprompts/index.txt +./entity/man_desert/teleprompts/move.wav +./entity/man_desert/teleprompts/hes_stuck.wav +./entity/man_desert/teleprompts/how.wav +./entity/man_desert/teleprompts/uu.wav +./entity/man_desert/teleprompts/where_is_the_gun.wav +./entity/man_desert/teleprompts/getting_a_gun.wav +./entity/man_desert/data.gd +./entity/man_desert/hand.png +./entity/barrel_side_smoke/entity.tscn +./entity/barrel_side_smoke/icon.png +./entity/barrel_side_smoke/data.gd +./entity/barrel_smoke/entity.tscn +./entity/barrel_smoke/icon.png +./entity/barrel_smoke/data.gd +./entity/project_box/entity.tscn +./entity/project_box/icon.png +./entity/project_box/data.gd +./entity/mutation_saw/entity.tscn +./entity/mutation_saw/icon.png +./entity/mutation_saw/special.gd +./entity/mutation_saw/data.gd +./entity/lift_entrance/entity.tscn +./entity/lift_entrance/icon.png +./entity/lift_entrance/special.gd +./entity/lift_entrance/data.gd +./entity/mutation_accuracy_boost_DELETE/entity.tscn +./entity/mutation_accuracy_boost_DELETE/icon.png +./entity/mutation_accuracy_boost_DELETE/special.gd +./entity/mutation_accuracy_boost_DELETE/data.gd +./entity/skin_ruffle/entity.tscn +./entity/skin_ruffle/icon.png +./entity/skin_ruffle/carried.png +./entity/skin_ruffle/data.gd +./entity/editor_only_icon.gd +./entity/console_dark/entity.tscn +./entity/console_dark/icon.png +./entity/console_dark/data.gd +./entity/console_dark/animation.png +./entity/smg2/entity.tscn +./entity/smg2/used.wav +./entity/smg2/icon.png +./entity/smg2/data.gd +./entity/smg2/debug.gd +./entity/grenade_launcher/entity.tscn +./entity/grenade_launcher/used.wav +./entity/grenade_launcher/icon.png +./entity/grenade_launcher/special.gd +./entity/grenade_launcher/data.gd +./entity/floor_tile_full_square/entity.tscn +./entity/floor_tile_full_square/icon.png +./entity/floor_tile_full_square/data.gd +./entity/grate_1/entity.tscn +./entity/grate_1/icon.png +./entity/grate_1/data.gd +./entity/bed_bunk_corner/entity.tscn +./entity/bed_bunk_corner/icon.png +./entity/bed_bunk_corner/data.gd +./entity/kill_streak_rail_gun_level_3/entity.tscn +./entity/kill_streak_rail_gun_level_3/data.gd +./entity/teleporter_random_weak/entity.tscn +./entity/teleporter_random_weak/teleporter_model.gd +./entity/teleporter_random_weak/used.wav +./entity/teleporter_random_weak/icon.png +./entity/teleporter_random_weak/special.gd +./entity/teleporter_random_weak/ray.gd +./entity/teleporter_random_weak/data.gd +./entity/teleporter_random_weak/flap.png +./entity/entities.kra +./entity/jerry_can/entity.tscn +./entity/jerry_can/icon.png +./entity/jerry_can/data.gd +./entity/kill_streak_helmet_full/entity.tscn +./entity/kill_streak_helmet_full/data.gd +./entity/background_derelict/background2.gd +./entity/background_derelict/entity.tscn +./entity/background_derelict/icon.png +./entity/background_derelict/background/space.png +./entity/background_derelict/background/line.png +./entity/background_derelict/background/overlay.png +./entity/background_derelict/background/background2.png +./entity/background_derelict/background/background.png +./entity/background_derelict/background/engine_glow.tscn +./entity/background_derelict/background/lines3.png +./entity/background_derelict/background/background.tscn +./entity/background_derelict/background/lines.tres +./entity/background_derelict/background/xx.gd +./entity/background_derelict/background/background.gd +./entity/background_derelict/background/bayer16tile2.png +./entity/background_derelict/background/push.png +./entity/background_derelict/background/palette_mono.png +./entity/background_derelict/background/stars.gd +./entity/background_derelict/background/lines2.png +./entity/background_derelict/background/lines.shader +./entity/background_derelict/background/ambience.gd +./entity/background_derelict/background/space_ship_ambience.ogg +./entity/background_derelict/background/stars.png +./entity/background_derelict/data.gd +./entity/smoker/entity.tscn +./entity/smoker/right_hand.png +./entity/smoker/eyes.png +./entity/smoker/data.gd +./entity/smoker/animate.gd +./entity/smoker/left_hand.png +./entity/EntityStatic.gd +./entity/level_model.gd +./entity/class_teleporter_drop_chance/entity.tscn +./entity/class_teleporter_drop_chance/icon.png +./entity/class_teleporter_drop_chance/special.gd +./entity/class_teleporter_drop_chance/data.gd +./entity/smg4/entity.tscn +./entity/smg4/used.wav +./entity/smg4/icon.png +./entity/smg4/data.gd +./entity/medpack/entity.tscn +./entity/medpack/icon.png +./entity/medpack/dead.png +./entity/medpack/data.gd +./entity/model.gd +./entity/doom_transition/entity.tscn +./entity/doom_transition/icon.png +./entity/doom_transition/special.gd +./entity/doom_transition/Screenshot from 2021-12-08 18-25-03.png +./entity/doom_transition/data.gd +./entity/glass_block_exploding/entity.tscn +./entity/glass_block_exploding/icon.png +./entity/glass_block_exploding/special.gd +./entity/glass_block_exploding/dead.png +./entity/glass_block_exploding/data.gd +./entity/floor_ting/entity.tscn +./entity/floor_ting/icon.png +./entity/floor_ting/data.gd +./entity/background_crashed_ship/entity.tscn +./entity/background_crashed_ship/icon.png +./entity/background_crashed_ship/background/background2.kra +./entity/background_crashed_ship/background/dust_storm_negative.png +./entity/background_crashed_ship/background/background2.png +./entity/background_crashed_ship/background/background2 (copy 1).png +./entity/background_crashed_ship/background/dust_bowl.ogg +./entity/background_crashed_ship/background/background.tscn +./entity/background_crashed_ship/background/background.kra +./entity/background_crashed_ship/data.gd +./entity/game_aim_hack_boss/entity.tscn +./entity/game_aim_hack_boss/icon.png +./entity/game_aim_hack_boss/special.gd +./entity/game_aim_hack_boss/give_my_arm_back.wav +./entity/game_aim_hack_boss/my_arm_came_off.wav +./entity/game_aim_hack_boss/data.gd +./entity/sink/entity.tscn +./entity/sink/icon.png +./entity/sink/data.gd +./entity/grate_2/entity.tscn +./entity/grate_2/icon.png +./entity/grate_2/data.gd +./entity/barrel_side/entity.tscn +./entity/barrel_side/icon.png +./entity/barrel_side/data.gd +./entity/oxygen/entity.tscn +./entity/oxygen/icon.png +./entity/oxygen/shadow.png +./entity/oxygen/data.gd +./entity/oxygen/normal.png +./entity/unlock_skin_robo/entity.tscn +./entity/unlock_skin_robo/icon.png +./entity/unlock_skin_robo/special.gd +./entity/unlock_skin_robo/data.gd +./entity/entity_agency_model.gd +./entity/floor_tile_wood/entity.tscn +./entity/floor_tile_wood/icon.png +./entity/floor_tile_wood/data.gd +./entity/qr_code/entity.tscn +./entity/qr_code/icon.png +./entity/qr_code/data.gd +./entity/background_sun/overlay.png +./entity/background_sun/entity.tscn +./entity/background_sun/c.gd +./entity/background_sun/kill.tscn +./entity/background_sun/icon.png +./entity/background_sun/special.gd +./entity/background_sun/wtf.tres +./entity/background_sun/background/background2.png +./entity/background_sun/background/background.tscn +./entity/background_sun/background/color2s.tres +./entity/background_sun/background/background_glow.png +./entity/background_sun/data.gd +./entity/background_sun/kill.gd +./entity/background_sun/stars.png +./entity/background_zone_intro/overlay.png +./entity/background_zone_intro/entity.tscn +./entity/background_zone_intro/icon.png +./entity/background_zone_intro/special.gd +./entity/background_zone_intro/background/space.png +./entity/background_zone_intro/background/line.png +./entity/background_zone_intro/background/background2.png +./entity/background_zone_intro/background/background.png +./entity/background_zone_intro/background/engine_glow.tscn +./entity/background_zone_intro/background/lines3.png +./entity/background_zone_intro/background/background.tscn +./entity/background_zone_intro/background/lines.tres +./entity/background_zone_intro/background/background.gd +./entity/background_zone_intro/background/bayer16tile2.png +./entity/background_zone_intro/background/push.png +./entity/background_zone_intro/background/palette_mono.png +./entity/background_zone_intro/background/stars.gd +./entity/background_zone_intro/background/lines2.png +./entity/background_zone_intro/background/lines.shader +./entity/background_zone_intro/background/ambience.gd +./entity/background_zone_intro/background/space_ship_ambience.ogg +./entity/background_zone_intro/background/stars.png +./entity/background_zone_intro/background_end.png +./entity/background_zone_intro/data.gd +./entity/background_zone_intro/tinge.png +./entity/closet_alt/entity.tscn +./entity/closet_alt/icon.png +./entity/closet_alt/data.gd +./entity/meta_random_sound/entity.tscn +./entity/meta_random_sound/giberish.wav +./entity/meta_random_sound/icon.png +./entity/meta_random_sound/special.gd +./entity/meta_random_sound/who.wav +./entity/meta_random_sound/data.gd +./entity/meta_random_sound/hoola_boola.wav +./entity/meta_random_sound/space_bandit.wav +./entity/lines/entity.tscn +./entity/lines/icon.png +./entity/lines/data.gd +./entity/teleporter_random_avoid_ray/entity.tscn +./entity/teleporter_random_avoid_ray/used.wav +./entity/teleporter_random_avoid_ray/icon.png +./entity/teleporter_random_avoid_ray/ray.gd +./entity/teleporter_random_avoid_ray/data.gd +./entity/teleporter_random_avoid_ray/flap.png +./entity/teleporter_random_avoid_ray/RayCast2D.gd +./entity/teleporter_random_avoid_ray/area.gd +./entity/teleporter_random_avoid_ray/flap.gd +./entity/saw/blades.gd +./entity/saw/entity.tscn +./entity/saw/used.wav +./entity/saw/icon.png +./entity/saw/special.gd +./entity/saw/carried.png +./entity/saw/data.gd +./entity/saw/used (copy 1).wav +./entity/saw/saw.wav +./entity/saw/carried_blades.png +./entity/floor_tile_checkerdboard/damage.png +./entity/floor_tile_checkerdboard/entity.tscn +./entity/floor_tile_checkerdboard/icon.png +./entity/floor_tile_checkerdboard/entity.tres +./entity/floor_tile_checkerdboard/data.gd +./entity/mutation_smoke_grenade_upgrade/entity.tscn +./entity/mutation_smoke_grenade_upgrade/icon.png +./entity/mutation_smoke_grenade_upgrade/special.gd +./entity/mutation_smoke_grenade_upgrade/data.gd +./entity/mutation_smoke_grenade_upgrade/mutation_model.gd +./entity/helmet_full/entity.tscn +./entity/helmet_full/pick_up.wav +./entity/helmet_full/icon.png +./entity/helmet_full/data.gd +./entity/helmet_full/helmet-ping.wav +./entity/barrel_explosive/entity.tscn +./entity/barrel_explosive/icon.png +./entity/barrel_explosive/data.gd +./entity/bank/entity.tscn +./entity/bank/icon.png +./entity/bank/special.gd +./entity/bank/data.gd +./entity/kick/entity.tscn +./entity/kick/swipe.png +./entity/kick/used.wav +./entity/kick/icon.png +./entity/kick/AnimatedSprite.gd +./entity/kick/data.gd +./entity/battery/entity.tscn +./entity/battery/icon.png +./entity/battery/data.gd +./entity/lift/entity.tscn +./entity/lift/opening.wav +./entity/lift/doors_open.png +./entity/lift/RichTextLabel.gd +./entity/lift/icon.png +./entity/lift/open.wav +./entity/lift/elevator_end.wav +./entity/lift/lift_model.gd +./entity/lift/label.tscn +./entity/lift/rumble.gd +./entity/lift/level_portal_model.gd +./entity/lift/data.gd +./entity/lift/doors.png +./entity/lift/area.gd +./entity/snes/entity.tscn +./entity/snes/icon.png +./entity/snes/data.gd +./entity/passive_disarm/entity.tscn +./entity/passive_disarm/icon.png +./entity/passive_disarm/special.gd +./entity/passive_disarm/data.gd +./entity/mutation_lots_of_shot/entity.tscn +./entity/mutation_lots_of_shot/icon.png +./entity/mutation_lots_of_shot/special.gd +./entity/mutation_lots_of_shot/data.gd +./entity/pallet2/entity.tscn +./entity/pallet2/icon.png +./entity/pallet2/data.gd +./entity/kill_streak_sword/entity.tscn +./entity/kill_streak_sword/data.gd +./entity/rain/entity.tscn +./entity/rain/icon.png +./entity/rain/special.gd +./entity/rain/rain.png +./entity/rain/rain.tscn +./entity/rain/data.gd +./entity/rain/rain.gd +./entity/white_line/entity.tscn +./entity/white_line/icon.png +./entity/white_line/data.gd +./entity/game_break_sword/entity.tscn +./entity/game_break_sword/icon.png +./entity/game_break_sword/special.gd +./entity/game_break_sword/data.gd +./entity/background_zone1/overlay.png +./entity/background_zone1/entity.tscn +./entity/background_zone1/icon.png +./entity/background_zone1/special.gd +./entity/background_zone1/background/space.png +./entity/background_zone1/background/line.png +./entity/background_zone1/background/background2.png +./entity/background_zone1/background/background.png +./entity/background_zone1/background/engine_glow.tscn +./entity/background_zone1/background/lines3.png +./entity/background_zone1/background/background.tscn +./entity/background_zone1/background/lines.tres +./entity/background_zone1/background/background.gd +./entity/background_zone1/background/bayer16tile2.png +./entity/background_zone1/background/push.png +./entity/background_zone1/background/palette_mono.png +./entity/background_zone1/background/stars.gd +./entity/background_zone1/background/lines2.png +./entity/background_zone1/background/lines.shader +./entity/background_zone1/background/ambience.gd +./entity/background_zone1/background/space_ship_ambience.ogg +./entity/background_zone1/background/stars.png +./entity/background_zone1/data.gd +./entity/background_zone1/tinge.png +./entity/mutation_throw_trap_DELETE/entity.tscn +./entity/mutation_throw_trap_DELETE/icon.png +./entity/mutation_throw_trap_DELETE/special.gd +./entity/mutation_throw_trap_DELETE/data.gd +./entity/agency.gd +./entity/skin_cheese/entity.tscn +./entity/skin_cheese/icon.png +./entity/skin_cheese/carried.png +./entity/skin_cheese/data.gd +./entity/toilet/entity.tscn +./entity/toilet/icon.png +./entity/toilet/special.gd +./entity/toilet/water.png +./entity/toilet/drink.wav +./entity/toilet/data.gd +./entity/smg3/entity.tscn +./entity/smg3/used.wav +./entity/smg3/icon.png +./entity/smg3/dead.png +./entity/smg3/data.gd +./entity/smg3/debug.gd +./entity/teleporter_super/entity.tscn +./entity/teleporter_super/icon.png +./entity/teleporter_super/data.gd +./entity/background_zone_end/overlay.png +./entity/background_zone_end/entity.tscn +./entity/background_zone_end/icon.png +./entity/background_zone_end/special.gd +./entity/background_zone_end/stars2.png +./entity/background_zone_end/background_end.png +./entity/background_zone_end/data.gd +./entity/background_zone_end/tinge.png +./entity/kill_streak_barricade/entity.tscn +./entity/kill_streak_barricade/data.gd +./entity/game_zone_4_boss_1/entity.tscn +./entity/game_zone_4_boss_1/icon.png +./entity/game_zone_4_boss_1/special.gd +./entity/game_zone_4_boss_1/data.gd +./entity/game_zone_4_boss_1/kill_me_and_explode_ship.wav +./entity/mutation_remove_melee/entity.tscn +./entity/mutation_remove_melee/icon.png +./entity/mutation_remove_melee/special.gd +./entity/mutation_remove_melee/data.gd +./entity/he_grenade_level_2/entity.tscn +./entity/he_grenade_level_2/icon.png +./entity/he_grenade_level_2/data.gd +./entity/background_zone_2/entity.tscn +./entity/background_zone_2/icon.png +./entity/background_zone_2/background/background2.kra +./entity/background_zone_2/background/grad.png +./entity/background_zone_2/background/background2.png +./entity/background_zone_2/background/background.png +./entity/background_zone_2/background/background2 (copy 1).png +./entity/background_zone_2/background/backgrounds.gd +./entity/background_zone_2/background/wall_overlay.png +./entity/background_zone_2/background/background.tscn +./entity/background_zone_2/background/Screenshot from 2022-07-07 10-58-48.png +./entity/background_zone_2/background/background.gd +./entity/background_zone_2/background/shadow.png +./entity/background_zone_2/background/engine smoke.png +./entity/background_zone_2/background/background.kra +./entity/background_zone_2/background/sea.ogg +./entity/background_zone_2/background/background2blur.png +./entity/background_zone_2/background/test.gd +./entity/background_zone_2/background/grad3.png +./entity/background_zone_2/background/lines2.png +./entity/background_zone_2/background/smoke.tscn +./entity/background_zone_2/background/left_water.tscn +./entity/background_zone_2/background/grad2.png +./entity/background_zone_2/background/para.png +./entity/background_zone_2/data.gd +./entity/pipe_corner/entity.tscn +./entity/pipe_corner/icon.png +./entity/pipe_corner/data.gd +./entity/floor_tile_metal_cow_trap/entity.tscn +./entity/floor_tile_metal_cow_trap/icon.png +./entity/floor_tile_metal_cow_trap/data.gd +./entity/skin_naked/entity.tscn +./entity/skin_naked/icon.png +./entity/skin_naked/carried.png +./entity/skin_naked/data.gd +./entity/valve/entity.tscn +./entity/valve/icon.png +./entity/valve/.icon.png-autosave.kra +./entity/valve/data.gd +./entity/bed/entity.tscn +./entity/bed/icon.png +./entity/bed/data.gd +./entity/game_invisible_guy/entity.tscn +./entity/game_invisible_guy/icon.png +./entity/game_invisible_guy/special.gd +./entity/game_invisible_guy/data.gd +./entity/smg/entity.tscn +./entity/smg/used.wav +./entity/smg/icon.png +./entity/smg/data.gd +./entity/skin_robo/entity.tscn +./entity/skin_robo/icon.png +./entity/skin_robo/carried.png +./entity/skin_robo/data.gd +./entity/bandana/entity.tscn +./entity/bandana/bob.gd +./entity/bandana/icon.png +./entity/bandana/special.gd +./entity/bandana/carried.png +./entity/bandana/data.gd +./entity/bandana/pixel.png +./entity/floor_plug/entity.tscn +./entity/floor_plug/icon.png +./entity/floor_plug/data.gd +./entity/bench/entity.tscn +./entity/bench/icon.png +./entity/bench/data.gd +./entity/meta_strip_items/entity.tscn +./entity/meta_strip_items/special.gd +./entity/meta_strip_items/meta_strip_items_model.gd +./entity/meta_strip_items/data.gd +./entity/crate_teleporter/entity.tscn +./entity/crate_teleporter/icon.png +./entity/crate_teleporter/data.gd +./entity/crate_teleporter/satellite.kra +./entity/crate_garbage/entity.tscn +./entity/crate_garbage/icon.png +./entity/crate_garbage/data.gd +./entity/crate_garbage/gibbed.png +./entity/meta_stats/entity.tscn +./entity/meta_stats/letters.tres +./entity/meta_stats/icon.png +./entity/meta_stats/special.gd +./entity/meta_stats/data.gd +./entity/meta_stats/meta_stats_model.gd +./entity/rail_gun/entity.tscn +./entity/rail_gun/used.wav +./entity/rail_gun/icon.png +./entity/rail_gun/special.gd +./entity/rail_gun/carried.png +./entity/rail_gun/data.gd +./entity/drop_ship_door/entity.tscn +./entity/drop_ship_door/icon.png +./entity/drop_ship_door/data.gd +./entity/floor_lines/entity.tscn +./entity/floor_lines/icon.png +./entity/floor_lines/data.gd +./entity/game_trap/entity.tscn +./entity/game_trap/you_blew_up_my_force_field.wav +./entity/game_trap/droped_my_grenade_2.wav +./entity/game_trap/icon.png +./entity/game_trap/special.gd +./entity/game_trap/droped_my_grenade_0.wav +./entity/game_trap/shock.wav +./entity/game_trap/uh_my_helmet.wav +./entity/game_trap/ha_missed_me.wav +./entity/game_trap/data.gd +./entity/game_trap/try_beat_this_force_field.wav +./entity/game_trap/droped_my_grenade_1.wav +./entity/blood_sword/entity.tscn +./entity/blood_sword/pick_up.wav +./entity/blood_sword/used.wav +./entity/blood_sword/sam2.png +./entity/blood_sword/icon.png +./entity/blood_sword/special.gd +./entity/blood_sword/hit_bar.gd +./entity/blood_sword/data.gd +./entity/blood_sword/sam.png +./entity/blood_sword/dead.wav +./entity/blood_sword/animation.png +./entity/auto_cables_thick/entity.tscn +./entity/auto_cables_thick/data.gd +./entity/auto_cables_thick/wires2.png +./entity/shield/entity.tscn +./entity/shield/pick_up.wav +./entity/shield/icon.png +./entity/shield/carried.png +./entity/shield/data.gd +./entity/shield/helmet-ping.wav +./entity/game_teleport_in/entity.tscn +./entity/game_teleport_in/icon.png +./entity/game_teleport_in/special.gd +./entity/game_teleport_in/data.gd +./entity/shotgun_super/entity.tscn +./entity/shotgun_super/icon.png +./entity/shotgun_super/data.gd +./entity/bottle/entity.tscn +./entity/bottle/icon.png +./entity/bottle/data.gd +./entity/bottle/normal.png +./entity/bottle/icon_shadow.png +./entity/kill_streak_p90/entity.tscn +./entity/kill_streak_p90/data.gd +./entity/drain/entity.tscn +./entity/drain/icon.png +./entity/drain/data.gd +./entity/auto_wires_three/entity.tscn +./entity/auto_wires_three/data.gd +./entity/light/entity.tscn +./entity/light/icon.png +./entity/light/special.gd +./entity/light/light.wav +./entity/light/data.gd +./entity/debris/entity.tscn +./entity/debris/icon.png +./entity/debris/data.gd +./entity/debris/gibbed.png +./entity/mutation_rail_gun_upgrade/entity.tscn +./entity/mutation_rail_gun_upgrade/icon.png +./entity/mutation_rail_gun_upgrade/special.gd +./entity/mutation_rail_gun_upgrade/data.gd +./entity/mutation_rail_gun_upgrade/mutation_model.gd +./entity/auto_cables/entity.tscn +./entity/auto_cables/data.gd +./entity/auto_cables/wires2.png +./entity/stealth_camo/entity.tscn +./entity/stealth_camo/special.gd +./entity/stealth_camo/data.gd +./entity/colt_45/entity.tscn +./entity/colt_45/used.wav +./entity/colt_45/icon.png +./entity/colt_45/dead.png +./entity/colt_45/data.gd +./entity/quantum_suicide_drive/entity.tscn +./entity/quantum_suicide_drive/heart.ogg +./entity/quantum_suicide_drive/icon.png +./entity/quantum_suicide_drive/special.gd +./entity/quantum_suicide_drive/qsd_model.gd +./entity/quantum_suicide_drive/multi.gd +./entity/quantum_suicide_drive/multi.tscn +./entity/quantum_suicide_drive/CenterContainer.gd +./entity/quantum_suicide_drive/carried.png +./entity/quantum_suicide_drive/data.gd +./entity/helmet/entity.tscn +./entity/helmet/pick_up.wav +./entity/helmet/icon.png +./entity/helmet/special.gd +./entity/helmet/die.wav +./entity/helmet/carried.png +./entity/helmet/data.gd +./entity/helmet/helmet-ping.wav +./entity/ammo_box/entity.tscn +./entity/ammo_box/icon.png +./entity/ammo_box/data.gd +./entity/rail_gun_level_2/entity.tscn +./entity/rail_gun_level_2/icon.png +./entity/rail_gun_level_2/data.gd +./entity/glass_block_backup/entity.tscn +./entity/glass_block_backup/icon.png +./entity/glass_block_backup/data.gd +./entity/closet/entity.tscn +./entity/closet/icon.png +./entity/closet/data.gd +./entity/little_boxes/entity.tscn +./entity/little_boxes/icon.png +./entity/little_boxes/data.gd +./entity/meta_health_bar/entity.tscn +./entity/meta_health_bar/health_bar_model.gd +./entity/meta_health_bar/icon.png +./entity/meta_health_bar/special.gd +./entity/meta_health_bar/invunerable.png +./entity/meta_health_bar/data.gd +./entity/night_stand/entity.tscn +./entity/night_stand/icon_normal.png +./entity/night_stand/icon.png +./entity/night_stand/shadow.png +./entity/night_stand/data.gd +./entity/fan/entity.tscn +./entity/fan/flap2.png +./entity/fan/flaps.gd +./entity/fan/icon.png +./entity/fan/data.gd +./entity/fan/flap.png +./entity/fan/icon_shadow.png +./entity/fan/animation.png +./entity/fan/gibbed.png +./entity/game_tutorial_end/entity.tscn +./entity/game_tutorial_end/icon.png +./entity/game_tutorial_end/special.gd +./entity/game_tutorial_end/data.gd +./entity/mutation_disarmament/entity.tscn +./entity/mutation_disarmament/icon.png +./entity/mutation_disarmament/special.gd +./entity/mutation_disarmament/data.gd +./entity/air_lock/icon_open.png +./entity/air_lock/entity.tscn +./entity/air_lock/door_close.wav +./entity/air_lock/icon.png +./entity/air_lock/special.gd +./entity/air_lock/air_lock_model.gd +./entity/air_lock/data.gd +./entity/scorpion/entity.tscn +./entity/scorpion/used.wav +./entity/scorpion/laser.gd +./entity/scorpion/icon.png +./entity/scorpion/data.gd +./entity/kill_streak_aim_hack/entity.tscn +./entity/kill_streak_aim_hack/data.gd +./entity/dungeon_proc_debug/entity.tscn +./entity/dungeon_proc_debug/icon.png +./entity/dungeon_proc_debug/data.gd +./entity/dungeon_proc_debug/debug.gd +./entity/dungeon_proc_debug/debug.tscn +./entity/tarp/entity.tscn +./entity/tarp/icon.png +./entity/tarp/data.gd +./entity/hit_indicator/entity.tscn +./entity/hit_indicator/data.gd +./entity/console_corner/entity.tscn +./entity/console_corner/animation2.tscn +./entity/console_corner/icon.png +./entity/console_corner/data.gd +./entity/console_corner/animation.tscn +./entity/icon.png +./entity/couch_corner/entity.tscn +./entity/couch_corner/icon.png +./entity/couch_corner/data.gd +./entity/m4/entity.tscn +./entity/m4/used.wav +./entity/m4/icon.png +./entity/m4/data.gd +./entity/game_hud/entity.tscn +./entity/game_hud/icon.png +./entity/game_hud/data.gd +./entity/game_hud/inventory_game.tscn +./entity/prototypes.gd +./entity/agent_chicken/emotes.png +./entity/agent_chicken/entity.tscn +./entity/agent_chicken/sound_board.gd +./entity/agent_chicken/bones.tscn +./entity/agent_chicken/bones.gd +./entity/agent_chicken/barks.gd +./entity/agent_chicken/emote.gd +./entity/agent_chicken/icon.png +./entity/agent_chicken/special.gd +./entity/agent_chicken/bark.gd +./entity/agent_chicken/deaad.png +./entity/agent_chicken/icon.gd +./entity/agent_chicken/data.gd +./entity/agent_chicken/animation.tscn +./entity/agent_chicken/emote.tscn +./entity/agent_chicken/hand.png +./entity/velocity/entity.tscn +./entity/velocity/icon.png +./entity/velocity/special.gd +./entity/velocity/data.gd +./entity/aircon/entity.tscn +./entity/aircon/grate.png +./entity/aircon/icon.png +./entity/aircon/data.gd +./entity/aircon/animation.png +./entity/floor_tile_bricks/entity.tscn +./entity/floor_tile_bricks/icon.png +./entity/floor_tile_bricks/data.gd +./entity/pallet/entity.tscn +./entity/pallet/icon.png +./entity/pallet/data.gd +./entity/barricade_deployed/debug.png +./entity/barricade_deployed/field.tscn +./entity/barricade_deployed/entity.tscn +./entity/barricade_deployed/ambience.ogg +./entity/barricade_deployed/icon.png +./entity/barricade_deployed/field.gd +./entity/barricade_deployed/field_material.tres +./entity/barricade_deployed/debug2.png +./entity/barricade_deployed/data.gd +./entity/barricade_deployed/field_material_invert.tres +./entity/barricade_deployed/field_material.gd +./entity/barricade_deployed/gibbed.png +./entity/helmet_nv/entity.tscn +./entity/helmet_nv/pick_up.wav +./entity/helmet_nv/icon.png +./entity/helmet_nv/special.gd +./entity/helmet_nv/carried.png +./entity/helmet_nv/eyes.png +./entity/helmet_nv/data.gd +./entity/helmet_nv/helmet-ping.wav +./entity/helmet_nv/eyes.gd +./entity/mutation_sword/entity.tscn +./entity/mutation_sword/icon.png +./entity/mutation_sword/special.gd +./entity/mutation_sword/data.gd +./entity/field_full_super/entity.tscn +./entity/field_full_super/icon.png +./entity/field_full_super/special.gd +./entity/field_full_super/carried.png +./entity/field_full_super/data.gd +./entity/entity_man.gd +./entity/couch/entity.tscn +./entity/couch/icon.png +./entity/couch/data.gd +./entity/teleporter_lil_hunter/entity.tscn +./entity/teleporter_lil_hunter/icon.png +./entity/teleporter_lil_hunter/tubes.png +./entity/teleporter_lil_hunter/osc_shader.tres +./entity/teleporter_lil_hunter/eyes.png +./entity/teleporter_lil_hunter/data.gd +./entity/teleporter_lil_hunter/osc.tres +./entity/game_tutorial_melee_zone/entity.tscn +./entity/game_tutorial_melee_zone/icon.png +./entity/game_tutorial_melee_zone/special.gd +./entity/game_tutorial_melee_zone/data.gd +./entity/kill_streak_glock/entity.tscn +./entity/kill_streak_glock/data.gd +./entity/skin_mime/entity.tscn +./entity/skin_mime/icon.png +./entity/skin_mime/special.gd +./entity/skin_mime/carried.png +./entity/skin_mime/data.gd +./entity/medpack_hard/entity.tscn +./entity/medpack_hard/icon.png +./entity/medpack_hard/data.gd +./entity/teleporter_overload/entity.tscn +./entity/teleporter_overload/icon.png +./entity/teleporter_overload/special.gd +./entity/teleporter_overload/carried.png +./entity/teleporter_overload/data.gd +./entity/background_freighter/overlay.png +./entity/background_freighter/entity.tscn +./entity/background_freighter/icon.png +./entity/background_freighter/Master.ogg +./entity/background_freighter/background/space.png +./entity/background_freighter/background/line.png +./entity/background_freighter/background/background2.gd +./entity/background_freighter/background/good create.png +./entity/background_freighter/background/backgip.png +./entity/background_freighter/background/background2.png +./entity/background_freighter/background/background.png +./entity/background_freighter/background/engine_glow.tscn +./entity/background_freighter/background/gra2d.png +./entity/background_freighter/background/lines3.png +./entity/background_freighter/background/background.tscn +./entity/background_freighter/background/lines.tres +./entity/background_freighter/background/background.gd +./entity/background_freighter/background/bayer16tile2.png +./entity/background_freighter/background/goodcrate.png +./entity/background_freighter/background/push.png +./entity/background_freighter/background/background_floor.png +./entity/background_freighter/background/palette_mono.png +./entity/background_freighter/background/stars.gd +./entity/background_freighter/background/lines2.png +./entity/background_freighter/background/lines.shader +./entity/background_freighter/background/ambience.gd +./entity/background_freighter/background/bacsdas.png +./entity/background_freighter/background/space_ship_ambience.ogg +./entity/background_freighter/background/stars.png +./entity/background_freighter/data.gd +./entity/auto_wires/entity.tscn +./entity/auto_wires/data.gd +./entity/kill_streak/entity.tscn +./entity/kill_streak/kill_streak_toast.tscn +./entity/kill_streak/icon.png diff --git a/tests/scene/test_audio_stream_wav.h b/tests/scene/test_audio_stream_wav.h index d3d5cc8a30..7276dd0878 100644 --- a/tests/scene/test_audio_stream_wav.h +++ b/tests/scene/test_audio_stream_wav.h @@ -162,7 +162,7 @@ void run_test(String file_name, AudioStreamWAV::Format data_format, bool stereo, // Compressed streams can't be saved, disable compression. options_map["compress/mode"] = 0; - REQUIRE(wav_importer->import(save_path, save_path, options_map, nullptr) == OK); + REQUIRE(wav_importer->import(0, save_path, save_path, options_map, nullptr) == OK); String load_path = save_path + "." + wav_importer->get_save_extension(); Ref<AudioStreamWAV> loaded_stream = ResourceLoader::load(load_path, "AudioStreamWAV", ResourceFormatImporter::CACHE_MODE_IGNORE, &error); diff --git a/tests/scene/test_primitives.h b/tests/scene/test_primitives.h index 59f23983e5..7426a9ce29 100644 --- a/tests/scene/test_primitives.h +++ b/tests/scene/test_primitives.h @@ -104,8 +104,9 @@ TEST_CASE("[SceneTree][Primitive][Capsule] Capsule Primitive") { float dist_to_yaxis = 0.f; for (Vector3 point : points) { float new_dist_to_y = point.x * point.x + point.z * point.z; - if (new_dist_to_y > dist_to_yaxis) + if (new_dist_to_y > dist_to_yaxis) { dist_to_yaxis = new_dist_to_y; + } } CHECK(dist_to_yaxis <= radius * radius); @@ -114,10 +115,12 @@ TEST_CASE("[SceneTree][Primitive][Capsule] Capsule Primitive") { float max_y{ 0.f }; float min_y{ 0.f }; for (Vector3 point : points) { - if (point.y > max_y) + if (point.y > max_y) { max_y = point.y; - if (point.y < min_y) + } + if (point.y < min_y) { min_y = point.y; + } } CHECK(max_y - min_y <= height); @@ -196,12 +199,14 @@ TEST_CASE("[SceneTree][Primitive][Box] Box Primitive") { for (const Vector3 &normal : normals) { bool add_normal{ true }; for (const Vector3 &vec : distinct_normals) { - if (vec.is_equal_approx(normal)) + if (vec.is_equal_approx(normal)) { add_normal = false; + } } - if (add_normal) + if (add_normal) { distinct_normals.push_back(normal); + } } CHECK_MESSAGE(distinct_normals.size() == 6, @@ -218,8 +223,9 @@ TEST_CASE("[SceneTree][Primitive][Box] Box Primitive") { break; } } - if (!normal_correct_direction) + if (!normal_correct_direction) { break; + } } CHECK_MESSAGE(normal_correct_direction, diff --git a/tests/scene/test_tree.h b/tests/scene/test_tree.h index e19f8311e2..a74158d328 100644 --- a/tests/scene/test_tree.h +++ b/tests/scene/test_tree.h @@ -139,18 +139,30 @@ TEST_CASE("[SceneTree][Tree]") { TreeItem *child1 = tree->create_item(); TreeItem *child2 = tree->create_item(); TreeItem *child3 = tree->create_item(); + CHECK_EQ(root->get_next(), nullptr); + CHECK_EQ(root->get_next_visible(), child1); + CHECK_EQ(root->get_next_in_tree(), child1); CHECK_EQ(child1->get_next(), child2); + CHECK_EQ(child1->get_next_visible(), child2); CHECK_EQ(child1->get_next_in_tree(), child2); CHECK_EQ(child2->get_next(), child3); + CHECK_EQ(child2->get_next_visible(), child3); CHECK_EQ(child2->get_next_in_tree(), child3); CHECK_EQ(child3->get_next(), nullptr); + CHECK_EQ(child3->get_next_visible(), nullptr); CHECK_EQ(child3->get_next_in_tree(), nullptr); + CHECK_EQ(root->get_prev(), nullptr); + CHECK_EQ(root->get_prev_visible(), nullptr); + CHECK_EQ(root->get_prev_in_tree(), nullptr); CHECK_EQ(child1->get_prev(), nullptr); + CHECK_EQ(child1->get_prev_visible(), root); CHECK_EQ(child1->get_prev_in_tree(), root); CHECK_EQ(child2->get_prev(), child1); + CHECK_EQ(child2->get_prev_visible(), child1); CHECK_EQ(child2->get_prev_in_tree(), child1); CHECK_EQ(child3->get_prev(), child2); + CHECK_EQ(child3->get_prev_visible(), child2); CHECK_EQ(child3->get_prev_in_tree(), child2); TreeItem *nested1 = tree->create_item(child2); @@ -158,13 +170,127 @@ TEST_CASE("[SceneTree][Tree]") { TreeItem *nested3 = tree->create_item(child2); CHECK_EQ(child1->get_next(), child2); + CHECK_EQ(child1->get_next_visible(), child2); CHECK_EQ(child1->get_next_in_tree(), child2); CHECK_EQ(child2->get_next(), child3); + CHECK_EQ(child2->get_next_visible(), nested1); CHECK_EQ(child2->get_next_in_tree(), nested1); CHECK_EQ(child3->get_prev(), child2); + CHECK_EQ(child3->get_prev_visible(), nested3); CHECK_EQ(child3->get_prev_in_tree(), nested3); CHECK_EQ(nested1->get_prev_in_tree(), child2); CHECK_EQ(nested1->get_next_in_tree(), nested2); + CHECK_EQ(nested3->get_next_in_tree(), child3); + + memdelete(tree); + } + + SUBCASE("[Tree] Previous and Next items with hide root.") { + Tree *tree = memnew(Tree); + tree->set_hide_root(true); + TreeItem *root = tree->create_item(); + + TreeItem *child1 = tree->create_item(); + TreeItem *child2 = tree->create_item(); + TreeItem *child3 = tree->create_item(); + CHECK_EQ(root->get_next(), nullptr); + CHECK_EQ(root->get_next_visible(), child1); + CHECK_EQ(root->get_next_in_tree(), child1); + CHECK_EQ(child1->get_next(), child2); + CHECK_EQ(child1->get_next_visible(), child2); + CHECK_EQ(child1->get_next_in_tree(), child2); + CHECK_EQ(child2->get_next(), child3); + CHECK_EQ(child2->get_next_visible(), child3); + CHECK_EQ(child2->get_next_in_tree(), child3); + CHECK_EQ(child3->get_next(), nullptr); + CHECK_EQ(child3->get_next_visible(), nullptr); + CHECK_EQ(child3->get_next_in_tree(), nullptr); + + CHECK_EQ(root->get_prev(), nullptr); + CHECK_EQ(root->get_prev_visible(), nullptr); + CHECK_EQ(root->get_prev_in_tree(), nullptr); + CHECK_EQ(child1->get_prev(), nullptr); + CHECK_EQ(child1->get_prev_visible(), nullptr); + CHECK_EQ(child1->get_prev_in_tree(), nullptr); + CHECK_EQ(child2->get_prev(), child1); + CHECK_EQ(child2->get_prev_visible(), child1); + CHECK_EQ(child2->get_prev_in_tree(), child1); + CHECK_EQ(child3->get_prev(), child2); + CHECK_EQ(child3->get_prev_visible(), child2); + CHECK_EQ(child3->get_prev_in_tree(), child2); + + memdelete(tree); + } + + SUBCASE("[Tree] Previous and Next items wrapping.") { + Tree *tree = memnew(Tree); + TreeItem *root = tree->create_item(); + + TreeItem *child1 = tree->create_item(); + TreeItem *child2 = tree->create_item(); + TreeItem *child3 = tree->create_item(); + CHECK_EQ(root->get_next_visible(true), child1); + CHECK_EQ(root->get_next_in_tree(true), child1); + CHECK_EQ(child1->get_next_visible(true), child2); + CHECK_EQ(child1->get_next_in_tree(true), child2); + CHECK_EQ(child2->get_next_visible(true), child3); + CHECK_EQ(child2->get_next_in_tree(true), child3); + CHECK_EQ(child3->get_next_visible(true), root); + CHECK_EQ(child3->get_next_in_tree(true), root); + + CHECK_EQ(root->get_prev_visible(true), child3); + CHECK_EQ(root->get_prev_in_tree(true), child3); + CHECK_EQ(child1->get_prev_visible(true), root); + CHECK_EQ(child1->get_prev_in_tree(true), root); + CHECK_EQ(child2->get_prev_visible(true), child1); + CHECK_EQ(child2->get_prev_in_tree(true), child1); + CHECK_EQ(child3->get_prev_visible(true), child2); + CHECK_EQ(child3->get_prev_in_tree(true), child2); + + TreeItem *nested1 = tree->create_item(child2); + TreeItem *nested2 = tree->create_item(child2); + TreeItem *nested3 = tree->create_item(child2); + + CHECK_EQ(child1->get_next_visible(true), child2); + CHECK_EQ(child1->get_next_in_tree(true), child2); + CHECK_EQ(child2->get_next_visible(true), nested1); + CHECK_EQ(child2->get_next_in_tree(true), nested1); + CHECK_EQ(nested3->get_next_visible(true), child3); + CHECK_EQ(nested3->get_next_in_tree(true), child3); + CHECK_EQ(child3->get_prev_visible(true), nested3); + CHECK_EQ(child3->get_prev_in_tree(true), nested3); + CHECK_EQ(nested1->get_prev_in_tree(true), child2); + CHECK_EQ(nested1->get_next_in_tree(true), nested2); + CHECK_EQ(nested3->get_next_in_tree(true), child3); + + memdelete(tree); + } + + SUBCASE("[Tree] Previous and Next items wrapping with hide root.") { + Tree *tree = memnew(Tree); + tree->set_hide_root(true); + TreeItem *root = tree->create_item(); + + TreeItem *child1 = tree->create_item(); + TreeItem *child2 = tree->create_item(); + TreeItem *child3 = tree->create_item(); + CHECK_EQ(root->get_next_visible(true), child1); + CHECK_EQ(root->get_next_in_tree(true), child1); + CHECK_EQ(child1->get_next_visible(true), child2); + CHECK_EQ(child1->get_next_in_tree(true), child2); + CHECK_EQ(child2->get_next_visible(true), child3); + CHECK_EQ(child2->get_next_in_tree(true), child3); + CHECK_EQ(child3->get_next_visible(true), root); + CHECK_EQ(child3->get_next_in_tree(true), root); + + CHECK_EQ(root->get_prev_visible(true), child3); + CHECK_EQ(root->get_prev_in_tree(true), child3); + CHECK_EQ(child1->get_prev_visible(true), child3); + CHECK_EQ(child1->get_prev_in_tree(true), child3); + CHECK_EQ(child2->get_prev_visible(true), child1); + CHECK_EQ(child2->get_prev_in_tree(true), child1); + CHECK_EQ(child3->get_prev_visible(true), child2); + CHECK_EQ(child3->get_prev_in_tree(true), child2); memdelete(tree); } diff --git a/tests/scene/test_viewport.h b/tests/scene/test_viewport.h index dde37944ec..06a38f234b 100644 --- a/tests/scene/test_viewport.h +++ b/tests/scene/test_viewport.h @@ -1577,7 +1577,7 @@ TEST_CASE("[SceneTree][Viewport] Physics Picking 2D") { PickingCollider pc; pc.a = memnew(TestArea2D); pc.c = memnew(CollisionShape2D); - pc.r = Ref<RectangleShape2D>(memnew(RectangleShape2D)); + pc.r.instantiate(); pc.r->set_size(Size2(150, 150)); pc.c->set_shape(pc.r); pc.a->add_child(pc.c); diff --git a/tests/servers/test_navigation_server_3d.h b/tests/servers/test_navigation_server_3d.h index 4411b1aae5..1b2a5e0db2 100644 --- a/tests/servers/test_navigation_server_3d.h +++ b/tests/servers/test_navigation_server_3d.h @@ -49,7 +49,7 @@ public: } unsigned function1_calls{ 0 }; - Variant function1_latest_arg0{}; + Variant function1_latest_arg0; }; static inline Array build_array() { diff --git a/tests/test_macros.h b/tests/test_macros.h index d32b26f111..9cc075b6d3 100644 --- a/tests/test_macros.h +++ b/tests/test_macros.h @@ -474,6 +474,6 @@ public: for (int i = 0; i < string_list.size(); ++i) { \ CHECK(string_list[i] == m_slices[i]); \ } \ - } while (0) + } while (false) #endif // TEST_MACROS_H diff --git a/tests/test_main.cpp b/tests/test_main.cpp index 465484d605..65d45ae92f 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -82,10 +82,12 @@ #include "tests/core/object/test_object.h" #include "tests/core/object/test_undo_redo.h" #include "tests/core/os/test_os.h" +#include "tests/core/string/test_fuzzy_search.h" #include "tests/core/string/test_node_path.h" #include "tests/core/string/test_string.h" #include "tests/core/string/test_translation.h" #include "tests/core/string/test_translation_server.h" +#include "tests/core/templates/test_a_hash_map.h" #include "tests/core/templates/test_command_queue.h" #include "tests/core/templates/test_hash_map.h" #include "tests/core/templates/test_hash_set.h" |