Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1486)

Unified Diff: pkg/unittest/lib/unittest.dart

Issue 807193003: Re-apply "Remove unittest and matcher from the repo." (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Code review changes Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/unittest/lib/test_controller.js ('k') | pkg/unittest/lib/vm_config.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/unittest/lib/unittest.dart
diff --git a/pkg/unittest/lib/unittest.dart b/pkg/unittest/lib/unittest.dart
deleted file mode 100644
index 14b3af66ba4c4d1bf05dcd54f13345be1954c08e..0000000000000000000000000000000000000000
--- a/pkg/unittest/lib/unittest.dart
+++ /dev/null
@@ -1,601 +0,0 @@
-// Copyright (c) 2013, 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.
-
-/// Support for writing Dart unit tests.
-///
-/// For information on installing and importing this library, see the
-/// [unittest package on pub.dartlang.org]
-/// (http://pub.dartlang.org/packages/unittest).
-///
-/// **See also:**
-/// [Unit Testing with Dart]
-/// (http://www.dartlang.org/articles/dart-unit-tests/)
-///
-/// ##Concepts
-///
-/// * __Tests__: Tests are specified via the top-level function [test], they can be
-/// organized together using [group].
-///
-/// * __Checks__: Test expectations can be specified via [expect]
-///
-/// * __Matchers__: [expect] assertions are written declaratively using the
-/// [Matcher] class.
-///
-/// * __Configuration__: The framework can be adapted by setting
-/// [unittestConfiguration] with a [Configuration]. See the other libraries
-/// in the `unittest` package for alternative implementations of
-/// [Configuration] including `compact_vm_config.dart`, `html_config.dart`
-/// and `html_enhanced_config.dart`.
-///
-/// ##Examples
-///
-/// A trivial test:
-///
-/// import 'package:unittest/unittest.dart';
-/// main() {
-/// test('this is a test', () {
-/// int x = 2 + 3;
-/// expect(x, equals(5));
-/// });
-/// }
-///
-/// Multiple tests:
-///
-/// import 'package:unittest/unittest.dart';
-/// main() {
-/// test('this is a test', () {
-/// int x = 2 + 3;
-/// expect(x, equals(5));
-/// });
-/// test('this is another test', () {
-/// int x = 2 + 3;
-/// expect(x, equals(5));
-/// });
-/// }
-///
-/// Multiple tests, grouped by category:
-///
-/// import 'package:unittest/unittest.dart';
-/// main() {
-/// group('group A', () {
-/// test('test A.1', () {
-/// int x = 2 + 3;
-/// expect(x, equals(5));
-/// });
-/// test('test A.2', () {
-/// int x = 2 + 3;
-/// expect(x, equals(5));
-/// });
-/// });
-/// group('group B', () {
-/// test('this B.1', () {
-/// int x = 2 + 3;
-/// expect(x, equals(5));
-/// });
-/// });
-/// }
-///
-/// Asynchronous tests: if callbacks expect between 0 and 6 positional
-/// arguments, [expectAsync] will wrap a function into a new callback and will
-/// not consider the test complete until that callback is run. A count argument
-/// can be provided to specify the number of times the callback should be called
-/// (the default is 1).
-///
-/// import 'dart:async';
-/// import 'package:unittest/unittest.dart';
-/// void main() {
-/// test('callback is executed once', () {
-/// // wrap the callback of an asynchronous call with [expectAsync] if
-/// // the callback takes 0 arguments...
-/// var timer = Timer.run(expectAsync(() {
-/// int x = 2 + 3;
-/// expect(x, equals(5));
-/// }));
-/// });
-///
-/// test('callback is executed twice', () {
-/// var callback = expectAsync(() {
-/// int x = 2 + 3;
-/// expect(x, equals(5));
-/// }, count: 2); // <-- we can indicate multiplicity to [expectAsync]
-/// Timer.run(callback);
-/// Timer.run(callback);
-/// });
-/// }
-///
-/// There may be times when the number of times a callback should be called is
-/// non-deterministic. In this case a dummy callback can be created with
-/// expectAsync((){}) and this can be called from the real callback when it is
-/// finally complete.
-///
-/// A variation on this is [expectAsyncUntil], which takes a callback as the
-/// first parameter and a predicate function as the second parameter. After each
-/// time the callback is called, the predicate function will be called. If it
-/// returns `false` the test will still be considered incomplete.
-///
-/// Test functions can return [Future]s, which provide another way of doing
-/// asynchronous tests. The test framework will handle exceptions thrown by
-/// the Future, and will advance to the next test when the Future is complete.
-///
-/// import 'dart:async';
-/// import 'package:unittest/unittest.dart';
-/// void main() {
-/// test('test that time has passed', () {
-/// var duration = const Duration(milliseconds: 200);
-/// var time = new DateTime.now();
-///
-/// return new Future.delayed(duration).then((_) {
-/// var delta = new DateTime.now().difference(time);
-///
-/// expect(delta, greaterThanOrEqualTo(duration));
-/// });
-/// });
-/// }
-library unittest;
-
-import 'dart:async';
-import 'dart:collection';
-import 'dart:isolate';
-
-import 'package:matcher/matcher.dart' show DefaultFailureHandler,
- configureExpectFailureHandler, TestFailure, wrapAsync;
-export 'package:matcher/matcher.dart';
-
-import 'src/utils.dart';
-
-import 'src/configuration.dart';
-export 'src/configuration.dart';
-
-part 'src/simple_configuration.dart';
-part 'src/group_context.dart';
-part 'src/spread_args_helper.dart';
-part 'src/test_case.dart';
-part 'src/test_environment.dart';
-
-const Symbol _UNITTEST_ENVIRONMENT = #unittest.environment;
-
-final _TestEnvironment _defaultEnvironment = new _TestEnvironment();
-
-/**
- * Internal getter for the current unittest config.
- */
-_TestEnvironment get _environment {
- var environment = Zone.current[_UNITTEST_ENVIRONMENT];
- if (environment == null) return _defaultEnvironment;
- return environment;
-}
-
-// Convenience getter for the current environment's config.
-Configuration get _config => _environment.config;
-
-// Convenience setter for the current environment's config.
-void set _config(Configuration config) {
- _environment.config = config;
-}
-
-// Convenience getter for the current environment's test cases.
-List<TestCase> get _testCases => _environment.testCases;
-
-/// [Configuration] used by the unittest library.
-///
-/// Note that if a configuration has not been set, calling this getter will
-/// create a default configuration.
-Configuration get unittestConfiguration {
- if (_config == null) {
- _config = new Configuration();
- }
- return _config;
-}
-
-/// Sets the [Configuration] used by the unittest library.
-///
-/// Throws a [StateError] if there is an existing, incompatible value.
-void set unittestConfiguration(Configuration value) {
- if (!identical(_config, value)) {
- if (_config != null) {
- logMessage('Warning: The unittestConfiguration has already been set. New '
- 'unittestConfiguration ignored.');
- } else {
- _config = value;
- }
- }
-}
-
-/// Can be called by tests to log status. Tests should use this
-/// instead of [print].
-void logMessage(String message) =>
- _config.onLogMessage(currentTestCase, message);
-
-/// Separator used between group names and test names.
-String groupSep = ' ';
-
-/// Tests executed in this suite.
-List<TestCase> get testCases =>
- new UnmodifiableListView<TestCase>(_environment.testCases);
-
-/// Interval (in msecs) after which synchronous tests will insert an async
-/// delay to allow DOM or other updates.
-const int BREATH_INTERVAL = 200;
-
-/// [TestCase] currently being executed.
-TestCase get currentTestCase =>
- (_environment.currentTestCaseIndex >= 0 &&
- _environment.currentTestCaseIndex < testCases.length)
- ? testCases[_environment.currentTestCaseIndex]
- : null;
-
-/* Test case result strings. */
-// TODO(gram) we should change these constants to use a different string
-// (so that writing 'FAIL' in the middle of a test doesn't
-// imply that the test fails). We can't do it without also changing
-// the testrunner and test.dart though.
-/// Result string for a passing test case.
-const PASS = 'pass';
-/// Result string for a failing test case.
-const FAIL = 'fail';
-/// Result string for an test case with an error.
-const ERROR = 'error';
-
-/// 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) {
- _requireNotRunning();
- ensureInitialized();
- if (!_environment.soloTestSeen || _environment.soloNestingLevel > 0) {
- var testcase = new TestCase._internal(testCases.length + 1, _fullSpec(spec),
- body);
- _testCases.add(testcase);
- }
-}
-
-/// Convenience function for skipping a test.
-void skip_test(String spec, TestFunction body) {}
-
-/// Creates a new test case with the given description and body. The
-/// description will include the descriptions of any surrounding group()
-/// calls.
-///
-/// If we use [solo_test] (or [solo_group]) instead of test, then all non-solo
-/// tests will be disabled. Note that if we use [solo_group], all tests in
-/// the group will be enabled, regardless of whether they use [test] or
-/// [solo_test], or whether they are in a nested [group] vs [solo_group]. Put
-/// another way, if there are any calls to [solo_test] or [solo_group] in a test
-/// file, all tests that are not inside a [solo_group] will be disabled unless
-/// they are [solo_test]s.
-///
-/// [skip_test] and [skip_group] take precedence over soloing, by virtue of the
-/// fact that they are effectively no-ops.
-void solo_test(String spec, TestFunction body) {
- _requireNotRunning();
- ensureInitialized();
- if (!_environment.soloTestSeen) {
- _environment.soloTestSeen = true;
- // This is the first solo-ed test. Discard all tests up to now.
- _testCases.clear();
- }
- ++_environment.soloNestingLevel;
- try {
- test(spec, body);
- } finally {
- --_environment.soloNestingLevel;
- }
-}
-
-/// Indicate that [callback] is expected to be called a [count] number of times
-/// (by default 1).
-///
-/// The unittest framework will wait for the callback to run the
-/// specified [count] times before it continues with the following test. Using
-/// [expectAsync] will also ensure that errors that occur within [callback] are
-/// tracked and reported. [callback] should take 0 positional arguments (named
-/// arguments are not supported). [id] can be used to provide more
-/// descriptive error messages if the callback is called more often than
-/// expected.
-///
-/// [max] can be used to specify an upper bound on the number of
-/// calls; if this is exceeded the test will fail (or be marked as in error if
-/// it was already complete). A value of 0 for [max] (the default) will set
-/// the upper bound to the same value as [count]; i.e. the callback should be
-/// called exactly [count] times. A value of -1 for [max] will mean no upper
-/// bound.
-///
-/// [reason] is optional and is typically not supplied, as a reason is generated
-/// by the unittest package; if reason is included it is appended to the
-/// generated reason.
-Function expectAsync(Function callback,
- {int count: 1, int max: 0, String id, String reason}) =>
- new _SpreadArgsHelper(callback, count, max, id, reason).func;
-
-/// Indicate that [callback] is expected to be called until [isDone] returns
-/// true.
-///
-/// The unittest framework checks [isDone] after each callback and only
-/// when it returns true will it continue with the following test. Using
-/// [expectAsyncUntil] will also ensure that errors that occur within
-/// [callback] are tracked and reported. [callback] should take 0 positional
-/// arguments (named arguments are not supported). [id] can be used to
-/// identify the callback in error messages (for example if it is called
-/// after the test case is complete).
-///
-/// [reason] is optional and is typically not supplied, as a reason is generated
-/// by the unittest package; if reason is included it is appended to the
-/// generated reason.
-Function expectAsyncUntil(Function callback, bool isDone(),
- {String id, String reason}) =>
- new _SpreadArgsHelper(callback, 0, -1, id, reason, isDone: isDone).func;
-
-/// Creates a new named group of tests.
-///
-/// Calls to group() or test() within the body of the function passed to this
-/// named group will inherit this group's description.
-void group(String description, void body()) {
- ensureInitialized();
- _requireNotRunning();
- _environment.currentContext =
- new _GroupContext(_environment.currentContext, description);
- try {
- body();
- } catch (e, trace) {
- var stack = (trace == null) ? '' : ': ${trace.toString()}';
- _environment.uncaughtErrorMessage = "${e.toString()}$stack";
- } finally {
- // Now that the group is over, restore the previous one.
- _environment.currentContext = _environment.currentContext.parent;
- }
-}
-
-/// Like [skip_test], but for groups.
-void skip_group(String description, void body()) {}
-
-/// Like [solo_test], but for groups.
-void solo_group(String description, void body()) {
- _requireNotRunning();
- ensureInitialized();
- if (!_environment.soloTestSeen) {
- _environment.soloTestSeen = true;
- // This is the first solo-ed group. Discard all tests up to now.
- _testCases.clear();
- }
- ++_environment.soloNestingLevel;
- try {
- group(description, body);
- } finally {
- --_environment.soloNestingLevel;
- }
-}
-
-/// Register a [setUp] function for a test [group].
-///
-/// This function will be called before each test in the group is run.
-/// [setUp] and [tearDown] should be called within the [group] before any
-/// calls to [test]. The [setupTest] function can be asynchronous; in this
-/// case it must return a [Future].
-void setUp(Function setupTest) {
- _requireNotRunning();
- _environment.currentContext.testSetup = setupTest;
-}
-
-/// Register a [tearDown] function for a test [group].
-///
-/// This function will be called after each test in the group is run.
-///
-/// Note that if groups are nested only the most locally scoped [teardownTest]
-/// function will be run. [setUp] and [tearDown] should be called within the
-/// [group] before any calls to [test]. The [teardownTest] function can be
-/// asynchronous; in this case it must return a [Future].
-void tearDown(Function teardownTest) {
- _requireNotRunning();
- _environment.currentContext.testTeardown = teardownTest;
-}
-
-/// Advance to the next test case.
-void _nextTestCase() {
- _environment.currentTestCaseIndex++;
- _runTest();
-}
-
-/// Handle errors that happen outside the tests.
-// TODO(vsm): figure out how to expose the stack trace here
-// Currently e.message works in dartium, but not in dartc.
-void handleExternalError(e, String message, [stack]) {
- var msg = '$message\nCaught $e';
-
- if (currentTestCase != null) {
- currentTestCase._error(msg, stack);
- } else {
- _environment.uncaughtErrorMessage = "$msg: $stack";
- }
-}
-
-/// Filter the tests by [testFilter].
-///
-/// [testFilter] can be a [RegExp], a [String] or a
-/// predicate function. This is different from enabling or disabling tests
-/// in that it removes the tests completely.
-void filterTests(testFilter) {
- var filterFunction;
- if (testFilter is String) {
- RegExp re = new RegExp(testFilter);
- filterFunction = (t) => re.hasMatch(t.description);
- } else if (testFilter is RegExp) {
- filterFunction = (t) => testFilter.hasMatch(t.description);
- } else if (testFilter is Function) {
- filterFunction = testFilter;
- }
- _testCases.retainWhere(filterFunction);
-}
-
-/// Runs all queued tests, one at a time.
-void runTests() {
- _requireNotRunning();
- _ensureInitialized(false);
- _environment.currentTestCaseIndex = 0;
- _config.onStart();
- _runTest();
-}
-
-/// Registers that an exception was caught for the current test.
-void registerException(e, [trace]) {
- _registerException(currentTestCase, e, trace);
-}
-
-/// Registers that an exception was caught for the current test.
-void _registerException(TestCase testCase, e, [trace]) {
- String message = (e is TestFailure) ? e.message : 'Caught $e';
- if (testCase.result == null) {
- testCase._fail(message, trace);
- } else {
- testCase._error(message, trace);
- }
-}
-
-/// Runs the next test.
-void _runTest() {
- if (_environment.currentTestCaseIndex >= testCases.length) {
- assert(_environment.currentTestCaseIndex == testCases.length);
- _completeTests();
- } else {
- var testCase = testCases[_environment.currentTestCaseIndex];
- Future f = runZoned(testCase._run, onError: (error, stack) {
- // TODO(kevmoo) Do a better job of flagging these are async errors.
- // https://code.google.com/p/dart/issues/detail?id=16530
- _registerException(testCase, error, stack);
- });
-
- var timeout = unittestConfiguration.timeout;
-
- Timer timer;
- if (timeout != null) {
- try {
- timer = new Timer(timeout, () {
- testCase._error("Test timed out after ${timeout.inSeconds} seconds.");
- _nextTestCase();
- });
- } on UnsupportedError catch (e) {
- if (e.message != "Timer greater than 0.") rethrow;
- // Support running on d8 and jsshell which don't support timers.
- }
- }
- f.whenComplete(() {
- if (timer != null) timer.cancel();
- var now = new DateTime.now().millisecondsSinceEpoch;
- if ((now - _environment.lastBreath) >= BREATH_INTERVAL) {
- _environment.lastBreath = now;
- Timer.run(_nextTestCase);
- } else {
- scheduleMicrotask(_nextTestCase); // Schedule the next test.
- }
- });
- }
-}
-
-/// Publish results on the page and notify controller.
-void _completeTests() {
- if (!_environment.initialized) return;
- int passed = 0;
- int failed = 0;
- int errors = 0;
-
- 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, testCases,
- _environment.uncaughtErrorMessage);
- _config.onDone(passed > 0 && failed == 0 && errors == 0 &&
- _environment.uncaughtErrorMessage == null);
- _environment.initialized = false;
- _environment.currentTestCaseIndex = -1;
-}
-
-String _fullSpec(String spec) {
- var group = '${_environment.currentContext.fullName}';
- if (spec == null) return group;
- return group != '' ? '$group$groupSep$spec' : spec;
-}
-
-/// Lazily initializes the test library if not already initialized.
-void ensureInitialized() {
- _ensureInitialized(true);
-}
-
-void _ensureInitialized(bool configAutoStart) {
- if (_environment.initialized) {
- return;
- }
- _environment.initialized = true;
- // Hook our async guard into the matcher library.
- wrapAsync = (f, [id]) => expectAsync(f, id: id);
-
- _environment.uncaughtErrorMessage = null;
-
- unittestConfiguration.onInit();
-
- if (configAutoStart && _config.autoStart) {
- // Immediately queue the suite up. It will run after a timeout (i.e. after
- // main() has returned).
- scheduleMicrotask(runTests);
- }
-}
-
-/// Select a solo test by ID.
-void setSoloTest(int id) => _testCases.retainWhere((t) => t.id == id);
-
-/// Enable/disable a test by ID.
-void _setTestEnabledState(int testId, bool state) {
- // Try fast path first.
- if (testCases.length > testId && testCases[testId].id == testId) {
- testCases[testId]._enabled = state;
- } else {
- for (var i = 0; i < testCases.length; i++) {
- if (testCases[i].id == testId) {
- testCases[i]._enabled = state;
- break;
- }
- }
- }
-}
-
-/// Enable a test by ID.
-void enableTest(int testId) => _setTestEnabledState(testId, true);
-
-/// Disable a test by ID.
-void disableTest(int testId) => _setTestEnabledState(testId, false);
-
-/// Signature for a test function.
-typedef dynamic TestFunction();
-
-/// A flag that controls whether we hide unittest and core library details in
-/// exception stacks.
-///
-/// Useful to disable when debugging unittest or matcher customizations.
-bool formatStacks = true;
-
-/// A flag that controls whether we try to filter out irrelevant frames from
-/// the stack trace.
-///
-/// Requires [formatStacks] to be set.
-bool filterStacks = true;
-
-void _requireNotRunning() {
- if (_environment.currentTestCaseIndex != -1) {
- throw new StateError('Not allowed when tests are running.');
- }
-}
-
-/// Method to create a test environment running in its own zone scope.
-///
-/// This allows for multiple invocations of the unittest library in the same
-/// application instance.
-/// This is useful when, for example, creating a test runner application which
-/// needs to create a new pristine test environment on each invocation to run
-/// a given set of test.
-dynamic withTestEnvironment(callback()) {
- return runZoned(callback,
- zoneValues: {_UNITTEST_ENVIRONMENT: new _TestEnvironment()});
-}
« no previous file with comments | « pkg/unittest/lib/test_controller.js ('k') | pkg/unittest/lib/vm_config.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698