OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2011 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 }; | 129 }; |
130 | 130 |
131 typedef WTF::Vector<OwnPtr<DestructCounter> > OwnPtrVector; | 131 typedef WTF::Vector<OwnPtr<DestructCounter> > OwnPtrVector; |
132 | 132 |
133 TEST(WTF_Vector, OwnPtr) | 133 TEST(WTF_Vector, OwnPtr) |
134 { | 134 { |
135 int destructNumber = 0; | 135 int destructNumber = 0; |
136 OwnPtrVector vector; | 136 OwnPtrVector vector; |
137 vector.append(adoptPtr(new DestructCounter(0, &destructNumber))); | 137 vector.append(adoptPtr(new DestructCounter(0, &destructNumber))); |
138 vector.append(adoptPtr(new DestructCounter(1, &destructNumber))); | 138 vector.append(adoptPtr(new DestructCounter(1, &destructNumber))); |
139 ASSERT_EQ(2u, vector.size()); | 139 EXPECT_EQ(2u, vector.size()); |
140 | 140 |
141 OwnPtr<DestructCounter>& counter0 = vector.first(); | 141 OwnPtr<DestructCounter>& counter0 = vector.first(); |
142 ASSERT_EQ(0, counter0->get()); | 142 ASSERT_EQ(0, counter0->get()); |
143 int counter1 = vector.last()->get(); | 143 int counter1 = vector.last()->get(); |
144 ASSERT_EQ(1, counter1); | 144 ASSERT_EQ(1, counter1); |
145 ASSERT_EQ(0, destructNumber); | 145 ASSERT_EQ(0, destructNumber); |
146 | 146 |
147 size_t index = 0; | 147 size_t index = 0; |
148 for (OwnPtrVector::iterator iter = vector.begin(); iter != vector.end(); ++i
ter) { | 148 for (OwnPtrVector::iterator iter = vector.begin(); iter != vector.end(); ++i
ter) { |
149 OwnPtr<DestructCounter>* refCounter = iter; | 149 OwnPtr<DestructCounter>* refCounter = iter; |
150 ASSERT_EQ(index, static_cast<size_t>(refCounter->get()->get())); | 150 EXPECT_EQ(index, static_cast<size_t>(refCounter->get()->get())); |
151 ASSERT_EQ(index, static_cast<size_t>((*refCounter)->get())); | 151 EXPECT_EQ(index, static_cast<size_t>((*refCounter)->get())); |
152 index++; | 152 index++; |
153 } | 153 } |
154 ASSERT_EQ(0, destructNumber); | 154 EXPECT_EQ(0, destructNumber); |
155 | 155 |
156 for (index = 0; index < vector.size(); index++) { | 156 for (index = 0; index < vector.size(); index++) { |
157 OwnPtr<DestructCounter>& refCounter = vector[index]; | 157 OwnPtr<DestructCounter>& refCounter = vector[index]; |
158 ASSERT_EQ(index, static_cast<size_t>(refCounter->get())); | 158 EXPECT_EQ(index, static_cast<size_t>(refCounter->get())); |
159 index++; | 159 index++; |
160 } | 160 } |
161 ASSERT_EQ(0, destructNumber); | 161 EXPECT_EQ(0, destructNumber); |
162 | 162 |
163 ASSERT_EQ(0, vector[0]->get()); | 163 EXPECT_EQ(0, vector[0]->get()); |
164 ASSERT_EQ(1, vector[1]->get()); | 164 EXPECT_EQ(1, vector[1]->get()); |
165 vector.remove(0); | 165 vector.remove(0); |
166 ASSERT_EQ(1, vector[0]->get()); | 166 EXPECT_EQ(1, vector[0]->get()); |
167 ASSERT_EQ(1u, vector.size()); | 167 EXPECT_EQ(1u, vector.size()); |
168 ASSERT_EQ(1, destructNumber); | 168 EXPECT_EQ(1, destructNumber); |
169 | 169 |
170 OwnPtr<DestructCounter> ownCounter1 = vector[0].release(); | 170 OwnPtr<DestructCounter> ownCounter1 = vector[0].release(); |
171 vector.remove(0); | 171 vector.remove(0); |
172 ASSERT_EQ(counter1, ownCounter1->get()); | 172 ASSERT_EQ(counter1, ownCounter1->get()); |
173 ASSERT_EQ(0u, vector.size()); | 173 ASSERT_EQ(0u, vector.size()); |
174 ASSERT_EQ(1, destructNumber); | 174 ASSERT_EQ(1, destructNumber); |
175 | 175 |
176 ownCounter1.clear(); | 176 ownCounter1.clear(); |
177 ASSERT_EQ(2, destructNumber); | 177 EXPECT_EQ(2, destructNumber); |
178 | 178 |
179 size_t count = 1025; | 179 size_t count = 1025; |
180 destructNumber = 0; | 180 destructNumber = 0; |
181 for (size_t i = 0; i < count; i++) | 181 for (size_t i = 0; i < count; i++) |
182 vector.prepend(adoptPtr(new DestructCounter(i, &destructNumber))); | 182 vector.prepend(adoptPtr(new DestructCounter(i, &destructNumber))); |
183 | 183 |
184 // Vector relocation must not destruct OwnPtr element. | 184 // Vector relocation must not destruct OwnPtr element. |
185 ASSERT_EQ(0, destructNumber); | 185 EXPECT_EQ(0, destructNumber); |
186 ASSERT_EQ(count, vector.size()); | 186 EXPECT_EQ(count, vector.size()); |
187 | 187 |
188 OwnPtrVector copyVector; | 188 OwnPtrVector copyVector; |
189 vector.swap(copyVector); | 189 vector.swap(copyVector); |
190 ASSERT_EQ(0, destructNumber); | 190 EXPECT_EQ(0, destructNumber); |
191 ASSERT_EQ(count, copyVector.size()); | 191 EXPECT_EQ(count, copyVector.size()); |
192 ASSERT_EQ(0u, vector.size()); | 192 EXPECT_EQ(0u, vector.size()); |
193 | 193 |
194 copyVector.clear(); | 194 copyVector.clear(); |
195 ASSERT_EQ(count, static_cast<size_t>(destructNumber)); | 195 EXPECT_EQ(count, static_cast<size_t>(destructNumber)); |
196 } | 196 } |
197 | 197 |
198 // WrappedInt class will fail if it was memmoved or memcpyed. | 198 // WrappedInt class will fail if it was memmoved or memcpyed. |
199 static HashSet<void*> constructedWrappedInts; | 199 static HashSet<void*> constructedWrappedInts; |
200 class WrappedInt { | 200 class WrappedInt { |
201 public: | 201 public: |
202 WrappedInt(int i = 0) | 202 WrappedInt(int i = 0) |
203 : m_originalThisPtr(this) | 203 : m_originalThisPtr(this) |
204 , m_i(i) | 204 , m_i(i) |
205 { | 205 { |
(...skipping 28 matching lines...) Expand all Loading... |
234 }; | 234 }; |
235 | 235 |
236 TEST(WTF_Vector, SwapWithInlineCapacity) | 236 TEST(WTF_Vector, SwapWithInlineCapacity) |
237 { | 237 { |
238 const size_t inlineCapacity = 2; | 238 const size_t inlineCapacity = 2; |
239 Vector<WrappedInt, inlineCapacity> vectorA; | 239 Vector<WrappedInt, inlineCapacity> vectorA; |
240 vectorA.append(WrappedInt(1)); | 240 vectorA.append(WrappedInt(1)); |
241 Vector<WrappedInt, inlineCapacity> vectorB; | 241 Vector<WrappedInt, inlineCapacity> vectorB; |
242 vectorB.append(WrappedInt(2)); | 242 vectorB.append(WrappedInt(2)); |
243 | 243 |
244 ASSERT_EQ(vectorA.size(), vectorB.size()); | 244 EXPECT_EQ(vectorA.size(), vectorB.size()); |
245 vectorA.swap(vectorB); | 245 vectorA.swap(vectorB); |
246 | 246 |
247 ASSERT_EQ(1u, vectorA.size()); | 247 EXPECT_EQ(1u, vectorA.size()); |
248 EXPECT_EQ(2, vectorA.at(0).get()); | 248 EXPECT_EQ(2, vectorA.at(0).get()); |
249 ASSERT_EQ(1u, vectorB.size()); | 249 EXPECT_EQ(1u, vectorB.size()); |
250 EXPECT_EQ(1, vectorB.at(0).get()); | 250 EXPECT_EQ(1, vectorB.at(0).get()); |
251 | 251 |
252 vectorA.append(WrappedInt(3)); | 252 vectorA.append(WrappedInt(3)); |
253 | 253 |
254 ASSERT_GT(vectorA.size(), vectorB.size()); | 254 EXPECT_GT(vectorA.size(), vectorB.size()); |
255 vectorA.swap(vectorB); | 255 vectorA.swap(vectorB); |
256 | 256 |
257 ASSERT_EQ(1u, vectorA.size()); | 257 EXPECT_EQ(1u, vectorA.size()); |
258 EXPECT_EQ(1, vectorA.at(0).get()); | 258 EXPECT_EQ(1, vectorA.at(0).get()); |
259 ASSERT_EQ(2u, vectorB.size()); | 259 EXPECT_EQ(2u, vectorB.size()); |
260 EXPECT_EQ(2, vectorB.at(0).get()); | 260 EXPECT_EQ(2, vectorB.at(0).get()); |
261 EXPECT_EQ(3, vectorB.at(1).get()); | 261 EXPECT_EQ(3, vectorB.at(1).get()); |
262 | 262 |
263 ASSERT_LT(vectorA.size(), vectorB.size()); | 263 EXPECT_LT(vectorA.size(), vectorB.size()); |
264 vectorA.swap(vectorB); | 264 vectorA.swap(vectorB); |
265 | 265 |
266 ASSERT_EQ(2u, vectorA.size()); | 266 EXPECT_EQ(2u, vectorA.size()); |
267 EXPECT_EQ(2, vectorA.at(0).get()); | 267 EXPECT_EQ(2, vectorA.at(0).get()); |
268 EXPECT_EQ(3, vectorA.at(1).get()); | 268 EXPECT_EQ(3, vectorA.at(1).get()); |
269 ASSERT_EQ(1u, vectorB.size()); | 269 EXPECT_EQ(1u, vectorB.size()); |
270 EXPECT_EQ(1, vectorB.at(0).get()); | 270 EXPECT_EQ(1, vectorB.at(0).get()); |
271 | 271 |
272 vectorA.append(WrappedInt(4)); | 272 vectorA.append(WrappedInt(4)); |
273 ASSERT_GT(vectorA.size(), inlineCapacity); | 273 EXPECT_GT(vectorA.size(), inlineCapacity); |
274 vectorA.swap(vectorB); | 274 vectorA.swap(vectorB); |
275 | 275 |
276 ASSERT_EQ(1u, vectorA.size()); | 276 EXPECT_EQ(1u, vectorA.size()); |
277 EXPECT_EQ(1, vectorA.at(0).get()); | 277 EXPECT_EQ(1, vectorA.at(0).get()); |
278 ASSERT_EQ(3u, vectorB.size()); | 278 EXPECT_EQ(3u, vectorB.size()); |
279 EXPECT_EQ(2, vectorB.at(0).get()); | 279 EXPECT_EQ(2, vectorB.at(0).get()); |
280 EXPECT_EQ(3, vectorB.at(1).get()); | 280 EXPECT_EQ(3, vectorB.at(1).get()); |
281 EXPECT_EQ(4, vectorB.at(2).get()); | 281 EXPECT_EQ(4, vectorB.at(2).get()); |
282 | 282 |
283 vectorB.swap(vectorA); | 283 vectorB.swap(vectorA); |
284 } | 284 } |
285 | 285 |
286 } // namespace | 286 } // namespace |
OLD | NEW |