diff --git a/src/xenia/base/testing/premake5.lua b/src/xenia/base/testing/premake5.lua index 9570a76f5..74d39aa65 100644 --- a/src/xenia/base/testing/premake5.lua +++ b/src/xenia/base/testing/premake5.lua @@ -3,6 +3,7 @@ include(project_root.."/tools/build") test_suite("xenia-base-tests", project_root, ".", { links = { + "fmt", "xenia-base", }, }) diff --git a/src/xenia/base/testing/utf8_test.cc b/src/xenia/base/testing/utf8_test.cc new file mode 100644 index 000000000..214ff43f8 --- /dev/null +++ b/src/xenia/base/testing/utf8_test.cc @@ -0,0 +1,139 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2020 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include +#include + +#include "xenia/base/string.h" + +#include "third_party/catch/include/catch.hpp" + +namespace xe::base::test { + +// https://www.cl.cam.ac.uk/~mgk25/ucs/examples/quickbrown.txt + +TEST_CASE("utf8::split", "UTF-8 Split") { + std::vector parts; + + // Danish + parts = utf8::split( + u8"Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen Wolther " + u8"spillede på xylofon.", + u8"æcå"); + REQUIRE(parts.size() == 4); + REQUIRE(parts[0] == u8"Quizdeltagerne spiste jordb"); + REQUIRE(parts[1] == u8"r med fløde, mens "); + REQUIRE(parts[2] == u8"irkusklovnen Wolther spillede p"); + REQUIRE(parts[3] == u8" xylofon."); + + // German + parts = utf8::split( + u8"Falsches Üben von Xylophonmusik quält jeden größeren Zwerg\n" + u8"Zwölf Boxkämpfer jagten Eva quer über den Sylter Deich\n" + u8"Heizölrückstoßabdämpfung", + u8"ßS"); + REQUIRE(parts.size() == 4); + REQUIRE(parts[0] == u8"Falsches Üben von Xylophonmusik quält jeden grö"); + REQUIRE(parts[1] == + u8"eren Zwerg\nZwölf Boxkämpfer jagten Eva quer über den "); + REQUIRE(parts[2] == u8"ylter Deich\nHeizölrücksto"); + REQUIRE(parts[3] == u8"abdämpfung"); + + // Greek + parts = utf8::split( + u8"Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ στὸ χρυσαφὶ ξέφωτο\n" + u8"Ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία", + u8"πφ"); + REQUIRE(parts.size() == 6); + REQUIRE(parts[0] == u8"Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ "); + REQUIRE(parts[1] == u8"ιὰ στὸ χρυσα"); + REQUIRE(parts[2] == u8"ὶ ξέ"); + REQUIRE(parts[3] == u8"ωτο\nΞεσκε"); + REQUIRE(parts[4] == u8"άζω τὴν ψυχο"); + REQUIRE(parts[5] == u8"θόρα βδελυγμία"); + + // English + parts = utf8::split("The quick brown fox jumps over the lazy dog", "xy"); + REQUIRE(parts.size() == 3); + REQUIRE(parts[0] == u8"The quick brown fo"); + REQUIRE(parts[1] == u8" jumps over the laz"); + REQUIRE(parts[2] == u8" dog"); + + // Spanish + parts = utf8::split( + u8"El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y " + u8"frío, añoraba a su querido cachorro.", + u8"ójd"); + REQUIRE(parts.size() == 4); + REQUIRE(parts[0] == u8"El pingüino Wenceslao hizo kil"); + REQUIRE(parts[1] == u8"metros ba"); + REQUIRE(parts[2] == u8"o exhaustiva lluvia y frío, añoraba a su queri"); + REQUIRE(parts[3] == u8"o cachorro."); + + // TODO(gibbed): French + // TODO(gibbed): Irish Gaelic + // TODO(gibbed): Hungarian + // TODO(gibbed): Icelandic + // TODO(gibbed): Japanese + // TODO(gibbed): Hebrew + // TODO(gibbed): Polish + // TODO(gibbed): Russian + // TODO(gibbed): Thai + // TODO(gibbed): Turkish +} + +TEST_CASE("utf8::equal_z", "UTF-8 Equal Z") { + REQUIRE(utf8::equal_z(u8"foo", u8"foo\0")); + REQUIRE_FALSE(utf8::equal_z(u8"bar", u8"baz\0")); +} + +TEST_CASE("utf8::equal_case_z", "UTF-8 Equal Case Z") { + REQUIRE(utf8::equal_z(u8"foo", u8"foo\0")); + REQUIRE_FALSE(utf8::equal_z(u8"bar", u8"baz\0")); +} + +TEST_CASE("utf8::join_paths", "UTF-8 Join Paths") { + REQUIRE(utf8::join_paths({u8"X:", u8"foo", u8"bar", u8"baz", u8"qux"}, + '\\') == "X:\\foo\\bar\\baz\\qux"); + REQUIRE(utf8::join_paths({u8"X:", u8"foo", u8"bar", u8"baz", u8"qux"}, '/') == + "X:/foo/bar/baz/qux"); +} + +TEST_CASE("utf8::fix_path_separators", "UTF-8 Fix Path Separators") { + REQUIRE(utf8::fix_path_separators("X:\\foo/bar\\baz/qux", '\\') == + "X:\\foo\\bar\\baz\\qux"); + REQUIRE(utf8::fix_path_separators("X:\\foo/bar\\baz/qux", '/') == + "X:/foo/bar/baz/qux"); +} + +TEST_CASE("utf8::find_name_from_path", "UTF-8 Find Name From Path") { + REQUIRE(utf8::find_name_from_path("X:\\foo\\bar\\baz\\qux", '\\') == "qux"); + REQUIRE(utf8::find_name_from_path("X:/foo/bar/baz/qux", '/') == "qux"); +} + +TEST_CASE("utf8::find_base_path", "UTF-8 Find Base Path") { + REQUIRE(utf8::find_base_path("X:\\foo\\bar\\baz\\qux", '\\') == + "X:\\foo\\bar\\baz"); + REQUIRE(utf8::find_base_path("X:/foo/bar/baz/qux", '/') == "X:/foo/bar/baz"); +} + +TEST_CASE("utf8::canonicalize_path", "UTF-8 Canonicalize Path") { + REQUIRE(utf8::canonicalize_path("X:\\foo\\bar\\baz\\qux", '\\') == + "X:\\foo\\bar\\baz\\qux"); + REQUIRE(utf8::canonicalize_path("X:\\foo\\.\\baz\\qux", '\\') == + "X:\\foo\\baz\\qux"); + REQUIRE(utf8::canonicalize_path("X:\\foo\\..\\baz\\qux", '\\') == + "X:\\baz\\qux"); + REQUIRE(utf8::canonicalize_path("X:\\.\\bar\\baz\\qux", '\\') == + "X:\\bar\\baz\\qux"); + REQUIRE(utf8::canonicalize_path("X:\\..\\bar\\baz\\qux", '\\') == + "X:\\bar\\baz\\qux"); +} + +} // namespace xe::base::test