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