OLD | NEW |
| (Empty) |
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 | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 class FixedHashCode implements Hashable { | |
6 final int _hashCode; | |
7 const FixedHashCode(this._hashCode); | |
8 int hashCode() { return _hashCode; } | |
9 } | |
10 | |
11 class SetIteratorTest { | |
12 static testMain() { | |
13 testSmallSet(); | |
14 testLargeSet(); | |
15 testEmptySet(); | |
16 testSetWithDeletedEntries(); | |
17 testBug5116829(); | |
18 testDifferentSizes(); | |
19 testDifferentHashCodes(); | |
20 } | |
21 | |
22 static void testThrows(Iterator<int> it) { | |
23 Expect.equals(false, it.hasNext()); | |
24 var exception = null; | |
25 try { | |
26 it.next(); | |
27 } catch (NoMoreElementsException e) { | |
28 exception = e; | |
29 } | |
30 Expect.equals(true, exception != null); | |
31 } | |
32 | |
33 static int sum(int expected, Iterator<int> it) { | |
34 int count = 0; | |
35 while (it.hasNext()) { | |
36 count += it.next(); | |
37 } | |
38 Expect.equals(expected, count); | |
39 } | |
40 | |
41 static void testSmallSet() { | |
42 Set<int> set = new Set<int>(); | |
43 set.add(1); | |
44 set.add(2); | |
45 set.add(3); | |
46 | |
47 Iterator<int> it = set.iterator(); | |
48 Expect.equals(true, it.hasNext()); | |
49 sum(6, it); | |
50 testThrows(it); | |
51 } | |
52 | |
53 static void testLargeSet() { | |
54 Set<int> set = new Set<int>(); | |
55 int count = 0; | |
56 for (int i = 0; i < 100; i++) { | |
57 count += i; | |
58 set.add(i); | |
59 } | |
60 Iterator<int> it = set.iterator(); | |
61 Expect.equals(true, it.hasNext()); | |
62 sum(count, it); | |
63 testThrows(it); | |
64 } | |
65 | |
66 static void testEmptySet() { | |
67 Set<int> set = new Set<int>(); | |
68 Iterator<int> it = set.iterator(); | |
69 Expect.equals(false, it.hasNext()); | |
70 sum(0, it); | |
71 testThrows(it); | |
72 } | |
73 | |
74 static void testSetWithDeletedEntries() { | |
75 Set<int> set = new Set<int>(); | |
76 for (int i = 0; i < 100; i++) { | |
77 set.add(i); | |
78 } | |
79 for (int i = 0; i < 100; i++) { | |
80 set.remove(i); | |
81 } | |
82 Iterator<int> it = set.iterator(); | |
83 Expect.equals(false, it.hasNext()); | |
84 sum(0, it); | |
85 testThrows(it); | |
86 | |
87 int count = 0; | |
88 for (int i = 0; i < 100; i++) { | |
89 set.add(i); | |
90 if (i % 2 == 0) set.remove(i); | |
91 else count += i; | |
92 } | |
93 it = set.iterator(); | |
94 Expect.equals(true, it.hasNext()); | |
95 sum(count, it); | |
96 testThrows(it); | |
97 } | |
98 | |
99 static void testBug5116829() { | |
100 // During iteration we skipped slot 0 of the hashset's key list. "A" was | |
101 // hashed to slot 0 and therefore triggered the bug. | |
102 Set<String> mystrs = new Set<String>(); | |
103 mystrs.add("A"); | |
104 int seen = 0; | |
105 for (String elt in mystrs) { | |
106 seen++; | |
107 Expect.equals("A", elt); | |
108 } | |
109 Expect.equals(1, seen); | |
110 } | |
111 | |
112 static void testDifferentSizes() { | |
113 for (int i = 1; i < 20; i++) { | |
114 Set set = new Set(); | |
115 int sum = 0; | |
116 for (int j = 0; j < i; j++) { | |
117 set.add(j); | |
118 sum += j; | |
119 } | |
120 int count = 0; | |
121 int controlSum = 0; | |
122 for (int x in set) { | |
123 controlSum += x; | |
124 count++; | |
125 } | |
126 Expect.equals(i, count); | |
127 Expect.equals(sum, controlSum); | |
128 } | |
129 } | |
130 | |
131 static void testDifferentHashCodes() { | |
132 for (int i = -20; i < 20; i++) { | |
133 Set set = new Set(); | |
134 var element = new FixedHashCode(i); | |
135 set.add(element); | |
136 Expect.equals(1, set.length); | |
137 bool foundIt = false; | |
138 for (var x in set) { | |
139 foundIt = true; | |
140 Expect.equals(true, x === element); | |
141 } | |
142 Expect.equals(true, foundIt); | |
143 } | |
144 } | |
145 } | |
146 | |
147 main() { | |
148 SetIteratorTest.testMain(); | |
149 } | |
OLD | NEW |