| // |
| // Copyright 2015 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // string_utils_unittests: |
| // Unit tests for the string utils. |
| // |
| |
| #include "string_utils.h" |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| using namespace angle; |
| |
| namespace |
| { |
| |
| // Basic SplitString tests |
| TEST(StringUtilsTest, SplitString_Basics) |
| { |
| std::vector<std::string> r; |
| |
| r = SplitString(std::string(), ",:;", KEEP_WHITESPACE, SPLIT_WANT_ALL); |
| EXPECT_TRUE(r.empty()); |
| |
| // Empty separator list |
| r = SplitString("hello, world", "", KEEP_WHITESPACE, SPLIT_WANT_ALL); |
| ASSERT_EQ(1u, r.size()); |
| EXPECT_EQ("hello, world", r[0]); |
| |
| // Should split on any of the separators. |
| r = SplitString("::,,;;", ",:;", KEEP_WHITESPACE, SPLIT_WANT_ALL); |
| ASSERT_EQ(7u, r.size()); |
| for (auto str : r) |
| ASSERT_TRUE(str.empty()); |
| |
| r = SplitString("red, green; blue:", ",:;", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY); |
| ASSERT_EQ(3u, r.size()); |
| EXPECT_EQ("red", r[0]); |
| EXPECT_EQ("green", r[1]); |
| EXPECT_EQ("blue", r[2]); |
| |
| // Want to split a string along whitespace sequences. |
| r = SplitString(" red green \tblue\n", " \t\n", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY); |
| ASSERT_EQ(3u, r.size()); |
| EXPECT_EQ("red", r[0]); |
| EXPECT_EQ("green", r[1]); |
| EXPECT_EQ("blue", r[2]); |
| |
| // Weird case of splitting on spaces but not trimming. |
| r = SplitString(" red ", " ", TRIM_WHITESPACE, SPLIT_WANT_ALL); |
| ASSERT_EQ(3u, r.size()); |
| EXPECT_EQ("", r[0]); // Before the first space. |
| EXPECT_EQ("red", r[1]); |
| EXPECT_EQ("", r[2]); // After the last space. |
| } |
| |
| // Check different whitespace and result types for SplitString |
| TEST(StringUtilsTest, SplitString_WhitespaceAndResultType) |
| { |
| std::vector<std::string> r; |
| |
| // Empty input handling. |
| r = SplitString(std::string(), ",", KEEP_WHITESPACE, SPLIT_WANT_ALL); |
| EXPECT_TRUE(r.empty()); |
| r = SplitString(std::string(), ",", KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY); |
| EXPECT_TRUE(r.empty()); |
| |
| // Input string is space and we're trimming. |
| r = SplitString(" ", ",", TRIM_WHITESPACE, SPLIT_WANT_ALL); |
| ASSERT_EQ(1u, r.size()); |
| EXPECT_EQ("", r[0]); |
| r = SplitString(" ", ",", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY); |
| EXPECT_TRUE(r.empty()); |
| |
| // Test all 4 combinations of flags on ", ,". |
| r = SplitString(", ,", ",", KEEP_WHITESPACE, SPLIT_WANT_ALL); |
| ASSERT_EQ(3u, r.size()); |
| EXPECT_EQ("", r[0]); |
| EXPECT_EQ(" ", r[1]); |
| EXPECT_EQ("", r[2]); |
| r = SplitString(", ,", ",", KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY); |
| ASSERT_EQ(1u, r.size()); |
| ASSERT_EQ(" ", r[0]); |
| r = SplitString(", ,", ",", TRIM_WHITESPACE, SPLIT_WANT_ALL); |
| ASSERT_EQ(3u, r.size()); |
| EXPECT_EQ("", r[0]); |
| EXPECT_EQ("", r[1]); |
| EXPECT_EQ("", r[2]); |
| r = SplitString(", ,", ",", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY); |
| ASSERT_TRUE(r.empty()); |
| } |
| |
| // Tests for SplitStringAlongWhitespace |
| TEST(StringUtilsTest, SplitStringAlongWhitespace) |
| { |
| { |
| // No whitespace. |
| std::vector<std::string> r; |
| SplitStringAlongWhitespace("abcd", &r); |
| ASSERT_THAT(r, testing::ElementsAre("abcd")); |
| } |
| |
| { |
| // Just whitespace. |
| std::vector<std::string> r; |
| SplitStringAlongWhitespace(" \t", &r); |
| ASSERT_THAT(r, testing::ElementsAre()); |
| } |
| |
| { |
| // Consecutive whitespace of same type. |
| std::vector<std::string> r; |
| SplitStringAlongWhitespace("a b", &r); |
| ASSERT_THAT(r, testing::ElementsAre("a", "b")); |
| } |
| |
| { |
| // Consecutive whitespace of different types. |
| std::vector<std::string> r; |
| SplitStringAlongWhitespace("ab \tcd", &r); |
| ASSERT_THAT(r, testing::ElementsAre("ab", "cd")); |
| } |
| |
| { |
| // Non-empty output std::vector. |
| std::vector<std::string> r; |
| r.push_back("z"); |
| SplitStringAlongWhitespace("abc", &r); |
| ASSERT_THAT(r, testing::ElementsAre("z", "abc")); |
| } |
| } |
| |
| // Tests for TrimString |
| TEST(StringUtilsTest, TrimString) |
| { |
| // Basic tests |
| EXPECT_EQ("a", TrimString("a", kWhitespaceASCII)); |
| EXPECT_EQ("a", TrimString(" a", kWhitespaceASCII)); |
| EXPECT_EQ("a", TrimString("a ", kWhitespaceASCII)); |
| EXPECT_EQ("a", TrimString(" a ", kWhitespaceASCII)); |
| |
| // Tests with empty strings |
| EXPECT_EQ("", TrimString("", kWhitespaceASCII)); |
| EXPECT_EQ("", TrimString(" \n\r\t", kWhitespaceASCII)); |
| EXPECT_EQ(" foo ", TrimString(" foo ", "")); |
| |
| // Tests it doesn't removes characters in the middle |
| EXPECT_EQ("foo bar", TrimString(" foo bar ", kWhitespaceASCII)); |
| |
| // Test with non-whitespace trimChars |
| EXPECT_EQ(" ", TrimString("foo bar", "abcdefghijklmnopqrstuvwxyz")); |
| } |
| |
| // Basic functionality tests for HexStringToUInt |
| TEST(StringUtilsTest, HexStringToUIntBasic) |
| { |
| unsigned int uintValue; |
| |
| std::string emptyString; |
| ASSERT_FALSE(HexStringToUInt(emptyString, &uintValue)); |
| |
| std::string testStringA("0xBADF00D"); |
| ASSERT_TRUE(HexStringToUInt(testStringA, &uintValue)); |
| EXPECT_EQ(0xBADF00Du, uintValue); |
| |
| std::string testStringB("0xBADFOOD"); |
| EXPECT_FALSE(HexStringToUInt(testStringB, &uintValue)); |
| |
| std::string testStringC("BADF00D"); |
| EXPECT_TRUE(HexStringToUInt(testStringC, &uintValue)); |
| EXPECT_EQ(0xBADF00Du, uintValue); |
| |
| std::string testStringD("0x BADF00D"); |
| EXPECT_FALSE(HexStringToUInt(testStringD, &uintValue)); |
| } |
| |
| // Basic functionality for NamesMatchWithWildcard. |
| TEST(StringUtilsTest, NamesMatchWithWildcard) |
| { |
| EXPECT_TRUE(NamesMatchWithWildcard("ASDF", "ASDF")); |
| EXPECT_TRUE(NamesMatchWithWildcard("A*", "ASDF")); |
| EXPECT_TRUE(NamesMatchWithWildcard("AS*", "ASDF")); |
| EXPECT_TRUE(NamesMatchWithWildcard("ASD*", "ASDF")); |
| EXPECT_TRUE(NamesMatchWithWildcard("ASDF*", "ASDF")); |
| |
| EXPECT_TRUE(NamesMatchWithWildcard("*F", "ASDF")); |
| EXPECT_TRUE(NamesMatchWithWildcard("*DF", "ASDF")); |
| EXPECT_TRUE(NamesMatchWithWildcard("*SDF", "ASDF")); |
| EXPECT_TRUE(NamesMatchWithWildcard("*ASDF", "ASDF")); |
| |
| EXPECT_TRUE(NamesMatchWithWildcard("AS**", "ASDF")); |
| EXPECT_TRUE(NamesMatchWithWildcard("AS***", "ASDF")); |
| EXPECT_TRUE(NamesMatchWithWildcard("**DF", "ASDF")); |
| EXPECT_TRUE(NamesMatchWithWildcard("***DF", "ASDF")); |
| |
| EXPECT_TRUE(NamesMatchWithWildcard("A*F", "ASDF")); |
| EXPECT_TRUE(NamesMatchWithWildcard("A**F", "ASDF")); |
| EXPECT_TRUE(NamesMatchWithWildcard("*SD*", "ASDF")); |
| EXPECT_TRUE(NamesMatchWithWildcard("*S*D*", "ASDF")); |
| |
| EXPECT_TRUE(NamesMatchWithWildcard("ASD*", "ASDF*")); |
| } |
| |
| // Note: ReadFileToString is harder to test |
| |
| class BeginsWithTest : public testing::Test |
| { |
| public: |
| BeginsWithTest() : mMode(TestMode::CHAR_ARRAY) {} |
| |
| enum class TestMode |
| { |
| CHAR_ARRAY, |
| STRING_AND_CHAR_ARRAY, |
| STRING |
| }; |
| |
| void setMode(TestMode mode) { mMode = mode; } |
| |
| bool runBeginsWith(const char *str, const char *prefix) |
| { |
| if (mMode == TestMode::CHAR_ARRAY) |
| { |
| return BeginsWith(str, prefix); |
| } |
| if (mMode == TestMode::STRING_AND_CHAR_ARRAY) |
| { |
| return BeginsWith(std::string(str), prefix); |
| } |
| return BeginsWith(std::string(str), std::string(prefix)); |
| } |
| |
| void runTest() |
| { |
| ASSERT_FALSE(runBeginsWith("foo", "bar")); |
| ASSERT_FALSE(runBeginsWith("", "foo")); |
| ASSERT_FALSE(runBeginsWith("foo", "foobar")); |
| |
| ASSERT_TRUE(runBeginsWith("foobar", "foo")); |
| ASSERT_TRUE(runBeginsWith("foobar", "")); |
| ASSERT_TRUE(runBeginsWith("foo", "foo")); |
| ASSERT_TRUE(runBeginsWith("", "")); |
| } |
| |
| private: |
| TestMode mMode; |
| }; |
| |
| // Test that BeginsWith works correctly for const char * arguments. |
| TEST_F(BeginsWithTest, CharArrays) |
| { |
| setMode(TestMode::CHAR_ARRAY); |
| runTest(); |
| } |
| |
| // Test that BeginsWith works correctly for std::string and const char * arguments. |
| TEST_F(BeginsWithTest, StringAndCharArray) |
| { |
| setMode(TestMode::STRING_AND_CHAR_ARRAY); |
| runTest(); |
| } |
| |
| // Test that BeginsWith works correctly for std::string arguments. |
| TEST_F(BeginsWithTest, Strings) |
| { |
| setMode(TestMode::STRING); |
| runTest(); |
| } |
| |
| class EndsWithTest : public testing::Test |
| { |
| public: |
| EndsWithTest() : mMode(TestMode::CHAR_ARRAY) {} |
| |
| enum class TestMode |
| { |
| CHAR_ARRAY, |
| STRING_AND_CHAR_ARRAY, |
| STRING |
| }; |
| |
| void setMode(TestMode mode) { mMode = mode; } |
| |
| bool runEndsWith(const char *str, const char *suffix) |
| { |
| if (mMode == TestMode::CHAR_ARRAY) |
| { |
| return EndsWith(str, suffix); |
| } |
| if (mMode == TestMode::STRING_AND_CHAR_ARRAY) |
| { |
| return EndsWith(std::string(str), suffix); |
| } |
| return EndsWith(std::string(str), std::string(suffix)); |
| } |
| |
| void runTest() |
| { |
| ASSERT_FALSE(EndsWith("foo", "bar")); |
| ASSERT_FALSE(EndsWith("", "bar")); |
| ASSERT_FALSE(EndsWith("foo", "foobar")); |
| |
| ASSERT_TRUE(EndsWith("foobar", "bar")); |
| ASSERT_TRUE(EndsWith("foobar", "")); |
| ASSERT_TRUE(EndsWith("bar", "bar")); |
| ASSERT_TRUE(EndsWith("", "")); |
| } |
| |
| private: |
| TestMode mMode; |
| }; |
| |
| // Test that EndsWith works correctly for const char * arguments. |
| TEST_F(EndsWithTest, CharArrays) |
| { |
| setMode(TestMode::CHAR_ARRAY); |
| runTest(); |
| } |
| |
| // Test that EndsWith works correctly for std::string and const char * arguments. |
| TEST_F(EndsWithTest, StringAndCharArray) |
| { |
| setMode(TestMode::STRING_AND_CHAR_ARRAY); |
| runTest(); |
| } |
| |
| // Test that EndsWith works correctly for std::string arguments. |
| TEST_F(EndsWithTest, Strings) |
| { |
| setMode(TestMode::STRING); |
| runTest(); |
| } |
| |
| } // anonymous namespace |