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