| // 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); |
| }); |
| }); |
| }); |
| } |