Index: test/codegen/corelib/set_iterator_test.dart |
diff --git a/test/codegen/corelib/set_iterator_test.dart b/test/codegen/corelib/set_iterator_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d2193adf76d90008e9fdfb224fdf1cd9e9ad30bd |
--- /dev/null |
+++ b/test/codegen/corelib/set_iterator_test.dart |
@@ -0,0 +1,142 @@ |
+// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+import "package:expect/expect.dart"; |
+ |
+class FixedHashCode { |
+ final int _hashCode; |
+ const FixedHashCode(this._hashCode); |
+ int get hashCode { return _hashCode; } |
+} |
+ |
+class SetIteratorTest { |
+ static testMain() { |
+ testSmallSet(); |
+ testLargeSet(); |
+ testEmptySet(); |
+ testSetWithDeletedEntries(); |
+ testBug5116829(); |
+ testDifferentSizes(); |
+ testDifferentHashCodes(); |
+ } |
+ |
+ static int sum(int expected, Iterator<int> it) { |
+ int count = 0; |
+ while (it.moveNext()) { |
+ count += it.current; |
+ } |
+ Expect.equals(expected, count); |
+ } |
+ |
+ static void testSmallSet() { |
+ Set<int> set = new Set<int>(); |
+ set.add(1); |
+ set.add(2); |
+ set.add(3); |
+ |
+ Iterator<int> it = set.iterator; |
+ sum(6, it); |
+ Expect.isFalse(it.moveNext()); |
+ Expect.isNull(it.current); |
+ } |
+ |
+ static void testLargeSet() { |
+ Set<int> set = new Set<int>(); |
+ int count = 0; |
+ for (int i = 0; i < 100; i++) { |
+ count += i; |
+ set.add(i); |
+ } |
+ Iterator<int> it = set.iterator; |
+ sum(count, it); |
+ Expect.isFalse(it.moveNext()); |
+ Expect.isNull(it.current); |
+ } |
+ |
+ static void testEmptySet() { |
+ Set<int> set = new Set<int>(); |
+ Iterator<int> it = set.iterator; |
+ sum(0, it); |
+ Expect.isFalse(it.moveNext()); |
+ Expect.isNull(it.current); |
+ } |
+ |
+ static void testSetWithDeletedEntries() { |
+ Set<int> set = new Set<int>(); |
+ for (int i = 0; i < 100; i++) { |
+ set.add(i); |
+ } |
+ for (int i = 0; i < 100; i++) { |
+ set.remove(i); |
+ } |
+ Iterator<int> it = set.iterator; |
+ Expect.isFalse(it.moveNext()); |
+ it = set.iterator; |
+ sum(0, it); |
+ Expect.isFalse(it.moveNext()); |
+ Expect.isNull(it.current); |
+ |
+ int count = 0; |
+ for (int i = 0; i < 100; i++) { |
+ set.add(i); |
+ if (i % 2 == 0) set.remove(i); |
+ else count += i; |
+ } |
+ it = set.iterator; |
+ sum(count, it); |
+ Expect.isFalse(it.moveNext()); |
+ Expect.isNull(it.current); |
+ } |
+ |
+ static void testBug5116829() { |
+ // During iteration we skipped slot 0 of the hashset's key list. "A" was |
+ // hashed to slot 0 and therefore triggered the bug. |
+ Set<String> mystrs = new Set<String>(); |
+ mystrs.add("A"); |
+ int seen = 0; |
+ for (String elt in mystrs) { |
+ seen++; |
+ Expect.equals("A", elt); |
+ } |
+ Expect.equals(1, seen); |
+ } |
+ |
+ static void testDifferentSizes() { |
+ for (int i = 1; i < 20; i++) { |
+ Set set = new Set(); |
+ int sum = 0; |
+ for (int j = 0; j < i; j++) { |
+ set.add(j); |
+ sum += j; |
+ } |
+ int count = 0; |
+ int controlSum = 0; |
+ for (int x in set) { |
+ controlSum += x; |
+ count++; |
+ } |
+ Expect.equals(i, count); |
+ Expect.equals(sum, controlSum); |
+ } |
+ } |
+ |
+ static void testDifferentHashCodes() { |
+ for (int i = -20; i < 20; i++) { |
+ Set set = new Set(); |
+ var element = new FixedHashCode(i); |
+ set.add(element); |
+ Expect.equals(1, set.length); |
+ bool foundIt = false; |
+ for (var x in set) { |
+ foundIt = true; |
+ Expect.equals(true, identical(x, element)); |
+ } |
+ Expect.equals(true, foundIt); |
+ } |
+ } |
+} |
+ |
+main() { |
+ SetIteratorTest.testMain(); |
+} |