1fe47ae56a8808c836923466e44704db3a8371593Niko Catania/* -*- c++ -*- */
2fe47ae56a8808c836923466e44704db3a8371593Niko Catania/*
3fe47ae56a8808c836923466e44704db3a8371593Niko Catania * Copyright (C) 2009 The Android Open Source Project
4fe47ae56a8808c836923466e44704db3a8371593Niko Catania * All rights reserved.
5fe47ae56a8808c836923466e44704db3a8371593Niko Catania *
6fe47ae56a8808c836923466e44704db3a8371593Niko Catania * Redistribution and use in source and binary forms, with or without
7fe47ae56a8808c836923466e44704db3a8371593Niko Catania * modification, are permitted provided that the following conditions
8fe47ae56a8808c836923466e44704db3a8371593Niko Catania * are met:
9fe47ae56a8808c836923466e44704db3a8371593Niko Catania *  * Redistributions of source code must retain the above copyright
10fe47ae56a8808c836923466e44704db3a8371593Niko Catania *    notice, this list of conditions and the following disclaimer.
11fe47ae56a8808c836923466e44704db3a8371593Niko Catania *  * Redistributions in binary form must reproduce the above copyright
12fe47ae56a8808c836923466e44704db3a8371593Niko Catania *    notice, this list of conditions and the following disclaimer in
13fe47ae56a8808c836923466e44704db3a8371593Niko Catania *    the documentation and/or other materials provided with the
14fe47ae56a8808c836923466e44704db3a8371593Niko Catania *    distribution.
15fe47ae56a8808c836923466e44704db3a8371593Niko Catania *
16fe47ae56a8808c836923466e44704db3a8371593Niko Catania * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17fe47ae56a8808c836923466e44704db3a8371593Niko Catania * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18fe47ae56a8808c836923466e44704db3a8371593Niko Catania * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
19fe47ae56a8808c836923466e44704db3a8371593Niko Catania * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
20fe47ae56a8808c836923466e44704db3a8371593Niko Catania * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21fe47ae56a8808c836923466e44704db3a8371593Niko Catania * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
22fe47ae56a8808c836923466e44704db3a8371593Niko Catania * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
23fe47ae56a8808c836923466e44704db3a8371593Niko Catania * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24fe47ae56a8808c836923466e44704db3a8371593Niko Catania * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25fe47ae56a8808c836923466e44704db3a8371593Niko Catania * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
26fe47ae56a8808c836923466e44704db3a8371593Niko Catania * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27fe47ae56a8808c836923466e44704db3a8371593Niko Catania * SUCH DAMAGE.
28fe47ae56a8808c836923466e44704db3a8371593Niko Catania */
29fe47ae56a8808c836923466e44704db3a8371593Niko Catania
30fe47ae56a8808c836923466e44704db3a8371593Niko Catania#include "../include/string"
31fe47ae56a8808c836923466e44704db3a8371593Niko Catania#ifndef ANDROID_ASTL_STRING__
32fe47ae56a8808c836923466e44704db3a8371593Niko Catania#error "Wrong header included!!"
33fe47ae56a8808c836923466e44704db3a8371593Niko Catania#endif
34fe47ae56a8808c836923466e44704db3a8371593Niko Catania#include <climits>
35fe47ae56a8808c836923466e44704db3a8371593Niko Catania#include <cstring>
366943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania#include <algorithm>
370cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania#include <list>
382a4077a9186d6f6dff104bbd1a73484aae6d5c01Nicolas Catania#include "common.h"
39fe47ae56a8808c836923466e44704db3a8371593Niko Catania
40fe47ae56a8808c836923466e44704db3a8371593Niko Catania
41fe47ae56a8808c836923466e44704db3a8371593Niko Catanianamespace android {
42fe47ae56a8808c836923466e44704db3a8371593Niko Cataniausing std::string;
43fe47ae56a8808c836923466e44704db3a8371593Niko Catania
44fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testConstructorCString()
45fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
46fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string empty_str1;
47fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(empty_str1.size() == 0);
48fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(empty_str1.capacity() == 0);
49fe47ae56a8808c836923466e44704db3a8371593Niko Catania
50fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string empty_str2("");
51fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(empty_str2.size() == 0);
52fe47ae56a8808c836923466e44704db3a8371593Niko Catania
53fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const char empty_as_array[] = "";
54fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string empty_str3(empty_as_array);
55fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(empty_str3.size() == 0);
56fe47ae56a8808c836923466e44704db3a8371593Niko Catania
57fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const char literal[] = "scott mills cracks me up";
58fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str1(literal);
59fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(strcmp(literal, str1.c_str()) == 0);
60fe47ae56a8808c836923466e44704db3a8371593Niko Catania
61fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str2(literal, 11);
62fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(strcmp("scott mills", str2.c_str()) == 0);
63fe47ae56a8808c836923466e44704db3a8371593Niko Catania
64fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str3(literal, sizeof(literal));
65fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(strcmp(literal, str3.c_str()) == 0);
66fe47ae56a8808c836923466e44704db3a8371593Niko Catania
67fe47ae56a8808c836923466e44704db3a8371593Niko Catania    // Pass the end of the string => still ok, there is \0
68fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str4(literal, sizeof(literal) + 1);
69fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str4.size() == sizeof(literal) + 1);
70fe47ae56a8808c836923466e44704db3a8371593Niko Catania
71fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str5(literal, literal + 11);
72fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(strcmp("scott mills", str5.c_str()) == 0);
73fe47ae56a8808c836923466e44704db3a8371593Niko Catania
74fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const char text[] = {'l','a','d','y',' ','g','a','g','a'};
75fe47ae56a8808c836923466e44704db3a8371593Niko Catania
76fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str6(text, ARRAYSIZE(text));
77fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str6 == "lady gaga");
78fe47ae56a8808c836923466e44704db3a8371593Niko Catania
79fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str7(NULL);
80fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(empty_str1.size() == 0);
81fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(empty_str1.empty());
82fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
83fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
84fe47ae56a8808c836923466e44704db3a8371593Niko Catania
85fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testConstructorString()
86fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
87fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string empty_str1;
88fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string empty_str2;
89fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(empty_str1.c_str() == empty_str2.c_str());
90fe47ae56a8808c836923466e44704db3a8371593Niko Catania
91fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string empty_str3(empty_str2);
92fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(empty_str3.size() == 0);
93fe47ae56a8808c836923466e44704db3a8371593Niko Catania
94fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const char string_with_nulls[] = "contains 2 \0 bytes \0.";
95fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str1 (string_with_nulls, 21);
96fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str1.size() == 21);
97fe47ae56a8808c836923466e44704db3a8371593Niko Catania
98fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str2 (str1);
99fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str1.size() == 21);
100fe47ae56a8808c836923466e44704db3a8371593Niko Catania
101fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const string str3("scott mills cracks me up");
102fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str4(str3, 12);
103fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(strcmp("cracks me up", str4.c_str()) == 0);
104fe47ae56a8808c836923466e44704db3a8371593Niko Catania
105fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str5(str3, 12, 6);
106fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(strcmp("cracks", str5.c_str()) == 0);
107fe47ae56a8808c836923466e44704db3a8371593Niko Catania
108fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str6(str3, 23);
109fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(strcmp("p", str6.c_str()) == 0);
110fe47ae56a8808c836923466e44704db3a8371593Niko Catania
111fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str7(str3, 24);
112fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(strcmp("", str7.c_str()) == 0);
113fe47ae56a8808c836923466e44704db3a8371593Niko Catania
114fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str8(str3, 23, 1);
115fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(strcmp("p", str8.c_str()) == 0);
116fe47ae56a8808c836923466e44704db3a8371593Niko Catania
117fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str9(str3, 24, 1);
118fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(strcmp("", str9.c_str()) == 0);
119fe47ae56a8808c836923466e44704db3a8371593Niko Catania
120fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
121fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
122fe47ae56a8808c836923466e44704db3a8371593Niko Catania
123fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testConstructorPointers()
124fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
125fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const string empty;
126fe47ae56a8808c836923466e44704db3a8371593Niko Catania    char data[] = "a 16 char string";
127fe47ae56a8808c836923466e44704db3a8371593Niko Catania
128fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str01(data, data + 0);
129fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.c_str() == empty.c_str());
130fe47ae56a8808c836923466e44704db3a8371593Niko Catania
131fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str02(data, data + 1);
132fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str02 == "a");
133fe47ae56a8808c836923466e44704db3a8371593Niko Catania
134fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str03(data + 2, data + 16);
135fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str03 == "16 char string");
136fe47ae56a8808c836923466e44704db3a8371593Niko Catania
137fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str04(data + 15, data + 16);
138fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str04 == "g");
139fe47ae56a8808c836923466e44704db3a8371593Niko Catania
140fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str05(data + 16, data + 16);
141fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str05 == "");
142fe47ae56a8808c836923466e44704db3a8371593Niko Catania
143fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
144fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
145fe47ae56a8808c836923466e44704db3a8371593Niko Catania
146fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testConstructorRepeatChar()
147fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
148fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str01(0, 'c');
149fe47ae56a8808c836923466e44704db3a8371593Niko Catania
150fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.empty());
151fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.size() == 0);
152fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.capacity() == 0);
153fe47ae56a8808c836923466e44704db3a8371593Niko Catania
154fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str02(10, 'c');
155fe47ae56a8808c836923466e44704db3a8371593Niko Catania
156fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(!str02.empty());
157fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str02.size() == 10);
158fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str02.capacity() == 10);
159fe47ae56a8808c836923466e44704db3a8371593Niko Catania
16060fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    for (size_t i = 0; i < 100; ++i)
161fe47ae56a8808c836923466e44704db3a8371593Niko Catania    {
162fe47ae56a8808c836923466e44704db3a8371593Niko Catania        string str03(i, 'x');
163fe47ae56a8808c836923466e44704db3a8371593Niko Catania
1647618d7b9a011b1158ef868d6ae3ead242ddaccacNicolas Catania        EXPECT_TRUE(str03[i] == '\0');
1657618d7b9a011b1158ef868d6ae3ead242ddaccacNicolas Catania        EXPECT_TRUE(str03.length() == i);
1667618d7b9a011b1158ef868d6ae3ead242ddaccacNicolas Catania
167fe47ae56a8808c836923466e44704db3a8371593Niko Catania        str03.reserve(i + 20);
1687618d7b9a011b1158ef868d6ae3ead242ddaccacNicolas Catania        EXPECT_TRUE(str03.capacity() == i + 20);
1697618d7b9a011b1158ef868d6ae3ead242ddaccacNicolas Catania        EXPECT_TRUE(str03.length() == i);
170fe47ae56a8808c836923466e44704db3a8371593Niko Catania        EXPECT_TRUE(str03[i] == '\0');
171fe47ae56a8808c836923466e44704db3a8371593Niko Catania    }
172fe47ae56a8808c836923466e44704db3a8371593Niko Catania
173fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
174fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
175fe47ae56a8808c836923466e44704db3a8371593Niko Catania
176fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testConstructorInvalidValues()
177fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
178fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const string empty;
179fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const string str01("a 16 char string");
180fe47ae56a8808c836923466e44704db3a8371593Niko Catania
181fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.size() == 16);
182fe47ae56a8808c836923466e44704db3a8371593Niko Catania
183fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str02(str01, 17, 1);  // invalid index
184fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str02.c_str() == empty.c_str());
185fe47ae56a8808c836923466e44704db3a8371593Niko Catania
186fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str03(str01, 17, 0);  // invalid index
187fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str03.c_str() == empty.c_str());
188fe47ae56a8808c836923466e44704db3a8371593Niko Catania
189fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str04(str01, -1, 0);  // invalid index
190fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str04.c_str() == empty.c_str());
191fe47ae56a8808c836923466e44704db3a8371593Niko Catania
19240d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania    string str05(str01, 0, 17);  // invalid length -> clamped
19340d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania    EXPECT_TRUE(str05 == str01);
194fe47ae56a8808c836923466e44704db3a8371593Niko Catania
195fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str06(str01, 17);  // invalid index
196fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str06.c_str() == empty.c_str());
197fe47ae56a8808c836923466e44704db3a8371593Niko Catania
198fe47ae56a8808c836923466e44704db3a8371593Niko Catania    char end[] = "a string";
199fe47ae56a8808c836923466e44704db3a8371593Niko Catania    char *begin = end + 1;  // begin after end.
200fe47ae56a8808c836923466e44704db3a8371593Niko Catania
201fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str07(begin, end);
202fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str07.c_str() == empty.c_str());
203fe47ae56a8808c836923466e44704db3a8371593Niko Catania
204fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
205fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
206fe47ae56a8808c836923466e44704db3a8371593Niko Catania
207fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testSize()
208fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
209fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str01;
210fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.size() == 0);
211fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.length() == 0);
212fe47ae56a8808c836923466e44704db3a8371593Niko Catania
213fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str01 += "a string.";
214fe47ae56a8808c836923466e44704db3a8371593Niko Catania
215fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.size() == 9);
216fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.length() == 9);
217fe47ae56a8808c836923466e44704db3a8371593Niko Catania
218fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
219fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
220fe47ae56a8808c836923466e44704db3a8371593Niko Catania
221fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testCString()
222fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
223fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str01;
224fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str02;
225fe47ae56a8808c836923466e44704db3a8371593Niko Catania
226fe47ae56a8808c836923466e44704db3a8371593Niko Catania    // Should point to the same empty string.
227fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.c_str() == str02.c_str());
228fe47ae56a8808c836923466e44704db3a8371593Niko Catania    // c_str() == data()
229fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.c_str() == str01.data());
230fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.empty());
231fe47ae56a8808c836923466e44704db3a8371593Niko Catania
232fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const char text[] = "a string";
233fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str01 += text;
234fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(strcmp(str01.c_str(), text) == 0);
235fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(strcmp(str01.data(), text) == 0);
236fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(!str01.empty());
237fe47ae56a8808c836923466e44704db3a8371593Niko Catania
238fe47ae56a8808c836923466e44704db3a8371593Niko Catania    // after a clear, points back to the original empty string.
239fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str01.clear();
240fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.c_str() == str02.c_str());
241fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.empty());
242fe47ae56a8808c836923466e44704db3a8371593Niko Catania
243fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
244fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
245fe47ae56a8808c836923466e44704db3a8371593Niko Catania
246fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testReserve()
247fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
248fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str01;
249fe47ae56a8808c836923466e44704db3a8371593Niko Catania    size_t capacity = str01.capacity();
250fe47ae56a8808c836923466e44704db3a8371593Niko Catania
251fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(0 == capacity);
252fe47ae56a8808c836923466e44704db3a8371593Niko Catania
253fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str01.reserve(5);
254fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(5 == str01.capacity());
255fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str01.reserve(0);
256fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(0 == str01.capacity());
257fe47ae56a8808c836923466e44704db3a8371593Niko Catania
258fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str02("7 chars");
259fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(7 == str02.capacity());
260fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(7 == str02.size());
261fe47ae56a8808c836923466e44704db3a8371593Niko Catania
262fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str02.reserve(10);
263fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str02 == "7 chars");
264fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(10 == str02.capacity());
265fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(7 == str02.size());
266fe47ae56a8808c836923466e44704db3a8371593Niko Catania
267fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str02.reserve(6); // no effect
268fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str02 == "7 chars");
269fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(10 == str02.capacity());
270fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(7 == str02.size());
271fe47ae56a8808c836923466e44704db3a8371593Niko Catania
272fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str03;
273fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const string str04;
274fe47ae56a8808c836923466e44704db3a8371593Niko Catania
275fe47ae56a8808c836923466e44704db3a8371593Niko Catania    // Both point to kEmptyString.
276fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str03.c_str() == str04.c_str());
277fe47ae56a8808c836923466e44704db3a8371593Niko Catania
278fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03.reserve();
279fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(0 == str03.capacity());
280fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str03.c_str() == str04.c_str());
281fe47ae56a8808c836923466e44704db3a8371593Niko Catania
282fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03.reserve(10);
283fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(10 == str03.capacity());
284fe47ae56a8808c836923466e44704db3a8371593Niko Catania    // Not pointing at the empty string anymore.
285fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str03.c_str() != str04.c_str());
286fe47ae56a8808c836923466e44704db3a8371593Niko Catania
287fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03.reserve();
288fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(0 == str03.capacity());
289fe47ae56a8808c836923466e44704db3a8371593Niko Catania    // c_str() points back to the empty string.
290fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str03.c_str() == str04.c_str());
291fe47ae56a8808c836923466e44704db3a8371593Niko Catania
292fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03.reserve(10);
293fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03.append("7 chars");
294fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str03 == "7 chars");
295fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03.reserve();  // shrink to fit.
296fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(7 == str03.capacity());
297fe47ae56a8808c836923466e44704db3a8371593Niko Catania
298fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str05 = "twelve chars";
299fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str06 = str05;
300fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str05.reserve(1);
301fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str05.capacity() == 12);
302fe47ae56a8808c836923466e44704db3a8371593Niko Catania
303fe47ae56a8808c836923466e44704db3a8371593Niko Catania
304fe47ae56a8808c836923466e44704db3a8371593Niko Catania    for (size_t i = 1; i <= 100; i *= 2)
305fe47ae56a8808c836923466e44704db3a8371593Niko Catania    {
306fe47ae56a8808c836923466e44704db3a8371593Niko Catania        string str(i, 'x');
307fe47ae56a8808c836923466e44704db3a8371593Niko Catania        str.reserve(3 * i);
308fe47ae56a8808c836923466e44704db3a8371593Niko Catania        EXPECT_TRUE(str.capacity() == 3 * i);
309fe47ae56a8808c836923466e44704db3a8371593Niko Catania
310fe47ae56a8808c836923466e44704db3a8371593Niko Catania        str.reserve(2 * i);
311fe47ae56a8808c836923466e44704db3a8371593Niko Catania        EXPECT_TRUE(str.capacity() == 2 * i);
312fe47ae56a8808c836923466e44704db3a8371593Niko Catania
313fe47ae56a8808c836923466e44704db3a8371593Niko Catania        str.reserve();
314fe47ae56a8808c836923466e44704db3a8371593Niko Catania        EXPECT_TRUE(str.capacity() == i);
315fe47ae56a8808c836923466e44704db3a8371593Niko Catania    }
316fe47ae56a8808c836923466e44704db3a8371593Niko Catania
317fe47ae56a8808c836923466e44704db3a8371593Niko Catania    // Check overflow.
318fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str07;
319fe47ae56a8808c836923466e44704db3a8371593Niko Catania
320fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str07.reserve(10);
321fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str07.capacity() == 10);
322fe47ae56a8808c836923466e44704db3a8371593Niko Catania
3232a4077a9186d6f6dff104bbd1a73484aae6d5c01Nicolas Catania    str07.reserve(kMaxSizeT);
324fe47ae56a8808c836923466e44704db3a8371593Niko Catania
325fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str07.capacity() == 10);
326fe47ae56a8808c836923466e44704db3a8371593Niko Catania
327fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
328fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
329fe47ae56a8808c836923466e44704db3a8371593Niko Catania
330fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testAppend()
331fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
332fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str1;
333fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const char *text = "You spin my head right round.";
334fe47ae56a8808c836923466e44704db3a8371593Niko Catania
335fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str1.append(text);
336fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str1 == text);
337fe47ae56a8808c836923466e44704db3a8371593Niko Catania
338fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str1.append(" Flo Rida.");
339fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str1 == "You spin my head right round. Flo Rida.");
340fe47ae56a8808c836923466e44704db3a8371593Niko Catania
341fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str2;
342fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str2.append(str1);
343fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str2 == "You spin my head right round. Flo Rida.");
344fe47ae56a8808c836923466e44704db3a8371593Niko Catania
345fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str3("You spin ");
346fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str3.append("my head right round.");
347fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str3 == "You spin my head right round.");
348fe47ae56a8808c836923466e44704db3a8371593Niko Catania
349fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str4("You spin ");
350fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str5("my head right round.");
351fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str4.append(str5);
352fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str4 == "You spin my head right round.");
353fe47ae56a8808c836923466e44704db3a8371593Niko Catania
354fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str6("");
355fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str7("");
356fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str6.append(str7);
357fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str6 == "");
358fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str6.empty());
359fe47ae56a8808c836923466e44704db3a8371593Niko Catania
360fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str8;
361fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str8.append("a");
362fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str8 == "a");
363fe47ae56a8808c836923466e44704db3a8371593Niko Catania
364fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const char more_text[] = {'l','a','d','y',' ','g','a','g','a'};
365fe47ae56a8808c836923466e44704db3a8371593Niko Catania
366fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str9;
367fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str9.append(more_text, ARRAYSIZE(more_text));
368fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str9 == string(more_text, ARRAYSIZE(more_text)));
369fe47ae56a8808c836923466e44704db3a8371593Niko Catania
370fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str10;
371fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str10.append("", 0);
372fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str10.size() == 0 );
373fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str10.append(text, strlen(text));
374fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str10 == "You spin my head right round.");
375fe47ae56a8808c836923466e44704db3a8371593Niko Catania
376fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str11;
377fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str11.append("You spin my head right round.", 5, 11);
378fe47ae56a8808c836923466e44704db3a8371593Niko Catania
379fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str11 == "pin my head");
380fe47ae56a8808c836923466e44704db3a8371593Niko Catania
381fe47ae56a8808c836923466e44704db3a8371593Niko Catania    // Append overflow
382fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str12("original");
383fe47ae56a8808c836923466e44704db3a8371593Niko Catania    char dummy[] = "unused";
384fe47ae56a8808c836923466e44704db3a8371593Niko Catania    // We lie about the size but that is ok. Since the lenght of the new string
3852a4077a9186d6f6dff104bbd1a73484aae6d5c01Nicolas Catania    // is going to be kMaxSizeT, the call will have not effect (there is no
386fe47ae56a8808c836923466e44704db3a8371593Niko Catania    // space for the trailing '\0').
3872a4077a9186d6f6dff104bbd1a73484aae6d5c01Nicolas Catania    str12.append(dummy, kMaxSizeT);
388fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str12 == "original");
389fe47ae56a8808c836923466e44704db3a8371593Niko Catania
3900cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania    // Append iterator.
3910cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania    {
3920cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        string str1("once upon ");
3930cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        const string str2("a time");
3940cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania
3950cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        str1.append(str2.begin(), str2.end());
3960cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        EXPECT_TRUE(str1.size() == 16);
3970cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        EXPECT_TRUE(str1 == "once upon a time");
3980cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania    }
3990cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania    {
4000cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        string str1("once upon ");
4010cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        string str2("a time");
4020cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania
4030cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        str1.append(str2.begin(), str2.begin());
4040cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        EXPECT_TRUE(str1.size() == 10);
4050cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        EXPECT_TRUE(str1 == "once upon ");
4060cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania    }
4070cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania    {
4080cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        string str1;
4090cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        string str2("hello");
4100cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania
4110cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        str1.append(str2.begin(), str2.end());
4120cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        EXPECT_TRUE(str1.size() == 5);
4130cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        EXPECT_TRUE(str1 == "hello");
4140cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania    }
4150cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania    {
4160cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        string str1("hello ");
4170cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        std::list<char> list1;
4180cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        list1.push_back('w');
4190cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        list1.push_back('o');
4200cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        list1.push_back('r');
4210cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        list1.push_back('l');
4220cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        list1.push_back('d');
4230cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        str1.append(list1.begin(), list1.end());
4240cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania        EXPECT_TRUE(str1 == "hello world");
4250cc3ee31c3cddd2bb5322398d17c388975e96d64Nicolas Catania    }
426fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
427fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
428fe47ae56a8808c836923466e44704db3a8371593Niko Catania
429fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testAppendOperator()
430fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
431fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str1;
432fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const char *text = "You spin my head right round.";
433fe47ae56a8808c836923466e44704db3a8371593Niko Catania
434fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str1 += text;
435fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str1 == text);
436fe47ae56a8808c836923466e44704db3a8371593Niko Catania
437fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str1 += " Flo Rida.";
438fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str1 == "You spin my head right round. Flo Rida.");
439fe47ae56a8808c836923466e44704db3a8371593Niko Catania
440fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str2;
441fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str2 += str1;
442fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str2 == "You spin my head right round. Flo Rida.");
443fe47ae56a8808c836923466e44704db3a8371593Niko Catania
444fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str3("You spin ");
445fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str3 += "my head right round.";
446fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str3 == "You spin my head right round.");
447fe47ae56a8808c836923466e44704db3a8371593Niko Catania
448fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str4("You spin ");
449fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str5("my head right round.");
450fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str4 += str5;
451fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str4 == "You spin my head right round.");
452fe47ae56a8808c836923466e44704db3a8371593Niko Catania
453fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str6("");
454fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str7("");
455fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str6 += str7;
456fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str6 == "");
457fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str6.empty());
458fe47ae56a8808c836923466e44704db3a8371593Niko Catania
459fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str8;
460fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str8 += "a";
461fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str8 == "a");
462fe47ae56a8808c836923466e44704db3a8371593Niko Catania
463fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const char more_text[] = {'l','a','d','y',' ','g','a','g','a'};
464fe47ae56a8808c836923466e44704db3a8371593Niko Catania
465fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str9;
466fe47ae56a8808c836923466e44704db3a8371593Niko Catania    for (size_t i = 0; i < ARRAYSIZE(more_text); ++i)
467fe47ae56a8808c836923466e44704db3a8371593Niko Catania    {
468fe47ae56a8808c836923466e44704db3a8371593Niko Catania        str9 += more_text[i];
469fe47ae56a8808c836923466e44704db3a8371593Niko Catania    }
470fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str9 == "lady gaga");
471fe47ae56a8808c836923466e44704db3a8371593Niko Catania
472fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str9 += (const char *)NULL;
473fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str9 == "lady gaga");
474fe47ae56a8808c836923466e44704db3a8371593Niko Catania
475fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str10(more_text, ARRAYSIZE(more_text));
476fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str10 == "lady gaga");
477fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str10 += '\0';
478fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str10 == "lady gaga");
479fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str10 == string("lady gaga\0", 10));
480fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str10 += 'x';
481fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str10 == string("lady gaga\0x", 11));
482fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str10[11] == '\0');
483fe47ae56a8808c836923466e44704db3a8371593Niko Catania
484fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
485fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
486fe47ae56a8808c836923466e44704db3a8371593Niko Catania
487fe47ae56a8808c836923466e44704db3a8371593Niko Catania
488fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testCompare()
489fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
490fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str01("bell helmet");
491fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str02("bell moto");
492fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str03("bell");
493fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str04("bell pants");
494fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str05;
495fe47ae56a8808c836923466e44704db3a8371593Niko Catania
496fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str05 = str01;
497fe47ae56a8808c836923466e44704db3a8371593Niko Catania    // Compare with self.
498fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01 == str01);
499fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(!(str01 != str01));
500fe47ae56a8808c836923466e44704db3a8371593Niko Catania
501fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01 == str05);
502fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str05 == str01);
503fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(!(str01 != str05));
504fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(!(str05 != str01));
505fe47ae56a8808c836923466e44704db3a8371593Niko Catania
506fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01 != str02);
507fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01 != str03);
508fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01 != str04);
509fe47ae56a8808c836923466e44704db3a8371593Niko Catania
510fe47ae56a8808c836923466e44704db3a8371593Niko Catania    // Compare with literals.
511fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01 == "bell helmet");
512fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(!(str01 != "bell helmet"));
513fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE("bell helmet" == str01);
514fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(!("bell helmet" != str01));
515fe47ae56a8808c836923466e44704db3a8371593Niko Catania
516fe47ae56a8808c836923466e44704db3a8371593Niko Catania    // Compare with char array.
517fe47ae56a8808c836923466e44704db3a8371593Niko Catania    char array[] = { 'a', ' ', 'b', 'u', 'g', '\0'};
518fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str01 = "a bug";
519fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(array == str01);
520fe47ae56a8808c836923466e44704db3a8371593Niko Catania
521fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(strcmp("a bug", "a bugg") < 0);
522fe47ae56a8808c836923466e44704db3a8371593Niko Catania
523fe47ae56a8808c836923466e44704db3a8371593Niko Catania    char array2[] = { 'a', 'b', 'u', 'g', 'g' };
524fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.compare(array2) < 0);
525fe47ae56a8808c836923466e44704db3a8371593Niko Catania
526fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str06;
527fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str06 != NULL);
5286309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania    {
5296309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania        string str_long("this is");
5306309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania        string str_short("it");
5316309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania        EXPECT_TRUE(str_long > str_short);
5326309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania        EXPECT_TRUE(str_long >= str_short);
5336309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania        EXPECT_FALSE(str_long < str_short);
5346309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania        EXPECT_FALSE(str_long <= str_short);
5356309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania    }
5366309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania    {
5376309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania        string str_lhs("this is");
5386309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania        string str_rhs("this is");
5396309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania        EXPECT_FALSE(str_lhs > str_rhs);
5406309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania        EXPECT_TRUE(str_lhs >= str_rhs);
5416309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania        EXPECT_FALSE(str_lhs < str_rhs);
5426309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania        EXPECT_TRUE(str_lhs <= str_rhs);
5436309a85f3be27b49451e37d0b31446e0cf727f23Nicolas Catania    }
544fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
545fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
546fe47ae56a8808c836923466e44704db3a8371593Niko Catania
547fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testSwap()
548fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
549fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str01;
550fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str02("test");
551fe47ae56a8808c836923466e44704db3a8371593Niko Catania
552fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str01.swap(str02);
553fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str02.empty());
554fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01 == "test");
555fe47ae56a8808c836923466e44704db3a8371593Niko Catania
556fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str03("altima");
557fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str04("versa");
558fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03.swap(str04);
559fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str03 == "versa");
560fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str04 == "altima");
561fe47ae56a8808c836923466e44704db3a8371593Niko Catania
562fe47ae56a8808c836923466e44704db3a8371593Niko Catania    {
563fe47ae56a8808c836923466e44704db3a8371593Niko Catania        string empty;
564fe47ae56a8808c836923466e44704db3a8371593Niko Catania        // swap can be used to clean strings
565fe47ae56a8808c836923466e44704db3a8371593Niko Catania        str04.swap(empty);
566fe47ae56a8808c836923466e44704db3a8371593Niko Catania    }
567fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str04.empty());
568fe47ae56a8808c836923466e44704db3a8371593Niko Catania
569fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
570fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
571fe47ae56a8808c836923466e44704db3a8371593Niko Catania
572fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testAccessor()
573fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
574fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str01 = "earmarks";
575fe47ae56a8808c836923466e44704db3a8371593Niko Catania
576fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01[0] == 'e');
577fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01[7] == 's');
578fe47ae56a8808c836923466e44704db3a8371593Niko Catania
579fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str01[0] = 'E';
580fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str01[7] = 'S';
581fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01 == "EarmarkS");
582fe47ae56a8808c836923466e44704db3a8371593Niko Catania
583fe47ae56a8808c836923466e44704db3a8371593Niko Catania    for (int i = 0; i < 100; ++i)
584fe47ae56a8808c836923466e44704db3a8371593Niko Catania    {
585fe47ae56a8808c836923466e44704db3a8371593Niko Catania        string str02(i, 'x');
586fe47ae56a8808c836923466e44704db3a8371593Niko Catania
587fe47ae56a8808c836923466e44704db3a8371593Niko Catania        str02.reserve(20);
588fe47ae56a8808c836923466e44704db3a8371593Niko Catania
589fe47ae56a8808c836923466e44704db3a8371593Niko Catania        EXPECT_TRUE(str02[i] == '\0');
590fe47ae56a8808c836923466e44704db3a8371593Niko Catania
591fe47ae56a8808c836923466e44704db3a8371593Niko Catania        const string str03(str02);
592fe47ae56a8808c836923466e44704db3a8371593Niko Catania        EXPECT_TRUE(str03[i] == '\0');
593fe47ae56a8808c836923466e44704db3a8371593Niko Catania    }
594fe47ae56a8808c836923466e44704db3a8371593Niko Catania
595fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str05;
596fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str05.reserve(100);
597fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str05[99] = 'a';
598fe47ae56a8808c836923466e44704db3a8371593Niko Catania
59974a6fdea77d52a17be4bc38831fe02a31cefbf34Nicolas Catania    // 'at'
60074a6fdea77d52a17be4bc38831fe02a31cefbf34Nicolas Catania    EXPECT_TRUE(str01.at(0) == 'E');
60174a6fdea77d52a17be4bc38831fe02a31cefbf34Nicolas Catania    EXPECT_TRUE(str01.at(7) == 'S');
60274a6fdea77d52a17be4bc38831fe02a31cefbf34Nicolas Catania    EXPECT_TRUE(str01.at(8) == 'X');  // 'X' is the dummy value returned.
60374a6fdea77d52a17be4bc38831fe02a31cefbf34Nicolas Catania
60474a6fdea77d52a17be4bc38831fe02a31cefbf34Nicolas Catania    str01.at(1) = 'A';
60574a6fdea77d52a17be4bc38831fe02a31cefbf34Nicolas Catania    str01.at(6) = 'K';
60674a6fdea77d52a17be4bc38831fe02a31cefbf34Nicolas Catania    EXPECT_TRUE(str01 == "EArmarKS");
607fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
608fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
609fe47ae56a8808c836923466e44704db3a8371593Niko Catania
610fe47ae56a8808c836923466e44704db3a8371593Niko Catania
611fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testAssignment()
612fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
613fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const char *literal = "Need to buy a full face helmet for Lilie.";
614fe47ae56a8808c836923466e44704db3a8371593Niko Catania    const string str01 = literal;
615fe47ae56a8808c836923466e44704db3a8371593Niko Catania
616fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.length() == strlen(literal));
617fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.size() == strlen(literal));
618fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.capacity() == strlen(literal));
619fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01 == literal);
620fe47ae56a8808c836923466e44704db3a8371593Niko Catania
621fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str02;
622fe47ae56a8808c836923466e44704db3a8371593Niko Catania
623fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str02.assign(str01, 8, 33);
624fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str02 == "buy a full face helmet for Lilie.");
625fe47ae56a8808c836923466e44704db3a8371593Niko Catania
626fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str02.assign(str01, 8, 0);
627fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str02 == "");
628fe47ae56a8808c836923466e44704db3a8371593Niko Catania
629fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str02.assign(str01, 0, 7);
630fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str02 == "Need to");
631fe47ae56a8808c836923466e44704db3a8371593Niko Catania
632fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str02.assign("unchanged");
633fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str02.assign(str01, 35, 1000);
634fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str02 == "unchanged");
635fe47ae56a8808c836923466e44704db3a8371593Niko Catania
636fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str02.assign(str01, 35, 6);
637fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str02 == "Lilie.");
638fe47ae56a8808c836923466e44704db3a8371593Niko Catania
639fe47ae56a8808c836923466e44704db3a8371593Niko Catania
640fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str02.assign(str01, 35, 5);
641fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str02 == "Lilie");
642fe47ae56a8808c836923466e44704db3a8371593Niko Catania
643fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str03;
644fe47ae56a8808c836923466e44704db3a8371593Niko Catania
645fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03.assign(literal);
646fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str03 == "Need to buy a full face helmet for Lilie.");
647fe47ae56a8808c836923466e44704db3a8371593Niko Catania
648fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str04;
649fe47ae56a8808c836923466e44704db3a8371593Niko Catania
650fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str04.assign(str03.c_str());
651fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str04 == "Need to buy a full face helmet for Lilie.");
652fe47ae56a8808c836923466e44704db3a8371593Niko Catania
653fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str04.assign(str03.c_str() + 5, 10);
654fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str04 == "to buy a f");
655fe47ae56a8808c836923466e44704db3a8371593Niko Catania
656fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str04.assign("noop");
657fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str04.assign(NULL);
658fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str04 == "noop");
659fe47ae56a8808c836923466e44704db3a8371593Niko Catania
660fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str04.assign(str01, str01.size() - 1, 1);
661fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str04 == ".");
662fe47ae56a8808c836923466e44704db3a8371593Niko Catania
663fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str04.assign("unchanged");
664fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str04.assign(str01, str01.size(), 1);
665fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str04.assign(NULL, 4, 1);
666fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str04.assign(NULL, 4);
667fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str04 == "unchanged");
668fe47ae56a8808c836923466e44704db3a8371593Niko Catania
669fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
670fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
671fe47ae56a8808c836923466e44704db3a8371593Niko Catania
6726943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Cataniabool testCopy()
6736943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania{
6746943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania    string data[] = {"one", "two", "three", "four", "five", "six"};
6756943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania    std::copy(data + 2, data + 5, data);
6766943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania    EXPECT_TRUE(data[0] == "three");
6776943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania    EXPECT_TRUE(data[1] == "four");
6786943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania    EXPECT_TRUE(data[2] == "five");
6796943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania    EXPECT_TRUE(data[3] == "four");
6806943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania    EXPECT_TRUE(data[4] == "five");
6816943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania    EXPECT_TRUE(data[5] == "six");
6826943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania    return true;
6836943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania}
6846943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania
685fe47ae56a8808c836923466e44704db3a8371593Niko Catania
686fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testConcat()
687fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
688fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str01("The full");
689fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str02(" sentence.");
690fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str03;
691fe47ae56a8808c836923466e44704db3a8371593Niko Catania
692fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = str01 + str02;
693fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str03 == "The full sentence.");
694fe47ae56a8808c836923466e44704db3a8371593Niko Catania
695fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = str02 + str01;
696fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str03 == " sentence.The full");
697fe47ae56a8808c836923466e44704db3a8371593Niko Catania
698fe47ae56a8808c836923466e44704db3a8371593Niko Catania
699fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = str01 + " sentence.";
700fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str03 == "The full sentence.");
701fe47ae56a8808c836923466e44704db3a8371593Niko Catania
702fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = "The full" + str02;
703fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str03 == "The full sentence.");
704fe47ae56a8808c836923466e44704db3a8371593Niko Catania
705fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = 'l' + str02;
706fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = 'l' + str03;
707fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = 'u' + str03;
708fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = 'f' + str03;
709fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = ' ' + str03;
710fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = 'e' + str03;
711fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = 'h' + str03;
712fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = 'T' + str03;
713fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str03 == "The full sentence.");
714fe47ae56a8808c836923466e44704db3a8371593Niko Catania
715fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = "The full ";
716fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = str03 + 's';
717fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = str03 + 'e';
718fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = str03 + 'n';
719fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = str03 + 't';
720fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = str03 + 'e';
721fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = str03 + 'n';
722fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = str03 + 'c';
723fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = str03 + 'e';
724fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str03 = str03 + '.';
725fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str03 == "The full sentence.");
726fe47ae56a8808c836923466e44704db3a8371593Niko Catania
727fe47ae56a8808c836923466e44704db3a8371593Niko Catania    // Check the new string buffer is not the same as the original one.
728fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str04("left and");
729fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str05(" right");
730fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str06(str04 + str05);
731fe47ae56a8808c836923466e44704db3a8371593Niko Catania
732fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str06 == "left and right");
733fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str06.c_str() != str04.c_str());
734fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str06.c_str() != str05.c_str());
735fe47ae56a8808c836923466e44704db3a8371593Niko Catania
736fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str06 = str04 + str05;
737fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str06 == "left and right");
738fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str06.c_str() != str04.c_str());
739fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str06.c_str() != str05.c_str());
740fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
741fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
742fe47ae56a8808c836923466e44704db3a8371593Niko Catania
743fe47ae56a8808c836923466e44704db3a8371593Niko Cataniabool testPushBack()
744fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
745fe47ae56a8808c836923466e44704db3a8371593Niko Catania    string str01;
746fe47ae56a8808c836923466e44704db3a8371593Niko Catania
747fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str01.push_back('a');
748fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01 == "a");
749fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.capacity() == 1);
750fe47ae56a8808c836923466e44704db3a8371593Niko Catania
751fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str01.reserve(10);
752fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str01.push_back('b');
753fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01 == "ab");
754fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.capacity() == 10);
755fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01[2] == '\0');
756fe47ae56a8808c836923466e44704db3a8371593Niko Catania
757fe47ae56a8808c836923466e44704db3a8371593Niko Catania    str01.reserve();
758fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01 == "ab");
759fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01.capacity() == 2);
760fe47ae56a8808c836923466e44704db3a8371593Niko Catania    EXPECT_TRUE(str01[2] == '\0');
761fe47ae56a8808c836923466e44704db3a8371593Niko Catania
762fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return true;
763fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
764fe47ae56a8808c836923466e44704db3a8371593Niko Catania
765d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Cataniabool testFind()
766d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania{
767d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  string haystack("one two three one two three");
768d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania
769d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  // Don't die on null strings
770cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania  EXPECT_TRUE(haystack.find((char*)NULL) == string::npos);
771cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania  EXPECT_TRUE(haystack.find((char*)NULL, 10) == string::npos);
772d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania
773d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  // C strings.
774d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find("one") == 0);
775d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find("two") == 4);
776d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find("t") == 4);
777d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find("four") == string::npos);
778d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find("one", string::npos) == string::npos);
779d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania
780d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  // with offset
781d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find("one", 13) == 14);
782d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find("one", 14) == 14);
783d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find("one", 15) == string::npos);
784d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find("e", haystack.size() - 1) == haystack.size() - 1);
785d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find("e", haystack.size()) == string::npos);
786d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find("one", string::npos) == string::npos);
787d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania
788d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  // std::string
789d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find(string("one")) == 0);
790d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find(string("two")) == 4);
791d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find(string("t")) == 4);
792d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find(string("four")) == string::npos);
793d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find(string("one"), string::npos) == string::npos);
794d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania
795d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  // with offset
796d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find(string("one"), 13) == 14);
797d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find(string("one"), 14) == 14);
798d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find(string("one"), 15) == string::npos);
799d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find(string("e"), haystack.size() - 1) == haystack.size() - 1);
800d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find(string("e"), haystack.size()) == string::npos);
801d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(haystack.find(string("one"), string::npos) == string::npos);
802d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania
803d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  // Emtpy string should be found at every position in a string except
804d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  // past the end.
805d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(string().find("", 0) == 0);
806d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(string().find(string(), 0) == 0);
807d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(string().find(string(), 10) == string::npos);
808d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania
809d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  string foo = "foo";
810d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(foo.find("", 0) == 0);
811d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(foo.find(string(), 0) == 0);
812d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(foo.find(string(""), 0) == 0);
813d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania
814d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(foo.find("", 1) == 1);
815d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(foo.find(string(), 1) == 1);
816d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(foo.find(string(""), 1) == 1);
817d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania
818d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(foo.find("", foo.size()) == foo.size());
819d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(foo.find(string(), foo.size()) == foo.size());
820d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(foo.find(string(""), foo.size()) == foo.size());
821d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania
822d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(foo.find("", foo.size() + 1) == string::npos);
823d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(foo.find(string(), foo.size() + 1) == string::npos);
824d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(foo.find(string(""), foo.size() + 1) == string::npos);
825d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania
826d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  // Find on an empty string a non empty one should fail
827d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(string().find("f", 0) == string::npos);
828d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  EXPECT_TRUE(string().find(string("f"), 0) == string::npos);
829d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania  return true;
830d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania}
831d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania
83260fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Cataniabool testCapacity()
83360fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania{
83460fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  string empty_string;
83560fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
83660fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  EXPECT_TRUE(empty_string.capacity() == 0);
83760fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  EXPECT_TRUE(empty_string.size() == 0);
83860fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
83960fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  const char *text = "non empty string";
84060fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  const size_t len = strlen(text);
84160fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  string str01(text);
84260fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
84360fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  EXPECT_TRUE(str01.capacity() == len);
84460fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  EXPECT_TRUE(str01.size() == len);
84560fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  return true;
84660fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania}
84760fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
84860fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Cataniabool testClear()
84960fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania{
85060fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  string empty_string;
85160fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
85260fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  empty_string.clear();
85360fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  EXPECT_TRUE(empty_string.capacity() == 0);
85460fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  EXPECT_TRUE(empty_string.size() == 0);
85560fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
85660fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  string str01("non empty string");
85760fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
85860fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  str01.clear();
85960fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  EXPECT_TRUE(str01.capacity() == 0);
86060fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  EXPECT_TRUE(str01.size() == 0);
86160fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  EXPECT_TRUE(str01.empty());
86260fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  return true;
86360fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania}
86460fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
86560fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Cataniabool testErase()
86660fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania{
86760fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  {
86860fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    string empty_string;
86960fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
87060fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    empty_string.erase();
87160fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(empty_string.capacity() == 0);
87260fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(empty_string.size() == 0);
87360fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
8742a4077a9186d6f6dff104bbd1a73484aae6d5c01Nicolas Catania    empty_string.erase(kMaxSizeT);
87560fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(empty_string.capacity() == 0);
87660fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(empty_string.size() == 0);
87760fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
8782a4077a9186d6f6dff104bbd1a73484aae6d5c01Nicolas Catania    empty_string.erase(kMaxSizeT, kMaxSizeT);
87960fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(empty_string.capacity() == 0);
88060fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(empty_string.size() == 0);
88160fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  }
88260fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
88360fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  {
88460fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    string str01("a");
88560fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
88660fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    str01.erase();
88760fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str01.capacity() == 1);
88860fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str01.size() == 0);
88960fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  }
89060fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
89160fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  {
89260fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    string str02("a");
89360fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
8942a4077a9186d6f6dff104bbd1a73484aae6d5c01Nicolas Catania    str02.erase(kMaxSizeT);
89560fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str02.capacity() == 1);
89660fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str02.size() == 1);
89760fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  }
89860fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
89960fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  {
90060fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    string str03("a");
90160fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
9022a4077a9186d6f6dff104bbd1a73484aae6d5c01Nicolas Catania    str03.erase(0, kMaxSizeT);
90360fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str03.capacity() == 1);
90460fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str03.size() == 0);
90560fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  }
90660fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
90760fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  {
90860fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    string str04("a");
90960fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
9102a4077a9186d6f6dff104bbd1a73484aae6d5c01Nicolas Catania    str04.erase(1, kMaxSizeT);
91160fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str04.capacity() == 1);
91260fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str04.size() == 1);
91360fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  }
91460fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
91560fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  {
91660fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    string str05("abcd");
91760fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
91860fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    str05.erase(1, 2);
91960fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str05.capacity() == 4);
92060fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str05.size() == 2);
92160fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str05 == "ad");
92260fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  }
92360fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
92460fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  {
92560fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    string str06("abcd");
92660fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
92760fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    str06.erase(0, 1);
92860fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str06.capacity() == 4);
92960fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str06.size() == 3);
93060fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str06 == "bcd");
93160fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  }
93260fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
93360fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  {
93460fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    // overlap
93560fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    string str07("oh my god (You think I'm in control)");
93660fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
93760fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    str07.erase(0, strlen("oh my god "));
93860fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str07.size() == 26);
93960fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    EXPECT_TRUE(str07 == "(You think I'm in control)");
94060fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  }
94160fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
94260fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania  return true;
94360fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania}
94460fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania
94591ea6c037471a1acd97b03c3097223777906f748Nicolas Catania// Checks an iterator can be cast to a const one.
94691ea6c037471a1acd97b03c3097223777906f748Nicolas Cataniabool testConstIterator()
94791ea6c037471a1acd97b03c3097223777906f748Nicolas Catania{
94891ea6c037471a1acd97b03c3097223777906f748Nicolas Catania    string s("a string");
94991ea6c037471a1acd97b03c3097223777906f748Nicolas Catania    string::iterator i = s.begin();
95091ea6c037471a1acd97b03c3097223777906f748Nicolas Catania    string::const_iterator ci = s.begin();
95191ea6c037471a1acd97b03c3097223777906f748Nicolas Catania    return true;
95291ea6c037471a1acd97b03c3097223777906f748Nicolas Catania}
95391ea6c037471a1acd97b03c3097223777906f748Nicolas Catania
95491ea6c037471a1acd97b03c3097223777906f748Nicolas Cataniabool testForwardIterator()
95591ea6c037471a1acd97b03c3097223777906f748Nicolas Catania{
95691ea6c037471a1acd97b03c3097223777906f748Nicolas Catania    string s("a string");
95791ea6c037471a1acd97b03c3097223777906f748Nicolas Catania    char chars[] = "a string";
95891ea6c037471a1acd97b03c3097223777906f748Nicolas Catania    string::iterator iter = s.begin();
95991ea6c037471a1acd97b03c3097223777906f748Nicolas Catania    for (int i = 0; iter != s.end(); ++i) {
96091ea6c037471a1acd97b03c3097223777906f748Nicolas Catania        EXPECT_TRUE(*iter == chars[i]);
96191ea6c037471a1acd97b03c3097223777906f748Nicolas Catania        ++iter;
96291ea6c037471a1acd97b03c3097223777906f748Nicolas Catania    }
96391ea6c037471a1acd97b03c3097223777906f748Nicolas Catania    EXPECT_TRUE(iter == s.end());
96491ea6c037471a1acd97b03c3097223777906f748Nicolas Catania
96591ea6c037471a1acd97b03c3097223777906f748Nicolas Catania    string empty;
96691ea6c037471a1acd97b03c3097223777906f748Nicolas Catania    EXPECT_TRUE(empty.begin() == empty.end());
96791ea6c037471a1acd97b03c3097223777906f748Nicolas Catania    return true;
96891ea6c037471a1acd97b03c3097223777906f748Nicolas Catania}
96991ea6c037471a1acd97b03c3097223777906f748Nicolas Catania
97040d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Cataniabool testSubstr() {
97140d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania    {
97240d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania        string s;
97340d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania        string res = s.substr(10, 1);
97440d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania        EXPECT_TRUE(res.empty());
97540d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania    }
97640d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania    {
97740d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania        string s = "pandora radio";
97840d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania        string res = s.substr(string::npos, 1);
97940d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania        EXPECT_TRUE(res.empty());
98040d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania    }
98140d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania    {
98240d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania        string s = "pandora radio";
98340d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania        string res = s.substr(5, 1000);
98440d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania        EXPECT_TRUE(res == "ra radio");
98540d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania    }
98640d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania    {
98740d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania        string s = "pandora radio";
98840d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania        string res = s.substr(5, 0);
98940d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania        EXPECT_TRUE(res.empty());
99040d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania    }
99140d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania    {
99240d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania        string s = "pandora radio";
99340d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania        string res = s.substr(5, 5);
99440d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania        EXPECT_TRUE(res == "ra ra");
99540d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania    }
99640d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania    return true;
99740d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania}
99840d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania
999cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Cataniabool testCharSearch() {
1000cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    {
1001cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        string s;
1002cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_first_of('a') == string::npos);
1003cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        s = "abracadabra";
1004cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_first_of('a') == 0);
1005cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_first_of('a', 0) == 0);
1006cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_first_of('a', 1) == 3);
1007cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_first_of('a', 8) == 10);
1008cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        s = "zzzzzzza";
1009cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_first_of('a') == 7);
1010cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_first_of('a', 8) == string::npos); // out of bound
1011cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    }
1012cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    // For char (set of size 1) find_first_of is equive to find(char, pos)
1013cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    {
1014cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        string s;
1015cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find('a') == string::npos);
1016cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        s = "abracadabra";
1017cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find('a') == 0);
1018cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find('a', 0) == 0);
1019cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find('a', 1) == 3);
1020cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find('a', 8) == 10);
1021cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        s = "zzzzzzza";
1022cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find('a') == 7);
1023cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find('a', 8) == string::npos); // out of bound
1024cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    }
1025cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    {
1026cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        string s;
1027cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_last_of('a') == string::npos);
1028cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_last_of('a', 0) == string::npos);
1029cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_last_of('a', 10) == string::npos);
1030cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        s = "abracadabra";
1031cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_last_of('a', 10) == 10);
1032cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_last_of('a', 9) == 7);
1033cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_last_of('a', 0) == 0);
1034cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        s = "azzzzzzz";
1035cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_last_of('a') == 0);
1036cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    }
1037cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    // For char (set of size 1) find_last_of is equiv to rfind(char, pos).
1038cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    {
1039cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        string s;
1040cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.rfind('a') == string::npos);
1041cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.rfind('a', 0) == string::npos);
1042cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.rfind('a', 10) == string::npos);
1043cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        s = "abracadabra";
1044cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.rfind('a', 10) == 10);
1045cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.rfind('a', 9) == 7);
1046cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.rfind('a', 0) == 0);
1047cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        s = "azzzzzzz";
1048cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.rfind('a') == 0);
1049cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    }
1050cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    {
1051cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        string s;
1052cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_first_not_of('a') == string::npos);
1053cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        s = "abracadabra";
1054cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_first_not_of('a') == 1);
1055cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_first_not_of('a', 0) == 1);
1056cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_first_not_of('a', 1) == 1);
1057cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_first_not_of('a', 7) == 8);
1058cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        s = "zzzzzzza";
1059cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_first_not_of('a') == 0);
1060cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_first_not_of('a', 8) == string::npos); // out of bound
1061cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    }
1062cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    {
1063cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        string s;
1064cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_last_not_of('a') == string::npos);
1065cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_last_not_of('a', 0) == string::npos);
1066cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_last_not_of('a', 10) == string::npos);
1067cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        s = "abracadabra";
1068cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_last_not_of('a') == 9);
1069cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_last_not_of('a', 10) == 9);
1070cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_last_not_of('a', 9) == 9);
1071cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_last_not_of('a', 0) == string::npos);
1072cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        s = "azzzzzzz";
1073cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania        EXPECT_TRUE(s.find_last_not_of('a') == 7);
1074cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    }
1075cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    return true;
1076cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania}
1077cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania
1078464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania
1079464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Cataniabool testInsert() {
1080464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania    {
1081464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania        string::iterator res;
1082464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania        string str("zzzzzz");
1083464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania        res = str.insert(str.begin(), 'a');
1084464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania        EXPECT_TRUE(str == "azzzzzz");
1085464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania        EXPECT_TRUE(*res == 'a');
1086464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania
1087464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania        res = str.insert(str.begin() + 3, 'b');
1088464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania        EXPECT_TRUE(str == "azzbzzzz");
1089464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania        EXPECT_TRUE(*res == 'b');
1090464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania
1091464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania        res = str.insert(str.end(), 'c');
1092464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania        EXPECT_TRUE(str == "azzbzzzzc");
1093464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania        EXPECT_TRUE(*res == 'c');
1094464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania    }
1095464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania    {
1096464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania        string str;
1097464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania        string::iterator res = str.insert(str.begin(), 'a');
1098464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania        EXPECT_TRUE(str == "a");
1099464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania        EXPECT_TRUE(*res == 'a');
1100464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania    }
1101464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania    return true;
1102464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania}
1103464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania
1104fe47ae56a8808c836923466e44704db3a8371593Niko Catania}  // namespace android
1105fe47ae56a8808c836923466e44704db3a8371593Niko Catania
1106fe47ae56a8808c836923466e44704db3a8371593Niko Cataniaint main(int argc, char **argv)
1107fe47ae56a8808c836923466e44704db3a8371593Niko Catania{
1108fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testConstructorCString);
1109fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testConstructorString);
1110fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testConstructorRepeatChar);
1111fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testConstructorPointers);
1112fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testConstructorInvalidValues);
1113fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testSize);
1114fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testCString);
1115fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testAppend);
1116fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testAppendOperator);
1117fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testConcat);
1118fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testAssignment);
11196943930994c640cbb24773ddb8df99de8a5d7e16Nicolas Catania    FAIL_UNLESS(testCopy);
1120fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testReserve);
1121fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testCompare);
1122fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testAccessor);
1123fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testSwap);
1124fe47ae56a8808c836923466e44704db3a8371593Niko Catania    FAIL_UNLESS(testPushBack);
1125d738d268c8f915bde451bba52e0c3996113ba9f0Nicolas Catania    FAIL_UNLESS(testFind);
112660fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    FAIL_UNLESS(testCapacity);
112760fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    FAIL_UNLESS(testClear);
112860fd0f758a63e74980d712a13c91bc24d98cedc6Nicolas Catania    FAIL_UNLESS(testErase);
112991ea6c037471a1acd97b03c3097223777906f748Nicolas Catania    FAIL_UNLESS(testConstIterator);
113091ea6c037471a1acd97b03c3097223777906f748Nicolas Catania    FAIL_UNLESS(testForwardIterator);
113140d9e34c926f59cae26c4bae4ab55377cf3cdd40Nicolas Catania    FAIL_UNLESS(testSubstr);
1132cb8eb8e1390d1343563a55c117b5c39cfa87fe1dNicolas Catania    FAIL_UNLESS(testCharSearch);
1133464136e01a1facf09ce3befccbfc04f2d1da8d5bNicolas Catania    FAIL_UNLESS(testInsert);
1134fe47ae56a8808c836923466e44704db3a8371593Niko Catania    return kPassed;
1135fe47ae56a8808c836923466e44704db3a8371593Niko Catania}
1136