OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library queue.test; | 5 library queue.test; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 | 8 |
9 abstract class QueueTest { | 9 abstract class QueueTest { |
10 | 10 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 void checkQueue(Queue queue, int expectedSize, int expectedSum) { | 124 void checkQueue(Queue queue, int expectedSize, int expectedSum) { |
125 Expect.equals(expectedSize, queue.length); | 125 Expect.equals(expectedSize, queue.length); |
126 int sum = 0; | 126 int sum = 0; |
127 void sumElements(int value) { | 127 void sumElements(int value) { |
128 sum += value; | 128 sum += value; |
129 } | 129 } |
130 queue.forEach(sumElements); | 130 queue.forEach(sumElements); |
131 Expect.equals(expectedSum, sum); | 131 Expect.equals(expectedSum, sum); |
132 } | 132 } |
133 | 133 |
| 134 testLength(int length, Queue queue) { |
| 135 Expect.equals(length, queue.length); |
| 136 ((length == 0) ? Expect.isTrue : Expect.isFalse)(queue.isEmpty); |
| 137 } |
| 138 |
134 void testAddAll() { | 139 void testAddAll() { |
135 Set<int> set = new Set<int>.from([1, 2, 4]); | 140 Set<int> set = new Set<int>.from([1, 2, 4]); |
| 141 Expect.equals(3, set.length); |
136 | 142 |
137 Queue queue1 = newQueueFrom(set); | 143 Queue queue1 = newQueueFrom(set); |
138 Queue queue2 = newQueue(); | 144 Queue queue2 = newQueue(); |
139 Queue queue3 = newQueue(); | 145 Queue queue3 = newQueue(); |
| 146 testLength(3, queue1); |
| 147 testLength(0, queue2); |
| 148 testLength(0, queue3); |
140 | 149 |
141 queue2.addAll(set); | 150 queue2.addAll(set); |
| 151 testLength(3, queue2); |
| 152 |
142 queue3.addAll(queue1); | 153 queue3.addAll(queue1); |
143 | 154 testLength(3, queue3); |
144 Expect.equals(3, set.length); | |
145 Expect.equals(3, queue1.length); | |
146 Expect.equals(3, queue2.length); | |
147 Expect.equals(3, queue3.length); | |
148 | 155 |
149 int sum = 0; | 156 int sum = 0; |
150 void f(e) { sum += e; }; | 157 void f(e) { sum += e; }; |
151 | 158 |
152 set.forEach(f); | 159 set.forEach(f); |
153 Expect.equals(7, sum); | 160 Expect.equals(7, sum); |
154 sum = 0; | 161 sum = 0; |
155 | 162 |
156 queue1.forEach(f); | 163 queue1.forEach(f); |
157 Expect.equals(7, sum); | 164 Expect.equals(7, sum); |
(...skipping 14 matching lines...) Expand all Loading... |
172 | 179 |
173 queue2.addAll(set); | 180 queue2.addAll(set); |
174 queue3.addAll(queue1); | 181 queue3.addAll(queue1); |
175 | 182 |
176 Expect.equals(0, set.length); | 183 Expect.equals(0, set.length); |
177 Expect.equals(0, queue1.length); | 184 Expect.equals(0, queue1.length); |
178 Expect.equals(0, queue2.length); | 185 Expect.equals(0, queue2.length); |
179 Expect.equals(0, queue3.length); | 186 Expect.equals(0, queue3.length); |
180 } | 187 } |
181 | 188 |
| 189 void testLengthChanges() { |
| 190 // Test that the length property is updated properly by |
| 191 // modifications; |
| 192 Queue queue = newQueue(); |
| 193 testLength(0, queue); |
| 194 |
| 195 for (int i = 1; i <= 10; i++) { |
| 196 queue.add(i); |
| 197 testLength(i, queue); |
| 198 } |
| 199 |
| 200 for (int i = 1; i <= 10; i++) { |
| 201 queue.addFirst(i); |
| 202 testLength(10 + i, queue); |
| 203 } |
| 204 |
| 205 for (int i = 1; i <= 10; i++) { |
| 206 queue.addLast(i); |
| 207 testLength(20 + i, queue); |
| 208 } |
| 209 |
| 210 queue.addAll([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); |
| 211 testLength(40, queue); |
| 212 |
| 213 for (int i = 1; i <= 5; i++) { |
| 214 Expect.equals(i, queue.removeFirst()); |
| 215 testLength(40 - i, queue); |
| 216 } |
| 217 |
| 218 for (int i = 1; i <= 5; i++) { |
| 219 Expect.equals(11 - i, queue.removeLast()); |
| 220 testLength(35 - i, queue); |
| 221 } |
| 222 |
| 223 queue.remove(10); |
| 224 testLength(29, queue); |
| 225 |
| 226 queue.removeAll([4, 6]); |
| 227 testLength(23, queue); |
| 228 |
| 229 queue.retainAll([1, 3, 5, 7, 9, 10]); // Remove 2 and 8. |
| 230 testLength(17, queue); |
| 231 |
| 232 queue.removeMatching((x) = x == 7); |
| 233 testLength(14, queue); |
| 234 |
| 235 queue.retainMatching((x) = x != 3); |
| 236 testLength(11, queue); |
| 237 |
| 238 Expect.listEquals([9, 1, 5, 9, 10, 1, 5, 9, 10, 1, 5], queue.toList()); |
| 239 } |
| 240 |
182 void testLarge() { | 241 void testLarge() { |
183 int N = 10000; | 242 int N = 10000; |
184 Set set = new Set(); | 243 Set set = new Set(); |
185 | 244 |
186 Queue queue = newQueue(); | 245 Queue queue = newQueue(); |
187 Expect.isTrue(queue.isEmpty); | 246 Expect.isTrue(queue.isEmpty); |
188 | 247 |
189 for (int i = 0; i < N; i++) { | 248 for (int i = 0; i < N; i++) { |
190 queue.add(i); | 249 queue.add(i); |
191 set.add(i); | 250 set.add(i); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 Expect.equals(list.length, queue.length); | 314 Expect.equals(list.length, queue.length); |
256 to = queue.toList(); | 315 to = queue.toList(); |
257 Expect.listEquals(list, to); | 316 Expect.listEquals(list, to); |
258 } | 317 } |
259 } | 318 } |
260 } | 319 } |
261 | 320 |
262 class ListQueueTest extends QueueTest { | 321 class ListQueueTest extends QueueTest { |
263 Queue newQueue() => new ListQueue(); | 322 Queue newQueue() => new ListQueue(); |
264 Queue newQueueFrom(Iterable elements) => new ListQueue.from(elements); | 323 Queue newQueueFrom(Iterable elements) => new ListQueue.from(elements); |
| 324 |
| 325 void testMain() { |
| 326 super.testMain(); |
| 327 trickyTest(); |
| 328 } |
| 329 |
| 330 void trickyTest() { |
| 331 // Test behavior around the know growing capacities of a ListQueue. |
| 332 Queue q = new ListQueue(); |
| 333 |
| 334 for (int i = 0; i < 255; i++) { |
| 335 q.add(i); |
| 336 } |
| 337 for (int i = 0; i < 128; i++) { |
| 338 Expect.equals(i, q.removeFirst()); |
| 339 } |
| 340 q.add(255); |
| 341 for (int i = 0; i < 127; i++) { |
| 342 q.add(i); |
| 343 } |
| 344 |
| 345 Expect.equals(255, q.length); |
| 346 |
| 347 // Remove element at end of internal buffer. |
| 348 q.removeMatching((v) => v == 255); |
| 349 // Remove element at beginning of internal buffer. |
| 350 q.removeMatching((v) => v == 0); |
| 351 // Remove element at both ends of internal buffer. |
| 352 q.removeMatching((v) => v == 254 || v == 1); |
| 353 |
| 354 Expect.equals(251, q.length); |
| 355 |
| 356 Iterable i255 = new Iterable.generate(255, (x) => x); |
| 357 |
| 358 q = new ListQueue(); |
| 359 q.addAll(i255); |
| 360 Expect.listEquals(i255.toList(), q.toList()); |
| 361 |
| 362 q = new ListQueue(); |
| 363 q.addAll(i255.toList()); |
| 364 Expect.listEquals(i255.toList(), q.toList()); |
| 365 |
| 366 q = new ListQueue.from(i255); |
| 367 for (int i = 0; i < 128; i++) q.removeFirst(); |
| 368 q.add(256); |
| 369 q.add(0); |
| 370 q.addAll(i255.toList()); |
| 371 Expect.equals(129 + 255, q.length); |
| 372 |
| 373 // Test addAll that requires the queue to grow. |
| 374 q = new ListQueue(); |
| 375 q.addAll(i255.take(35)); |
| 376 q.addAll(i255.skip(35).take(96)); |
| 377 q.addAll(i255.skip(35 + 96)); |
| 378 Expect.listEquals(i255.toList(), q.toList()); |
| 379 } |
265 } | 380 } |
266 | 381 |
267 class DoubleLinkedQueueTest extends QueueTest { | 382 class DoubleLinkedQueueTest extends QueueTest { |
268 Queue newQueue() => new DoubleLinkedQueue(); | 383 Queue newQueue() => new DoubleLinkedQueue(); |
269 Queue newQueueFrom(Iterable elements) => new DoubleLinkedQueue.from(elements); | 384 Queue newQueueFrom(Iterable elements) => new DoubleLinkedQueue.from(elements); |
270 | 385 |
271 void testMain() { | 386 void testMain() { |
272 super.testMain(); | 387 super.testMain(); |
273 testQueueElements(); | 388 testQueueElements(); |
274 } | 389 } |
275 | 390 |
276 void testQueueElements() { | 391 void testQueueElements() { |
277 DoubleLinkedQueue<int> queue1 = new DoubleLinkedQueue<int>.from([1, 2, 4]); | 392 DoubleLinkedQueue<int> queue1 = new DoubleLinkedQueue<int>.from([1, 2, 4]); |
278 DoubleLinkedQueue<int> queue2 = new DoubleLinkedQueue<int>(); | 393 DoubleLinkedQueue<int> queue2 = new DoubleLinkedQueue<int>(); |
279 queue2.addAll(queue1); | 394 queue2.addAll(queue1); |
280 | 395 |
281 Expect.equals(queue1.length, queue2.length); | 396 Expect.equals(queue1.length, queue2.length); |
282 DoubleLinkedQueueEntry<int> entry1 = queue1.firstEntry(); | 397 DoubleLinkedQueueEntry<int> entry1 = queue1.firstEntry(); |
283 DoubleLinkedQueueEntry<int> entry2 = queue2.firstEntry(); | 398 DoubleLinkedQueueEntry<int> entry2 = queue2.firstEntry(); |
284 while (entry1 != null) { | 399 while (entry1 != null) { |
285 Expect.equals(true, !identical(entry1, entry2)); | 400 Expect.equals(true, !identical(entry1, entry2)); |
286 entry1 = entry1.nextEntry(); | 401 entry1 = entry1.nextEntry(); |
287 entry2 = entry2.nextEntry(); | 402 entry2 = entry2.nextEntry(); |
288 } | 403 } |
289 Expect.equals(null, entry2); | 404 Expect.equals(null, entry2); |
290 } | 405 } |
291 } | 406 } |
292 | 407 |
293 void trickyTest() { | |
294 Queue q = new ListQueue(); | |
295 | |
296 for (int i = 0; i < 255; i++) { | |
297 q.add(i); | |
298 } | |
299 for (int i = 0; i < 128; i++) { | |
300 Expect.equals(i, q.removeFirst()); | |
301 } | |
302 q.add(255); | |
303 for (int i = 0; i < 127; i++) { | |
304 q.add(i); | |
305 } | |
306 | |
307 Expect.equals(255, q.length); | |
308 | |
309 // Remove element at end of internal buffer. | |
310 q.removeMatching((v) => v == 255); | |
311 // Remove element at beginning of internal buffer. | |
312 q.removeMatching((v) => v == 0); | |
313 // Remove element at both ends of internal buffer. | |
314 q.removeMatching((v) => v == 254 || v == 1); | |
315 | |
316 Expect.equals(251, q.length); | |
317 | |
318 Iterable i255 = new Iterable.generate(255, (x) => x); | |
319 | |
320 q = new ListQueue(); | |
321 q.addAll(i255); | |
322 Expect.listEquals(i255.toList(), q.toList()); | |
323 | |
324 q = new ListQueue(); | |
325 q.addAll(i255.toList()); | |
326 Expect.listEquals(i255.toList(), q.toList()); | |
327 | |
328 q = new ListQueue.from(i255); | |
329 for (int i = 0; i < 128; i++) q.removeFirst(); | |
330 q.add(256); | |
331 q.add(0); | |
332 q.addAll(i255.toList()); | |
333 Expect.equals(129 + 255, q.length); | |
334 | |
335 // Test addAll that requires the queue to grow. | |
336 q = new ListQueue(); | |
337 q.addAll(i255.take(35)); | |
338 q.addAll(i255.skip(35).take(96)); | |
339 q.addAll(i255.skip(35 + 96)); | |
340 Expect.listEquals(i255.toList(), q.toList()); | |
341 } | |
342 | 408 |
343 main() { | 409 main() { |
344 new DoubleLinkedQueueTest().testMain(); | 410 new DoubleLinkedQueueTest().testMain(); |
345 new ListQueueTest().testMain(); | 411 new ListQueueTest().testMain(); |
346 trickyTest(); | |
347 } | 412 } |
OLD | NEW |