Add support for skipping tests
diff --git a/pkgs/test_reflective_loader/lib/test_reflective_loader.dart b/pkgs/test_reflective_loader/lib/test_reflective_loader.dart index 25868d9..4312ba5 100644 --- a/pkgs/test_reflective_loader/lib/test_reflective_loader.dart +++ b/pkgs/test_reflective_loader/lib/test_reflective_loader.dart
@@ -27,6 +27,11 @@ const _ReflectiveTest reflectiveTest = const _ReflectiveTest(); /** + * A marker annotation used to annotate test methods that should be skipped. + */ +const SkippedTest skippedTest = const SkippedTest(); + +/** * A marker annotation used to annotate "solo" groups and tests. */ const _SoloTest soloTest = const _SoloTest(); @@ -115,14 +120,18 @@ _hasAnnotationInstance(memberMirror, soloTest); // test_ if (memberName.startsWith('test_')) { - group.addTest(isSolo, memberName, memberMirror, () { - if (_hasFailingTestAnnotation(memberMirror) || - _isCheckedMode && _hasAssertFailingTestAnnotation(memberMirror)) { - return _runFailingTest(classMirror, symbol); - } else { - return _runTest(classMirror, symbol); - } - }); + if (_hasSkippedTestAnnotation(memberMirror)) { + group.addSkippedTest(memberName); + } else { + group.addTest(isSolo, memberName, memberMirror, () { + if (_hasFailingTestAnnotation(memberMirror) || + _isCheckedMode && _hasAssertFailingTestAnnotation(memberMirror)) { + return _runFailingTest(classMirror, symbol); + } else { + return _runTest(classMirror, symbol); + } + }); + } return; } // solo_test_ @@ -143,6 +152,10 @@ return _runFailingTest(classMirror, symbol); }); } + // skip_test_ + if (memberName.startsWith('skip_test_')) { + group.addSkippedTest(memberName); + } }); // Support for the case of missing enclosing [defineReflectiveSuite]. @@ -160,7 +173,7 @@ for (_Test test in group.tests) { if (allTests || test.isSolo) { test_package.test(test.name, test.function, - timeout: test.timeout); + timeout: test.timeout, skip: test.isSkipped); } } } @@ -211,6 +224,9 @@ bool _hasFailingTestAnnotation(MethodMirror method) => _hasAnnotationInstance(method, failingTest); +bool _hasSkippedTestAnnotation(MethodMirror method) => + _hasAnnotationInstance(method, skippedTest); + Future _invokeSymbolIfExists(InstanceMirror instanceMirror, Symbol symbol) { var invocationResult = null; InstanceMirror closure; @@ -277,6 +293,19 @@ } /** + * A marker annotation used to annotate test methods which are skipped. + */ +class SkippedTest { + /** + * Initialize this annotation with the given arguments. + * + * [issue] is a full URI describing the failure and used for tracking. + * [reason] is a free form textual description. + */ + const SkippedTest({String issue, String reason}); +} + +/** * A marker annotation used to annotate test methods with additional timeout * information. */ @@ -309,6 +338,11 @@ bool get hasSoloTest => tests.any((test) => test.isSolo); + void addSkippedTest(String name) { + String fullName = _combineNames(this.name, name); + tests.add(new _Test.skipped(isSolo, fullName)); + } + void addTest(bool isSolo, String name, MethodMirror memberMirror, _TestFunction function) { String fullName = _combineNames(this.name, name); @@ -341,5 +375,12 @@ final _TestFunction function; final test_package.Timeout timeout; - _Test(this.isSolo, this.name, this.function, this.timeout); + final bool isSkipped; + + _Test(this.isSolo, this.name, this.function, this.timeout) + : isSkipped = false; + _Test.skipped(this.isSolo, this.name) + : isSkipped = true, + function = null, + timeout = null; }
diff --git a/pkgs/test_reflective_loader/test/test_reflective_loader_test.dart b/pkgs/test_reflective_loader/test/test_reflective_loader_test.dart index 952fe0a..a657b04 100644 --- a/pkgs/test_reflective_loader/test/test_reflective_loader_test.dart +++ b/pkgs/test_reflective_loader/test/test_reflective_loader_test.dart
@@ -35,4 +35,14 @@ Future test_fails_throws_async() { return new Future.error('foo'); } + + @skippedTest + void test_fails_but_skipped() { + throw 'foo'; + } + + @skippedTest + void test_times_out_but_skipped() { + while (true) {} + } }