| Index: lib/src/runner/parse_metadata.dart
|
| diff --git a/lib/src/runner/parse_metadata.dart b/lib/src/runner/parse_metadata.dart
|
| index 5cc4cb61039b3fa19277c68dc193ba882eff2a7f..21ed6e2cbd954fc71812c324522a6a34007b10c8 100644
|
| --- a/lib/src/runner/parse_metadata.dart
|
| +++ b/lib/src/runner/parse_metadata.dart
|
| @@ -32,6 +32,7 @@ const _durationArgs = const [
|
| Metadata parseMetadata(String path) {
|
| var timeout;
|
| var testOn;
|
| + var skip;
|
|
|
| var contents = new File(path).readAsStringSync();
|
| var directives = parseDirectives(contents, name: path).directives;
|
| @@ -82,13 +83,21 @@ Metadata parseMetadata(String path) {
|
| _spanFor(annotation, path));
|
| }
|
| timeout = _parseTimeout(annotation, constructorName, path);
|
| + } else if (name == 'Skip') {
|
| + if (skip != null) {
|
| + throw new SourceSpanFormatException(
|
| + "Only a single Skip annotation may be used for a given test file.",
|
| + _spanFor(annotation, path));
|
| + }
|
| + skip = _parseSkip(annotation, constructorName, path);
|
| }
|
| }
|
|
|
| try {
|
| return new Metadata.parse(
|
| testOn: testOn == null ? null : testOn.stringValue,
|
| - timeout: timeout);
|
| + timeout: timeout,
|
| + skip: skip);
|
| } on SourceSpanFormatException catch (error) {
|
| var file = new SourceFile(new File(path).readAsStringSync(),
|
| url: p.toUri(path));
|
| @@ -188,6 +197,47 @@ Timeout _parseTimeout(Annotation annotation, String constructorName,
|
| }
|
| }
|
|
|
| +/// Parses a `@Skip` annotation.
|
| +///
|
| +/// [annotation] is the annotation. [constructorName] is the name of the named
|
| +/// constructor for the annotation, if any. [path] is the path to the file from
|
| +/// which the annotation was parsed.
|
| +///
|
| +/// Returns either `true` or a reason string.
|
| +_parseSkip(Annotation annotation, String constructorName, String path) {
|
| + if (constructorName != null) {
|
| + throw new SourceSpanFormatException(
|
| + 'Skip doesn\'t have a constructor named "$constructorName".',
|
| + _spanFor(annotation, path));
|
| + }
|
| +
|
| + if (annotation.arguments == null) {
|
| + throw new SourceSpanFormatException(
|
| + 'Skip must have parentheses.', _spanFor(annotation, path));
|
| + }
|
| +
|
| + var args = annotation.arguments.arguments;
|
| + if (args.length > 1) {
|
| + throw new SourceSpanFormatException(
|
| + 'Skip takes zero arguments or one argument.',
|
| + _spanFor(annotation.arguments, path));
|
| + }
|
| +
|
| + if (args.isEmpty) return true;
|
| +
|
| + if (args.first is NamedExpression) {
|
| + throw new SourceSpanFormatException(
|
| + "Skip doesn't take named parameters.", _spanFor(args.first, path));
|
| + }
|
| +
|
| + if (args.first is! StringLiteral) {
|
| + throw new SourceSpanFormatException(
|
| + "Skip takes a String.", _spanFor(args.first, path));
|
| + }
|
| +
|
| + return args.first.stringValue;
|
| +}
|
| +
|
| /// Parses a `const Duration` expression.
|
| Duration _parseDuration(Expression expression, String path) {
|
| if (expression is! InstanceCreationExpression) {
|
|
|