Index: lib/unittest/shared.dart |
diff --git a/lib/unittest/shared.dart b/lib/unittest/shared.dart |
deleted file mode 100644 |
index 879e4da362de7a6e90db33a16e504ea7b49c95f6..0000000000000000000000000000000000000000 |
--- a/lib/unittest/shared.dart |
+++ /dev/null |
@@ -1,378 +0,0 @@ |
-// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-/** |
- * This file is sourced from unittest_html, unittest_dom, and unittest_vm. |
- * These libraries shold also source 'config.dart' and should define a class |
- * called [PlatformConfiguration] that implements [Configuration]. |
- */ |
- |
-/** [Configuration] used by the unittest library. */ |
-Configuration _config = null; |
- |
-/** |
- * Description text of the current test group. If multiple groups are nested, |
- * this will contain all of their text concatenated. |
- */ |
-String _currentGroup = ''; |
- |
-/** Tests executed in this suite. */ |
-List<TestCase> _tests; |
- |
-/** |
- * Callback used to run tests. Entrypoints can replace this with their own |
- * if they want. |
- */ |
-Function _testRunner; |
- |
-/** Current test being executed. */ |
-int _currentTest = 0; |
- |
-/** Total number of callbacks that have been executed in the current test. */ |
-int _callbacksCalled = 0; |
- |
-final _UNINITIALIZED = 0; |
-final _READY = 1; |
-final _RUNNING_TEST = 2; |
- |
-/** |
- * Whether an undetected error occurred while running the last test. These |
- * errors are commonly caused by DOM callbacks that were not guarded in a |
- * try-catch block. |
- */ |
-final _UNCAUGHT_ERROR = 3; |
- |
-int _state = _UNINITIALIZED; |
- |
-final _PASS = 'pass'; |
-final _FAIL = 'fail'; |
-final _ERROR = 'error'; |
- |
-/** Creates an expectation for the given value. */ |
-Expectation expect(value) => new Expectation(value); |
- |
-/** Evaluates the given function and validates that it throws an exception. */ |
-void expectThrow(function) { |
- bool threw = false; |
- try { |
- function(); |
- } catch (var e) { |
- threw = true; |
- } |
- Expect.equals(true, threw, 'Expected exception but none was thrown.'); |
-} |
- |
-/** |
- * Creates a new test case with the given description and body. The |
- * description will include the descriptions of any surrounding group() |
- * calls. |
- */ |
-void test(String spec, TestFunction body) { |
- _ensureInitialized(); |
- |
- _tests.add(new TestCase(_tests.length + 1, _fullSpec(spec), body, 0)); |
-} |
- |
-/** |
- * Creates a new async test case with the given description and body. The |
- * description will include the descriptions of any surrounding group() |
- * calls. |
- */ |
-void asyncTest(String spec, int callbacks, TestFunction body) { |
- _ensureInitialized(); |
- |
- final testCase = new TestCase( |
- _tests.length + 1, _fullSpec(spec), body, callbacks); |
- _tests.add(testCase); |
- |
- if (callbacks < 1) { |
- testCase.error( |
- 'Async tests must wait for at least one callback ', ''); |
- } |
-} |
- |
-/** |
- * Creates a new named group of tests. Calls to group() or test() within the |
- * body of the function passed to this will inherit this group's description. |
- */ |
-void group(String description, void body()) { |
- _ensureInitialized(); |
- |
- // Concatenate the new group. |
- final oldGroup = _currentGroup; |
- if (_currentGroup != '') { |
- // Add a space. |
- _currentGroup = '$_currentGroup $description'; |
- } else { |
- // The first group. |
- _currentGroup = description; |
- } |
- |
- try { |
- body(); |
- } finally { |
- // Now that the group is over, restore the previous one. |
- _currentGroup = oldGroup; |
- } |
-} |
- |
-/** Called by subclasses to indicate that an asynchronous test completed. */ |
-void callbackDone() { |
- _callbacksCalled++; |
- final testCase = _tests[_currentTest]; |
- if (testCase.callbacks == 0) { |
- testCase.error( |
- "Can't call callbackDone() on a synchronous test", ''); |
- _state = _UNCAUGHT_ERROR; |
- } else if (_callbacksCalled > testCase.callbacks) { |
- final expected = testCase.callbacks; |
- testCase.error( |
- 'More calls to callbackDone() than expected. ' |
- + 'Actual: ${_callbacksCalled}, expected: ${expected}', ''); |
- _state = _UNCAUGHT_ERROR; |
- } else if ((_callbacksCalled == testCase.callbacks) && |
- (_state != _RUNNING_TEST)) { |
- testCase.pass(); |
- _currentTest++; |
- _testRunner(); |
- } |
-} |
- |
-/** Runs [callback] at the end of the event loop. */ |
-_defer(void callback()) { |
- // Exploit isolate ports as a platform-independent mechanism to queue a |
- // message at the end of the event loop. |
- // TODO(sigmund): expose this functionality somewhere in our libraries. |
- final port = new ReceivePort(); |
- port.receive((msg, reply) { |
- callback(); |
- port.close(); |
- }); |
- port.toSendPort().send(null, null); |
-} |
- |
-/** Runs all queued tests, one at a time. */ |
-_runTests() { |
- _config.onStart(); |
- |
- _defer(() { |
- assert (_currentTest == 0); |
- _testRunner(); |
- }); |
-} |
- |
-/** Runs a single test. */ |
-_runTest(TestCase testCase) { |
- try { |
- _callbacksCalled = 0; |
- _state = _RUNNING_TEST; |
- |
- testCase.test(); |
- |
- if (_state != _UNCAUGHT_ERROR) { |
- if (testCase.callbacks == _callbacksCalled) { |
- testCase.pass(); |
- } |
- } |
- |
- } catch (ExpectException e, var trace) { |
- if (_state != _UNCAUGHT_ERROR) { |
- //TODO(pquitslund) remove guard once dartc reliably propagates traces |
- testCase.fail(e.message, trace == null ? '' : trace.toString()); |
- } |
- } catch (var e, var trace) { |
- if (_state != _UNCAUGHT_ERROR) { |
- //TODO(pquitslund) remove guard once dartc reliably propagates traces |
- testCase.error('Caught ${e}', trace == null ? '' : trace.toString()); |
- } |
- } finally { |
- _state = _READY; |
- } |
-} |
- |
-/** |
- * Runs a batch of tests, yielding whenever an asynchronous test starts |
- * running. Tests will resume executing when such asynchronous test calls |
- * [done] or if it fails with an exception. |
- */ |
-_nextBatch() { |
- while (_currentTest < _tests.length) { |
- final testCase = _tests[_currentTest]; |
- |
- _runTest(testCase); |
- |
- if (!testCase.isComplete && testCase.callbacks > 0) return; |
- |
- _currentTest++; |
- } |
- |
- _completeTests(); |
-} |
- |
-/** Publish results on the page and notify controller. */ |
-_completeTests() { |
- _state = _UNINITIALIZED; |
- |
- int testsPassed_ = 0; |
- int testsFailed_ = 0; |
- int testsErrors_ = 0; |
- |
- for (TestCase t in _tests) { |
- switch (t.result) { |
- case _PASS: testsPassed_++; break; |
- case _FAIL: testsFailed_++; break; |
- case _ERROR: testsErrors_++; break; |
- } |
- } |
- |
- _config.onDone(testsPassed_, testsFailed_, testsErrors_, _tests); |
-} |
- |
-String _fullSpec(String spec) { |
- if (spec === null) return '$_currentGroup'; |
- return _currentGroup != '' ? '$_currentGroup $spec' : spec; |
-} |
- |
-/** |
- * Lazily initializes the test library if not already initialized. |
- */ |
-_ensureInitialized() { |
- if (_state != _UNINITIALIZED) return; |
- |
- _tests = <TestCase>[]; |
- _currentGroup = ''; |
- _state = _READY; |
- _testRunner = _nextBatch; |
- |
- if (_config == null) { |
- // TODO(sigmund): make this [new Configuration], set configuration |
- // for each platform in test.dart |
- _config = new PlatformConfiguration(); |
- } |
- _config.onInit(); |
- |
- // Immediately queue the suite up. It will run after a timeout (i.e. after |
- // main() has returned). |
- _defer(_runTests); |
-} |
- |
-/** |
- * Wraps an value and provides an "==" operator that can be used to verify that |
- * the value matches a given expectation. |
- */ |
-class Expectation { |
- final _value; |
- |
- Expectation(this._value); |
- |
- /** Asserts that the value is equivalent to [expected]. */ |
- void equals(expected) { |
- // Use the type-specialized versions when appropriate to give better |
- // error messages. |
- if (_value is String && expected is String) { |
- Expect.stringEquals(expected, _value); |
- } else if (_value is Map && expected is Map) { |
- Expect.mapEquals(expected, _value); |
- } else if (_value is Set && expected is Set) { |
- Expect.setEquals(expected, _value); |
- } else { |
- Expect.equals(expected, _value); |
- } |
- } |
- |
- /** |
- * Asserts that the difference between [expected] and the value is within |
- * [tolerance]. If no tolerance is given, it is assumed to be the value 4 |
- * significant digits smaller than the expected value. |
- */ |
- void approxEquals(num expected, |
- [num tolerance = null, String reason = null]) { |
- Expect.approxEquals(expected, _value, tolerance: tolerance, reason: reason); |
- } |
- |
- /** Asserts that the value is [null]. */ |
- void isNull() { |
- Expect.equals(null, _value); |
- } |
- |
- /** Asserts that the value is not [null]. */ |
- void isNotNull() { |
- Expect.notEquals(null, _value); |
- } |
- |
- /** Asserts that the value is [true]. */ |
- void isTrue() { |
- Expect.equals(true, _value); |
- } |
- |
- /** Asserts that the value is [false]. */ |
- void isFalse() { |
- Expect.equals(false, _value); |
- } |
- |
- /** Asserts that the value has the same elements as [expected]. */ |
- void equalsCollection(Collection expected) { |
- Expect.listEquals(expected, _value); |
- } |
- |
- /** |
- * Checks that every element of [expected] is also in [actual], and that |
- * every element of [actual] is also in [expected]. |
- */ |
- void equalsSet(Iterable expected) { |
- Expect.setEquals(expected, _value); |
- } |
-} |
- |
-/** Summarizes information about a single test case. */ |
-class TestCase { |
- /** Identifier for this test. */ |
- final id; |
- |
- /** A description of what the test is specifying. */ |
- final String description; |
- |
- /** The body of the test case. */ |
- final TestFunction test; |
- |
- /** Total number of callbacks to wait for before the test completes. */ |
- int callbacks; |
- |
- /** Error or failure message. */ |
- String message = ''; |
- |
- /** |
- * One of [_PASS], [_FAIL], or [_ERROR] or [null] if the test hasn't run yet. |
- */ |
- String result; |
- |
- /** Stack trace associated with this test, or null if it succeeded. */ |
- String stackTrace; |
- |
- Date startTime; |
- |
- Duration runningTime; |
- |
- TestCase(this.id, this.description, this.test, this.callbacks); |
- |
- bool get isComplete() => result != null; |
- |
- void pass() { |
- result = _PASS; |
- } |
- |
- void fail(String message_, String stackTrace_) { |
- result = _FAIL; |
- this.message = message_; |
- this.stackTrace = stackTrace_; |
- } |
- |
- void error(String message_, String stackTrace_) { |
- result = _ERROR; |
- this.message = message_; |
- this.stackTrace = stackTrace_; |
- } |
-} |
- |
-typedef void TestFunction(); |