11767c5feSopenharmony_ci// Copyright (C) 2011 The Libphonenumber Authors 21767c5feSopenharmony_ci// 31767c5feSopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 41767c5feSopenharmony_ci// you may not use this file except in compliance with the License. 51767c5feSopenharmony_ci// You may obtain a copy of the License at 61767c5feSopenharmony_ci// 71767c5feSopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 81767c5feSopenharmony_ci// 91767c5feSopenharmony_ci// Unless required by applicable law or agreed to in writing, software 101767c5feSopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 111767c5feSopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121767c5feSopenharmony_ci// See the License for the specific language governing permissions and 131767c5feSopenharmony_ci// limitations under the License. 141767c5feSopenharmony_ci 151767c5feSopenharmony_ci// Author: Philippe Liard 161767c5feSopenharmony_ci 171767c5feSopenharmony_ci#include "phonenumbers/stringutil.h" 181767c5feSopenharmony_ci 191767c5feSopenharmony_ci#include <string> 201767c5feSopenharmony_ci#include <vector> 211767c5feSopenharmony_ci 221767c5feSopenharmony_ci#include <gtest/gtest.h> 231767c5feSopenharmony_ci 241767c5feSopenharmony_ciusing std::string; 251767c5feSopenharmony_ciusing std::vector; 261767c5feSopenharmony_ci 271767c5feSopenharmony_cinamespace i18n { 281767c5feSopenharmony_cinamespace phonenumbers { 291767c5feSopenharmony_ci 301767c5feSopenharmony_ci// Test operator+(const string&, int). 311767c5feSopenharmony_ciTEST(StringUtilTest, OperatorPlus) { 321767c5feSopenharmony_ci EXPECT_EQ("hello10", string("hello") + 10); 331767c5feSopenharmony_ci} 341767c5feSopenharmony_ci 351767c5feSopenharmony_ci// Test SimpleItoa implementation. 361767c5feSopenharmony_ciTEST(StringUtilTest, SimpleItoa) { 371767c5feSopenharmony_ci EXPECT_EQ("10", SimpleItoa(10)); 381767c5feSopenharmony_ci} 391767c5feSopenharmony_ci 401767c5feSopenharmony_ciTEST(StringUtilTest, HasPrefixString) { 411767c5feSopenharmony_ci EXPECT_TRUE(HasPrefixString("hello world", "hello")); 421767c5feSopenharmony_ci EXPECT_FALSE(HasPrefixString("hello world", "hellO")); 431767c5feSopenharmony_ci} 441767c5feSopenharmony_ci 451767c5feSopenharmony_ciTEST(StringUtilTest, FindNthWithEmptyString) { 461767c5feSopenharmony_ci EXPECT_EQ(string::npos, FindNth("", 'a', 1)); 471767c5feSopenharmony_ci} 481767c5feSopenharmony_ci 491767c5feSopenharmony_ciTEST(StringUtilTest, FindNthWithNNegative) { 501767c5feSopenharmony_ci EXPECT_EQ(string::npos, FindNth("hello world", 'o', -1)); 511767c5feSopenharmony_ci} 521767c5feSopenharmony_ci 531767c5feSopenharmony_ciTEST(StringUtilTest, FindNthWithNTooHigh) { 541767c5feSopenharmony_ci EXPECT_EQ(string::npos, FindNth("hello world", 'o', 3)); 551767c5feSopenharmony_ci} 561767c5feSopenharmony_ci 571767c5feSopenharmony_ciTEST(StringUtilTest, FindNth) { 581767c5feSopenharmony_ci EXPECT_EQ(7U, FindNth("hello world", 'o', 2)); 591767c5feSopenharmony_ci} 601767c5feSopenharmony_ci 611767c5feSopenharmony_ciTEST(StringUtilTest, SplitStringUsingWithEmptyString) { 621767c5feSopenharmony_ci vector<string> result; 631767c5feSopenharmony_ci SplitStringUsing("", ':', &result); 641767c5feSopenharmony_ci EXPECT_EQ(0U, result.size()); 651767c5feSopenharmony_ci} 661767c5feSopenharmony_ci 671767c5feSopenharmony_ciTEST(StringUtilTest, SplitStringUsing) { 681767c5feSopenharmony_ci vector<string> result; 691767c5feSopenharmony_ci SplitStringUsing(":hello:world:", ':', &result); 701767c5feSopenharmony_ci EXPECT_EQ(2U, result.size()); 711767c5feSopenharmony_ci EXPECT_EQ("hello", result[0]); 721767c5feSopenharmony_ci EXPECT_EQ("world", result[1]); 731767c5feSopenharmony_ci} 741767c5feSopenharmony_ci 751767c5feSopenharmony_ciTEST(StringUtilTest, SplitStringUsingIgnoresEmptyToken) { 761767c5feSopenharmony_ci vector<string> result; 771767c5feSopenharmony_ci SplitStringUsing("hello::world", ':', &result); 781767c5feSopenharmony_ci EXPECT_EQ(2U, result.size()); 791767c5feSopenharmony_ci EXPECT_EQ("hello", result[0]); 801767c5feSopenharmony_ci EXPECT_EQ("world", result[1]); 811767c5feSopenharmony_ci} 821767c5feSopenharmony_ci 831767c5feSopenharmony_ci// Test TryStripPrefixString. 841767c5feSopenharmony_ciTEST(StringUtilTest, TryStripPrefixString) { 851767c5feSopenharmony_ci string s; 861767c5feSopenharmony_ci 871767c5feSopenharmony_ci EXPECT_TRUE(TryStripPrefixString("hello world", "hello", &s)); 881767c5feSopenharmony_ci EXPECT_EQ(" world", s); 891767c5feSopenharmony_ci s.clear(); 901767c5feSopenharmony_ci 911767c5feSopenharmony_ci EXPECT_FALSE(TryStripPrefixString("hello world", "helloa", &s)); 921767c5feSopenharmony_ci s.clear(); 931767c5feSopenharmony_ci 941767c5feSopenharmony_ci EXPECT_TRUE(TryStripPrefixString("hello world", "", &s)); 951767c5feSopenharmony_ci EXPECT_EQ("hello world", s); 961767c5feSopenharmony_ci s.clear(); 971767c5feSopenharmony_ci 981767c5feSopenharmony_ci EXPECT_FALSE(TryStripPrefixString("", "hello", &s)); 991767c5feSopenharmony_ci s.clear(); 1001767c5feSopenharmony_ci} 1011767c5feSopenharmony_ci 1021767c5feSopenharmony_ci// Test HasSuffixString. 1031767c5feSopenharmony_ciTEST(StringUtilTest, HasSuffixString) { 1041767c5feSopenharmony_ci EXPECT_TRUE(HasSuffixString("hello world", "hello world")); 1051767c5feSopenharmony_ci EXPECT_TRUE(HasSuffixString("hello world", "world")); 1061767c5feSopenharmony_ci EXPECT_FALSE(HasSuffixString("hello world", "world!")); 1071767c5feSopenharmony_ci EXPECT_TRUE(HasSuffixString("hello world", "")); 1081767c5feSopenharmony_ci EXPECT_FALSE(HasSuffixString("", "hello")); 1091767c5feSopenharmony_ci} 1101767c5feSopenharmony_ci 1111767c5feSopenharmony_ci// Test safe_strto32. 1121767c5feSopenharmony_ciTEST(StringUtilTest, safe_strto32) { 1131767c5feSopenharmony_ci int32 n; 1141767c5feSopenharmony_ci 1151767c5feSopenharmony_ci safe_strto32("0", &n); 1161767c5feSopenharmony_ci EXPECT_EQ(0, n); 1171767c5feSopenharmony_ci 1181767c5feSopenharmony_ci safe_strto32("16", &n); 1191767c5feSopenharmony_ci EXPECT_EQ(16, n); 1201767c5feSopenharmony_ci 1211767c5feSopenharmony_ci safe_strto32("2147483647", &n); 1221767c5feSopenharmony_ci EXPECT_EQ(2147483647, n); 1231767c5feSopenharmony_ci 1241767c5feSopenharmony_ci safe_strto32("-2147483648", &n); 1251767c5feSopenharmony_ci EXPECT_EQ(-2147483648LL, n); 1261767c5feSopenharmony_ci} 1271767c5feSopenharmony_ci 1281767c5feSopenharmony_ci// Test safe_strtou64. 1291767c5feSopenharmony_ciTEST(StringUtilTest, safe_strtou64) { 1301767c5feSopenharmony_ci uint64 n; 1311767c5feSopenharmony_ci 1321767c5feSopenharmony_ci safe_strtou64("0", &n); 1331767c5feSopenharmony_ci EXPECT_EQ(0U, n); 1341767c5feSopenharmony_ci 1351767c5feSopenharmony_ci safe_strtou64("16", &n); 1361767c5feSopenharmony_ci EXPECT_EQ(16U, n); 1371767c5feSopenharmony_ci 1381767c5feSopenharmony_ci safe_strtou64("18446744073709551615", &n); 1391767c5feSopenharmony_ci EXPECT_EQ(18446744073709551615ULL, n); 1401767c5feSopenharmony_ci} 1411767c5feSopenharmony_ci 1421767c5feSopenharmony_ci// Test strrmm. 1431767c5feSopenharmony_ciTEST(StringUtilTest, strrmm) { 1441767c5feSopenharmony_ci string input("hello"); 1451767c5feSopenharmony_ci 1461767c5feSopenharmony_ci strrmm(&input, ""); 1471767c5feSopenharmony_ci EXPECT_EQ(input, input); 1481767c5feSopenharmony_ci 1491767c5feSopenharmony_ci string empty; 1501767c5feSopenharmony_ci strrmm(&empty, ""); 1511767c5feSopenharmony_ci EXPECT_EQ("", empty); 1521767c5feSopenharmony_ci 1531767c5feSopenharmony_ci strrmm(&empty, "aa"); 1541767c5feSopenharmony_ci EXPECT_EQ("", empty); 1551767c5feSopenharmony_ci 1561767c5feSopenharmony_ci strrmm(&input, "h"); 1571767c5feSopenharmony_ci EXPECT_EQ("ello", input); 1581767c5feSopenharmony_ci 1591767c5feSopenharmony_ci strrmm(&input, "el"); 1601767c5feSopenharmony_ci EXPECT_EQ("o", input); 1611767c5feSopenharmony_ci} 1621767c5feSopenharmony_ci 1631767c5feSopenharmony_ci// Test GlobalReplaceSubstring. 1641767c5feSopenharmony_ciTEST(StringUtilTest, GlobalReplaceSubstring) { 1651767c5feSopenharmony_ci string input("hello"); 1661767c5feSopenharmony_ci 1671767c5feSopenharmony_ci EXPECT_EQ(0, GlobalReplaceSubstring("aaa", "", &input)); 1681767c5feSopenharmony_ci EXPECT_EQ("hello", input); 1691767c5feSopenharmony_ci 1701767c5feSopenharmony_ci EXPECT_EQ(0, GlobalReplaceSubstring("", "aaa", &input)); 1711767c5feSopenharmony_ci EXPECT_EQ("hello", input); 1721767c5feSopenharmony_ci 1731767c5feSopenharmony_ci EXPECT_EQ(0, GlobalReplaceSubstring("", "", &input)); 1741767c5feSopenharmony_ci EXPECT_EQ("hello", input); 1751767c5feSopenharmony_ci 1761767c5feSopenharmony_ci EXPECT_EQ(0, GlobalReplaceSubstring("aaa", "bbb", &input)); 1771767c5feSopenharmony_ci EXPECT_EQ("hello", input); 1781767c5feSopenharmony_ci 1791767c5feSopenharmony_ci EXPECT_EQ(1, GlobalReplaceSubstring("o", "o world", &input)); 1801767c5feSopenharmony_ci ASSERT_EQ("hello world", input); 1811767c5feSopenharmony_ci 1821767c5feSopenharmony_ci EXPECT_EQ(2, GlobalReplaceSubstring("o", "O", &input)); 1831767c5feSopenharmony_ci EXPECT_EQ("hellO wOrld", input); 1841767c5feSopenharmony_ci} 1851767c5feSopenharmony_ci 1861767c5feSopenharmony_ci// Test the StringHolder class. 1871767c5feSopenharmony_ciTEST(StringUtilTest, StringHolder) { 1881767c5feSopenharmony_ci // Test with C string. 1891767c5feSopenharmony_ci static const char cstring[] = "aaa"; 1901767c5feSopenharmony_ci StringHolder sh1(cstring); 1911767c5feSopenharmony_ci EXPECT_EQ(cstring, sh1.GetCString()); 1921767c5feSopenharmony_ci 1931767c5feSopenharmony_ci // Test with absl::string_view. 1941767c5feSopenharmony_ci string s = "aaa"; 1951767c5feSopenharmony_ci StringHolder sh2(s); 1961767c5feSopenharmony_ci EXPECT_EQ(cstring, sh2.GetString()); 1971767c5feSopenharmony_ci 1981767c5feSopenharmony_ci // Test GetLength(). 1991767c5feSopenharmony_ci string s2 = "hello"; 2001767c5feSopenharmony_ci StringHolder sh3(s2); 2011767c5feSopenharmony_ci EXPECT_EQ(5U, sh3.Length()); 2021767c5feSopenharmony_ci 2031767c5feSopenharmony_ci // Test with uint64. 2041767c5feSopenharmony_ci StringHolder sh4(42); 2051767c5feSopenharmony_ci static const char cstring2[] = "42";; 2061767c5feSopenharmony_ci EXPECT_EQ(cstring2, sh4.GetString()); 2071767c5feSopenharmony_ci} 2081767c5feSopenharmony_ci 2091767c5feSopenharmony_ci// Test the operator+=(string& lhs, const StringHolder& rhs) implementation. 2101767c5feSopenharmony_ciTEST(StringUtilTest, OperatorPlusEquals) { 2111767c5feSopenharmony_ci // Test with a const char* string to append. 2121767c5feSopenharmony_ci string s = "h"; 2131767c5feSopenharmony_ci static const char append1[] = "ello"; 2141767c5feSopenharmony_ci s += StringHolder(append1); // force StringHolder usage 2151767c5feSopenharmony_ci 2161767c5feSopenharmony_ci EXPECT_EQ("hello", s); 2171767c5feSopenharmony_ci 2181767c5feSopenharmony_ci // Test with a std::string to append. 2191767c5feSopenharmony_ci s = "h"; 2201767c5feSopenharmony_ci string append2 = "ello"; 2211767c5feSopenharmony_ci s += StringHolder(append2); // force StringHolder usage 2221767c5feSopenharmony_ci 2231767c5feSopenharmony_ci EXPECT_EQ("hello", s); 2241767c5feSopenharmony_ci} 2251767c5feSopenharmony_ci 2261767c5feSopenharmony_ci// Test the StrCat implementations 2271767c5feSopenharmony_ciTEST(StringUtilTest, StrCat) { 2281767c5feSopenharmony_ci string s; 2291767c5feSopenharmony_ci 2301767c5feSopenharmony_ci // Test with 2 arguments. 2311767c5feSopenharmony_ci s = StrCat("a", "b"); 2321767c5feSopenharmony_ci EXPECT_EQ("ab", s); 2331767c5feSopenharmony_ci 2341767c5feSopenharmony_ci // Test with 3 arguments. 2351767c5feSopenharmony_ci s = StrCat("a", "b", "c"); 2361767c5feSopenharmony_ci EXPECT_EQ("abc", s); 2371767c5feSopenharmony_ci 2381767c5feSopenharmony_ci // Test with 4 arguments. 2391767c5feSopenharmony_ci s = StrCat("a", "b", "c", "d"); 2401767c5feSopenharmony_ci EXPECT_EQ("abcd", s); 2411767c5feSopenharmony_ci 2421767c5feSopenharmony_ci // Test with 5 arguments. 2431767c5feSopenharmony_ci s = StrCat("a", "b", "c", "d", "e"); 2441767c5feSopenharmony_ci EXPECT_EQ("abcde", s); 2451767c5feSopenharmony_ci 2461767c5feSopenharmony_ci // Test with 6 arguments. 2471767c5feSopenharmony_ci s = StrCat("a", "b", "c", "d", "e", "f"); 2481767c5feSopenharmony_ci EXPECT_EQ("abcdef", s); 2491767c5feSopenharmony_ci 2501767c5feSopenharmony_ci // Test with 7 arguments. 2511767c5feSopenharmony_ci s = StrCat("a", "b", "c", "d", "e", "f", "g"); 2521767c5feSopenharmony_ci EXPECT_EQ("abcdefg", s); 2531767c5feSopenharmony_ci 2541767c5feSopenharmony_ci // Test with 8 arguments. 2551767c5feSopenharmony_ci s = StrCat("a", "b", "c", "d", "e", "f", "g", "h"); 2561767c5feSopenharmony_ci EXPECT_EQ("abcdefgh", s); 2571767c5feSopenharmony_ci 2581767c5feSopenharmony_ci // Test with 9 arguments. 2591767c5feSopenharmony_ci s = StrCat("a", "b", "c", "d", "e", "f", "g", "h", "i"); 2601767c5feSopenharmony_ci EXPECT_EQ("abcdefghi", s); 2611767c5feSopenharmony_ci 2621767c5feSopenharmony_ci // Test with 11 arguments. 2631767c5feSopenharmony_ci s = StrCat("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"); 2641767c5feSopenharmony_ci EXPECT_EQ("abcdefghijk", s); 2651767c5feSopenharmony_ci} 2661767c5feSopenharmony_ci 2671767c5feSopenharmony_ci// Test the StrAppend implementations. 2681767c5feSopenharmony_ciTEST(StringUtilTest, StrAppend) { 2691767c5feSopenharmony_ci string s; 2701767c5feSopenharmony_ci 2711767c5feSopenharmony_ci // Test with 1 argument. 2721767c5feSopenharmony_ci StrAppend(&s, "a"); 2731767c5feSopenharmony_ci ASSERT_EQ("a", s); 2741767c5feSopenharmony_ci 2751767c5feSopenharmony_ci // Test with 2 arguments. 2761767c5feSopenharmony_ci StrAppend(&s, "b", "c"); 2771767c5feSopenharmony_ci ASSERT_EQ("abc", s); 2781767c5feSopenharmony_ci 2791767c5feSopenharmony_ci // Test with 3 arguments. 2801767c5feSopenharmony_ci StrAppend(&s, "d", "e", "f"); 2811767c5feSopenharmony_ci ASSERT_EQ("abcdef", s); 2821767c5feSopenharmony_ci 2831767c5feSopenharmony_ci // Test with 4 arguments. 2841767c5feSopenharmony_ci StrAppend(&s, "g", "h", "i", "j"); 2851767c5feSopenharmony_ci ASSERT_EQ("abcdefghij", s); 2861767c5feSopenharmony_ci 2871767c5feSopenharmony_ci // Test with 5 arguments. 2881767c5feSopenharmony_ci StrAppend(&s, "k", "l", "m", "n", "o"); 2891767c5feSopenharmony_ci ASSERT_EQ("abcdefghijklmno", s); 2901767c5feSopenharmony_ci 2911767c5feSopenharmony_ci // Test with int argument. 2921767c5feSopenharmony_ci StrAppend(&s, 42); 2931767c5feSopenharmony_ci ASSERT_EQ("abcdefghijklmno42", s); 2941767c5feSopenharmony_ci} 2951767c5feSopenharmony_ci 2961767c5feSopenharmony_ci} // namespace phonenumbers 2971767c5feSopenharmony_ci} // namespace i18n 298