| Index: client/testing/unittest/unittest.dart
|
| diff --git a/client/testing/unittest/unittest.dart b/client/testing/unittest/unittest.dart
|
| index 045bbccfcd62b81d8c4db21effad8f3713559fbd..de270824321ab0fc9b53615dc83a57903a201d17 100644
|
| --- a/client/testing/unittest/unittest.dart
|
| +++ b/client/testing/unittest/unittest.dart
|
| @@ -3,10 +3,102 @@
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
| /**
|
| - * A simple unit test library.
|
| + * A simple unit test library for running tests in a browser.
|
| */
|
| #library("unittest");
|
|
|
| #import("dart:dom");
|
|
|
| -#source("unittestsuite.dart");
|
| +#source("shared.dart");
|
| +
|
| +// TODO(rnystrom): Get rid of this if we get canonical closures for methods.
|
| +EventListener _onErrorClosure;
|
| +
|
| +_platformInitialize() {
|
| + _onErrorClosure = (e) { _onError(e); };
|
| +}
|
| +
|
| +_platformDefer(void callback()) {
|
| + window.setTimeout(callback, 0);
|
| +}
|
| +
|
| +void _onError(e) {
|
| + if (_currentTest < _tests.length) {
|
| + final testCase = _tests[_currentTest];
|
| + // TODO(vsm): figure out how to expose the stack trace here
|
| + // Currently e.message works in dartium, but not in dartc.
|
| + testCase.recordError('(DOM callback has errors) Caught ${e}', '');
|
| + _state = _UNCAUGHT_ERROR;
|
| + if (testCase.callbacks > 0) {
|
| + _currentTest++;
|
| + _nextBatch();
|
| + }
|
| + }
|
| +}
|
| +
|
| +/** Runs all queued tests, one at a time. */
|
| +_platformStartTests() {
|
| + window.postMessage('unittest-suite-start', '*');
|
| +
|
| + // Listen for uncaught errors.
|
| + window.onerror = _onErrorClosure;
|
| +}
|
| +
|
| +_platformCompleteTests(int testsPassed, int testsFailed, int testsErrors) {
|
| + window.onerror = null;
|
| +
|
| + if (_isLayoutTest && testsPassed == _tests.length) {
|
| + document.body.innerHTML = "PASS";
|
| + } else {
|
| + var newBody = new StringBuffer();
|
| + newBody.add("<table class='unittest-table'><tbody>");
|
| + newBody.add(testsPassed == _tests.length
|
| + ? "<tr><td colspan='3' class='unittest-pass'>PASS</td></tr>"
|
| + : "<tr><td colspan='3' class='unittest-fail'>FAIL</td></tr>");
|
| +
|
| + for (final test in _tests) {
|
| + newBody.add(_toHtml(test));
|
| + }
|
| +
|
| + if (testsPassed == _tests.length) {
|
| + newBody.add("<tr><td colspan='3' class='unittest-pass'>All "
|
| + + testsPassed + " tests passed</td></tr>");
|
| + } else {
|
| + newBody.add("""
|
| + <tr><td colspan='3'>Total
|
| + <span class='unittest-pass'>${testsPassed} passed</span>,
|
| + <span class='unittest-fail'>${testsFailed} failed</span>
|
| + <span class='unittest-error'>${testsErrors} errors</span>
|
| + </td></tr>""");
|
| + }
|
| + newBody.add("</tbody></table>");
|
| + document.body.innerHTML = newBody.toString();
|
| + }
|
| +
|
| + window.postMessage('unittest-suite-done', '*');
|
| +}
|
| +
|
| +String _toHtml(TestCase test) {
|
| + if (!test.isComplete) {
|
| + return '''
|
| + <tr>
|
| + <td>${test.id}</td>
|
| + <td class="unittest-error">NO STATUS</td>
|
| + <td>Test did not complete</td>
|
| + </tr>''';
|
| + }
|
| +
|
| + var html = '''
|
| + <tr>
|
| + <td>${test.id}</td>
|
| + <td class="unittest-${test.result}">${test.result.toUpperCase()}</td>
|
| + <td>Expectation: ${test.description}. ${test.message}</td>
|
| + </tr>''';
|
| +
|
| + if (test.stackTrace != null) {
|
| + html +=
|
| + '<tr><td></td><td colspan="2"><pre>${test.stackTrace}</pre></td></tr>';
|
| + }
|
| +
|
| + return html;
|
| +}
|
|
|