| Index: pkg/dev_compiler/test/codegen/minitest.dart
|
| diff --git a/pkg/dev_compiler/test/codegen/minitest.dart b/pkg/dev_compiler/test/codegen/minitest.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..980544c2839a162c9591f603b4f13a31cbd18774
|
| --- /dev/null
|
| +++ b/pkg/dev_compiler/test/codegen/minitest.dart
|
| @@ -0,0 +1,181 @@
|
| +// Copyright (c) 2016, 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.
|
| +
|
| +/// A minimal, dependency-free emulation layer for a subset of the
|
| +/// unittest/test API used by the language and core library (especially HTML)
|
| +/// tests.
|
| +///
|
| +/// A number of our language and core library tests were written against the
|
| +/// unittest package, which is now deprecated in favor of the new test package.
|
| +/// The latter is much better feature-wise, but is also quite complex and has
|
| +/// many dependencies. For low-level language and core library tests, we don't
|
| +/// want to have to pull in a large number of dependencies and be able to run
|
| +/// them correctly in order to run a test, so we want to test them against
|
| +/// something simpler.
|
| +///
|
| +/// When possible, we just use the tiny expect library. But to avoid rewriting
|
| +/// all of the existing tests that use unittest, they can instead use this,
|
| +/// which shims the unittest API with as little code as possible and calls into
|
| +/// expect.
|
| +///
|
| +/// Eventually, it would be good to refactor those tests to use the expect
|
| +/// package directly and remove this.
|
| +
|
| +import 'package:expect/expect.dart';
|
| +
|
| +typedef void _Action();
|
| +typedef void _ExpectationFunction(Object actual);
|
| +
|
| +final List<_Group> _groups = [new _Group()];
|
| +
|
| +final Object isFalse = new _Expectation(Expect.isFalse);
|
| +final Object isNotNull = new _Expectation(Expect.isNotNull);
|
| +final Object isNull = new _Expectation(Expect.isNull);
|
| +final Object isTrue = new _Expectation(Expect.isTrue);
|
| +
|
| +final Object returnsNormally = new _Expectation((actual) {
|
| + try {
|
| + (actual as _Action)();
|
| + } catch (error) {
|
| + Expect.fail("Expected function to return normally, but threw:\n$error");
|
| + }
|
| +});
|
| +
|
| +final Object throws = new _Expectation((actual) {
|
| + Expect.throws(actual as _Action);
|
| +});
|
| +
|
| +final Object throwsArgumentError = new _Expectation((actual) {
|
| + Expect.throws(actual as _Action, (error) => error is ArgumentError);
|
| +});
|
| +
|
| +final Object throwsNoSuchMethodError = new _Expectation((actual) {
|
| + Expect.throws(actual as _Action, (error) => error is NoSuchMethodError);
|
| +});
|
| +
|
| +final Object throwsRangeError = new _Expectation((actual) {
|
| + Expect.throws(actual as _Action, (error) => error is RangeError);
|
| +});
|
| +
|
| +final Object throwsStateError = new _Expectation((actual) {
|
| + Expect.throws(actual as _Action, (error) => error is StateError);
|
| +});
|
| +
|
| +final Object throwsUnsupportedError = new _Expectation((actual) {
|
| + Expect.throws(actual as _Action, (error) => error is UnsupportedError);
|
| +});
|
| +
|
| +/// The test runner should call this once after running a test file.
|
| +void finishTests() {
|
| + _groups.clear();
|
| + _groups.add(new _Group());
|
| +}
|
| +
|
| +void group(String description, body()) {
|
| + // TODO(rnystrom): Do something useful with the description.
|
| + _groups.add(new _Group());
|
| +
|
| + try {
|
| + body();
|
| + } finally {
|
| + _groups.removeLast();
|
| + }
|
| +}
|
| +
|
| +void test(String description, body()) {
|
| + // TODO(rnystrom): Do something useful with the description.
|
| + for (var group in _groups) {
|
| + if (group.setUpFunction != null) group.setUpFunction();
|
| + }
|
| +
|
| + try {
|
| + body();
|
| + } finally {
|
| + for (var i = _groups.length - 1; i >= 0; i--) {
|
| + var group = _groups[i];
|
| + if (group.tearDownFunction != null) group.tearDownFunction();
|
| + }
|
| + }
|
| +}
|
| +
|
| +void setUp(body()) {
|
| + // Can't define multiple setUps at the same level.
|
| + assert(_groups.last.setUpFunction == null);
|
| + _groups.last.setUpFunction = body;
|
| +}
|
| +
|
| +void tearDown(body()) {
|
| + // Can't define multiple tearDowns at the same level.
|
| + assert(_groups.last.tearDownFunction == null);
|
| + _groups.last.tearDownFunction = body;
|
| +}
|
| +
|
| +void expect(Object actual, Object expected, {String reason}) {
|
| + // TODO(rnystrom): Do something useful with reason.
|
| + if (expected is! _Expectation) {
|
| + expected = equals(expected);
|
| + }
|
| +
|
| + var expectation = expected as _Expectation;
|
| + expectation.function(actual);
|
| +}
|
| +
|
| +void fail(String message) {
|
| + Expect.fail(message);
|
| +}
|
| +
|
| +Object equals(Object value) => new _Expectation((actual) {
|
| + Expect.deepEquals(value, actual);
|
| + });
|
| +
|
| +Object notEquals(Object value) => new _Expectation((actual) {
|
| + Expect.notEquals(value, actual);
|
| + });
|
| +
|
| +Object unorderedEquals(Object value) => new _Expectation((actual) {
|
| + Expect.setEquals(value, actual);
|
| + });
|
| +
|
| +// TODO(bob): Do something useful with the description.
|
| +Object predicate(bool fn(Object value), [String description]) =>
|
| + new _Expectation((actual) {
|
| + Expect.isTrue(fn(actual));
|
| + });
|
| +
|
| +Object inInclusiveRange(num min, num max) => new _Expectation((actual) {
|
| + var actualNum = actual as num;
|
| + if (actualNum < min || actualNum > max) {
|
| + fail("Expected $actualNum to be in the inclusive range [$min, $max].");
|
| + }
|
| + });
|
| +
|
| +Object greaterThan(num value) => new _Expectation((actual) {
|
| + var actualNum = actual as num;
|
| + if (actualNum <= value) {
|
| + fail("Expected $actualNum to be greater than $value.");
|
| + }
|
| + });
|
| +
|
| +Object same(Object value) => new _Expectation((actual) {
|
| + Expect.identical(value, actual);
|
| + });
|
| +
|
| +/// One level of group() nesting to track an optional [setUp()] and [tearDown()]
|
| +/// function for the group.
|
| +///
|
| +/// There is also an implicit top level group.
|
| +class _Group {
|
| + _Action setUpFunction;
|
| + _Action tearDownFunction;
|
| +}
|
| +
|
| +/// A wrapper around an expectation function.
|
| +///
|
| +/// This function is passed the actual value and should throw an
|
| +/// [ExpectException] if the value doesn't match the expectation.
|
| +class _Expectation {
|
| + final _ExpectationFunction function;
|
| +
|
| + _Expectation(this.function);
|
| +}
|
|
|