blob: 35fc9ef183cb1cef4008ae6b4e090ba8f4b890eb [file] [log] [blame]
// Copyright (c) 2015, 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.
import 'package:boolean_selector/boolean_selector.dart';
import 'package:test/src/backend/metadata.dart';
import 'package:test/src/backend/platform_selector.dart';
import 'package:test/src/backend/test_platform.dart';
import 'package:test/src/frontend/skip.dart';
import 'package:test/src/frontend/timeout.dart';
import 'package:test/test.dart';
void main() {
group("tags", () {
test("parses an Iterable", () {
expect(new Metadata.parse(tags: ["a", "b"]).tags,
unorderedEquals(["a", "b"]));
});
test("parses a String", () {
expect(new Metadata.parse(tags: "a").tags, unorderedEquals(["a"]));
});
test("parses null", () {
expect(new Metadata.parse().tags, unorderedEquals([]));
});
test("parse refuses an invalid type", () {
expect(() => new Metadata.parse(tags: 1), throwsArgumentError);
});
test("parse refuses an invalid type in a list", () {
expect(() => new Metadata.parse(tags: [1]), throwsArgumentError);
});
test("merges tags by computing the union of the two tag sets", () {
var merged =
new Metadata(tags: ["a", "b"]).merge(new Metadata(tags: ["b", "c"]));
expect(merged.tags, unorderedEquals(["a", "b", "c"]));
});
test("serializes and deserializes tags", () {
var metadata = new Metadata(tags: ["a", "b"]).serialize();
expect(
new Metadata.deserialize(metadata).tags, unorderedEquals(['a', 'b']));
});
});
group("constructor", () {
test("returns the normal metadata if there's no forTag", () {
var metadata = new Metadata(verboseTrace: true, tags: ['foo', 'bar']);
expect(metadata.verboseTrace, isTrue);
expect(metadata.tags, equals(['foo', 'bar']));
});
test("returns the normal metadata if there's no tags", () {
var metadata = new Metadata(
verboseTrace: true,
forTag: {new BooleanSelector.parse('foo'): new Metadata(skip: true)});
expect(metadata.verboseTrace, isTrue);
expect(metadata.skip, isFalse);
expect(metadata.forTag, contains(new BooleanSelector.parse('foo')));
expect(metadata.forTag[new BooleanSelector.parse('foo')].skip, isTrue);
});
test("returns the normal metadata if forTag doesn't match tags", () {
var metadata = new Metadata(
verboseTrace: true,
tags: ['bar', 'baz'],
forTag: {new BooleanSelector.parse('foo'): new Metadata(skip: true)});
expect(metadata.verboseTrace, isTrue);
expect(metadata.skip, isFalse);
expect(metadata.tags, unorderedEquals(['bar', 'baz']));
expect(metadata.forTag, contains(new BooleanSelector.parse('foo')));
expect(metadata.forTag[new BooleanSelector.parse('foo')].skip, isTrue);
});
test("resolves forTags that match tags", () {
var metadata = new Metadata(verboseTrace: true, tags: [
'foo',
'bar',
'baz'
], forTag: {
new BooleanSelector.parse('foo'): new Metadata(skip: true),
new BooleanSelector.parse('baz'): new Metadata(timeout: Timeout.none),
new BooleanSelector.parse('qux'): new Metadata(skipReason: "blah")
});
expect(metadata.verboseTrace, isTrue);
expect(metadata.skip, isTrue);
expect(metadata.skipReason, isNull);
expect(metadata.timeout, equals(Timeout.none));
expect(metadata.tags, unorderedEquals(['foo', 'bar', 'baz']));
expect(metadata.forTag.keys, equals([new BooleanSelector.parse('qux')]));
});
test("resolves forTags that adds a behavioral tag", () {
var metadata = new Metadata(tags: [
'foo'
], forTag: {
new BooleanSelector.parse('baz'): new Metadata(skip: true),
new BooleanSelector.parse('bar'):
new Metadata(verboseTrace: true, tags: ['baz']),
new BooleanSelector.parse('foo'): new Metadata(tags: ['bar'])
});
expect(metadata.verboseTrace, isTrue);
expect(metadata.skip, isTrue);
expect(metadata.tags, unorderedEquals(['foo', 'bar', 'baz']));
expect(metadata.forTag, isEmpty);
});
test("resolves forTags that adds circular tags", () {
var metadata = new Metadata(tags: [
'foo'
], forTag: {
new BooleanSelector.parse('foo'): new Metadata(tags: ['bar']),
new BooleanSelector.parse('bar'): new Metadata(tags: ['baz']),
new BooleanSelector.parse('baz'): new Metadata(tags: ['foo'])
});
expect(metadata.tags, unorderedEquals(['foo', 'bar', 'baz']));
expect(metadata.forTag, isEmpty);
});
test("base metadata takes precedence over forTags", () {
var metadata = new Metadata(verboseTrace: true, tags: [
'foo'
], forTag: {
new BooleanSelector.parse('foo'): new Metadata(verboseTrace: false)
});
expect(metadata.verboseTrace, isTrue);
});
});
group("onPlatform", () {
test("parses a valid map", () {
var metadata = new Metadata.parse(onPlatform: {
"chrome": new Timeout.factor(2),
"vm": [new Skip(), new Timeout.factor(3)]
});
var key = metadata.onPlatform.keys.first;
expect(key.evaluate(TestPlatform.chrome), isTrue);
expect(key.evaluate(TestPlatform.vm), isFalse);
var value = metadata.onPlatform.values.first;
expect(value.timeout.scaleFactor, equals(2));
key = metadata.onPlatform.keys.last;
expect(key.evaluate(TestPlatform.vm), isTrue);
expect(key.evaluate(TestPlatform.chrome), isFalse);
value = metadata.onPlatform.values.last;
expect(value.skip, isTrue);
expect(value.timeout.scaleFactor, equals(3));
});
test("refuses an invalid value", () {
expect(() {
new Metadata.parse(onPlatform: {"chrome": new TestOn("chrome")});
}, throwsArgumentError);
});
test("refuses an invalid value in a list", () {
expect(() {
new Metadata.parse(onPlatform: {
"chrome": [new TestOn("chrome")]
});
}, throwsArgumentError);
});
test("refuses an invalid platform selector", () {
expect(() {
new Metadata.parse(onPlatform: {"vm &&": new Skip()});
}, throwsFormatException);
});
test("refuses multiple Timeouts", () {
expect(() {
new Metadata.parse(onPlatform: {
"chrome": [new Timeout.factor(2), new Timeout.factor(3)]
});
}, throwsArgumentError);
});
test("refuses multiple Skips", () {
expect(() {
new Metadata.parse(onPlatform: {
"chrome": [new Skip(), new Skip()]
});
}, throwsArgumentError);
});
});
group("validatePlatformSelectors", () {
test("succeeds if onPlatform uses valid platforms", () {
new Metadata.parse(onPlatform: {"vm || browser": new Skip()})
.validatePlatformSelectors(new Set.from(["vm"]));
});
test("succeeds if testOn uses valid platforms", () {
new Metadata.parse(testOn: "vm || browser")
.validatePlatformSelectors(new Set.from(["vm"]));
});
test("fails if onPlatform uses an invalid platform", () {
expect(() {
new Metadata.parse(onPlatform: {"unknown": new Skip()})
.validatePlatformSelectors(new Set.from(["vm"]));
}, throwsFormatException);
});
test("fails if testOn uses an invalid platform", () {
expect(() {
new Metadata.parse(testOn: "unknown")
.validatePlatformSelectors(new Set.from(["vm"]));
}, throwsFormatException);
});
});
group("change", () {
test("preserves all fields if no parameters are passed", () {
var metadata = new Metadata(
testOn: new PlatformSelector.parse("linux"),
timeout: new Timeout.factor(2),
skip: true,
skipReason: "just because",
verboseTrace: true,
tags: [
"foo",
"bar"
],
onPlatform: {
new PlatformSelector.parse("mac-os"): new Metadata(skip: false)
},
forTag: {
new BooleanSelector.parse("slow"):
new Metadata(timeout: new Timeout.factor(4))
});
expect(metadata.serialize(), equals(metadata.change().serialize()));
});
test("updates a changed field", () {
var metadata = new Metadata(timeout: new Timeout.factor(2));
expect(metadata.change(timeout: new Timeout.factor(3)).timeout,
equals(new Timeout.factor(3)));
});
});
}