OLD | NEW |
| (Empty) |
1 // Copyright (c) 2013, 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 /// Tests wrapper utilities. | |
6 | |
7 import "dart:collection"; | |
8 import "package:collection_helpers/all.dart"; | |
9 import "package:unittest/unittest.dart"; | |
10 | |
11 // Test that any member access/call on the wrapper object is equal to | |
12 // an expected access on the wrapped object. | |
13 // This is implemented by capturing accesses using noSuchMethod and comparing | |
14 // them to expected accesses captured previously. | |
15 | |
16 // Compare two Invocations for having equal type and arguments. | |
17 void testInvocations(Invocation i1, Invocation i2) { | |
18 String name = "${i1.memberName}"; | |
19 expect(i1.isGetter, equals(i2.isGetter), reason: name); | |
20 expect(i1.isSetter, equals(i2.isSetter), reason: name); | |
21 expect(i1.memberName, equals(i2.memberName), reason: name); | |
22 expect(i1.positionalArguments, equals(i2.positionalArguments), reason: name); | |
23 expect(i1.namedArguments, equals(i2.namedArguments), reason: name); | |
24 } | |
25 | |
26 /** | |
27 * Utility class to record a member access and a member access on a wrapped | |
28 * object, and compare them for equality. | |
29 */ | |
30 abstract class Expector { | |
31 getWrappedObject(action(Invocation i)); | |
32 // Hack to test assignment ([]=) because it doesn't return the result | |
33 // of the member call. Instead use (expect..[4]=5).equal[4]=5 where | |
34 // you would normally use expect[4].equals[4] for non-assignments. | |
35 var equals; | |
36 | |
37 noSuchMethod(Invocation m) => new _Equals(equals = getWrappedObject((m2) { | |
38 testInvocations(m, m2); | |
39 })); | |
40 } | |
41 | |
42 // An object with a field called "equals", only introduced into the | |
43 // flow to allow writing expect.xxx.equals.xxx. | |
44 class _Equals { | |
45 final equals; | |
46 _Equals(this.equals); | |
47 } | |
48 | |
49 // Parameterization of noSuchMethod. | |
50 class NSM { | |
51 Function _action; | |
52 NSM(this._action); | |
53 noSuchMethod(Invocation i) => _action(i); | |
54 } | |
55 | |
56 // LikeNSM, but has types Iterable, Set and List to allow it as | |
57 // argument to DelegatingIterable/Set/List. | |
58 class IterableNSM extends NSM implements Iterable, Set, List, Queue { | |
59 IterableNSM(action(Invocation i)) : super(action); | |
60 noSuchMethod(Invocation i) => super.noSuchMethod(i); // Silence warnings | |
61 } | |
62 | |
63 // Expector that wraps in DelegatingIterable. | |
64 class IterableExpector extends Expector { | |
65 getWrappedObject(void action(Invocation i)) { | |
66 return new DelegatingIterable(new IterableNSM(action)); | |
67 } | |
68 } | |
69 | |
70 // Expector that wraps in DelegatingList. | |
71 class ListExpector extends Expector { | |
72 getWrappedObject(void action(Invocation i)) { | |
73 return new DelegatingList(new IterableNSM(action)); | |
74 } | |
75 } | |
76 | |
77 // Expector that wraps in DelegatingSet. | |
78 class SetExpector extends Expector { | |
79 getWrappedObject(void action(Invocation i)) { | |
80 return new DelegatingSet(new IterableNSM(action)); | |
81 } | |
82 } | |
83 | |
84 // Expector that wraps in DelegatingSet. | |
85 class QueueExpector extends Expector { | |
86 getWrappedObject(void action(Invocation i)) { | |
87 return new DelegatingQueue(new IterableNSM(action)); | |
88 } | |
89 } | |
90 | |
91 // Like NSM but implements Map to allow as argument for DelegatingMap. | |
92 class MapNSM extends NSM implements Map { | |
93 MapNSM(action(Invocation i)) : super(action); | |
94 noSuchMethod(Invocation i) => super.noSuchMethod(i); | |
95 } | |
96 | |
97 // Expector that wraps in DelegatingMap. | |
98 class MapExpector extends Expector { | |
99 getWrappedObject(void action(Invocation i)) { | |
100 return new DelegatingMap(new MapNSM(action)); | |
101 } | |
102 } | |
103 | |
104 // Utility values to use as arguments in calls. | |
105 func0() {} | |
106 func1(x) {} | |
107 func2(x, y) {} | |
108 var val = new Object(); | |
109 | |
110 void main() { | |
111 testIterable(var expect) { | |
112 expect.any(func1).equals.any(func1); | |
113 expect.contains(val).equals.contains(val); | |
114 expect.elementAt(0).equals.elementAt(0); | |
115 expect.every(func1).equals.every(func1); | |
116 expect.expand(func1).equals.expand(func1); | |
117 expect.first.equals.first; | |
118 // Default values of the Iterable interface will be added in the | |
119 // second call to firstWhere, so we must record them in our | |
120 // expectation (which doesn't have the interface implementat or | |
121 // its default values). | |
122 expect.firstWhere(func1, orElse: null).equals.firstWhere(func1); | |
123 expect.firstWhere(func1, orElse: func0).equals. | |
124 firstWhere(func1, orElse: func0); | |
125 expect.fold(null, func2).equals.fold(null, func2); | |
126 expect.forEach(func1).equals.forEach(func1); | |
127 expect.isEmpty.equals.isEmpty; | |
128 expect.isNotEmpty.equals.isNotEmpty; | |
129 expect.iterator.equals.iterator; | |
130 expect.join('').equals.join(); | |
131 expect.join("X").equals.join("X"); | |
132 expect.last.equals.last; | |
133 expect.lastWhere(func1, orElse: null).equals.lastWhere(func1); | |
134 expect.lastWhere(func1, orElse: func0).equals. | |
135 lastWhere(func1, orElse: func0); | |
136 expect.length.equals.length; | |
137 expect.map(func1).equals.map(func1); | |
138 expect.reduce(func2).equals.reduce(func2); | |
139 expect.single.equals.single; | |
140 expect.singleWhere(func1).equals.singleWhere(func1); | |
141 expect.skip(5).equals.skip(5); | |
142 expect.skipWhile(func1).equals.skipWhile(func1); | |
143 expect.take(5).equals.take(5); | |
144 expect.takeWhile(func1).equals.takeWhile(func1); | |
145 expect.toList(growable: true).equals.toList(); | |
146 expect.toList(growable: true).equals.toList(growable: true); | |
147 expect.toList(growable: false).equals.toList(growable: false); | |
148 expect.toSet().equals.toSet(); | |
149 expect.where(func1).equals.where(func1); | |
150 } | |
151 | |
152 void testList(var expect) { | |
153 testIterable(expect); | |
154 | |
155 expect[4].equals[4]; | |
156 (expect..[4] = 5).equals[4] = 5; | |
157 | |
158 expect.add(val).equals.add(val); | |
159 expect.addAll([val]).equals.addAll([val]); | |
160 expect.asMap().equals.asMap(); | |
161 expect.clear().equals.clear(); | |
162 expect.fillRange(4, 5, null).equals.fillRange(4, 5); | |
163 expect.fillRange(4, 5, val).equals.fillRange(4, 5, val); | |
164 expect.getRange(4, 5).equals.getRange(4, 5); | |
165 expect.indexOf(val, 0).equals.indexOf(val); | |
166 expect.indexOf(val, 4).equals.indexOf(val, 4); | |
167 expect.insert(4, val).equals.insert(4, val); | |
168 expect.insertAll(4, [val]).equals.insertAll(4, [val]); | |
169 expect.lastIndexOf(val, null).equals.lastIndexOf(val); | |
170 expect.lastIndexOf(val, 4).equals.lastIndexOf(val, 4); | |
171 (expect..length = 4).equals.length = 4; | |
172 expect.remove(val).equals.remove(val); | |
173 expect.removeAt(4).equals.removeAt(4); | |
174 expect.removeLast().equals.removeLast(); | |
175 expect.removeRange(4, 5).equals.removeRange(4, 5); | |
176 expect.removeWhere(func1).equals.removeWhere(func1); | |
177 expect.replaceRange(4, 5, [val]).equals.replaceRange(4, 5, [val]); | |
178 expect.retainWhere(func1).equals.retainWhere(func1); | |
179 expect.reversed.equals.reversed; | |
180 expect.setAll(4, [val]).equals.setAll(4, [val]); | |
181 expect.setRange(4, 5, [val], 0).equals.setRange(4, 5, [val]); | |
182 expect.setRange(4, 5, [val], 3).equals.setRange(4, 5, [val], 3); | |
183 expect.sort(null).equals.sort(); | |
184 expect.sort(func2).equals.sort(func2); | |
185 expect.sublist(4, null).equals.sublist(4); | |
186 expect.sublist(4, 5).equals.sublist(4, 5); | |
187 } | |
188 | |
189 void testSet(var expect) { | |
190 testIterable(expect); | |
191 Set set = new Set(); | |
192 expect.add(val).equals.add(val); | |
193 expect.addAll([val]).equals.addAll([val]); | |
194 expect.clear().equals.clear(); | |
195 expect.containsAll([val]).equals.containsAll([val]); | |
196 expect.difference(set).equals.difference(set); | |
197 expect.intersection(set).equals.intersection(set); | |
198 expect.remove(val).equals.remove(val); | |
199 expect.removeAll([val]).equals.removeAll([val]); | |
200 expect.removeWhere(func1).equals.removeWhere(func1); | |
201 expect.retainAll([val]).equals.retainAll([val]); | |
202 expect.retainWhere(func1).equals.retainWhere(func1); | |
203 expect.union(set).equals.union(set); | |
204 } | |
205 | |
206 void testQueue(var expect) { | |
207 testIterable(expect); | |
208 expect.add(val).equals.add(val); | |
209 expect.addAll([val]).equals.addAll([val]); | |
210 expect.addFirst(val).equals.addFirst(val); | |
211 expect.addLast(val).equals.addLast(val); | |
212 expect.clear().equals.clear(); | |
213 expect.remove(val).equals.remove(val); | |
214 expect.removeFirst().equals.removeFirst(); | |
215 expect.removeLast().equals.removeLast(); | |
216 } | |
217 | |
218 void testMap(var expect) { | |
219 Map map = new Map(); | |
220 expect[val].equals[val]; | |
221 (expect..[val] = val).equals[val] = val; | |
222 expect.addAll(map).equals.addAll(map); | |
223 expect.clear().equals.clear(); | |
224 expect.containsKey(val).equals.containsKey(val); | |
225 expect.containsValue(val).equals.containsValue(val); | |
226 expect.forEach(func2).equals.forEach(func2); | |
227 expect.isEmpty.equals.isEmpty; | |
228 expect.isNotEmpty.equals.isNotEmpty; | |
229 expect.keys.equals.keys; | |
230 expect.length.equals.length; | |
231 expect.putIfAbsent(val, func0).equals.putIfAbsent(val, func0); | |
232 expect.remove(val).equals.remove(val); | |
233 expect.values.equals.values; | |
234 } | |
235 | |
236 test("Iterable", () { | |
237 testIterable(new IterableExpector()); | |
238 }); | |
239 | |
240 test("List", () { | |
241 testList(new ListExpector()); | |
242 }); | |
243 | |
244 test("Set", () { | |
245 testSet(new SetExpector()); | |
246 }); | |
247 | |
248 test("Queue", () { | |
249 testQueue(new QueueExpector()); | |
250 }); | |
251 | |
252 test("Map", () { | |
253 testMap(new MapExpector()); | |
254 }); | |
255 } | |
OLD | NEW |