Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(86)

Side by Side Diff: tests/corelib/json_map_test.dart

Issue 336863008: Make the JSON decoder (parser) create Dart maps lazily (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address review feedback. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « sdk/lib/_internal/lib/convert_patch.dart ('k') | tests/corelib/map_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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 library json_map_test;
6
7 import "package:expect/expect.dart";
8 import 'dart:convert' show JSON;
9 import 'dart:collection' show LinkedHashMap, HashMap;
10
11 Map jsonify(Map map) => JSON.decode(JSON.encode(map));
12
13 List listEach(Map map) {
14 var result = [];
15 map.forEach((String key, value) {
16 result.add(key);
17 result.add(value);
18 });
19 return result;
20 }
21
22 void main() {
23 testEmpty(jsonify({}));
24 testAtoB(jsonify({'a': 'b'}));
25
26 Map map = jsonify({});
27 map['a'] = 'b';
28 testAtoB(map);
29
30 map = jsonify({});
31 Expect.equals('b', map.putIfAbsent('a', () => 'b'));
32 testAtoB(map);
33
34 map = jsonify({});
35 map.addAll({'a': 'b'});
36 testAtoB(map);
37
38 testOrder(['a', 'b', 'c', 'd', 'e', 'f']);
39
40 testProto();
41 testToString();
42 testConcurrentModifications();
43 testType();
44 testNonStringKeys();
45 testClear();
46
47 testListEntry();
48 }
49
50 void testEmpty(Map map) {
51 for (int i = 0; i < 2; i++) {
52 Expect.equals(0, map.length);
53 Expect.isTrue(map.isEmpty);
54 Expect.isFalse(map.isNotEmpty);
55 Expect.listEquals([], map.keys.toList());
56 Expect.listEquals([], map.values.toList());
57 Expect.isNull(map['a']);
58 Expect.listEquals([], listEach(map));
59 Expect.isFalse(map.containsKey('a'));
60 Expect.isFalse(map.containsValue('a'));
61 Expect.isNull(map.remove('a'));
62 testLookupNonExistingKeys(map);
63 testLookupNonExistingValues(map);
64 map.clear();
65 }
66 }
67
68 void testAtoB(Map map) {
69 Expect.equals(1, map.length);
70 Expect.isFalse(map.isEmpty);
71 Expect.isTrue(map.isNotEmpty);
72 Expect.listEquals(['a'], map.keys.toList());
73 Expect.listEquals(['b'], map.values.toList());
74 Expect.equals('b', map['a']);
75 Expect.listEquals(['a', 'b'], listEach(map));
76 Expect.isTrue(map.containsKey('a'));
77 Expect.isFalse(map.containsKey('b'));
78 Expect.isTrue(map.containsValue('b'));
79 Expect.isFalse(map.containsValue('a'));
80
81 testLookupNonExistingKeys(map);
82 testLookupNonExistingValues(map);
83 Expect.equals('b', map.remove('a'));
84 Expect.isNull(map.remove('b'));
85 testLookupNonExistingKeys(map);
86 testLookupNonExistingValues(map);
87
88 map.clear();
89 testEmpty(map);
90 }
91
92 void testLookupNonExistingKeys(Map map) {
93 for (String key in ['__proto__', 'null', null]) {
94 Expect.isNull(map[key]);
95 Expect.isFalse(map.containsKey(key));
96 }
97 }
98
99 void testLookupNonExistingValues(Map map) {
100 for (var value in ['__proto__', 'null', null]) {
101 Expect.isFalse(map.containsValue(value));
102 }
103 }
104
105 void testOrder(List list) {
106 if (list.isEmpty) return;
107 else testOrder(list.skip(1).toList());
108
109 Map original = {};
110 for (int i = 0; i < list.length; i++) {
111 original[list[i]] = i;
112 }
113
114 Map map = jsonify(original);
115 Expect.equals(list.length, map.length);
116 Expect.listEquals(list, map.keys.toList());
117
118 for (int i = 0; i < 10; i++) {
119 map["$i"] = i;
120 Expect.equals(list.length + i + 1, map.length);
121 Expect.listEquals(list, map.keys.take(list.length).toList());
122 }
123 }
124
125 void testProto() {
126 Map map = jsonify({'__proto__': 0});
127 Expect.equals(1, map.length);
128 Expect.isTrue(map.containsKey('__proto__'));
129 Expect.listEquals(['__proto__'], map.keys.toList());
130 Expect.equals(0, map['__proto__']);
131 Expect.equals(0, map.remove('__proto__'));
132 testEmpty(map);
133
134 map = jsonify({'__proto__': null});
135 Expect.equals(1, map.length);
136 Expect.isTrue(map.containsKey('__proto__'));
137 Expect.listEquals(['__proto__'], map.keys.toList());
138 Expect.isNull(map['__proto__']);
139 Expect.isNull(map.remove('__proto__'));
140 testEmpty(map);
141 }
142
143 void testToString() {
144 Expect.equals("{}", jsonify({}).toString());
145 Expect.equals("{a: 0}", jsonify({'a': 0}).toString());
146 }
147
148 void testConcurrentModifications() {
149 void testIterate(Map map, Iterable iterable, Function f) {
150 Iterator iterator = iterable.iterator;
151 f(map);
152 iterator.moveNext();
153 }
154
155 void testKeys(Map map, Function f) => testIterate(map, map.keys, f);
156 void testValues(Map map, Function f) => testIterate(map, map.values, f);
157
158 void testForEach(Map map, Function f) {
159 map.forEach((key, value) {
160 f(map);
161 });
162 }
163
164 bool throwsCME(Function f) {
165 try {
166 f();
167 } on ConcurrentModificationError catch (e) {
168 return true;
169 } catch (e) {
170 return false;
171 }
172 return false;
173 }
174
175 Map map = {};
176 Expect.isTrue(throwsCME(() => testKeys(jsonify(map),
177 (map) => map['a'] = 0)));
178 Expect.isTrue(throwsCME(() => testValues(jsonify(map),
179 (map) => map['a'] = 0)));
180 Expect.isFalse(throwsCME(() => testForEach(jsonify(map),
181 (map) => map['a'] = 0)));
182
183 Expect.isFalse(throwsCME(() => testKeys(jsonify(map),
184 (map) => map.clear())));
185 Expect.isFalse(throwsCME(() => testValues(jsonify(map),
186 (map) => map.clear())));
187 Expect.isFalse(throwsCME(() => testForEach(jsonify(map),
188 (map) => map.clear())));
189
190 Expect.isFalse(throwsCME(() => testKeys(jsonify(map),
191 (map) => map.remove('a'))));
192 Expect.isFalse(throwsCME(() => testValues(jsonify(map),
193 (map) => map.remove('a'))));
194 Expect.isFalse(throwsCME(() => testForEach(jsonify(map),
195 (map) => map.remove('a'))));
196
197 Expect.isTrue(throwsCME(() => testKeys(jsonify(map),
198 (map) => map.putIfAbsent('a', () => 0))));
199 Expect.isTrue(throwsCME(() => testValues(jsonify(map),
200 (map) => map.putIfAbsent('a', () => 0))));
201 Expect.isFalse(throwsCME(() => testForEach(jsonify(map),
202 (map) => map.putIfAbsent('a', () => 0))));
203
204 Expect.isFalse(throwsCME(() => testKeys(jsonify(map),
205 (map) => map.addAll({}))));
206 Expect.isFalse(throwsCME(() => testValues(jsonify(map),
207 (map) => map.addAll({}))));
208 Expect.isFalse(throwsCME(() => testForEach(jsonify(map),
209 (map) => map.addAll({}))));
210
211 Expect.isTrue(throwsCME(() => testKeys(jsonify(map),
212 (map) => map.addAll({'a': 0}))));
213 Expect.isTrue(throwsCME(() => testValues(jsonify(map),
214 (map) => map.addAll({'a': 0}))));
215 Expect.isFalse(throwsCME(() => testForEach(jsonify(map),
216 (map) => map.addAll({'a': 0}))));
217
218 map = {'a': 1};
219 Expect.isFalse(throwsCME(() => testKeys(jsonify(map),
220 (map) => map['a'] = 0)));
221 Expect.isFalse(throwsCME(() => testValues(jsonify(map),
222 (map) => map['a'] = 0)));
223 Expect.isFalse(throwsCME(() => testForEach(jsonify(map),
224 (map) => map['a'] = 0)));
225
226 Expect.isTrue(throwsCME(() => testKeys(jsonify(map),
227 (map) => map['b'] = 0)));
228 Expect.isTrue(throwsCME(() => testValues(jsonify(map),
229 (map) => map['b'] = 0)));
230 Expect.isTrue(throwsCME(() => testForEach(jsonify(map),
231 (map) => map['b'] = 0)));
232
233 Expect.isTrue(throwsCME(() => testKeys(jsonify(map),
234 (map) => map.clear())));
235 Expect.isTrue(throwsCME(() => testValues(jsonify(map),
236 (map) => map.clear())));
237 Expect.isTrue(throwsCME(() => testForEach(jsonify(map),
238 (map) => map.clear())));
239
240 Expect.isTrue(throwsCME(() => testKeys(jsonify(map),
241 (map) => map.remove('a'))));
242 Expect.isTrue(throwsCME(() => testValues(jsonify(map),
243 (map) => map.remove('a'))));
244 Expect.isTrue(throwsCME(() => testForEach(jsonify(map),
245 (map) => map.remove('a'))));
246
247 Expect.isFalse(throwsCME(() => testKeys(jsonify(map),
248 (map) => map.remove('b'))));
249 Expect.isFalse(throwsCME(() => testValues(jsonify(map),
250 (map) => map.remove('b'))));
251 Expect.isFalse(throwsCME(() => testForEach(jsonify(map),
252 (map) => map.remove('b'))));
253
254 Expect.isFalse(throwsCME(() => testKeys(jsonify(map),
255 (map) => map.putIfAbsent('a', () => 0))));
256 Expect.isFalse(throwsCME(() => testValues(jsonify(map),
257 (map) => map.putIfAbsent('a', () => 0))));
258 Expect.isFalse(throwsCME(() => testForEach(jsonify(map),
259 (map) => map.putIfAbsent('a', () => 0))));
260
261 Expect.isTrue(throwsCME(() => testKeys(jsonify(map),
262 (map) => map.putIfAbsent('b', () => 0))));
263 Expect.isTrue(throwsCME(() => testValues(jsonify(map),
264 (map) => map.putIfAbsent('b', () => 0))));
265 Expect.isTrue(throwsCME(() => testForEach(jsonify(map),
266 (map) => map.putIfAbsent('b', () => 0))));
267
268 Expect.isFalse(throwsCME(() => testKeys(jsonify(map),
269 (map) => map.addAll({}))));
270 Expect.isFalse(throwsCME(() => testValues(jsonify(map),
271 (map) => map.addAll({}))));
272 Expect.isFalse(throwsCME(() => testForEach(jsonify(map),
273 (map) => map.addAll({}))));
274
275 Expect.isFalse(throwsCME(() => testKeys(jsonify(map),
276 (map) => map.addAll({'a': 0}))));
277 Expect.isFalse(throwsCME(() => testValues(jsonify(map),
278 (map) => map.addAll({'a': 0}))));
279 Expect.isFalse(throwsCME(() => testForEach(jsonify(map),
280 (map) => map.addAll({'a': 0}))));
281
282 Expect.isTrue(throwsCME(() => testKeys(jsonify(map),
283 (map) => map.addAll({'b': 0}))));
284 Expect.isTrue(throwsCME(() => testValues(jsonify(map),
285 (map) => map.addAll({'b': 0}))));
286 Expect.isTrue(throwsCME(() => testForEach(jsonify(map),
287 (map) => map.addAll({'b': 0}))));
288 }
289
290 void testType() {
291 Expect.isTrue(jsonify({}) is Map);
292 Expect.isTrue(jsonify({}) is HashMap);
293 Expect.isTrue(jsonify({}) is LinkedHashMap);
294
295 Expect.isTrue(jsonify({}) is Map<String, dynamic>);
296 Expect.isTrue(jsonify({}) is HashMap<String, dynamic>);
297 Expect.isTrue(jsonify({}) is LinkedHashMap<String, dynamic>);
298
299 Expect.isTrue(jsonify({}) is Map<int, dynamic>);
300 Expect.isTrue(jsonify({}) is HashMap<int, dynamic>);
301 Expect.isTrue(jsonify({}) is LinkedHashMap<int, dynamic>);
302 }
303
304 void testNonStringKeys() {
305 Map map = jsonify({});
306 map[1] = 2;
307 Expect.equals(1, map.length);
308 Expect.equals(2, map[1]);
309 }
310
311 void testClear() {
312 Map map = jsonify({'a': 0});
313 map.clear();
314 Expect.equals(0, map.length);
315 }
316
317 void testListEntry() {
318 Map map = jsonify({'a': [7, 8, {'b': 9}]});
319 List list = map['a'];
320 Expect.equals(3, list.length);
321 Expect.equals(7, list[0]);
322 Expect.equals(8, list[1]);
323 Expect.equals(9, list[2]['b']);
324 }
OLDNEW
« no previous file with comments | « sdk/lib/_internal/lib/convert_patch.dart ('k') | tests/corelib/map_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698