String_unittest.cpp revision d3f2c27ff9f611e5047a35cb20ed53f548214fed
1d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// Copyright 2014 The Android Open Source Project
2d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner//
3d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// This software is licensed under the terms of the GNU General Public
4d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// License version 2, as published by the Free Software Foundation, and
5d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// may be copied, distributed, and modified under those terms.
6d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner//
7d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// This program is distributed in the hope that it will be useful,
8d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// but WITHOUT ANY WARRANTY; without even the implied warranty of
9d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// GNU General Public License for more details.
11d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
12d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner#include "android/base/String.h"
13d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
14d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner#include "android/base/StringView.h"
15d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
16d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner#include <gtest/gtest.h>
17d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
18d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnernamespace android {
19d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnernamespace base {
20d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
21d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, DefaultConstructor) {
22d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s;
23d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(0U, s.size());
24d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_TRUE(s.empty());
25d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
26d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
27d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, SimpleConstructor) {
28d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    static const char kString[] = "hello you";
29d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const size_t kStringLen = sizeof(kString) - 1U;
30d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
31d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s(kString);
32d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_NE(kString, s.c_str());
33d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(kStringLen, s.size());
34d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_FALSE(s.empty());
35d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_STREQ(kString, s.c_str());
36d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
37d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
38d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, SimpleConstructorWithLongString) {
39d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    static const char kString[] =
40d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner            "this is a long string that should exceed the "
41d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner            "small-string-optimization capacity";
42d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const size_t kStringLen = sizeof(kString) - 1U;
43d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
44d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s(kString);
45d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_NE(kString, s.c_str());
46d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(kStringLen, s.size());
47d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_FALSE(s.empty());
48d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_STREQ(kString, s.c_str());
49d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
50d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
51d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, CopyConstructor) {
52d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s1("Hello World!");
53d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s2(s1);
54d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(s1.size(), s2.size());
55d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_STREQ(s1.c_str(), s2.c_str());
56d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
57d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
58d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, ConstructorFromStringView) {
59d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    StringView view("Hello Cowboys");
60d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s(view);
61d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_NE(view.str(), s.c_str());
62d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(view.size(), s.size());
63d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_STREQ(view.str(), s.c_str());
64d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
65d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
66d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, ConstructorWithCountAndFill) {
67d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const size_t kCount = 1024;
68d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const char kFill = 0x42;
69d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
70d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s(kCount, kFill);
71d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(kCount, s.size());
72d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < kCount; ++n)
73d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(kFill, s[n]);
74d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
75d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
76d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, empty) {
77d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s1("");
78d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_TRUE(s1.empty());
79d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
80d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s2("foo");
81d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_FALSE(s2.empty());
82d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
83d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
84d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, size) {
85d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const size_t kCount = 4096;
86d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s;
87d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < kCount; ++n) {
88d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(n, s.size());
89d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        s += 'x';
90d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
91d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(kCount, s.size());
92d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
93d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
94d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, IndexedAccess) {
95d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s("foobar");
96d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ('f', s[0]);
97d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ('o', s[1]);
98d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ('o', s[2]);
99d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ('b', s[3]);
100d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ('a', s[4]);
101d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ('r', s[5]);
102d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ('\0', s[6]);
103d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
104d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
105d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, AssignOperatorWithCString) {
106d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    static const char kString[] = "Hello 10234";
107d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const size_t kStringLen = sizeof(kString) - 1U;
108d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
109d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s;
110d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    s = kString;
111d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_NE(kString, s.c_str());
112d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(kStringLen, s.size());
113d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_STREQ(kString, s.c_str());
114d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
115d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
116d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, AssignOperatorWithOtherString) {
117d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s0("A fish named Wanda");
118d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s;
119d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    s = s0;
120d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(s0.size(), s.size());
121d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_STREQ(s0.c_str(), s.c_str());
122d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
123d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
124d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, AssignOperatorWithStringView) {
125d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    StringView v0("What a beautiful world");
126d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s;
127d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    s = v0;
128d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(v0.size(), s.size());
129d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_STREQ(v0.str(), s.c_str());
130d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
131d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
132d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, AssignOperatorWithChar) {
133d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s;
134d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    s = 'f';
135d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(1U, s.size());
136d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ('f', s[0]);
137d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
138d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
139d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, assignWithCString) {
140d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    static const char kString[] = "Hello";
141d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const size_t kStringLen = sizeof(kString) - 1U;
142d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
143d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String  s;
144d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    s.assign(kString);
145d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(kStringLen, s.size());
146d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_STREQ(kString, s.c_str());
147d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
148d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
149d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, assignWithString) {
150d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s0("Input string");
151d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s;
152d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    s.assign(s0);
153d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(s0.size(), s.size());
154d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_STREQ(s0.c_str(), s.c_str());
155d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
156d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
157d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, assignWithStringAndLen) {
158d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    static const char kString[] = "Who you're gonna call?";
159d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const size_t kStringLen = sizeof(kString) - 1U;
160d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
161d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s;
162d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    s.assign(kString, kStringLen);
163d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_NE(kString, s.c_str());
164d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(kStringLen, s.size());
165d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_STREQ(kString, s.c_str());
166d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
167d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
168d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, assignWithCountAndFill) {
169d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const size_t kCount = 1024;
170d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const char kFill = '\x7f';
171d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s;
172d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    s.assign(kCount, kFill);
173d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(kCount, s.size());
174d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < kCount; ++n) {
175d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(kFill, s[n]) << "At index " << n;
176d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
177d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
178d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
179d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, assignWithStringView) {
180d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    StringView v0("Input string view");
181d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s;
182d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    s.assign(v0);
183d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(v0.size(), s.size());
184d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_STREQ(v0.str(), s.c_str());
185d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
186d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
187d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, assignWithChar) {
188d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s;
189d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    s.assign('f');
190d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(1U, s.size());
191d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_STREQ("f", s.c_str());
192d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
193d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
194d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnertypedef struct {
195d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const char* s1;
196d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const char* s2;
197d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    int expected;
198d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner} Comparison;
199d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
200d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnerstatic const Comparison kComparisons[] = {
201d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    { "", "", 0 },
202d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    { "", "foo", -1 },
203d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    { "foo", "", +1 },
204d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    { "foo", "zoo", -1 },
205d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    { "foo", "foo", 0 },
206d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    { "foo", "fo", +1 },
207d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    { "foo", "fooo", -1 },
208d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    { "foo", "fop", -1 },
209d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    { "foo", "fon", +1 },
210d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner};
211d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
212d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner#define ARRAY_SIZE(x)  (sizeof(x)/sizeof(x[0]))
213d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
214d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, compareWithCString) {
215d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < ARRAY_SIZE(kComparisons); ++n) {
216d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        const Comparison& comp = kComparisons[n];
217d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String s(comp.s1);
218d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(comp.expected, s.compare(comp.s2))
219d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << "Comparing '" << comp.s1 << "' with '"
220d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << comp.s2 << "'";
221d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
222d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
223d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
224d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, compareWithCStringWithLen) {
225d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < ARRAY_SIZE(kComparisons); ++n) {
226d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        const Comparison& comp = kComparisons[n];
227d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String s(comp.s1);
228d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        size_t len2 = ::strlen(comp.s2);
229d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(comp.expected, s.compare(comp.s2, len2))
230d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << "Comparing '" << comp.s1 << "' with '"
231d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << comp.s2 << "'";
232d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
233d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
234d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
235d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
236d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, compareWithString) {
237d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < ARRAY_SIZE(kComparisons); ++n) {
238d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        const Comparison& comp = kComparisons[n];
239d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String s1(comp.s1);
240d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String s2(comp.s2);
241d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(comp.expected, s1.compare(s2))
242d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << "Comparing '" << comp.s1 << "' with '"
243d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << comp.s2 << "'";
244d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
245d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
246d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
247d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, compareWithStringView) {
248d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < ARRAY_SIZE(kComparisons); ++n) {
249d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        const Comparison& comp = kComparisons[n];
250d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String s1(comp.s1);
251d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        StringView s2(comp.s2);
252d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(comp.expected, s1.compare(s2))
253d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << "Comparing '" << comp.s1 << "' with '"
254d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << comp.s2 << "'";
255d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
256d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
257d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
258d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, equalsWithCString) {
259d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < ARRAY_SIZE(kComparisons); ++n) {
260d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        const Comparison& comp = kComparisons[n];
261d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String s(comp.s1);
262d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(!comp.expected, s.equals(comp.s2))
263d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << "Comparing '" << comp.s1 << "' with '"
264d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << comp.s2 << "'";
265d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
266d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
267d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
268d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, equalsWithCStringWithLen) {
269d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < ARRAY_SIZE(kComparisons); ++n) {
270d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        const Comparison& comp = kComparisons[n];
271d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String s(comp.s1);
272d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        size_t len2 = ::strlen(comp.s2);
273d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(!comp.expected, s.equals(comp.s2, len2))
274d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << "Comparing '" << comp.s1 << "' with '"
275d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << comp.s2 << "'";
276d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
277d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
278d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
279d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
280d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, equalsWithString) {
281d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < ARRAY_SIZE(kComparisons); ++n) {
282d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        const Comparison& comp = kComparisons[n];
283d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String s1(comp.s1);
284d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String s2(comp.s2);
285d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(!comp.expected, s1.equals(s2))
286d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << "Comparing '" << comp.s1 << "' with '"
287d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << comp.s2 << "'";
288d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
289d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
290d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
291d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, equalsWithStringView) {
292d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < ARRAY_SIZE(kComparisons); ++n) {
293d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        const Comparison& comp = kComparisons[n];
294d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String s1(comp.s1);
295d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        StringView s2(comp.s2);
296d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(!comp.expected, s1.equals(s2))
297d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << "Comparing '" << comp.s1 << "' with '"
298d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << comp.s2 << "'";
299d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
300d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
301d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
302d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, EqualsOperatorWithCString) {
303d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < ARRAY_SIZE(kComparisons); ++n) {
304d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        const Comparison& comp = kComparisons[n];
305d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String s(comp.s1);
306d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(!comp.expected, s == comp.s2)
307d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << "Comparing '" << comp.s1 << "' with '"
308d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << comp.s2 << "'";
309d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
310d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
311d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
312d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, EqualsOperatorWithString) {
313d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < ARRAY_SIZE(kComparisons); ++n) {
314d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        const Comparison& comp = kComparisons[n];
315d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String s1(comp.s1);
316d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String s2(comp.s2);
317d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(!comp.expected, s1 == s2)
318d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << "Comparing '" << comp.s1 << "' with '"
319d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << comp.s2 << "'";
320d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
321d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
322d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
323d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, EqualsOperatorWithStringView) {
324d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < ARRAY_SIZE(kComparisons); ++n) {
325d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        const Comparison& comp = kComparisons[n];
326d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String s1(comp.s1);
327d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        StringView s2(comp.s2);
328d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(!comp.expected, s1 == s2)
329d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << "Comparing '" << comp.s1 << "' with '"
330d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << comp.s2 << "'";
331d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
332d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
333d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
334d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, Reserve0OnEmptyString) {
335d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String s;
336d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    // This is really to check that this doesn't crash.
337d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    ::memset(&s, 0, sizeof(s));
338d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    s.reserve(0U);
339d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
340d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
341d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(String, Swap) {
342d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const String kShortString1("Hello World!");
343d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const String kLongString1("A very long string that will likely "
344d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner            "exceed the small string optimization storage buffer");
345d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const String kShortString2("Menthe a l'eau");
346d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const String kLongString2("Harold Ramis, Chicago actor, writer "
347d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner            "and director, dead at 69");
348d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
349d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    // Swap two short strings.
350d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    {
351d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String sa = kShortString1;
352d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String sb = kShortString2;
353d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        sa.swap(&sb);
354d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(kShortString2, sa);
355d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(kShortString1, sb);
356d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
357d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
358d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    // Swap one short + one long string.
359d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    {
360d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String sa = kShortString1;
361d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String sb = kLongString1;
362d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        sa.swap(&sb);
363d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(kLongString1, sa);
364d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(kShortString1, sb);
365d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
366d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
367d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    // Swap one long + one short string.
368d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    {
369d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String sa = kLongString1;
370d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String sb = kLongString2;
371d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        sa.swap(&sb);
372d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(kLongString2, sa);
373d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(kLongString1, sb);
374d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
375d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
376d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
377d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}  // namespace base
378d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}  // namespace android
379