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/containers/StringVector.h"
13d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
14d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner#include <gtest/gtest.h>
15d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
16d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnernamespace android {
17d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnernamespace base {
18d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
19d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner// Generate a pseudo-random string.
20d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turnerstatic String genHashString(size_t n) {
21d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    size_t count = ((n << 3) ^ ((n >> 1) * 11)) % 100;
22d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String result;
23d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    size_t hash = 3467 * n;
24d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < count; ++n) {
25d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        result += "0123456789abcdefghijklmnopqrstvuwxyz"[hash % 36];
26d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        hash = hash * 3667 + n;
27d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
28d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    return result;
29d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
30d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
31d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(StringVector, Empty) {
32d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    StringVector v;
33d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_TRUE(v.empty());
34d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(0U, v.size());
35d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
36d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
37d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(StringVector, ResizeGrows) {
38d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    StringVector v;
39d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const size_t kCount = 100;
40d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    v.resize(kCount);
41d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(kCount, v.size());
42d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < kCount; ++n) {
43d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_TRUE(v[n].empty());
44d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
45d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
46d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
47d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(StringVector, AppendOneString) {
48d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    StringVector v;
49d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    String str("Hello World");
50d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    v.append(str);
51d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(1U, v.size());
52d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_NE(str.c_str(), v[0].c_str());
53d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_STREQ(str.c_str(), v[0].c_str());
54d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
55d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
56d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(StringVector, AppendLotsOfStrings) {
57d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    StringVector v;
58d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const size_t kMaxCount = 1000;
59d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < kMaxCount; ++n) {
60d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        v.append(genHashString(n));
61d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
62d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(kMaxCount, v.size());
63d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < kMaxCount; ++n) {
64d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String expected = genHashString(n);
65d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(expected.size(), v[n].size());
66d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_STREQ(expected.c_str(), v[n].c_str())
67d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << "At index " << n;
68d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
69d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
70d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
71d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(StringVector, Prepend) {
72d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    StringVector v;
73d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    v.prepend(String("hello"));
74d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    v.prepend(String("world"));
75d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(2U, v.size());
76d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_STREQ("world", v[0].c_str());
77d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_STREQ("hello", v[1].c_str());
78d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
79d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
80d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(StringVector, PrependLotsOfStrings) {
81d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    StringVector v;
82d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const size_t kMaxCount = 1000;
83d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < kMaxCount; ++n) {
84d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        v.prepend(genHashString(n));
85d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
86d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(kMaxCount, v.size());
87d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < kMaxCount; ++n) {
88d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        String expected = genHashString(kMaxCount - n - 1U);
89d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(expected.size(), v[n].size());
90d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_STREQ(expected.c_str(), v[n].c_str())
91d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner                << "At index " << n;
92d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
93d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
94d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
95d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(StringVector, Swap) {
96d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    static const char* const kList1[] = {
97d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        "Hello", "World!",
98d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    };
99d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const size_t kList1Len = sizeof(kList1)/sizeof(kList1[0]);
100d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
101d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    static const char* const kList2[] = {
102d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        "Menthe", "a", "l'", "eau",
103d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    };
104d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const size_t kList2Len = sizeof(kList2)/sizeof(kList1[0]);
105d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
106d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    StringVector v1;
107d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < kList1Len; ++n) {
108d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        v1.append(StringView(kList1[n]));
109d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
110d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
111d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    StringVector v2;
112d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < kList2Len; ++n) {
113d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        v2.append(StringView(kList2[n]));
114d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
115d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
116d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    v1.swap(&v2);
117d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
118d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(kList2Len, v1.size());
119d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < kList2Len; ++n) {
120d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(String(kList2[n]), v1[n]) << "At index " << n;
121d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
122d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
123d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_EQ(kList1Len, v2.size());
124d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < kList1Len; ++n) {
125d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(String(kList1[n]), v2[n]) << "At index " << n;
126d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
127d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
128d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
129d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' TurnerTEST(StringVector, AssignmentOperator) {
130d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    static const char* const kList[] = {
131d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        "Menthe", "a", "l'", "eau",
132d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    };
133d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    const size_t kListLen = sizeof(kList)/sizeof(kList[0]);
134d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
135d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    StringVector v1;
136d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < kListLen; ++n) {
137d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        v1.append(StringView(kList[n]));
138d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
139d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
140d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    StringVector v2;
141d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    v2 = v1;
142d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    v1.reserve(0);
143d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    EXPECT_TRUE(v1.empty());
144d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
145d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    for (size_t n = 0; n < kListLen; ++n) {
146d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_EQ(::strlen(kList[n]), v2[n].size()) << "At index " << n;
147d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner        EXPECT_STREQ(kList[n], v2[n].c_str()) << "At index " << n;
148d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner    }
149d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}
150d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner
151d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}  // namespace base
152d3f2c27ff9f611e5047a35cb20ed53f548214fedDavid 'Digit' Turner}  // namespace android
153