Index: pkg/unittest/lib/unittest.dart |
diff --git a/pkg/unittest/lib/unittest.dart b/pkg/unittest/lib/unittest.dart |
index 329e20dc68b61be922a967f566b95ca5635b83e1..a0f5ffc3e41f8ee66f41e12c881518197ec52713 100644 |
--- a/pkg/unittest/lib/unittest.dart |
+++ b/pkg/unittest/lib/unittest.dart |
@@ -155,6 +155,7 @@ library unittest; |
import 'dart:async'; |
import 'dart:isolate'; |
+import 'dart:collection'; |
import 'matcher.dart'; |
export 'matcher.dart'; |
@@ -196,10 +197,10 @@ String _currentGroup = ''; |
String groupSep = ' '; |
/** Tests executed in this suite. */ |
-List<TestCase> _tests; |
+final List<TestCase> _testCases = new List<TestCase>(); |
/** Get the list of tests. */ |
-List<TestCase> get testCases => _tests; |
+final List<TestCase> testCases = new UnmodifiableListView(_testCases); |
/** Setup function called before each test in a group */ |
Function _testSetup; |
@@ -207,13 +208,12 @@ Function _testSetup; |
/** Teardown function called after each test in a group */ |
Function _testTeardown; |
-/** Current test being executed. */ |
-int _currentTest = 0; |
-TestCase _currentTestCase; |
+int _currentTestCaseIndex = 0; |
+/** [TestCase] currently being executed. */ |
TestCase get currentTestCase => |
- (_currentTest >= 0 && _currentTest < _tests.length) |
- ? _tests[_currentTest] |
+ (_currentTestCaseIndex >= 0 && _currentTestCaseIndex < _testCases.length) |
+ ? _testCases[_currentTestCaseIndex] |
: null; |
/** Whether the framework is in an initialized state. */ |
@@ -249,7 +249,8 @@ Map testState = {}; |
*/ |
void test(String spec, TestFunction body) { |
ensureInitialized(); |
- _tests.add(new TestCase._internal(_tests.length + 1, _fullSpec(spec), body)); |
+ _testCases.add(new TestCase._internal(_testCases.length + 1, _fullSpec(spec), |
+ body)); |
} |
/** |
@@ -271,8 +272,8 @@ void solo_test(String spec, TestFunction body) { |
ensureInitialized(); |
- _soloTest = new TestCase._internal(_tests.length + 1, _fullSpec(spec), body); |
- _tests.add(_soloTest); |
+ _soloTest = new TestCase._internal(_testCases.length + 1, _fullSpec(spec), body); |
+ _testCases.add(_soloTest); |
} |
/** Sentinel value for [_SpreadArgsHelper]. */ |
@@ -303,19 +304,19 @@ class _SpreadArgsHelper { |
? minExpected |
: maxExpected, |
this.isDone = isDone, |
- testNum = _currentTest, |
+ testNum = _currentTestCaseIndex, |
this.id = _makeCallbackId(id, callback) { |
ensureInitialized(); |
- if (!(_currentTest >= 0 && |
- _currentTest < _tests.length && |
- _tests[_currentTest] != null)) { |
+ if (!(_currentTestCaseIndex >= 0 && |
+ _currentTestCaseIndex < _testCases.length && |
+ _testCases[_currentTestCaseIndex] != null)) { |
print("No valid test, did you forget to run your test inside a call " |
"to test()?"); |
} |
- assert(_currentTest >= 0 && |
- _currentTest < _tests.length && |
- _tests[_currentTest] != null); |
- testCase = _tests[_currentTest]; |
+ assert(_currentTestCaseIndex >= 0 && |
+ _currentTestCaseIndex < _testCases.length && |
+ _testCases[_currentTestCaseIndex] != null); |
+ testCase = _testCases[_currentTestCaseIndex]; |
if (isDone != null || minExpected > 0) { |
testCase._callbackFunctionsOutstanding++; |
complete = false; |
@@ -634,7 +635,7 @@ void tearDown(Function teardownTest) { |
/** Advance to the next test case. */ |
void _nextTestCase() { |
_defer(() { |
- _currentTest++; |
+ _currentTestCaseIndex++; |
_nextBatch(); |
}); |
} |
@@ -644,8 +645,8 @@ void _nextTestCase() { |
* error was caught outside of this library. |
*/ |
void _reportTestError(String msg, String trace) { |
- if (_currentTest < _tests.length) { |
- final testCase = _tests[_currentTest]; |
+ if (_currentTestCaseIndex < _testCases.length) { |
+ final testCase = _testCases[_currentTestCaseIndex]; |
testCase.error(msg, trace); |
} else { |
_uncaughtErrorMessage = "$msg: $trace"; |
@@ -686,12 +687,12 @@ void filterTests(testFilter) { |
} else if (testFilter is Function) { |
filterFunction = testFilter; |
} |
- _tests.retainWhere(filterFunction); |
+ _testCases.retainWhere(filterFunction); |
} |
/** Runs all queued tests, one at a time. */ |
void runTests() { |
- _currentTest = 0; |
+ _currentTestCaseIndex = 0; |
_currentGroup = ''; |
// If we are soloing a test, remove all the others. |
@@ -713,7 +714,7 @@ void runTests() { |
* The value returned by [tryBody] (if any) is returned by [guardAsync]. |
*/ |
guardAsync(Function tryBody) { |
- return _guardAsync(tryBody, null, _currentTest); |
+ return _guardAsync(tryBody, null, _currentTestCaseIndex); |
} |
_guardAsync(Function tryBody, Function finallyBody, int testNum) { |
@@ -731,7 +732,7 @@ _guardAsync(Function tryBody, Function finallyBody, int testNum) { |
* Registers that an exception was caught for the current test. |
*/ |
void registerException(e, [trace]) { |
- _registerException(_currentTest, e, trace); |
+ _registerException(_currentTestCaseIndex, e, trace); |
} |
/** |
@@ -740,10 +741,10 @@ void registerException(e, [trace]) { |
void _registerException(testNum, e, [trace]) { |
trace = trace == null ? '' : trace.toString(); |
String message = (e is TestFailure) ? e.message : 'Caught $e'; |
- if (_tests[testNum].result == null) { |
- _tests[testNum].fail(message, trace); |
+ if (_testCases[testNum].result == null) { |
+ _testCases[testNum].fail(message, trace); |
} else { |
- _tests[testNum].error(message, trace); |
+ _testCases[testNum].error(message, trace); |
} |
} |
@@ -754,19 +755,19 @@ void _registerException(testNum, e, [trace]) { |
*/ |
void _nextBatch() { |
while (true) { |
- if (_currentTest >= _tests.length) { |
+ if (_currentTestCaseIndex >= _testCases.length) { |
_completeTests(); |
break; |
} |
- final testCase = _tests[_currentTest]; |
- var f = _guardAsync(testCase._run, null, _currentTest); |
+ final testCase = _testCases[_currentTestCaseIndex]; |
+ var f = _guardAsync(testCase._run, null, _currentTestCaseIndex); |
if (f != null) { |
f.whenComplete(() { |
_nextTestCase(); // Schedule the next test. |
}); |
break; |
} |
- _currentTest++; |
+ _currentTestCaseIndex++; |
} |
} |
@@ -777,14 +778,14 @@ void _completeTests() { |
int failed = 0; |
int errors = 0; |
- for (TestCase t in _tests) { |
+ for (TestCase t in _testCases) { |
switch (t.result) { |
case PASS: passed++; break; |
case FAIL: failed++; break; |
case ERROR: errors++; break; |
} |
} |
- _config.onSummary(passed, failed, errors, _tests, _uncaughtErrorMessage); |
+ _config.onSummary(passed, failed, errors, _testCases, _uncaughtErrorMessage); |
_config.onDone(passed > 0 && failed == 0 && errors == 0 && |
_uncaughtErrorMessage == null); |
_initialized = false; |
@@ -806,7 +807,6 @@ void ensureInitialized() { |
// Hook our async guard into the matcher library. |
wrapAsync = (f, [id]) => expectAsync1(f, id: id); |
- _tests = <TestCase>[]; |
_uncaughtErrorMessage = null; |
if (_config == null) { |
@@ -823,9 +823,9 @@ void ensureInitialized() { |
/** Select a solo test by ID. */ |
void setSoloTest(int id) { |
- for (var i = 0; i < _tests.length; i++) { |
- if (_tests[i].id == id) { |
- _soloTest = _tests[i]; |
+ for (var i = 0; i < _testCases.length; i++) { |
+ if (_testCases[i].id == id) { |
+ _soloTest = _testCases[i]; |
break; |
} |
} |
@@ -834,12 +834,12 @@ void setSoloTest(int id) { |
/** Enable/disable a test by ID. */ |
void _setTestEnabledState(int testId, bool state) { |
// Try fast path first. |
- if (_tests.length > testId && _tests[testId].id == testId) { |
- _tests[testId].enabled = state; |
+ if (_testCases.length > testId && _testCases[testId].id == testId) { |
+ _testCases[testId].enabled = state; |
} else { |
- for (var i = 0; i < _tests.length; i++) { |
- if (_tests[i].id == testId) { |
- _tests[i].enabled = state; |
+ for (var i = 0; i < _testCases.length; i++) { |
+ if (_testCases[i].id == testId) { |
+ _testCases[i].enabled = state; |
break; |
} |
} |