blob: c5f7a3d7c716e1e66d2c5b125677468987d0413a [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/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",
JSON.encode({
"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",
JSON.encode({
"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",
JSON.encode({
"tags": {
"foo": {"timeout": "0s"}
}
}))
.create();
await d.file("test.dart", """
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("test 1", () => new Future.delayed(Duration.ZERO), tags: ['foo']);
test("test 2", () => new 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",
JSON.encode({
"tags": {
"foo && bar": {"timeout": "0s"}
}
}))
.create();
await d.file("test.dart", """
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("test 1", () => new Future.delayed(Duration.ZERO), tags: ['foo']);
test("test 2", () => new Future.delayed(Duration.ZERO), tags: ['bar']);
test("test 3", () => new 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",
JSON.encode({
"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",
JSON.encode({
"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", JSON.encode({"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", JSON.encode({"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",
JSON.encode({
"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", JSON.encode({"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",
JSON.encode({
"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",
JSON.encode({
"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", JSON.encode({"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",
JSON.encode({
"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",
JSON.encode({
"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", JSON.encode({"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", JSON.encode({"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", JSON.encode({"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", JSON.encode({"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);
});
});
});
}