blob: a3234b611162a9cd455fb038916a8b0559d3dc33 [file] [log] [blame]
// 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.
@TestOn('vm')
import 'dart:convert';
import 'package:test_descriptor/test_descriptor.dart' as d;
import 'package:test_core/src/util/exit_codes.dart' as exit_codes;
import 'package:test/test.dart';
import '../../io.dart';
void main() {
test('adds the specified tags', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'add_tags': ['foo', 'bar']
}))
.create();
await d.file('test.dart', '''
import 'package:test/test.dart';
void main() {
test("test", () {});
}
''').create();
var test = await runTest(['--exclude-tag', 'foo', 'test.dart']);
expect(test.stdout, emitsThrough(contains('No tests ran.')));
await test.shouldExit(0);
test = await runTest(['--exclude-tag', 'bar', 'test.dart']);
expect(test.stdout, emitsThrough(contains('No tests ran.')));
await test.shouldExit(0);
test = await runTest(['test.dart']);
expect(test.stdout, emitsThrough(contains('+1: All tests passed!')));
await test.shouldExit(0);
});
group('tags', () {
test("doesn't warn for tags that exist in the configuration", () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'tags': {'foo': null}
}))
.create();
await d.file('test.dart', '''
import 'package:test/test.dart';
void main() {
test("test", () {});
}
''').create();
var test = await runTest(['test.dart']);
expect(test.stdout, neverEmits(contains('Warning: Tags were used')));
await test.shouldExit(0);
});
test('applies tag-specific configuration only to matching tests', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'tags': {
'foo': {'timeout': '0s'}
}
}))
.create();
await d.file('test.dart', '''
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("test 1", () => Future.delayed(Duration.zero), tags: ['foo']);
test("test 2", () => Future.delayed(Duration.zero));
}
''').create();
var test = await runTest(['test.dart']);
expect(test.stdout,
containsInOrder(['-1: test 1 [E]', '+1 -1: Some tests failed.']));
await test.shouldExit(1);
});
test('supports tag selectors', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'tags': {
'foo && bar': {'timeout': '0s'}
}
}))
.create();
await d.file('test.dart', '''
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("test 1", () => Future.delayed(Duration.zero), tags: ['foo']);
test("test 2", () => Future.delayed(Duration.zero), tags: ['bar']);
test("test 3", () => Future.delayed(Duration.zero),
tags: ['foo', 'bar']);
}
''').create();
var test = await runTest(['test.dart']);
expect(test.stdout,
containsInOrder(['+2 -1: test 3 [E]', '+2 -1: Some tests failed.']));
await test.shouldExit(1);
});
test('allows tag inheritance via add_tags', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'tags': {
'foo': null,
'bar': {
'add_tags': ['foo']
}
}
}))
.create();
await d.file('test.dart', '''
import 'package:test/test.dart';
void main() {
test("test 1", () {}, tags: ['bar']);
test("test 2", () {});
}
''').create();
var test = await runTest(['test.dart', '--tags', 'foo']);
expect(test.stdout, emitsThrough(contains('+1: All tests passed!')));
await test.shouldExit(0);
});
// Regression test for #503.
test('skips tests whose tags are marked as skip', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'tags': {
'foo': {'skip': 'some reason'}
}
}))
.create();
await d.file('test.dart', '''
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("test 1", () => throw 'bad', tags: ['foo']);
}
''').create();
var test = await runTest(['test.dart']);
expect(
test.stdout, containsInOrder(['some reason', 'All tests skipped.']));
await test.shouldExit(0);
});
});
group('include_tags and exclude_tags', () {
test('only runs tests with the included tags', () async {
await d
.file('dart_test.yaml', jsonEncode({'include_tags': 'foo && bar'}))
.create();
await d.file('test.dart', '''
import 'package:test/test.dart';
void main() {
test("zip", () {}, tags: "foo");
test("zap", () {}, tags: "bar");
test("zop", () {}, tags: ["foo", "bar"]);
}
''').create();
var test = await runTest(['test.dart']);
expect(
test.stdout, containsInOrder(['+0: zop', '+1: All tests passed!']));
await test.shouldExit(0);
});
test("doesn't run tests with the excluded tags", () async {
await d
.file('dart_test.yaml', jsonEncode({'exclude_tags': 'foo && bar'}))
.create();
await d.file('test.dart', '''
import 'package:test/test.dart';
void main() {
test("zip", () {}, tags: "foo");
test("zap", () {}, tags: "bar");
test("zop", () {}, tags: ["foo", "bar"]);
}
''').create();
var test = await runTest(['test.dart']);
expect(test.stdout,
containsInOrder(['+0: zip', '+1: zap', '+2: All tests passed!']));
await test.shouldExit(0);
});
});
group('errors', () {
group('tags', () {
test('rejects an invalid tag type', () async {
await d.file('dart_test.yaml', '{"tags": {12: null}}').create();
var test = await runTest([]);
expect(
test.stderr, containsInOrder(['tags key must be a string', '^^']));
await test.shouldExit(exit_codes.data);
});
test('rejects an invalid tag selector', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'tags': {'foo bar': null}
}))
.create();
var test = await runTest([]);
expect(
test.stderr,
containsInOrder(
['Invalid tags key: Expected end of input.', '^^^^^^^^^']));
await test.shouldExit(exit_codes.data);
});
test('rejects an invalid tag map', () async {
await d.file('dart_test.yaml', jsonEncode({'tags': 12})).create();
var test = await runTest([]);
expect(test.stderr, containsInOrder(['tags must be a map', '^^']));
await test.shouldExit(exit_codes.data);
});
test('rejects an invalid tag configuration', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'tags': {
'foo': {'timeout': '12p'}
}
}))
.create();
var test = await runTest([]);
expect(test.stderr,
containsInOrder(['Invalid timeout: expected unit', '^^^^']));
await test.shouldExit(exit_codes.data);
});
test('rejects runner configuration', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'tags': {
'foo': {'filename': '*_blorp.dart'}
}
}))
.create();
var test = await runTest([]);
expect(test.stderr,
containsInOrder(["filename isn't supported here.", '^^^^^^^^^^']));
await test.shouldExit(exit_codes.data);
});
});
group('add_tags', () {
test('rejects an invalid list type', () async {
await d
.file('dart_test.yaml', jsonEncode({'add_tags': 'foo'}))
.create();
var test = await runTest(['test.dart']);
expect(
test.stderr, containsInOrder(['add_tags must be a list', '^^^^']));
await test.shouldExit(exit_codes.data);
});
test('rejects an invalid tag type', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'add_tags': [12]
}))
.create();
var test = await runTest(['test.dart']);
expect(
test.stderr, containsInOrder(['Tag name must be a string', '^^']));
await test.shouldExit(exit_codes.data);
});
test('rejects an invalid tag name', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'add_tags': ['foo bar']
}))
.create();
var test = await runTest(['test.dart']);
expect(
test.stderr,
containsInOrder([
'Tag name must be an (optionally hyphenated) Dart identifier.',
'^^^^^^^^^'
]));
await test.shouldExit(exit_codes.data);
});
});
group('include_tags', () {
test('rejects an invalid type', () async {
await d
.file('dart_test.yaml', jsonEncode({'include_tags': 12}))
.create();
var test = await runTest(['test.dart']);
expect(test.stderr,
containsInOrder(['include_tags must be a string', '^^']));
await test.shouldExit(exit_codes.data);
});
test('rejects an invalid selector', () async {
await d
.file('dart_test.yaml', jsonEncode({'include_tags': 'foo bar'}))
.create();
var test = await runTest([]);
expect(
test.stderr,
containsInOrder(
['Invalid include_tags: Expected end of input.', '^^^^^^^^^']));
await test.shouldExit(exit_codes.data);
});
});
group('exclude_tags', () {
test('rejects an invalid type', () async {
await d
.file('dart_test.yaml', jsonEncode({'exclude_tags': 12}))
.create();
var test = await runTest(['test.dart']);
expect(test.stderr,
containsInOrder(['exclude_tags must be a string', '^^']));
await test.shouldExit(exit_codes.data);
});
test('rejects an invalid selector', () async {
await d
.file('dart_test.yaml', jsonEncode({'exclude_tags': 'foo bar'}))
.create();
var test = await runTest([]);
expect(
test.stderr,
containsInOrder(
['Invalid exclude_tags: Expected end of input.', '^^^^^^^^^']));
await test.shouldExit(exit_codes.data);
});
});
});
}