| /* -*- c++ -*- */ |
| /* |
| * Copyright (C) 2009 The Android Open Source Project |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
| * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
| * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
| * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
| * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS |
| * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
| * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| * SUCH DAMAGE. |
| */ |
| |
| #include "../include/string" |
| #ifndef ANDROID_ASTL_STRING__ |
| #error "Wrong header included!!" |
| #endif |
| #include <climits> |
| #include <cstring> |
| #include <algorithm> |
| #include <list> |
| #include "common.h" |
| |
| |
| namespace android { |
| using std::string; |
| |
| bool testConstructorCString() |
| { |
| string empty_str1; |
| EXPECT_TRUE(empty_str1.size() == 0); |
| EXPECT_TRUE(empty_str1.capacity() == 0); |
| |
| string empty_str2(""); |
| EXPECT_TRUE(empty_str2.size() == 0); |
| |
| const char empty_as_array[] = ""; |
| string empty_str3(empty_as_array); |
| EXPECT_TRUE(empty_str3.size() == 0); |
| |
| const char literal[] = "scott mills cracks me up"; |
| string str1(literal); |
| EXPECT_TRUE(strcmp(literal, str1.c_str()) == 0); |
| |
| string str2(literal, 11); |
| EXPECT_TRUE(strcmp("scott mills", str2.c_str()) == 0); |
| |
| string str3(literal, sizeof(literal)); |
| EXPECT_TRUE(strcmp(literal, str3.c_str()) == 0); |
| |
| // Pass the end of the string => still ok, there is \0 |
| string str4(literal, sizeof(literal) + 1); |
| EXPECT_TRUE(str4.size() == sizeof(literal) + 1); |
| |
| string str5(literal, literal + 11); |
| EXPECT_TRUE(strcmp("scott mills", str5.c_str()) == 0); |
| |
| const char text[] = {'l','a','d','y',' ','g','a','g','a'}; |
| |
| string str6(text, ARRAYSIZE(text)); |
| EXPECT_TRUE(str6 == "lady gaga"); |
| |
| string str7(NULL); |
| EXPECT_TRUE(empty_str1.size() == 0); |
| EXPECT_TRUE(empty_str1.empty()); |
| return true; |
| } |
| |
| bool testConstructorString() |
| { |
| string empty_str1; |
| string empty_str2; |
| EXPECT_TRUE(empty_str1.c_str() == empty_str2.c_str()); |
| |
| string empty_str3(empty_str2); |
| EXPECT_TRUE(empty_str3.size() == 0); |
| |
| const char string_with_nulls[] = "contains 2 \0 bytes \0."; |
| string str1 (string_with_nulls, 21); |
| EXPECT_TRUE(str1.size() == 21); |
| |
| string str2 (str1); |
| EXPECT_TRUE(str1.size() == 21); |
| |
| const string str3("scott mills cracks me up"); |
| string str4(str3, 12); |
| EXPECT_TRUE(strcmp("cracks me up", str4.c_str()) == 0); |
| |
| string str5(str3, 12, 6); |
| EXPECT_TRUE(strcmp("cracks", str5.c_str()) == 0); |
| |
| string str6(str3, 23); |
| EXPECT_TRUE(strcmp("p", str6.c_str()) == 0); |
| |
| string str7(str3, 24); |
| EXPECT_TRUE(strcmp("", str7.c_str()) == 0); |
| |
| string str8(str3, 23, 1); |
| EXPECT_TRUE(strcmp("p", str8.c_str()) == 0); |
| |
| string str9(str3, 24, 1); |
| EXPECT_TRUE(strcmp("", str9.c_str()) == 0); |
| |
| return true; |
| } |
| |
| bool testConstructorPointers() |
| { |
| const string empty; |
| char data[] = "a 16 char string"; |
| |
| string str01(data, data + 0); |
| EXPECT_TRUE(str01.c_str() == empty.c_str()); |
| |
| string str02(data, data + 1); |
| EXPECT_TRUE(str02 == "a"); |
| |
| string str03(data + 2, data + 16); |
| EXPECT_TRUE(str03 == "16 char string"); |
| |
| string str04(data + 15, data + 16); |
| EXPECT_TRUE(str04 == "g"); |
| |
| string str05(data + 16, data + 16); |
| EXPECT_TRUE(str05 == ""); |
| |
| return true; |
| } |
| |
| bool testConstructorRepeatChar() |
| { |
| string str01(0, 'c'); |
| |
| EXPECT_TRUE(str01.empty()); |
| EXPECT_TRUE(str01.size() == 0); |
| EXPECT_TRUE(str01.capacity() == 0); |
| |
| string str02(10, 'c'); |
| |
| EXPECT_TRUE(!str02.empty()); |
| EXPECT_TRUE(str02.size() == 10); |
| EXPECT_TRUE(str02.capacity() == 10); |
| |
| for (size_t i = 0; i < 100; ++i) |
| { |
| string str03(i, 'x'); |
| |
| EXPECT_TRUE(str03[i] == '\0'); |
| EXPECT_TRUE(str03.length() == i); |
| |
| str03.reserve(i + 20); |
| EXPECT_TRUE(str03.capacity() == i + 20); |
| EXPECT_TRUE(str03.length() == i); |
| EXPECT_TRUE(str03[i] == '\0'); |
| } |
| |
| return true; |
| } |
| |
| bool testConstructorInvalidValues() |
| { |
| const string empty; |
| const string str01("a 16 char string"); |
| |
| EXPECT_TRUE(str01.size() == 16); |
| |
| string str02(str01, 17, 1); // invalid index |
| EXPECT_TRUE(str02.c_str() == empty.c_str()); |
| |
| string str03(str01, 17, 0); // invalid index |
| EXPECT_TRUE(str03.c_str() == empty.c_str()); |
| |
| string str04(str01, -1, 0); // invalid index |
| EXPECT_TRUE(str04.c_str() == empty.c_str()); |
| |
| string str05(str01, 0, 17); // invalid length -> clamped |
| EXPECT_TRUE(str05 == str01); |
| |
| string str06(str01, 17); // invalid index |
| EXPECT_TRUE(str06.c_str() == empty.c_str()); |
| |
| char end[] = "a string"; |
| char *begin = end + 1; // begin after end. |
| |
| string str07(begin, end); |
| EXPECT_TRUE(str07.c_str() == empty.c_str()); |
| |
| return true; |
| } |
| |
| bool testSize() |
| { |
| string str01; |
| EXPECT_TRUE(str01.size() == 0); |
| EXPECT_TRUE(str01.length() == 0); |
| |
| str01 += "a string."; |
| |
| EXPECT_TRUE(str01.size() == 9); |
| EXPECT_TRUE(str01.length() == 9); |
| |
| return true; |
| } |
| |
| bool testCString() |
| { |
| string str01; |
| string str02; |
| |
| // Should point to the same empty string. |
| EXPECT_TRUE(str01.c_str() == str02.c_str()); |
| // c_str() == data() |
| EXPECT_TRUE(str01.c_str() == str01.data()); |
| EXPECT_TRUE(str01.empty()); |
| |
| const char text[] = "a string"; |
| str01 += text; |
| EXPECT_TRUE(strcmp(str01.c_str(), text) == 0); |
| EXPECT_TRUE(strcmp(str01.data(), text) == 0); |
| EXPECT_TRUE(!str01.empty()); |
| |
| // after a clear, points back to the original empty string. |
| str01.clear(); |
| EXPECT_TRUE(str01.c_str() == str02.c_str()); |
| EXPECT_TRUE(str01.empty()); |
| |
| return true; |
| } |
| |
| bool testReserve() |
| { |
| string str01; |
| size_t capacity = str01.capacity(); |
| |
| EXPECT_TRUE(0 == capacity); |
| |
| str01.reserve(5); |
| EXPECT_TRUE(5 == str01.capacity()); |
| str01.reserve(0); |
| EXPECT_TRUE(0 == str01.capacity()); |
| |
| string str02("7 chars"); |
| EXPECT_TRUE(7 == str02.capacity()); |
| EXPECT_TRUE(7 == str02.size()); |
| |
| str02.reserve(10); |
| EXPECT_TRUE(str02 == "7 chars"); |
| EXPECT_TRUE(10 == str02.capacity()); |
| EXPECT_TRUE(7 == str02.size()); |
| |
| str02.reserve(6); // no effect |
| EXPECT_TRUE(str02 == "7 chars"); |
| EXPECT_TRUE(10 == str02.capacity()); |
| EXPECT_TRUE(7 == str02.size()); |
| |
| string str03; |
| const string str04; |
| |
| // Both point to kEmptyString. |
| EXPECT_TRUE(str03.c_str() == str04.c_str()); |
| |
| str03.reserve(); |
| EXPECT_TRUE(0 == str03.capacity()); |
| EXPECT_TRUE(str03.c_str() == str04.c_str()); |
| |
| str03.reserve(10); |
| EXPECT_TRUE(10 == str03.capacity()); |
| // Not pointing at the empty string anymore. |
| EXPECT_TRUE(str03.c_str() != str04.c_str()); |
| |
| str03.reserve(); |
| EXPECT_TRUE(0 == str03.capacity()); |
| // c_str() points back to the empty string. |
| EXPECT_TRUE(str03.c_str() == str04.c_str()); |
| |
| str03.reserve(10); |
| str03.append("7 chars"); |
| EXPECT_TRUE(str03 == "7 chars"); |
| str03.reserve(); // shrink to fit. |
| EXPECT_TRUE(7 == str03.capacity()); |
| |
| string str05 = "twelve chars"; |
| string str06 = str05; |
| str05.reserve(1); |
| EXPECT_TRUE(str05.capacity() == 12); |
| |
| |
| for (size_t i = 1; i <= 100; i *= 2) |
| { |
| string str(i, 'x'); |
| str.reserve(3 * i); |
| EXPECT_TRUE(str.capacity() == 3 * i); |
| |
| str.reserve(2 * i); |
| EXPECT_TRUE(str.capacity() == 2 * i); |
| |
| str.reserve(); |
| EXPECT_TRUE(str.capacity() == i); |
| } |
| |
| // Check overflow. |
| string str07; |
| |
| str07.reserve(10); |
| EXPECT_TRUE(str07.capacity() == 10); |
| |
| str07.reserve(kMaxSizeT); |
| |
| EXPECT_TRUE(str07.capacity() == 10); |
| |
| return true; |
| } |
| |
| bool testAppend() |
| { |
| string str1; |
| const char *text = "You spin my head right round."; |
| |
| str1.append(text); |
| EXPECT_TRUE(str1 == text); |
| |
| str1.append(" Flo Rida."); |
| EXPECT_TRUE(str1 == "You spin my head right round. Flo Rida."); |
| |
| string str2; |
| str2.append(str1); |
| EXPECT_TRUE(str2 == "You spin my head right round. Flo Rida."); |
| |
| string str3("You spin "); |
| str3.append("my head right round."); |
| EXPECT_TRUE(str3 == "You spin my head right round."); |
| |
| string str4("You spin "); |
| string str5("my head right round."); |
| str4.append(str5); |
| EXPECT_TRUE(str4 == "You spin my head right round."); |
| |
| string str6(""); |
| string str7(""); |
| str6.append(str7); |
| EXPECT_TRUE(str6 == ""); |
| EXPECT_TRUE(str6.empty()); |
| |
| string str8; |
| str8.append("a"); |
| EXPECT_TRUE(str8 == "a"); |
| |
| const char more_text[] = {'l','a','d','y',' ','g','a','g','a'}; |
| |
| string str9; |
| str9.append(more_text, ARRAYSIZE(more_text)); |
| EXPECT_TRUE(str9 == string(more_text, ARRAYSIZE(more_text))); |
| |
| string str10; |
| str10.append("", 0); |
| EXPECT_TRUE(str10.size() == 0 ); |
| str10.append(text, strlen(text)); |
| EXPECT_TRUE(str10 == "You spin my head right round."); |
| |
| string str11; |
| str11.append("You spin my head right round.", 5, 11); |
| |
| EXPECT_TRUE(str11 == "pin my head"); |
| |
| // Append overflow |
| string str12("original"); |
| char dummy[] = "unused"; |
| // We lie about the size but that is ok. Since the lenght of the new string |
| // is going to be kMaxSizeT, the call will have not effect (there is no |
| // space for the trailing '\0'). |
| str12.append(dummy, kMaxSizeT); |
| EXPECT_TRUE(str12 == "original"); |
| |
| // Append iterator. |
| { |
| string str1("once upon "); |
| const string str2("a time"); |
| |
| str1.append(str2.begin(), str2.end()); |
| EXPECT_TRUE(str1.size() == 16); |
| EXPECT_TRUE(str1 == "once upon a time"); |
| } |
| { |
| string str1("once upon "); |
| string str2("a time"); |
| |
| str1.append(str2.begin(), str2.begin()); |
| EXPECT_TRUE(str1.size() == 10); |
| EXPECT_TRUE(str1 == "once upon "); |
| } |
| { |
| string str1; |
| string str2("hello"); |
| |
| str1.append(str2.begin(), str2.end()); |
| EXPECT_TRUE(str1.size() == 5); |
| EXPECT_TRUE(str1 == "hello"); |
| } |
| { |
| string str1("hello "); |
| std::list<char> list1; |
| list1.push_back('w'); |
| list1.push_back('o'); |
| list1.push_back('r'); |
| list1.push_back('l'); |
| list1.push_back('d'); |
| str1.append(list1.begin(), list1.end()); |
| EXPECT_TRUE(str1 == "hello world"); |
| } |
| return true; |
| } |
| |
| bool testAppendOperator() |
| { |
| string str1; |
| const char *text = "You spin my head right round."; |
| |
| str1 += text; |
| EXPECT_TRUE(str1 == text); |
| |
| str1 += " Flo Rida."; |
| EXPECT_TRUE(str1 == "You spin my head right round. Flo Rida."); |
| |
| string str2; |
| str2 += str1; |
| EXPECT_TRUE(str2 == "You spin my head right round. Flo Rida."); |
| |
| string str3("You spin "); |
| str3 += "my head right round."; |
| EXPECT_TRUE(str3 == "You spin my head right round."); |
| |
| string str4("You spin "); |
| string str5("my head right round."); |
| str4 += str5; |
| EXPECT_TRUE(str4 == "You spin my head right round."); |
| |
| string str6(""); |
| string str7(""); |
| str6 += str7; |
| EXPECT_TRUE(str6 == ""); |
| EXPECT_TRUE(str6.empty()); |
| |
| string str8; |
| str8 += "a"; |
| EXPECT_TRUE(str8 == "a"); |
| |
| const char more_text[] = {'l','a','d','y',' ','g','a','g','a'}; |
| |
| string str9; |
| for (size_t i = 0; i < ARRAYSIZE(more_text); ++i) |
| { |
| str9 += more_text[i]; |
| } |
| EXPECT_TRUE(str9 == "lady gaga"); |
| |
| str9 += (const char *)NULL; |
| EXPECT_TRUE(str9 == "lady gaga"); |
| |
| string str10(more_text, ARRAYSIZE(more_text)); |
| EXPECT_TRUE(str10 == "lady gaga"); |
| str10 += '\0'; |
| EXPECT_TRUE(str10 == "lady gaga"); |
| EXPECT_TRUE(str10 == string("lady gaga\0", 10)); |
| str10 += 'x'; |
| EXPECT_TRUE(str10 == string("lady gaga\0x", 11)); |
| EXPECT_TRUE(str10[11] == '\0'); |
| |
| return true; |
| } |
| |
| |
| bool testCompare() |
| { |
| string str01("bell helmet"); |
| string str02("bell moto"); |
| string str03("bell"); |
| string str04("bell pants"); |
| string str05; |
| |
| str05 = str01; |
| // Compare with self. |
| EXPECT_TRUE(str01 == str01); |
| EXPECT_TRUE(!(str01 != str01)); |
| |
| EXPECT_TRUE(str01 == str05); |
| EXPECT_TRUE(str05 == str01); |
| EXPECT_TRUE(!(str01 != str05)); |
| EXPECT_TRUE(!(str05 != str01)); |
| |
| EXPECT_TRUE(str01 != str02); |
| EXPECT_TRUE(str01 != str03); |
| EXPECT_TRUE(str01 != str04); |
| |
| // Compare with literals. |
| EXPECT_TRUE(str01 == "bell helmet"); |
| EXPECT_TRUE(!(str01 != "bell helmet")); |
| EXPECT_TRUE("bell helmet" == str01); |
| EXPECT_TRUE(!("bell helmet" != str01)); |
| |
| // Compare with char array. |
| char array[] = { 'a', ' ', 'b', 'u', 'g', '\0'}; |
| str01 = "a bug"; |
| EXPECT_TRUE(array == str01); |
| |
| EXPECT_TRUE(strcmp("a bug", "a bugg") < 0); |
| |
| char array2[] = { 'a', 'b', 'u', 'g', 'g' }; |
| EXPECT_TRUE(str01.compare(array2) < 0); |
| |
| string str06; |
| EXPECT_TRUE(str06 != NULL); |
| { |
| string str_long("this is"); |
| string str_short("it"); |
| EXPECT_TRUE(str_long > str_short); |
| EXPECT_TRUE(str_long >= str_short); |
| EXPECT_FALSE(str_long < str_short); |
| EXPECT_FALSE(str_long <= str_short); |
| } |
| { |
| string str_lhs("this is"); |
| string str_rhs("this is"); |
| EXPECT_FALSE(str_lhs > str_rhs); |
| EXPECT_TRUE(str_lhs >= str_rhs); |
| EXPECT_FALSE(str_lhs < str_rhs); |
| EXPECT_TRUE(str_lhs <= str_rhs); |
| } |
| return true; |
| } |
| |
| bool testSwap() |
| { |
| string str01; |
| string str02("test"); |
| |
| str01.swap(str02); |
| EXPECT_TRUE(str02.empty()); |
| EXPECT_TRUE(str01 == "test"); |
| |
| string str03("altima"); |
| string str04("versa"); |
| str03.swap(str04); |
| EXPECT_TRUE(str03 == "versa"); |
| EXPECT_TRUE(str04 == "altima"); |
| |
| { |
| string empty; |
| // swap can be used to clean strings |
| str04.swap(empty); |
| } |
| EXPECT_TRUE(str04.empty()); |
| |
| return true; |
| } |
| |
| bool testAccessor() |
| { |
| string str01 = "earmarks"; |
| |
| EXPECT_TRUE(str01[0] == 'e'); |
| EXPECT_TRUE(str01[7] == 's'); |
| |
| str01[0] = 'E'; |
| str01[7] = 'S'; |
| EXPECT_TRUE(str01 == "EarmarkS"); |
| |
| for (int i = 0; i < 100; ++i) |
| { |
| string str02(i, 'x'); |
| |
| str02.reserve(20); |
| |
| EXPECT_TRUE(str02[i] == '\0'); |
| |
| const string str03(str02); |
| EXPECT_TRUE(str03[i] == '\0'); |
| } |
| |
| string str05; |
| str05.reserve(100); |
| str05[99] = 'a'; |
| |
| // 'at' |
| EXPECT_TRUE(str01.at(0) == 'E'); |
| EXPECT_TRUE(str01.at(7) == 'S'); |
| EXPECT_TRUE(str01.at(8) == 'X'); // 'X' is the dummy value returned. |
| |
| str01.at(1) = 'A'; |
| str01.at(6) = 'K'; |
| EXPECT_TRUE(str01 == "EArmarKS"); |
| return true; |
| } |
| |
| |
| bool testAssignment() |
| { |
| const char *literal = "Need to buy a full face helmet for Lilie."; |
| const string str01 = literal; |
| |
| EXPECT_TRUE(str01.length() == strlen(literal)); |
| EXPECT_TRUE(str01.size() == strlen(literal)); |
| EXPECT_TRUE(str01.capacity() == strlen(literal)); |
| EXPECT_TRUE(str01 == literal); |
| |
| string str02; |
| |
| str02.assign(str01, 8, 33); |
| EXPECT_TRUE(str02 == "buy a full face helmet for Lilie."); |
| |
| str02.assign(str01, 8, 0); |
| EXPECT_TRUE(str02 == ""); |
| |
| str02.assign(str01, 0, 7); |
| EXPECT_TRUE(str02 == "Need to"); |
| |
| str02.assign("unchanged"); |
| str02.assign(str01, 35, 1000); |
| EXPECT_TRUE(str02 == "unchanged"); |
| |
| str02.assign(str01, 35, 6); |
| EXPECT_TRUE(str02 == "Lilie."); |
| |
| |
| str02.assign(str01, 35, 5); |
| EXPECT_TRUE(str02 == "Lilie"); |
| |
| string str03; |
| |
| str03.assign(literal); |
| EXPECT_TRUE(str03 == "Need to buy a full face helmet for Lilie."); |
| |
| string str04; |
| |
| str04.assign(str03.c_str()); |
| EXPECT_TRUE(str04 == "Need to buy a full face helmet for Lilie."); |
| |
| str04.assign(str03.c_str() + 5, 10); |
| EXPECT_TRUE(str04 == "to buy a f"); |
| |
| str04.assign("noop"); |
| str04.assign(NULL); |
| EXPECT_TRUE(str04 == "noop"); |
| |
| str04.assign(str01, str01.size() - 1, 1); |
| EXPECT_TRUE(str04 == "."); |
| |
| str04.assign("unchanged"); |
| str04.assign(str01, str01.size(), 1); |
| str04.assign(NULL, 4, 1); |
| str04.assign(NULL, 4); |
| EXPECT_TRUE(str04 == "unchanged"); |
| |
| return true; |
| } |
| |
| bool testCopy() |
| { |
| string data[] = {"one", "two", "three", "four", "five", "six"}; |
| std::copy(data + 2, data + 5, data); |
| EXPECT_TRUE(data[0] == "three"); |
| EXPECT_TRUE(data[1] == "four"); |
| EXPECT_TRUE(data[2] == "five"); |
| EXPECT_TRUE(data[3] == "four"); |
| EXPECT_TRUE(data[4] == "five"); |
| EXPECT_TRUE(data[5] == "six"); |
| return true; |
| } |
| |
| |
| bool testConcat() |
| { |
| string str01("The full"); |
| string str02(" sentence."); |
| string str03; |
| |
| str03 = str01 + str02; |
| EXPECT_TRUE(str03 == "The full sentence."); |
| |
| str03 = str02 + str01; |
| EXPECT_TRUE(str03 == " sentence.The full"); |
| |
| |
| str03 = str01 + " sentence."; |
| EXPECT_TRUE(str03 == "The full sentence."); |
| |
| str03 = "The full" + str02; |
| EXPECT_TRUE(str03 == "The full sentence."); |
| |
| str03 = 'l' + str02; |
| str03 = 'l' + str03; |
| str03 = 'u' + str03; |
| str03 = 'f' + str03; |
| str03 = ' ' + str03; |
| str03 = 'e' + str03; |
| str03 = 'h' + str03; |
| str03 = 'T' + str03; |
| EXPECT_TRUE(str03 == "The full sentence."); |
| |
| str03 = "The full "; |
| str03 = str03 + 's'; |
| str03 = str03 + 'e'; |
| str03 = str03 + 'n'; |
| str03 = str03 + 't'; |
| str03 = str03 + 'e'; |
| str03 = str03 + 'n'; |
| str03 = str03 + 'c'; |
| str03 = str03 + 'e'; |
| str03 = str03 + '.'; |
| EXPECT_TRUE(str03 == "The full sentence."); |
| |
| // Check the new string buffer is not the same as the original one. |
| string str04("left and"); |
| string str05(" right"); |
| string str06(str04 + str05); |
| |
| EXPECT_TRUE(str06 == "left and right"); |
| EXPECT_TRUE(str06.c_str() != str04.c_str()); |
| EXPECT_TRUE(str06.c_str() != str05.c_str()); |
| |
| str06 = str04 + str05; |
| EXPECT_TRUE(str06 == "left and right"); |
| EXPECT_TRUE(str06.c_str() != str04.c_str()); |
| EXPECT_TRUE(str06.c_str() != str05.c_str()); |
| return true; |
| } |
| |
| bool testPushBack() |
| { |
| string str01; |
| |
| str01.push_back('a'); |
| EXPECT_TRUE(str01 == "a"); |
| EXPECT_TRUE(str01.capacity() == 1); |
| |
| str01.reserve(10); |
| str01.push_back('b'); |
| EXPECT_TRUE(str01 == "ab"); |
| EXPECT_TRUE(str01.capacity() == 10); |
| EXPECT_TRUE(str01[2] == '\0'); |
| |
| str01.reserve(); |
| EXPECT_TRUE(str01 == "ab"); |
| EXPECT_TRUE(str01.capacity() == 2); |
| EXPECT_TRUE(str01[2] == '\0'); |
| |
| return true; |
| } |
| |
| bool testFind() |
| { |
| string haystack("one two three one two three"); |
| |
| // Don't die on null strings |
| EXPECT_TRUE(haystack.find((char*)NULL) == string::npos); |
| EXPECT_TRUE(haystack.find((char*)NULL, 10) == string::npos); |
| |
| // C strings. |
| EXPECT_TRUE(haystack.find("one") == 0); |
| EXPECT_TRUE(haystack.find("two") == 4); |
| EXPECT_TRUE(haystack.find("t") == 4); |
| EXPECT_TRUE(haystack.find("four") == string::npos); |
| EXPECT_TRUE(haystack.find("one", string::npos) == string::npos); |
| |
| // with offset |
| EXPECT_TRUE(haystack.find("one", 13) == 14); |
| EXPECT_TRUE(haystack.find("one", 14) == 14); |
| EXPECT_TRUE(haystack.find("one", 15) == string::npos); |
| EXPECT_TRUE(haystack.find("e", haystack.size() - 1) == haystack.size() - 1); |
| EXPECT_TRUE(haystack.find("e", haystack.size()) == string::npos); |
| EXPECT_TRUE(haystack.find("one", string::npos) == string::npos); |
| |
| // std::string |
| EXPECT_TRUE(haystack.find(string("one")) == 0); |
| EXPECT_TRUE(haystack.find(string("two")) == 4); |
| EXPECT_TRUE(haystack.find(string("t")) == 4); |
| EXPECT_TRUE(haystack.find(string("four")) == string::npos); |
| EXPECT_TRUE(haystack.find(string("one"), string::npos) == string::npos); |
| |
| // with offset |
| EXPECT_TRUE(haystack.find(string("one"), 13) == 14); |
| EXPECT_TRUE(haystack.find(string("one"), 14) == 14); |
| EXPECT_TRUE(haystack.find(string("one"), 15) == string::npos); |
| EXPECT_TRUE(haystack.find(string("e"), haystack.size() - 1) == haystack.size() - 1); |
| EXPECT_TRUE(haystack.find(string("e"), haystack.size()) == string::npos); |
| EXPECT_TRUE(haystack.find(string("one"), string::npos) == string::npos); |
| |
| // Emtpy string should be found at every position in a string except |
| // past the end. |
| EXPECT_TRUE(string().find("", 0) == 0); |
| EXPECT_TRUE(string().find(string(), 0) == 0); |
| EXPECT_TRUE(string().find(string(), 10) == string::npos); |
| |
| string foo = "foo"; |
| EXPECT_TRUE(foo.find("", 0) == 0); |
| EXPECT_TRUE(foo.find(string(), 0) == 0); |
| EXPECT_TRUE(foo.find(string(""), 0) == 0); |
| |
| EXPECT_TRUE(foo.find("", 1) == 1); |
| EXPECT_TRUE(foo.find(string(), 1) == 1); |
| EXPECT_TRUE(foo.find(string(""), 1) == 1); |
| |
| EXPECT_TRUE(foo.find("", foo.size()) == foo.size()); |
| EXPECT_TRUE(foo.find(string(), foo.size()) == foo.size()); |
| EXPECT_TRUE(foo.find(string(""), foo.size()) == foo.size()); |
| |
| EXPECT_TRUE(foo.find("", foo.size() + 1) == string::npos); |
| EXPECT_TRUE(foo.find(string(), foo.size() + 1) == string::npos); |
| EXPECT_TRUE(foo.find(string(""), foo.size() + 1) == string::npos); |
| |
| // Find on an empty string a non empty one should fail |
| EXPECT_TRUE(string().find("f", 0) == string::npos); |
| EXPECT_TRUE(string().find(string("f"), 0) == string::npos); |
| return true; |
| } |
| |
| bool testCapacity() |
| { |
| string empty_string; |
| |
| EXPECT_TRUE(empty_string.capacity() == 0); |
| EXPECT_TRUE(empty_string.size() == 0); |
| |
| const char *text = "non empty string"; |
| const size_t len = strlen(text); |
| string str01(text); |
| |
| EXPECT_TRUE(str01.capacity() == len); |
| EXPECT_TRUE(str01.size() == len); |
| return true; |
| } |
| |
| bool testClear() |
| { |
| string empty_string; |
| |
| empty_string.clear(); |
| EXPECT_TRUE(empty_string.capacity() == 0); |
| EXPECT_TRUE(empty_string.size() == 0); |
| |
| string str01("non empty string"); |
| |
| str01.clear(); |
| EXPECT_TRUE(str01.capacity() == 0); |
| EXPECT_TRUE(str01.size() == 0); |
| EXPECT_TRUE(str01.empty()); |
| return true; |
| } |
| |
| bool testErase() |
| { |
| { |
| string empty_string; |
| |
| empty_string.erase(); |
| EXPECT_TRUE(empty_string.capacity() == 0); |
| EXPECT_TRUE(empty_string.size() == 0); |
| |
| empty_string.erase(kMaxSizeT); |
| EXPECT_TRUE(empty_string.capacity() == 0); |
| EXPECT_TRUE(empty_string.size() == 0); |
| |
| empty_string.erase(kMaxSizeT, kMaxSizeT); |
| EXPECT_TRUE(empty_string.capacity() == 0); |
| EXPECT_TRUE(empty_string.size() == 0); |
| } |
| |
| { |
| string str01("a"); |
| |
| str01.erase(); |
| EXPECT_TRUE(str01.capacity() == 1); |
| EXPECT_TRUE(str01.size() == 0); |
| } |
| |
| { |
| string str02("a"); |
| |
| str02.erase(kMaxSizeT); |
| EXPECT_TRUE(str02.capacity() == 1); |
| EXPECT_TRUE(str02.size() == 1); |
| } |
| |
| { |
| string str03("a"); |
| |
| str03.erase(0, kMaxSizeT); |
| EXPECT_TRUE(str03.capacity() == 1); |
| EXPECT_TRUE(str03.size() == 0); |
| } |
| |
| { |
| string str04("a"); |
| |
| str04.erase(1, kMaxSizeT); |
| EXPECT_TRUE(str04.capacity() == 1); |
| EXPECT_TRUE(str04.size() == 1); |
| } |
| |
| { |
| string str05("abcd"); |
| |
| str05.erase(1, 2); |
| EXPECT_TRUE(str05.capacity() == 4); |
| EXPECT_TRUE(str05.size() == 2); |
| EXPECT_TRUE(str05 == "ad"); |
| } |
| |
| { |
| string str06("abcd"); |
| |
| str06.erase(0, 1); |
| EXPECT_TRUE(str06.capacity() == 4); |
| EXPECT_TRUE(str06.size() == 3); |
| EXPECT_TRUE(str06 == "bcd"); |
| } |
| |
| { |
| // overlap |
| string str07("oh my god (You think I'm in control)"); |
| |
| str07.erase(0, strlen("oh my god ")); |
| EXPECT_TRUE(str07.size() == 26); |
| EXPECT_TRUE(str07 == "(You think I'm in control)"); |
| } |
| |
| return true; |
| } |
| |
| // Checks an iterator can be cast to a const one. |
| bool testConstIterator() |
| { |
| string s("a string"); |
| string::iterator i = s.begin(); |
| string::const_iterator ci = s.begin(); |
| return true; |
| } |
| |
| bool testForwardIterator() |
| { |
| string s("a string"); |
| char chars[] = "a string"; |
| string::iterator iter = s.begin(); |
| for (int i = 0; iter != s.end(); ++i) { |
| EXPECT_TRUE(*iter == chars[i]); |
| ++iter; |
| } |
| EXPECT_TRUE(iter == s.end()); |
| |
| string empty; |
| EXPECT_TRUE(empty.begin() == empty.end()); |
| return true; |
| } |
| |
| bool testSubstr() { |
| { |
| string s; |
| string res = s.substr(10, 1); |
| EXPECT_TRUE(res.empty()); |
| } |
| { |
| string s = "pandora radio"; |
| string res = s.substr(string::npos, 1); |
| EXPECT_TRUE(res.empty()); |
| } |
| { |
| string s = "pandora radio"; |
| string res = s.substr(5, 1000); |
| EXPECT_TRUE(res == "ra radio"); |
| } |
| { |
| string s = "pandora radio"; |
| string res = s.substr(5, 0); |
| EXPECT_TRUE(res.empty()); |
| } |
| { |
| string s = "pandora radio"; |
| string res = s.substr(5, 5); |
| EXPECT_TRUE(res == "ra ra"); |
| } |
| return true; |
| } |
| |
| bool testCharSearch() { |
| { |
| string s; |
| EXPECT_TRUE(s.find_first_of('a') == string::npos); |
| s = "abracadabra"; |
| EXPECT_TRUE(s.find_first_of('a') == 0); |
| EXPECT_TRUE(s.find_first_of('a', 0) == 0); |
| EXPECT_TRUE(s.find_first_of('a', 1) == 3); |
| EXPECT_TRUE(s.find_first_of('a', 8) == 10); |
| s = "zzzzzzza"; |
| EXPECT_TRUE(s.find_first_of('a') == 7); |
| EXPECT_TRUE(s.find_first_of('a', 8) == string::npos); // out of bound |
| } |
| // For char (set of size 1) find_first_of is equive to find(char, pos) |
| { |
| string s; |
| EXPECT_TRUE(s.find('a') == string::npos); |
| s = "abracadabra"; |
| EXPECT_TRUE(s.find('a') == 0); |
| EXPECT_TRUE(s.find('a', 0) == 0); |
| EXPECT_TRUE(s.find('a', 1) == 3); |
| EXPECT_TRUE(s.find('a', 8) == 10); |
| s = "zzzzzzza"; |
| EXPECT_TRUE(s.find('a') == 7); |
| EXPECT_TRUE(s.find('a', 8) == string::npos); // out of bound |
| } |
| { |
| string s; |
| EXPECT_TRUE(s.find_last_of('a') == string::npos); |
| EXPECT_TRUE(s.find_last_of('a', 0) == string::npos); |
| EXPECT_TRUE(s.find_last_of('a', 10) == string::npos); |
| s = "abracadabra"; |
| EXPECT_TRUE(s.find_last_of('a', 10) == 10); |
| EXPECT_TRUE(s.find_last_of('a', 9) == 7); |
| EXPECT_TRUE(s.find_last_of('a', 0) == 0); |
| s = "azzzzzzz"; |
| EXPECT_TRUE(s.find_last_of('a') == 0); |
| } |
| // For char (set of size 1) find_last_of is equiv to rfind(char, pos). |
| { |
| string s; |
| EXPECT_TRUE(s.rfind('a') == string::npos); |
| EXPECT_TRUE(s.rfind('a', 0) == string::npos); |
| EXPECT_TRUE(s.rfind('a', 10) == string::npos); |
| s = "abracadabra"; |
| EXPECT_TRUE(s.rfind('a', 10) == 10); |
| EXPECT_TRUE(s.rfind('a', 9) == 7); |
| EXPECT_TRUE(s.rfind('a', 0) == 0); |
| s = "azzzzzzz"; |
| EXPECT_TRUE(s.rfind('a') == 0); |
| } |
| { |
| string s; |
| EXPECT_TRUE(s.find_first_not_of('a') == string::npos); |
| s = "abracadabra"; |
| EXPECT_TRUE(s.find_first_not_of('a') == 1); |
| EXPECT_TRUE(s.find_first_not_of('a', 0) == 1); |
| EXPECT_TRUE(s.find_first_not_of('a', 1) == 1); |
| EXPECT_TRUE(s.find_first_not_of('a', 7) == 8); |
| s = "zzzzzzza"; |
| EXPECT_TRUE(s.find_first_not_of('a') == 0); |
| EXPECT_TRUE(s.find_first_not_of('a', 8) == string::npos); // out of bound |
| } |
| { |
| string s; |
| EXPECT_TRUE(s.find_last_not_of('a') == string::npos); |
| EXPECT_TRUE(s.find_last_not_of('a', 0) == string::npos); |
| EXPECT_TRUE(s.find_last_not_of('a', 10) == string::npos); |
| s = "abracadabra"; |
| EXPECT_TRUE(s.find_last_not_of('a') == 9); |
| EXPECT_TRUE(s.find_last_not_of('a', 10) == 9); |
| EXPECT_TRUE(s.find_last_not_of('a', 9) == 9); |
| EXPECT_TRUE(s.find_last_not_of('a', 0) == string::npos); |
| s = "azzzzzzz"; |
| EXPECT_TRUE(s.find_last_not_of('a') == 7); |
| } |
| return true; |
| } |
| |
| |
| bool testInsert() { |
| { |
| string::iterator res; |
| string str("zzzzzz"); |
| res = str.insert(str.begin(), 'a'); |
| EXPECT_TRUE(str == "azzzzzz"); |
| EXPECT_TRUE(*res == 'a'); |
| |
| res = str.insert(str.begin() + 3, 'b'); |
| EXPECT_TRUE(str == "azzbzzzz"); |
| EXPECT_TRUE(*res == 'b'); |
| |
| res = str.insert(str.end(), 'c'); |
| EXPECT_TRUE(str == "azzbzzzzc"); |
| EXPECT_TRUE(*res == 'c'); |
| } |
| { |
| string str; |
| string::iterator res = str.insert(str.begin(), 'a'); |
| EXPECT_TRUE(str == "a"); |
| EXPECT_TRUE(*res == 'a'); |
| } |
| return true; |
| } |
| |
| } // namespace android |
| |
| int main(int argc, char **argv) |
| { |
| FAIL_UNLESS(testConstructorCString); |
| FAIL_UNLESS(testConstructorString); |
| FAIL_UNLESS(testConstructorRepeatChar); |
| FAIL_UNLESS(testConstructorPointers); |
| FAIL_UNLESS(testConstructorInvalidValues); |
| FAIL_UNLESS(testSize); |
| FAIL_UNLESS(testCString); |
| FAIL_UNLESS(testAppend); |
| FAIL_UNLESS(testAppendOperator); |
| FAIL_UNLESS(testConcat); |
| FAIL_UNLESS(testAssignment); |
| FAIL_UNLESS(testCopy); |
| FAIL_UNLESS(testReserve); |
| FAIL_UNLESS(testCompare); |
| FAIL_UNLESS(testAccessor); |
| FAIL_UNLESS(testSwap); |
| FAIL_UNLESS(testPushBack); |
| FAIL_UNLESS(testFind); |
| FAIL_UNLESS(testCapacity); |
| FAIL_UNLESS(testClear); |
| FAIL_UNLESS(testErase); |
| FAIL_UNLESS(testConstIterator); |
| FAIL_UNLESS(testForwardIterator); |
| FAIL_UNLESS(testSubstr); |
| FAIL_UNLESS(testCharSearch); |
| FAIL_UNLESS(testInsert); |
| return kPassed; |
| } |