OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * A simple unit test library for running tests in a browser. | 6 * A simple unit test library for running tests in a browser. |
7 * | 7 * |
8 * Provides enhanced HTML output with collapsible group headers | 8 * Provides enhanced HTML output with collapsible group headers |
9 * and other at-a-glance information about the test results. | 9 * and other at-a-glance information about the test results. |
10 */ | 10 */ |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 handleExternalError('<unknown>', '(external error detected)'); | 61 handleExternalError('<unknown>', '(external error detected)'); |
62 } | 62 } |
63 } | 63 } |
64 | 64 |
65 void onInit() { | 65 void onInit() { |
66 _installHandlers(); | 66 _installHandlers(); |
67 //initialize and load CSS | 67 //initialize and load CSS |
68 final String _CSSID = '_unittestcss_'; | 68 final String _CSSID = '_unittestcss_'; |
69 | 69 |
70 var cssElement = document.head.query('#${_CSSID}'); | 70 var cssElement = document.head.query('#${_CSSID}'); |
71 if (cssElement == null){ | 71 if (cssElement == null) { |
72 cssElement = new StyleElement(); | 72 cssElement = new StyleElement(); |
73 cssElement.id = _CSSID; | 73 cssElement.id = _CSSID; |
74 document.head.append(cssElement); | 74 document.head.append(cssElement); |
75 } | 75 } |
76 | 76 |
77 cssElement.text = _htmlTestCSS; | 77 cssElement.text = _htmlTestCSS; |
78 window.postMessage('unittest-suite-wait-for-done', '*'); | 78 window.postMessage('unittest-suite-wait-for-done', '*'); |
79 } | 79 } |
80 | 80 |
81 void onStart() { | 81 void onStart() { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 .replaceAll('unittest-row ', 'unittest-row-hidden ')); | 141 .replaceAll('unittest-row ', 'unittest-row-hidden ')); |
142 }); | 142 }); |
143 | 143 |
144 var previousGroup = ''; | 144 var previousGroup = ''; |
145 var groupPassFail = true; | 145 var groupPassFail = true; |
146 final indentAmount = 50; | 146 final indentAmount = 50; |
147 | 147 |
148 // order by group and sort numerically within each group | 148 // order by group and sort numerically within each group |
149 var groupedBy = new LinkedHashMap<String, List<TestCase>>(); | 149 var groupedBy = new LinkedHashMap<String, List<TestCase>>(); |
150 | 150 |
151 for (final t in results){ | 151 for (final t in results) { |
152 if (!groupedBy.containsKey(t.currentGroup)){ | 152 if (!groupedBy.containsKey(t.currentGroup)) { |
153 groupedBy[t.currentGroup] = new List<TestCase>(); | 153 groupedBy[t.currentGroup] = new List<TestCase>(); |
154 } | 154 } |
155 | 155 |
156 groupedBy[t.currentGroup].add(t); | 156 groupedBy[t.currentGroup].add(t); |
157 } | 157 } |
158 | 158 |
159 // flatten the list again with tests ordered | 159 // flatten the list again with tests ordered |
160 List<TestCase> flattened = new List<TestCase>(); | 160 List<TestCase> flattened = new List<TestCase>(); |
161 | 161 |
162 groupedBy | 162 groupedBy |
163 .values | 163 .values |
164 .forEach((tList){ | 164 .forEach((tList){ |
165 tList.sort((tcA, tcB) => tcA.id - tcB.id); | 165 tList.sort((tcA, tcB) => tcA.id - tcB.id); |
166 flattened.addAll(tList); | 166 flattened.addAll(tList); |
167 } | 167 } |
168 ); | 168 ); |
169 | 169 |
170 var nonAlphanumeric = new RegExp('[^a-z0-9A-Z]'); | 170 var nonAlphanumeric = new RegExp('[^a-z0-9A-Z]'); |
171 | 171 |
172 // output group headers and test rows | 172 // output group headers and test rows |
173 for (final test_ in flattened) { | 173 for (final test_ in flattened) { |
174 | 174 |
175 // replace everything but numbers and letters from the group name with | 175 // replace everything but numbers and letters from the group name with |
176 // '_' so we can use in id and class properties. | 176 // '_' so we can use in id and class properties. |
177 var safeGroup = test_.currentGroup.replaceAll(nonAlphanumeric,'_'); | 177 var safeGroup = test_.currentGroup.replaceAll(nonAlphanumeric, '_'); |
178 | 178 |
179 if (test_.currentGroup != previousGroup){ | 179 if (test_.currentGroup != previousGroup) { |
180 | 180 |
181 previousGroup = test_.currentGroup; | 181 previousGroup = test_.currentGroup; |
182 | 182 |
183 var testsInGroup = results | 183 var testsInGroup = results |
184 .where((TestCase t) => t.currentGroup == previousGroup) | 184 .where((TestCase t) => t.currentGroup == previousGroup) |
185 .toList(); | 185 .toList(); |
186 var groupTotalTestCount = testsInGroup.length; | 186 var groupTotalTestCount = testsInGroup.length; |
187 var groupTestPassedCount = testsInGroup.where( | 187 var groupTestPassedCount = testsInGroup.where( |
188 (TestCase t) => t.result == 'pass').length; | 188 (TestCase t) => t.result == 'pass').length; |
189 groupPassFail = groupTotalTestCount == groupTestPassedCount; | 189 groupPassFail = groupTotalTestCount == groupTestPassedCount; |
(...skipping 11 matching lines...) Expand all Loading... |
201 <div ${_isIE ? "style='display:inline-block' ": ""}> | 201 <div ${_isIE ? "style='display:inline-block' ": ""}> |
202 ${test_.currentGroup}</div> | 202 ${test_.currentGroup}</div> |
203 | 203 |
204 <div ${_isIE ? "style='display:inline-block' ": ""}> | 204 <div ${_isIE ? "style='display:inline-block' ": ""}> |
205 (${groupTestPassedCount}/${groupTotalTestCount})</div> | 205 (${groupTestPassedCount}/${groupTotalTestCount})</div> |
206 </div> | 206 </div> |
207 </div>""")); | 207 </div>""")); |
208 | 208 |
209 // 'safeGroup' could be empty | 209 // 'safeGroup' could be empty |
210 var grp = (safeGroup == '') ? null : te.query('#${safeGroup}'); | 210 var grp = (safeGroup == '') ? null : te.query('#${safeGroup}'); |
211 if (grp != null){ | 211 if (grp != null) { |
212 grp.onClick.listen((_){ | 212 grp.onClick.listen((_) { |
213 var row = document.query('.unittest-row-${safeGroup}'); | 213 var row = document.query('.unittest-row-${safeGroup}'); |
214 if (row.attributes['class'].contains('unittest-row ')){ | 214 if (row.attributes['class'].contains('unittest-row ')){ |
215 document.queryAll('.unittest-row-${safeGroup}').forEach( | 215 document.queryAll('.unittest-row-${safeGroup}').forEach( |
216 (e) => e.attributes['class'] = e.attributes['class'] | 216 (e) => e.attributes['class'] = e.attributes['class'] |
217 .replaceAll('unittest-row ', 'unittest-row-hidden ')); | 217 .replaceAll('unittest-row ', 'unittest-row-hidden ')); |
218 }else{ | 218 }else{ |
219 document.queryAll('.unittest-row-${safeGroup}').forEach( | 219 document.queryAll('.unittest-row-${safeGroup}').forEach( |
220 (e) => e.attributes['class'] = e.attributes['class'] | 220 (e) => e.attributes['class'] = e.attributes['class'] |
221 .replaceAll('unittest-row-hidden', 'unittest-row')); | 221 .replaceAll('unittest-row-hidden', 'unittest-row')); |
222 } | 222 } |
(...skipping 25 matching lines...) Expand all Loading... |
248 $status</div> | 248 $status</div> |
249 <div ${_isIE ? "style='display:inline-block' ": ""} | 249 <div ${_isIE ? "style='display:inline-block' ": ""} |
250 class='unittest-row-description'>$description</div> | 250 class='unittest-row-description'>$description</div> |
251 </div> | 251 </div> |
252 </div>''' | 252 </div>''' |
253 ) | 253 ) |
254 ); | 254 ); |
255 } | 255 } |
256 | 256 |
257 if (!test_.isComplete) { | 257 if (!test_.isComplete) { |
258 addRowElement('${test_.id}', 'NO STATUS', 'Test did not complete.'); | 258 addRowElement('${test_.id}', 'NO STATUS', 'Test did not complete.'); |
259 return; | 259 return; |
260 } | 260 } |
261 | 261 |
262 addRowElement('${test_.id}', '${test_.result.toUpperCase()}', | 262 addRowElement('${test_.id}', '${test_.result.toUpperCase()}', |
263 '${test_.description}. ${HTML_ESCAPE.convert(test_.message)}'); | 263 '${test_.description}. ${HTML_ESCAPE.convert(test_.message)}'); |
264 | 264 |
265 if (test_.stackTrace != null) { | 265 if (test_.stackTrace != null) { |
266 addRowElement('', '', | 266 addRowElement('', '', |
267 '<pre>${HTML_ESCAPE.convert(test_.stackTrace.toString())}</pre>'); | 267 '<pre>${HTML_ESCAPE.convert(test_.stackTrace.toString())}</pre>'); |
268 } | 268 } |
269 } | 269 } |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 | 410 |
411 '''; | 411 '''; |
412 } | 412 } |
413 | 413 |
414 void useHtmlEnhancedConfiguration([bool isLayoutTest = false]) { | 414 void useHtmlEnhancedConfiguration([bool isLayoutTest = false]) { |
415 unittestConfiguration = isLayoutTest ? _singletonLayout : _singletonNotLayout; | 415 unittestConfiguration = isLayoutTest ? _singletonLayout : _singletonNotLayout; |
416 } | 416 } |
417 | 417 |
418 final _singletonLayout = new HtmlEnhancedConfiguration(true); | 418 final _singletonLayout = new HtmlEnhancedConfiguration(true); |
419 final _singletonNotLayout = new HtmlEnhancedConfiguration(false); | 419 final _singletonNotLayout = new HtmlEnhancedConfiguration(false); |
OLD | NEW |