OLD | NEW |
1 library TestUtils; | 1 library TestUtils; |
2 | 2 |
3 import 'dart:async'; | 3 import 'dart:async'; |
4 import 'dart:html'; | 4 import 'dart:html'; |
5 import 'dart:js' as js; | 5 import 'dart:js' as js; |
6 import 'dart:typed_data'; | 6 import 'dart:typed_data'; |
7 import 'package:unittest/unittest.dart'; | 7 import 'package:unittest/unittest.dart'; |
8 export 'package:web_components/polyfill.dart'; | 8 export 'package:web_components/polyfill.dart'; |
9 | 9 |
10 /** | 10 /** |
(...skipping 26 matching lines...) Expand all Loading... |
37 if (identical(actual, aItems[i])) { | 37 if (identical(actual, aItems[i])) { |
38 expect(expected, same(eItems[i]), | 38 expect(expected, same(eItems[i]), |
39 reason: message(path, 'extra back or side edge')); | 39 reason: message(path, 'extra back or side edge')); |
40 return; | 40 return; |
41 } | 41 } |
42 } | 42 } |
43 eItems.add(expected); | 43 eItems.add(expected); |
44 aItems.add(actual); | 44 aItems.add(actual); |
45 | 45 |
46 if (expected is Blob) { | 46 if (expected is Blob) { |
47 expect(actual is Blob, isTrue, | 47 expect(actual is Blob, isTrue, reason: '$actual is Blob'); |
48 reason: '$actual is Blob'); | |
49 expect(expected.type, equals(actual.type), | 48 expect(expected.type, equals(actual.type), |
50 reason: message(path, '.type')); | 49 reason: message(path, '.type')); |
51 expect(expected.size, equals(actual.size), | 50 expect(expected.size, equals(actual.size), |
52 reason: message(path, '.size')); | 51 reason: message(path, '.size')); |
53 return; | 52 return; |
54 } | 53 } |
55 | 54 |
56 if (expected is ByteBuffer) { | 55 if (expected is ByteBuffer) { |
57 expect(actual is ByteBuffer, isTrue, | 56 expect(actual is ByteBuffer, isTrue, reason: '$actual is ByteBuffer'); |
58 reason: '$actual is ByteBuffer'); | |
59 expect(expected.lengthInBytes, equals(actual.lengthInBytes), | 57 expect(expected.lengthInBytes, equals(actual.lengthInBytes), |
60 reason: message(path, '.lengthInBytes')); | 58 reason: message(path, '.lengthInBytes')); |
61 // TODO(antonm): one can create a view on top of those | 59 // TODO(antonm): one can create a view on top of those |
62 // and check if contents identical. Let's do it later. | 60 // and check if contents identical. Let's do it later. |
63 return; | 61 return; |
64 } | 62 } |
65 | 63 |
66 if (expected is DateTime) { | 64 if (expected is DateTime) { |
67 expect(actual is DateTime, isTrue, | 65 expect(actual is DateTime, isTrue, reason: '$actual is DateTime'); |
68 reason: '$actual is DateTime'); | |
69 expect(expected.millisecondsSinceEpoch, | 66 expect(expected.millisecondsSinceEpoch, |
70 equals(actual.millisecondsSinceEpoch), | 67 equals(actual.millisecondsSinceEpoch), |
71 reason: message(path, '.millisecondsSinceEpoch')); | 68 reason: message(path, '.millisecondsSinceEpoch')); |
72 return; | 69 return; |
73 } | 70 } |
74 | 71 |
75 if (expected is ImageData) { | 72 if (expected is ImageData) { |
76 expect(actual is ImageData, isTrue, | 73 expect(actual is ImageData, isTrue, reason: '$actual is ImageData'); |
77 reason: '$actual is ImageData'); | |
78 expect(expected.width, equals(actual.width), | 74 expect(expected.width, equals(actual.width), |
79 reason: message(path, '.width')); | 75 reason: message(path, '.width')); |
80 expect(expected.height, equals(actual.height), | 76 expect(expected.height, equals(actual.height), |
81 reason: message(path, '.height')); | 77 reason: message(path, '.height')); |
82 walk('$path.data', expected.data, actual.data); | 78 walk('$path.data', expected.data, actual.data); |
83 return; | 79 return; |
84 } | 80 } |
85 | 81 |
86 if (expected is TypedData) { | 82 if (expected is TypedData) { |
87 expect(actual is TypedData, isTrue, | 83 expect(actual is TypedData, isTrue, reason: '$actual is TypedData'); |
88 reason: '$actual is TypedData'); | |
89 walk('$path/.buffer', expected.buffer, actual.buffer); | 84 walk('$path/.buffer', expected.buffer, actual.buffer); |
90 expect(expected.offsetInBytes, equals(actual.offsetInBytes), | 85 expect(expected.offsetInBytes, equals(actual.offsetInBytes), |
91 reason: message(path, '.offsetInBytes')); | 86 reason: message(path, '.offsetInBytes')); |
92 expect(expected.lengthInBytes, equals(actual.lengthInBytes), | 87 expect(expected.lengthInBytes, equals(actual.lengthInBytes), |
93 reason: message(path, '.lengthInBytes')); | 88 reason: message(path, '.lengthInBytes')); |
94 // And also fallback to elements check below. | 89 // And also fallback to elements check below. |
95 } | 90 } |
96 | 91 |
97 if (expected is List) { | 92 if (expected is List) { |
98 expect(actual, isList, reason: message(path, '$actual is List')); | 93 expect(actual, isList, reason: message(path, '$actual is List')); |
99 expect(actual.length, expected.length, | 94 expect(actual.length, expected.length, |
100 reason: message(path, 'different list lengths')); | 95 reason: message(path, 'different list lengths')); |
101 for (var i = 0; i < expected.length; i++) { | 96 for (var i = 0; i < expected.length; i++) { |
102 walk('$path[$i]', expected[i], actual[i]); | 97 walk('$path[$i]', expected[i], actual[i]); |
103 } | 98 } |
104 return; | 99 return; |
105 } | 100 } |
106 | 101 |
107 if (expected is Map) { | 102 if (expected is Map) { |
108 expect(actual, isMap, reason: message(path, '$actual is Map')); | 103 expect(actual, isMap, reason: message(path, '$actual is Map')); |
109 for (var key in expected.keys) { | 104 for (var key in expected.keys) { |
110 if (!actual.containsKey(key)) { | 105 if (!actual.containsKey(key)) { |
111 expect(false, isTrue, reason: message(path, 'missing key "$key"')); | 106 expect(false, isTrue, reason: message(path, 'missing key "$key"')); |
112 } | 107 } |
113 walk('$path["$key"]', expected[key], actual[key]); | 108 walk('$path["$key"]', expected[key], actual[key]); |
114 } | 109 } |
115 for (var key in actual.keys) { | 110 for (var key in actual.keys) { |
116 if (!expected.containsKey(key)) { | 111 if (!expected.containsKey(key)) { |
117 expect(false, isTrue, reason: message(path, 'extra key "$key"')); | 112 expect(false, isTrue, reason: message(path, 'extra key "$key"')); |
118 } | 113 } |
119 } | 114 } |
120 return; | 115 return; |
121 } | 116 } |
122 | 117 |
123 expect(false, isTrue, reason: 'Unhandled type: $expected'); | 118 expect(false, isTrue, reason: 'Unhandled type: $expected'); |
124 } | 119 } |
125 | 120 |
126 walk('', expected, actual); | 121 walk('', expected, actual); |
127 } | 122 } |
128 | 123 |
129 | |
130 /** | 124 /** |
131 * Sanitizer which does nothing. | 125 * Sanitizer which does nothing. |
132 */ | 126 */ |
133 class NullTreeSanitizer implements NodeTreeSanitizer { | 127 class NullTreeSanitizer implements NodeTreeSanitizer { |
134 void sanitizeTree(Node node) {} | 128 void sanitizeTree(Node node) {} |
135 } | 129 } |
136 | 130 |
137 | |
138 /** | 131 /** |
139 * Validate that two DOM trees are equivalent. | 132 * Validate that two DOM trees are equivalent. |
140 */ | 133 */ |
141 void validateNodeTree(Node a, Node b, [String path = '']) { | 134 void validateNodeTree(Node a, Node b, [String path = '']) { |
142 path = '${path}${a.runtimeType}'; | 135 path = '${path}${a.runtimeType}'; |
143 expect(a.nodeType, b.nodeType, reason: '$path nodeTypes differ'); | 136 expect(a.nodeType, b.nodeType, reason: '$path nodeTypes differ'); |
144 expect(a.nodeValue, b.nodeValue, reason: '$path nodeValues differ'); | 137 expect(a.nodeValue, b.nodeValue, reason: '$path nodeValues differ'); |
145 expect(a.text, b.text, reason: '$path texts differ'); | 138 expect(a.text, b.text, reason: '$path texts differ'); |
146 expect(a.nodes.length, b.nodes.length, reason: '$path nodes.lengths differ'); | 139 expect(a.nodes.length, b.nodes.length, reason: '$path nodes.lengths differ'); |
147 | 140 |
(...skipping 19 matching lines...) Expand all Loading... |
167 * | 160 * |
168 * This is needed to cover timing scenarios which the custom element polyfill | 161 * This is needed to cover timing scenarios which the custom element polyfill |
169 * does not cover. | 162 * does not cover. |
170 */ | 163 */ |
171 void upgradeCustomElements(Node node) { | 164 void upgradeCustomElements(Node node) { |
172 if (js.context.hasProperty('CustomElements') && | 165 if (js.context.hasProperty('CustomElements') && |
173 js.context['CustomElements'].hasProperty('upgradeAll')) { | 166 js.context['CustomElements'].hasProperty('upgradeAll')) { |
174 js.context['CustomElements'].callMethod('upgradeAll', [node]); | 167 js.context['CustomElements'].callMethod('upgradeAll', [node]); |
175 } | 168 } |
176 } | 169 } |
OLD | NEW |