| 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 |