// Copyright (C) 2011 The Libphonenumber Authors // // 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. // Author: Philippe Liard #include #include #include "phonenumbers/unicodestring.h" using std::ostream; namespace i18n { namespace phonenumbers { // Used by GTest to print the expected and actual results in case of failure. ostream& operator<<(ostream& out, const UnicodeString& s) { string utf8; s.toUTF8String(utf8); out << utf8; return out; } TEST(UnicodeString, ToUTF8StringWithEmptyString) { UnicodeString s; string utf8; s.toUTF8String(utf8); EXPECT_EQ("", utf8); } TEST(UnicodeString, ToUTF8String) { UnicodeString s("hello"); string utf8; s.toUTF8String(utf8); EXPECT_EQ("hello", utf8); } TEST(UnicodeString, ToUTF8StringWithNonAscii) { UnicodeString s("\xEF\xBC\x95\xEF\xBC\x93" /* "53" */); string utf8; s.toUTF8String(utf8); EXPECT_EQ("\xEF\xBC\x95\xEF\xBC\x93", utf8); } TEST(UnicodeString, AppendCodepoint) { UnicodeString s; s.append('h'); ASSERT_EQ(UnicodeString("h"), s); s.append('e'); EXPECT_EQ(UnicodeString("he"), s); } TEST(UnicodeString, AppendCodepointWithNonAscii) { UnicodeString s; s.append(0xFF15 /* 5 */); ASSERT_EQ(UnicodeString("\xEF\xBC\x95" /* 5 */), s); s.append(0xFF13 /* 3 */); EXPECT_EQ(UnicodeString("\xEF\xBC\x95\xEF\xBC\x93" /* 53 */), s); } TEST(UnicodeString, AppendUnicodeString) { UnicodeString s; s.append(UnicodeString("he")); ASSERT_EQ(UnicodeString("he"), s); s.append(UnicodeString("llo")); EXPECT_EQ(UnicodeString("hello"), s); } TEST(UnicodeString, AppendUnicodeStringWithNonAscii) { UnicodeString s; s.append(UnicodeString("\xEF\xBC\x95" /* 5 */)); ASSERT_EQ(UnicodeString("\xEF\xBC\x95"), s); s.append(UnicodeString("\xEF\xBC\x93" /* 3 */)); EXPECT_EQ(UnicodeString("\xEF\xBC\x95\xEF\xBC\x93" /* 53 */), s); } TEST(UnicodeString, IndexOf) { UnicodeString s("hello"); EXPECT_EQ(0, s.indexOf('h')); EXPECT_EQ(2, s.indexOf('l')); EXPECT_EQ(4, s.indexOf('o')); } TEST(UnicodeString, IndexOfWithNonAscii) { UnicodeString s("\xEF\xBC\x95\xEF\xBC\x93" /* 53 */); EXPECT_EQ(1, s.indexOf(0xFF13 /* 3 */)); } TEST(UnicodeString, ReplaceWithEmptyInputs) { UnicodeString s; s.replace(0, 0, UnicodeString("")); EXPECT_EQ(UnicodeString(""), s); } TEST(UnicodeString, ReplaceWithEmptyReplacement) { UnicodeString s("hello"); s.replace(0, 5, UnicodeString("")); EXPECT_EQ(UnicodeString(""), s); } TEST(UnicodeString, ReplaceBegining) { UnicodeString s("hello world"); s.replace(0, 5, UnicodeString("HELLO")); EXPECT_EQ(UnicodeString("HELLO world"), s); } TEST(UnicodeString, ReplaceMiddle) { UnicodeString s("hello world"); s.replace(5, 1, UnicodeString("AB")); EXPECT_EQ(UnicodeString("helloABworld"), s); } TEST(UnicodeString, ReplaceEnd) { UnicodeString s("hello world"); s.replace(10, 1, UnicodeString("AB")); EXPECT_EQ(UnicodeString("hello worlAB"), s); } TEST(UnicodeString, ReplaceWithNonAscii) { UnicodeString s("hello world"); s.replace(3, 2, UnicodeString("\xEF\xBC\x91\xEF\xBC\x90" /* 10 */)); EXPECT_EQ(UnicodeString("hel\xEF\xBC\x91\xEF\xBC\x90 world"), s); } TEST(UnicodeString, SetCharBegining) { UnicodeString s("hello"); s.setCharAt(0, 'H'); EXPECT_EQ(UnicodeString("Hello"), s); } TEST(UnicodeString, SetCharMiddle) { UnicodeString s("hello"); s.setCharAt(2, 'L'); EXPECT_EQ(UnicodeString("heLlo"), s); } TEST(UnicodeString, SetCharEnd) { UnicodeString s("hello"); s.setCharAt(4, 'O'); EXPECT_EQ(UnicodeString("hellO"), s); } TEST(UnicodeString, SetCharWithNonAscii) { UnicodeString s("hello"); s.setCharAt(4, 0xFF10 /* 0 */); EXPECT_EQ(UnicodeString("hell\xEF\xBC\x90" /* 0 */), s); } TEST(UnicodeString, TempSubStringWithEmptyString) { EXPECT_EQ(UnicodeString(""), UnicodeString().tempSubString(0, 0)); } TEST(UnicodeString, TempSubStringWithInvalidInputs) { UnicodeString s("hello"); // tempSubString() returns an empty unicode string if one of the provided // paramaters is out of range. EXPECT_EQ(UnicodeString(""), s.tempSubString(6)); EXPECT_EQ(UnicodeString(""), s.tempSubString(2, 6)); } TEST(UnicodeString, TempSubString) { UnicodeString s("hello"); EXPECT_EQ(UnicodeString(""), s.tempSubString(0, 0)); EXPECT_EQ(UnicodeString("h"), s.tempSubString(0, 1)); EXPECT_EQ(UnicodeString("hello"), s.tempSubString(0, 5)); EXPECT_EQ(UnicodeString("llo"), s.tempSubString(2, 3)); } TEST(UnicodeString, TempSubStringWithNoLength) { UnicodeString s("hello"); EXPECT_EQ(UnicodeString("hello"), s.tempSubString(0)); EXPECT_EQ(UnicodeString("llo"), s.tempSubString(2)); } TEST(UnicodeString, TempSubStringWithNonAscii) { UnicodeString s("hel\xEF\xBC\x91\xEF\xBC\x90" /* 10 */); EXPECT_EQ(UnicodeString("\xEF\xBC\x91" /* 1 */), s.tempSubString(3, 1)); } TEST(UnicodeString, OperatorEqual) { UnicodeString s("hello"); s = UnicodeString("Hello"); EXPECT_EQ(UnicodeString("Hello"), s); } TEST(UnicodeString, OperatorEqualWithNonAscii) { UnicodeString s("hello"); s = UnicodeString("hel\xEF\xBC\x91\xEF\xBC\x90" /* 10 */); EXPECT_EQ(UnicodeString("hel\xEF\xBC\x91\xEF\xBC\x90"), s); } TEST(UnicodeString, OperatorBracket) { UnicodeString s("hello"); EXPECT_EQ('h', s[0]); EXPECT_EQ('e', s[1]); EXPECT_EQ('l', s[2]); EXPECT_EQ('l', s[3]); EXPECT_EQ('o', s[4]); } TEST(UnicodeString, OperatorBracketWithNonAscii) { UnicodeString s("hel\xEF\xBC\x91\xEF\xBC\x90" /* 10 */); EXPECT_EQ('h', s[0]); EXPECT_EQ('e', s[1]); EXPECT_EQ('l', s[2]); EXPECT_EQ(0xFF11 /* 1 */, s[3]); EXPECT_EQ(0xFF10 /* 0 */, s[4]); } TEST(UnicodeString, OperatorBracketWithIteratorCacheInvalidation) { UnicodeString s("hello"); EXPECT_EQ('h', s[0]); EXPECT_EQ('e', s[1]); // Modify the string which should invalidate the iterator cache. s.setCharAt(1, 'E'); EXPECT_EQ(UnicodeString("hEllo"), s); EXPECT_EQ('E', s[1]); // Get the previous character which should invalidate the iterator cache. EXPECT_EQ('h', s[0]); EXPECT_EQ('o', s[4]); } } // namespace phonenumbers } // namespace i18n