diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/core/string/test_string.h | 40 | ||||
-rw-r--r-- | tests/scene/test_code_edit.h | 32 | ||||
-rw-r--r-- | tests/servers/test_text_server.h | 43 | ||||
-rw-r--r-- | tests/test_macros.h | 28 | ||||
-rw-r--r-- | tests/test_main.cpp | 50 |
5 files changed, 154 insertions, 39 deletions
diff --git a/tests/core/string/test_string.h b/tests/core/string/test_string.h index 87016dddf6..58372a0ed6 100644 --- a/tests/core/string/test_string.h +++ b/tests/core/string/test_string.h @@ -636,6 +636,38 @@ TEST_CASE("[String] sprintf") { REQUIRE(error == false); CHECK(output == String("fish -5 frog")); + // Negative int left padded with spaces. + format = "fish %5d frog"; + args.clear(); + args.push_back(-5); + output = format.sprintf(args, &error); + REQUIRE(error == false); + CHECK(output == String("fish -5 frog")); + + // Negative int left padded with zeros. + format = "fish %05d frog"; + args.clear(); + args.push_back(-5); + output = format.sprintf(args, &error); + REQUIRE(error == false); + CHECK(output == String("fish -0005 frog")); + + // Negative int right padded with spaces. + format = "fish %-5d frog"; + args.clear(); + args.push_back(-5); + output = format.sprintf(args, &error); + REQUIRE(error == false); + CHECK(output == String("fish -5 frog")); + + // Negative int right padded with zeros. (0 ignored) + format = "fish %-05d frog"; + args.clear(); + args.push_back(-5); + output = format.sprintf(args, &error); + REQUIRE(error == false); + CHECK(output == String("fish -5 frog")); + // Hex (lower) format = "fish %x frog"; args.clear(); @@ -726,6 +758,14 @@ TEST_CASE("[String] sprintf") { REQUIRE(error == false); CHECK(output == String("fish 100 frog")); + // Negative real right padded with zeros. (0 ignored) + format = "fish %-011f frog"; + args.clear(); + args.push_back(-99.99); + output = format.sprintf(args, &error); + REQUIRE(error == false); + CHECK(output == String("fish -99.990000 frog")); + /////// Strings. // String diff --git a/tests/scene/test_code_edit.h b/tests/scene/test_code_edit.h index 574cacda95..62931cd4dd 100644 --- a/tests/scene/test_code_edit.h +++ b/tests/scene/test_code_edit.h @@ -2179,8 +2179,24 @@ TEST_CASE("[SceneTree][CodeEdit] indent") { SEND_GUI_ACTION(code_edit, "ui_text_newline"); CHECK(code_edit->get_line(0) == "test: # string"); CHECK(code_edit->get_line(1) == ""); + code_edit->remove_string_delimiter("#"); + + /* Non-whitespace prevents auto-indentation. */ + code_edit->add_comment_delimiter("#", ""); + code_edit->set_text(""); + code_edit->insert_text_at_caret("test := 0 # comment"); + SEND_GUI_ACTION(code_edit, "ui_text_newline"); + CHECK(code_edit->get_line(0) == "test := 0 # comment"); + CHECK(code_edit->get_line(1) == ""); code_edit->remove_comment_delimiter("#"); + /* Even when there's no comments. */ + code_edit->set_text(""); + code_edit->insert_text_at_caret("test := 0"); + SEND_GUI_ACTION(code_edit, "ui_text_newline"); + CHECK(code_edit->get_line(0) == "test := 0"); + CHECK(code_edit->get_line(1) == ""); + /* If between brace pairs an extra line is added. */ code_edit->set_text(""); code_edit->insert_text_at_caret("test{}"); @@ -2256,8 +2272,24 @@ TEST_CASE("[SceneTree][CodeEdit] indent") { SEND_GUI_ACTION(code_edit, "ui_text_newline"); CHECK(code_edit->get_line(0) == "test: # string"); CHECK(code_edit->get_line(1) == ""); + code_edit->remove_string_delimiter("#"); + + /* Non-whitespace prevents auto-indentation. */ + code_edit->add_comment_delimiter("#", ""); + code_edit->set_text(""); + code_edit->insert_text_at_caret("test := 0 # comment"); + SEND_GUI_ACTION(code_edit, "ui_text_newline"); + CHECK(code_edit->get_line(0) == "test := 0 # comment"); + CHECK(code_edit->get_line(1) == ""); code_edit->remove_comment_delimiter("#"); + /* Even when there's no comments. */ + code_edit->set_text(""); + code_edit->insert_text_at_caret("test := 0"); + SEND_GUI_ACTION(code_edit, "ui_text_newline"); + CHECK(code_edit->get_line(0) == "test := 0"); + CHECK(code_edit->get_line(1) == ""); + /* If between brace pairs an extra line is added. */ code_edit->set_text(""); code_edit->insert_text_at_caret("test{}"); diff --git a/tests/servers/test_text_server.h b/tests/servers/test_text_server.h index d7de94516f..066c280fd5 100644 --- a/tests/servers/test_text_server.h +++ b/tests/servers/test_text_server.h @@ -514,6 +514,49 @@ TEST_SUITE("[[TextServer]") { CHECK(ts->strip_diacritics(U"ṽṿ ẁẃẅẇẉ ẋẍ ẏ ẑẓẕ ẖ ẗẘẙẛ") == U"vv wwwww xx y zzz h twys"); } } + + SUBCASE("[TextServer] Word break") { + for (int i = 0; i < TextServerManager::get_singleton()->get_interface_count(); i++) { + Ref<TextServer> ts = TextServerManager::get_singleton()->get_interface(i); + + if (!ts->has_feature(TextServer::FEATURE_SIMPLE_LAYOUT)) { + continue; + } + + TEST_FAIL_COND(ts.is_null(), "Invalid TS interface."); + { + String text1 = U"linguistically similar and effectively form"; + // 14^ 22^ 26^ 38^ + PackedInt32Array breaks = ts->string_get_word_breaks(text1, "en"); + CHECK(breaks.size() == 4); + if (breaks.size() == 4) { + CHECK(breaks[0] == 14); + CHECK(breaks[1] == 22); + CHECK(breaks[2] == 26); + CHECK(breaks[3] == 38); + } + } + + if (ts->has_feature(TextServer::FEATURE_BREAK_ITERATORS)) { + String text2 = U"เป็นภาษาราชการและภาษาประจำชาติของประเทศไทย"; + // เป็น ภาษา ราชการ และ ภาษา ประจำ ชาติ ของ ประเทศไทย + // 3^ 7^ 13^ 16^ 20^ 25^ 29^ 32^ + + PackedInt32Array breaks = ts->string_get_word_breaks(text2, "th"); + CHECK(breaks.size() == 8); + if (breaks.size() == 8) { + CHECK(breaks[0] == 3); + CHECK(breaks[1] == 7); + CHECK(breaks[2] == 13); + CHECK(breaks[3] == 16); + CHECK(breaks[4] == 20); + CHECK(breaks[5] == 25); + CHECK(breaks[6] == 29); + CHECK(breaks[7] == 32); + } + } + } + } } } }; // namespace TestTextServer diff --git a/tests/test_macros.h b/tests/test_macros.h index 6e7a84bfb2..9cb9624d52 100644 --- a/tests/test_macros.h +++ b/tests/test_macros.h @@ -63,22 +63,22 @@ // Stringify all `Variant` compatible types for doctest output by default. // https://github.com/onqtam/doctest/blob/master/doc/markdown/stringification.md -#define DOCTEST_STRINGIFY_VARIANT(m_type) \ - template <> \ - struct doctest::StringMaker<m_type> { \ - static doctest::String convert(const m_type &p_val) { \ - const Variant val = p_val; \ - return val.get_construct_string().utf8().get_data(); \ - } \ +#define DOCTEST_STRINGIFY_VARIANT(m_type) \ + template <> \ + struct doctest::StringMaker<m_type> { \ + static doctest::String convert(const m_type &p_val) { \ + const Variant val = p_val; \ + return val.operator ::String().utf8().get_data(); \ + } \ }; -#define DOCTEST_STRINGIFY_VARIANT_POINTER(m_type) \ - template <> \ - struct doctest::StringMaker<m_type> { \ - static doctest::String convert(const m_type *p_val) { \ - const Variant val = p_val; \ - return val.get_construct_string().utf8().get_data(); \ - } \ +#define DOCTEST_STRINGIFY_VARIANT_POINTER(m_type) \ + template <> \ + struct doctest::StringMaker<m_type> { \ + static doctest::String convert(const m_type *p_val) { \ + const Variant val = p_val; \ + return val.operator ::String().utf8().get_data(); \ + } \ }; DOCTEST_STRINGIFY_VARIANT(Variant); diff --git a/tests/test_main.cpp b/tests/test_main.cpp index 1328ab10bf..be51afd83c 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -161,10 +161,10 @@ struct GodotTestCaseListener : public doctest::IReporter { SignalWatcher *signal_watcher = nullptr; - PhysicsServer3D *physics_3d_server = nullptr; - PhysicsServer2D *physics_2d_server = nullptr; - NavigationServer3D *navigation_3d_server = nullptr; - NavigationServer2D *navigation_2d_server = nullptr; + PhysicsServer3D *physics_server_3d = nullptr; + PhysicsServer2D *physics_server_2d = nullptr; + NavigationServer3D *navigation_server_3d = nullptr; + NavigationServer2D *navigation_server_2d = nullptr; void test_case_start(const doctest::TestCaseData &p_in) override { SignalWatcher::get_singleton()->_clear_signals(); @@ -191,19 +191,19 @@ struct GodotTestCaseListener : public doctest::IReporter { RenderingServerDefault::get_singleton()->init(); RenderingServerDefault::get_singleton()->set_render_loop_enabled(false); - physics_3d_server = PhysicsServer3DManager::new_default_server(); - physics_3d_server->init(); + physics_server_3d = PhysicsServer3DManager::new_default_server(); + physics_server_3d->init(); - physics_2d_server = PhysicsServer2DManager::new_default_server(); - physics_2d_server->init(); + physics_server_2d = PhysicsServer2DManager::new_default_server(); + physics_server_2d->init(); - navigation_3d_server = NavigationServer3DManager::new_default_server(); - navigation_2d_server = memnew(NavigationServer2D); + navigation_server_3d = NavigationServer3DManager::new_default_server(); + navigation_server_2d = memnew(NavigationServer2D); memnew(InputMap); InputMap::get_singleton()->load_default(); - make_default_theme(1.0, Ref<Font>(), TextServer::SUBPIXEL_POSITIONING_AUTO, TextServer::HINTING_LIGHT, true); + make_default_theme(1.0, Ref<Font>()); memnew(SceneTree); SceneTree::get_singleton()->initialize(); @@ -226,26 +226,26 @@ struct GodotTestCaseListener : public doctest::IReporter { clear_default_theme(); - if (navigation_3d_server) { - memdelete(navigation_3d_server); - navigation_3d_server = nullptr; + if (navigation_server_3d) { + memdelete(navigation_server_3d); + navigation_server_3d = nullptr; } - if (navigation_2d_server) { - memdelete(navigation_2d_server); - navigation_2d_server = nullptr; + if (navigation_server_2d) { + memdelete(navigation_server_2d); + navigation_server_2d = nullptr; } - if (physics_3d_server) { - physics_3d_server->finish(); - memdelete(physics_3d_server); - physics_3d_server = nullptr; + if (physics_server_3d) { + physics_server_3d->finish(); + memdelete(physics_server_3d); + physics_server_3d = nullptr; } - if (physics_2d_server) { - physics_2d_server->finish(); - memdelete(physics_2d_server); - physics_2d_server = nullptr; + if (physics_server_2d) { + physics_server_2d->finish(); + memdelete(physics_server_2d); + physics_server_2d = nullptr; } if (Input::get_singleton()) { |