//////////////////////////////////////////////////////////////////////////////// /// @brief test suite for StringUtils class /// /// @file /// /// DISCLAIMER /// /// Copyright 2004-2012 triagens GmbH, Cologne, Germany /// /// Licensed under the Apache License, Version 2.0 (the "License"); /// you may not use this file except in compliance with the License. /// You may obtain a copy of the License at /// /// http://www.apache.org/licenses/LICENSE-2.0 /// /// Unless required by applicable law or agreed to in writing, software /// distributed under the License is distributed on an "AS IS" BASIS, /// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. /// See the License for the specific language governing permissions and /// limitations under the License. /// /// Copyright holder is triAGENS GmbH, Cologne, Germany /// /// @author Dr. Frank Celler /// @author Copyright 2007-2012, triAGENS GmbH, Cologne, Germany //////////////////////////////////////////////////////////////////////////////// #include "Basics/Common.h" #include "gtest/gtest.h" #include #include #include "Basics/directories.h" #include "Basics/StringUtils.h" #include "Basics/Utf8Helper.h" #include "Basics/files.h" #include "icu-helper.h" using namespace arangodb; using namespace arangodb::basics; using namespace std; using namespace std::literals::string_literals; // ----------------------------------------------------------------------------- // --SECTION-- setup / tear-down // ----------------------------------------------------------------------------- class StringUtilsTest : public ::testing::Test { protected: StringUtilsTest () { IcuInitializer::setup("./3rdParty/V8/v8/third_party/icu/common/icudtl.dat"); } }; // ----------------------------------------------------------------------------- // --SECTION-- test suite // ----------------------------------------------------------------------------- TEST_F(StringUtilsTest, test_SplitEmptyness) { EXPECT_EQ(StringUtils::split("", '\0'), (std::vector{})); EXPECT_EQ(StringUtils::split({"a\0b\0c", 5}, '\0'), (std::vector{"a", "b", "c"})); EXPECT_EQ(StringUtils::split("", '/'), (std::vector{})); EXPECT_EQ(StringUtils::split("/", '/'), (std::vector{"", ""})); EXPECT_EQ(StringUtils::split("/1", '/'), (std::vector{"", "1"})); EXPECT_EQ(StringUtils::split("1/", '/'), (std::vector{"1", ""})); EXPECT_EQ(StringUtils::split("//", '/'), (std::vector{"", "", ""})); EXPECT_EQ(StringUtils::split("knurps", '/'), (std::vector{"knurps"})); EXPECT_EQ(StringUtils::split("", "/"), (std::vector{})); EXPECT_EQ(StringUtils::split("/", "/"), (std::vector{"", ""})); EXPECT_EQ(StringUtils::split("/1", "/"), (std::vector{"", "1"})); EXPECT_EQ(StringUtils::split("1/", "/"), (std::vector{"1", ""})); EXPECT_EQ(StringUtils::split("//", "/"), (std::vector{"", "", ""})); EXPECT_EQ(StringUtils::split("knurps", "/"), (std::vector{"knurps"})); EXPECT_EQ(StringUtils::split("", "abc"), (std::vector{})); EXPECT_EQ(StringUtils::split("/", "abc"), (std::vector{"/"})); EXPECT_EQ(StringUtils::split("/1", "abc"), (std::vector{"/1"})); EXPECT_EQ(StringUtils::split("1/", "abc"), (std::vector{"1/"})); EXPECT_EQ(StringUtils::split("//", "abc"), (std::vector{"//"})); EXPECT_EQ(StringUtils::split("abcdefg", "abc"), (std::vector{"", "", "", "defg"})); EXPECT_EQ(StringUtils::split("foo-split-bar-split-baz", "-sp"), (std::vector{"foo", "", "", "lit", "bar", "", "", "lit", "baz"})); EXPECT_EQ(StringUtils::split("this-line.is,split", ".,-"), (std::vector{"this", "line", "is", "split"})); } //////////////////////////////////////////////////////////////////////////////// /// @brief test_Split1 //////////////////////////////////////////////////////////////////////////////// TEST_F(StringUtilsTest, test_Split1) { vector lines = StringUtils::split("Hallo\nWorld\\/Me", '\n'); EXPECT_EQ(lines.size(), 2U); EXPECT_EQ(lines[0], "Hallo"); EXPECT_EQ(lines[1], "World\\/Me"); } //////////////////////////////////////////////////////////////////////////////// /// @brief test_Split2 //////////////////////////////////////////////////////////////////////////////// TEST_F(StringUtilsTest, test_Split2) { vector lines = StringUtils::split("\nHallo\nWorld\n", '\n'); EXPECT_EQ(lines.size(), 4U); EXPECT_EQ(lines[0], ""); EXPECT_EQ(lines[1], "Hallo"); EXPECT_EQ(lines[2], "World"); EXPECT_EQ(lines[3], ""); } //////////////////////////////////////////////////////////////////////////////// /// @brief test_Split3 //////////////////////////////////////////////////////////////////////////////// TEST_F(StringUtilsTest, test_Split3) { vector lines = StringUtils::split("Hallo\nWorld\\/Me", '\n'); EXPECT_EQ(lines.size(), 2U); EXPECT_EQ(lines[0], "Hallo"); EXPECT_EQ(lines[1], "World\\/Me"); } //////////////////////////////////////////////////////////////////////////////// /// @brief test_tolower //////////////////////////////////////////////////////////////////////////////// TEST_F(StringUtilsTest, test_tolower) { EXPECT_EQ(StringUtils::tolower(""), ""); EXPECT_EQ(StringUtils::tolower(" "), " "); EXPECT_EQ(StringUtils::tolower("12345"), "12345"); EXPECT_EQ(StringUtils::tolower("a"), "a"); EXPECT_EQ(StringUtils::tolower("A"), "a"); EXPECT_EQ(StringUtils::tolower("ä"), "ä"); EXPECT_EQ(StringUtils::tolower("Ä"), "Ä"); EXPECT_EQ(StringUtils::tolower("HeLlO WoRlD!"), "hello world!"); EXPECT_EQ(StringUtils::tolower("hello-world-nono "), "hello-world-nono "); EXPECT_EQ(StringUtils::tolower("HELLo-world-NONO "), "hello-world-nono "); EXPECT_EQ(StringUtils::tolower(" The quick \r\nbrown Fox"), " the quick \r\nbrown fox"); } //////////////////////////////////////////////////////////////////////////////// /// @brief test_toupper //////////////////////////////////////////////////////////////////////////////// TEST_F(StringUtilsTest, test_toupper) { EXPECT_EQ(StringUtils::toupper(""), ""); EXPECT_EQ(StringUtils::toupper(" "), " "); EXPECT_EQ(StringUtils::toupper("12345"), "12345"); EXPECT_EQ(StringUtils::toupper("a"), "A"); EXPECT_EQ(StringUtils::toupper("A"), "A"); EXPECT_EQ(StringUtils::toupper("ä"), "ä"); EXPECT_EQ(StringUtils::toupper("Ä"), "Ä"); EXPECT_EQ(StringUtils::toupper("HeLlO WoRlD!"), "HELLO WORLD!"); EXPECT_EQ(StringUtils::toupper("hello-world-nono "), "HELLO-WORLD-NONO "); EXPECT_EQ(StringUtils::toupper("HELLo-world-NONO "), "HELLO-WORLD-NONO "); } //////////////////////////////////////////////////////////////////////////////// /// @brief test_uint64 //////////////////////////////////////////////////////////////////////////////// TEST_F(StringUtilsTest, test_uint64) { EXPECT_EQ(0ULL, StringUtils::uint64("abc"s)); EXPECT_EQ(0ULL, StringUtils::uint64("ABC"s)); EXPECT_EQ(0ULL, StringUtils::uint64(" foo"s)); EXPECT_EQ(0ULL, StringUtils::uint64(""s)); EXPECT_EQ(0ULL, StringUtils::uint64(" "s)); EXPECT_EQ(12ULL, StringUtils::uint64("012"s)); EXPECT_EQ(12ULL, StringUtils::uint64("00012"s)); EXPECT_EQ(1234ULL, StringUtils::uint64("1234"s)); EXPECT_EQ(1234ULL, StringUtils::uint64("1234a"s)); #ifdef ARANGODB_STRING_UTILS_USE_FROM_CHARS EXPECT_EQ(0ULL, StringUtils::uint64("-1"s)); EXPECT_EQ(0ULL, StringUtils::uint64("-12345"s)); #else EXPECT_EQ(18446744073709551615ULL, StringUtils::uint64("-1"s)); EXPECT_EQ(18446744073709539271ULL, StringUtils::uint64("-12345"s)); #endif EXPECT_EQ(1234ULL, StringUtils::uint64("1234.56"s)); EXPECT_EQ(0ULL, StringUtils::uint64("1234567890123456789012345678901234567890"s)); EXPECT_EQ(0ULL, StringUtils::uint64("@"s)); EXPECT_EQ(0ULL, StringUtils::uint64("0"s)); EXPECT_EQ(1ULL, StringUtils::uint64("1"s)); EXPECT_EQ(12ULL, StringUtils::uint64("12"s)); EXPECT_EQ(123ULL, StringUtils::uint64("123"s)); EXPECT_EQ(1234ULL, StringUtils::uint64("1234"s)); EXPECT_EQ(1234ULL, StringUtils::uint64("01234"s)); EXPECT_EQ(9ULL, StringUtils::uint64("9"s)); EXPECT_EQ(9ULL, StringUtils::uint64("09"s)); EXPECT_EQ(9ULL, StringUtils::uint64("0009"s)); EXPECT_EQ(12345678ULL, StringUtils::uint64("12345678"s)); EXPECT_EQ(1234567800ULL, StringUtils::uint64("1234567800"s)); EXPECT_EQ(1234567890123456ULL, StringUtils::uint64("1234567890123456"s)); EXPECT_EQ(UINT64_MAX, StringUtils::uint64(std::to_string(UINT64_MAX))); } //////////////////////////////////////////////////////////////////////////////// /// @brief test_uint64_trusted //////////////////////////////////////////////////////////////////////////////// TEST_F(StringUtilsTest, test_uint64_trusted) { EXPECT_EQ(0ULL, StringUtils::uint64_trusted("0")); EXPECT_EQ(1ULL, StringUtils::uint64_trusted("1")); EXPECT_EQ(12ULL, StringUtils::uint64_trusted("12")); EXPECT_EQ(123ULL, StringUtils::uint64_trusted("123")); EXPECT_EQ(1234ULL, StringUtils::uint64_trusted("1234")); EXPECT_EQ(1234ULL, StringUtils::uint64_trusted("01234")); EXPECT_EQ(9ULL, StringUtils::uint64_trusted("9")); EXPECT_EQ(9ULL, StringUtils::uint64_trusted("0009")); EXPECT_EQ(12345678ULL, StringUtils::uint64_trusted("12345678")); EXPECT_EQ(1234567800ULL, StringUtils::uint64_trusted("1234567800")); EXPECT_EQ(1234567890123456ULL, StringUtils::uint64_trusted("1234567890123456")); EXPECT_EQ(UINT64_MAX, StringUtils::uint64_trusted(std::to_string(UINT64_MAX))); } TEST_F(StringUtilsTest, test_encodeHex) { EXPECT_EQ("", StringUtils::encodeHex("")); EXPECT_EQ("00", StringUtils::encodeHex(std::string("\x00", 1))); EXPECT_EQ("01", StringUtils::encodeHex("\x01")); EXPECT_EQ("02", StringUtils::encodeHex("\x02")); EXPECT_EQ("03", StringUtils::encodeHex("\x03")); EXPECT_EQ("04", StringUtils::encodeHex("\x04")); EXPECT_EQ("05", StringUtils::encodeHex("\x05")); EXPECT_EQ("06", StringUtils::encodeHex("\x06")); EXPECT_EQ("07", StringUtils::encodeHex("\x07")); EXPECT_EQ("08", StringUtils::encodeHex("\x08")); EXPECT_EQ("09", StringUtils::encodeHex("\x09")); EXPECT_EQ("0a", StringUtils::encodeHex("\x0a")); EXPECT_EQ("0b", StringUtils::encodeHex("\x0b")); EXPECT_EQ("0c", StringUtils::encodeHex("\x0c")); EXPECT_EQ("0d", StringUtils::encodeHex("\x0d")); EXPECT_EQ("0e", StringUtils::encodeHex("\x0e")); EXPECT_EQ("0f", StringUtils::encodeHex("\x0f")); EXPECT_EQ("10", StringUtils::encodeHex("\x10")); EXPECT_EQ("42", StringUtils::encodeHex("\x42")); EXPECT_EQ("ff", StringUtils::encodeHex("\xff")); EXPECT_EQ("aa0009", StringUtils::encodeHex(std::string("\xaa\x00\x09", 3))); EXPECT_EQ("000102", StringUtils::encodeHex(std::string("\x00\x01\x02", 3))); EXPECT_EQ("00010203", StringUtils::encodeHex(std::string("\x00\x01\x02\03", 4))); EXPECT_EQ("20", StringUtils::encodeHex(" ")); EXPECT_EQ("2a2a", StringUtils::encodeHex("**")); EXPECT_EQ("616263646566", StringUtils::encodeHex("abcdef")); EXPECT_EQ("4142434445462047", StringUtils::encodeHex("ABCDEF G")); EXPECT_EQ("54686520517569636b2062726f776e20466f78206a756d706564206f76657220746865206c617a7920646f6721", StringUtils::encodeHex("The Quick brown Fox jumped over the lazy dog!")); EXPECT_EQ("446572204bc3b674c3b67220737072c3bc6e6720c3bc62657220646965204272c3bc636b65", StringUtils::encodeHex("Der Kötör sprüng über die Brücke")); EXPECT_EQ("c3a4c3b6c3bcc39fc384c396c39ce282acc2b5", StringUtils::encodeHex("äöüßÄÖÜ€µ")); } TEST_F(StringUtilsTest, test_decodeHex) { EXPECT_EQ("", StringUtils::decodeHex("")); EXPECT_EQ(std::string("\x00", 1), StringUtils::decodeHex("00")); EXPECT_EQ("\x01", StringUtils::decodeHex("01")); EXPECT_EQ("\x02", StringUtils::decodeHex("02")); EXPECT_EQ("\x03", StringUtils::decodeHex("03")); EXPECT_EQ("\x04", StringUtils::decodeHex("04")); EXPECT_EQ("\x05", StringUtils::decodeHex("05")); EXPECT_EQ("\x06", StringUtils::decodeHex("06")); EXPECT_EQ("\x07", StringUtils::decodeHex("07")); EXPECT_EQ("\x08", StringUtils::decodeHex("08")); EXPECT_EQ("\x09", StringUtils::decodeHex("09")); EXPECT_EQ("\x0a", StringUtils::decodeHex("0a")); EXPECT_EQ("\x0b", StringUtils::decodeHex("0b")); EXPECT_EQ("\x0c", StringUtils::decodeHex("0c")); EXPECT_EQ("\x0d", StringUtils::decodeHex("0d")); EXPECT_EQ("\x0e", StringUtils::decodeHex("0e")); EXPECT_EQ("\x0f", StringUtils::decodeHex("0f")); EXPECT_EQ("\x0a", StringUtils::decodeHex("0A")); EXPECT_EQ("\x0b", StringUtils::decodeHex("0B")); EXPECT_EQ("\x0c", StringUtils::decodeHex("0C")); EXPECT_EQ("\x0d", StringUtils::decodeHex("0D")); EXPECT_EQ("\x0e", StringUtils::decodeHex("0E")); EXPECT_EQ("\x0f", StringUtils::decodeHex("0F")); EXPECT_EQ("\x1a", StringUtils::decodeHex("1a")); EXPECT_EQ("\x2b", StringUtils::decodeHex("2b")); EXPECT_EQ("\x3c", StringUtils::decodeHex("3c")); EXPECT_EQ("\x4d", StringUtils::decodeHex("4d")); EXPECT_EQ("\x5e", StringUtils::decodeHex("5e")); EXPECT_EQ("\x6f", StringUtils::decodeHex("6f")); EXPECT_EQ("\x7a", StringUtils::decodeHex("7A")); EXPECT_EQ("\x8b", StringUtils::decodeHex("8B")); EXPECT_EQ("\x9c", StringUtils::decodeHex("9C")); EXPECT_EQ("\xad", StringUtils::decodeHex("AD")); EXPECT_EQ("\xbe", StringUtils::decodeHex("BE")); EXPECT_EQ("\xcf", StringUtils::decodeHex("CF")); EXPECT_EQ("\xdf", StringUtils::decodeHex("df")); EXPECT_EQ("\xef", StringUtils::decodeHex("eF")); EXPECT_EQ("\xff", StringUtils::decodeHex("ff")); EXPECT_EQ(" ", StringUtils::decodeHex("20")); EXPECT_EQ("**", StringUtils::decodeHex("2a2a")); EXPECT_EQ("abcdef", StringUtils::decodeHex("616263646566")); EXPECT_EQ("ABCDEF G", StringUtils::decodeHex("4142434445462047")); EXPECT_EQ("The Quick brown Fox jumped over the lazy dog!", StringUtils::decodeHex("54686520517569636b2062726f776e20466f78206a756d706564206f76657220746865206c617a7920646f6721")); EXPECT_EQ("Der Kötör sprüng über die Brücke", StringUtils::decodeHex("446572204bc3b674c3b67220737072c3bc6e6720c3bc62657220646965204272c3bc636b65")); EXPECT_EQ("äöüßÄÖÜ€µ", StringUtils::decodeHex("c3a4c3b6c3bcc39fc384c396c39ce282acc2b5")); EXPECT_EQ("", StringUtils::decodeHex("1")); EXPECT_EQ("", StringUtils::decodeHex(" ")); EXPECT_EQ("", StringUtils::decodeHex(" 2")); EXPECT_EQ("", StringUtils::decodeHex("1 ")); EXPECT_EQ("", StringUtils::decodeHex("12 ")); EXPECT_EQ("", StringUtils::decodeHex("x")); EXPECT_EQ("", StringUtils::decodeHex("X")); EXPECT_EQ("", StringUtils::decodeHex("@@@")); EXPECT_EQ("", StringUtils::decodeHex("111")); EXPECT_EQ("", StringUtils::decodeHex("1 2 3")); EXPECT_EQ("", StringUtils::decodeHex("1122334")); EXPECT_EQ("", StringUtils::decodeHex("112233 ")); EXPECT_EQ("", StringUtils::decodeHex(" 112233")); EXPECT_EQ("", StringUtils::decodeHex("abcdefgh")); }