blob: 8fe9ba67f41cbb98bbec275008422113318c0f93 [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 'package:boolean_selector/boolean_selector.dart';
import 'package:path/path.dart' as p;
import 'package:test/test.dart';
import 'package:test/src/backend/platform_selector.dart';
import 'package:test/src/backend/test_platform.dart';
import 'package:test/src/runner/configuration.dart';
import 'package:test/src/runner/configuration/values.dart';
import 'package:test/src/util/io.dart';
void main() {
group("merge", () {
group("for most fields", () {
test("if neither is defined, preserves the default", () {
var merged = new Configuration().merge(new Configuration());
expect(merged.help, isFalse);
expect(merged.version, isFalse);
expect(merged.verboseTrace, isFalse);
expect(merged.jsTrace, isFalse);
expect(merged.skip, isFalse);
expect(merged.skipReason, isNull);
expect(merged.pauseAfterLoad, isFalse);
expect(merged.color, equals(canUseSpecialChars));
expect(merged.packageRoot, equals(p.join(p.current, 'packages')));
expect(merged.reporter, equals(defaultReporter));
expect(merged.pubServeUrl, isNull);
expect(merged.pattern, isNull);
expect(merged.platforms, equals([TestPlatform.vm]));
expect(merged.paths, equals(["test"]));
});
test("if only the old configuration's is defined, uses it", () {
var merged = new Configuration(
help: true,
version: true,
verboseTrace: true,
jsTrace: true,
skip: true,
skipReason: "boop",
pauseAfterLoad: true,
color: true,
packageRoot: "root",
reporter: "json",
pubServePort: 1234,
pattern: "foo",
platforms: [TestPlatform.chrome],
paths: ["bar"])
.merge(new Configuration());
expect(merged.help, isTrue);
expect(merged.version, isTrue);
expect(merged.verboseTrace, isTrue);
expect(merged.jsTrace, isTrue);
expect(merged.skip, isTrue);
expect(merged.skipReason, equals("boop"));
expect(merged.pauseAfterLoad, isTrue);
expect(merged.color, isTrue);
expect(merged.packageRoot, equals("root"));
expect(merged.reporter, equals("json"));
expect(merged.pubServeUrl.port, equals(1234));
expect(merged.pattern, equals("foo"));
expect(merged.platforms, equals([TestPlatform.chrome]));
expect(merged.paths, equals(["bar"]));
});
test("if only the new configuration's is defined, uses it", () {
var merged = new Configuration().merge(new Configuration(
help: true,
version: true,
verboseTrace: true,
jsTrace: true,
skip: true,
skipReason: "boop",
pauseAfterLoad: true,
color: true,
packageRoot: "root",
reporter: "json",
pubServePort: 1234,
pattern: "foo",
platforms: [TestPlatform.chrome],
paths: ["bar"]));
expect(merged.help, isTrue);
expect(merged.version, isTrue);
expect(merged.verboseTrace, isTrue);
expect(merged.jsTrace, isTrue);
expect(merged.skip, isTrue);
expect(merged.skipReason, equals("boop"));
expect(merged.pauseAfterLoad, isTrue);
expect(merged.color, isTrue);
expect(merged.packageRoot, equals("root"));
expect(merged.reporter, equals("json"));
expect(merged.pubServeUrl.port, equals(1234));
expect(merged.pattern, equals("foo"));
expect(merged.platforms, equals([TestPlatform.chrome]));
expect(merged.paths, equals(["bar"]));
});
test("if the two configurations conflict, uses the new configuration's "
"values", () {
var older = new Configuration(
help: true,
version: false,
verboseTrace: true,
jsTrace: false,
skip: true,
skipReason: "foo",
pauseAfterLoad: true,
color: false,
packageRoot: "root",
reporter: "json",
pubServePort: 1234,
pattern: "foo",
platforms: [TestPlatform.chrome],
paths: ["bar"]);
var newer = new Configuration(
help: false,
version: true,
verboseTrace: false,
jsTrace: true,
skip: true,
skipReason: "bar",
pauseAfterLoad: false,
color: true,
packageRoot: "boot",
reporter: "compact",
pubServePort: 5678,
pattern: "gonk",
platforms: [TestPlatform.dartium],
paths: ["blech"]);
var merged = older.merge(newer);
expect(merged.help, isFalse);
expect(merged.version, isTrue);
expect(merged.verboseTrace, isFalse);
expect(merged.jsTrace, isTrue);
expect(merged.skipReason, equals("bar"));
expect(merged.pauseAfterLoad, isFalse);
expect(merged.color, isTrue);
expect(merged.packageRoot, equals("boot"));
expect(merged.reporter, equals("compact"));
expect(merged.pubServeUrl.port, equals(5678));
expect(merged.pattern, equals("gonk"));
expect(merged.platforms, equals([TestPlatform.dartium]));
expect(merged.paths, equals(["blech"]));
});
});
group("for testOn", () {
test("if neither is defined, preserves the default", () {
var merged = new Configuration().merge(new Configuration());
expect(merged.testOn, equals(PlatformSelector.all));
});
test("if only the old configuration's is defined, uses it", () {
var merged = new Configuration(
testOn: new PlatformSelector.parse("chrome"))
.merge(new Configuration());
expect(merged.testOn, equals(new PlatformSelector.parse("chrome")));
});
test("if only the new configuration's is defined, uses it", () {
var merged = new Configuration()
.merge(new Configuration(
testOn: new PlatformSelector.parse("chrome")));
expect(merged.testOn, equals(new PlatformSelector.parse("chrome")));
});
test("if both are defined, intersects them", () {
var older = new Configuration(
testOn: new PlatformSelector.parse("vm"));
var newer = new Configuration(
testOn: new PlatformSelector.parse("linux"));
var merged = older.merge(newer);
expect(merged.testOn,
equals(new PlatformSelector.parse("vm && linux")));
});
});
group("for include and excludeTags", () {
test("if neither is defined, preserves the default", () {
var merged = new Configuration().merge(new Configuration());
expect(merged.includeTags, equals(BooleanSelector.all));
expect(merged.excludeTags, equals(BooleanSelector.none));
});
test("if only the old configuration's is defined, uses it", () {
var merged = new Configuration(
includeTags: new BooleanSelector.parse("foo || bar"),
excludeTags: new BooleanSelector.parse("baz || bang"))
.merge(new Configuration());
expect(merged.includeTags,
equals(new BooleanSelector.parse("foo || bar")));
expect(merged.excludeTags,
equals(new BooleanSelector.parse("baz || bang")));
});
test("if only the new configuration's is defined, uses it", () {
var merged = new Configuration().merge(new Configuration(
includeTags: new BooleanSelector.parse("foo || bar"),
excludeTags: new BooleanSelector.parse("baz || bang")));
expect(merged.includeTags,
equals(new BooleanSelector.parse("foo || bar")));
expect(merged.excludeTags,
equals(new BooleanSelector.parse("baz || bang")));
});
test("if both are defined, unions or intersects them", () {
var older = new Configuration(
includeTags: new BooleanSelector.parse("foo || bar"),
excludeTags: new BooleanSelector.parse("baz || bang"));
var newer = new Configuration(
includeTags: new BooleanSelector.parse("blip"),
excludeTags: new BooleanSelector.parse("qux"));
var merged = older.merge(newer);
expect(merged.includeTags,
equals(new BooleanSelector.parse("(foo || bar) && blip")));
expect(merged.excludeTags,
equals(new BooleanSelector.parse("(baz || bang) || qux")));
});
});
group("for sets", () {
test("if neither is defined, preserves the default", () {
var merged = new Configuration().merge(new Configuration());
expect(merged.addTags, isEmpty);
expect(merged.chosenPresets, isEmpty);
});
test("if only the old configuration's is defined, uses it", () {
var merged = new Configuration(
addTags: new Set.from(["foo", "bar"]),
chosenPresets: new Set.from(["baz", "bang"]))
.merge(new Configuration());
expect(merged.addTags, unorderedEquals(["foo", "bar"]));
expect(merged.chosenPresets, equals(["baz", "bang"]));
});
test("if only the new configuration's is defined, uses it", () {
var merged = new Configuration().merge(new Configuration(
addTags: new Set.from(["foo", "bar"]),
chosenPresets: new Set.from(["baz", "bang"])));
expect(merged.addTags, unorderedEquals(["foo", "bar"]));
expect(merged.chosenPresets, equals(["baz", "bang"]));
});
test("if both are defined, unions them", () {
var older = new Configuration(
addTags: new Set.from(["foo", "bar"]),
chosenPresets: new Set.from(["baz", "bang"]));
var newer = new Configuration(
addTags: new Set.from(["blip"]),
chosenPresets: new Set.from(["qux"]));
var merged = older.merge(newer);
expect(merged.addTags, unorderedEquals(["foo", "bar", "blip"]));
expect(merged.chosenPresets, equals(["baz", "bang", "qux"]));
});
});
group("for timeout", () {
test("if neither is defined, preserves the default", () {
var merged = new Configuration().merge(new Configuration());
expect(merged.timeout, equals(new Timeout.factor(1)));
});
test("if only the old configuration's is defined, uses it", () {
var merged = new Configuration(timeout: new Timeout.factor(2))
.merge(new Configuration());
expect(merged.timeout, equals(new Timeout.factor(2)));
});
test("if only the new configuration's is defined, uses it", () {
var merged = new Configuration()
.merge(new Configuration(timeout: new Timeout.factor(2)));
expect(merged.timeout, equals(new Timeout.factor(2)));
});
test("if both are defined, merges them", () {
var older = new Configuration(timeout: new Timeout.factor(2));
var newer = new Configuration(timeout: new Timeout.factor(3));
var merged = older.merge(newer);
expect(merged.timeout, equals(new Timeout.factor(6)));
});
test("if the merge conflicts, prefers the new value", () {
var older = new Configuration(
timeout: new Timeout(new Duration(seconds: 1)));
var newer = new Configuration(
timeout: new Timeout(new Duration(seconds: 2)));
var merged = older.merge(newer);
expect(merged.timeout, equals(new Timeout(new Duration(seconds: 2))));
});
});
group("for config maps", () {
test("merges each nested configuration", () {
var merged = new Configuration(
tags: {
new BooleanSelector.parse("foo"):
new Configuration(verboseTrace: true),
new BooleanSelector.parse("bar"): new Configuration(jsTrace: true)
},
onPlatform: {
new PlatformSelector.parse("vm"):
new Configuration(verboseTrace: true),
new PlatformSelector.parse("chrome"):
new Configuration(jsTrace: true)
},
presets: {
"bang": new Configuration(verboseTrace: true),
"qux": new Configuration(jsTrace: true)
}
).merge(new Configuration(
tags: {
new BooleanSelector.parse("bar"): new Configuration(jsTrace: false),
new BooleanSelector.parse("baz"): new Configuration(skip: true)
},
onPlatform: {
new PlatformSelector.parse("chrome"):
new Configuration(jsTrace: false),
new PlatformSelector.parse("firefox"): new Configuration(skip: true)
},
presets: {
"qux": new Configuration(jsTrace: false),
"zap": new Configuration(skip: true)
}
));
expect(merged.tags[new BooleanSelector.parse("foo")].verboseTrace,
isTrue);
expect(merged.tags[new BooleanSelector.parse("bar")].jsTrace, isFalse);
expect(merged.tags[new BooleanSelector.parse("baz")].skip, isTrue);
expect(merged.onPlatform[new PlatformSelector.parse("vm")].verboseTrace,
isTrue);
expect(merged.onPlatform[new PlatformSelector.parse("chrome")].jsTrace,
isFalse);
expect(merged.onPlatform[new PlatformSelector.parse("firefox")].skip,
isTrue);
expect(merged.presets["bang"].verboseTrace, isTrue);
expect(merged.presets["qux"].jsTrace, isFalse);
expect(merged.presets["zap"].skip, isTrue);
});
});
group("for presets", () {
test("automatically resolves a matching chosen preset", () {
var configuration = new Configuration(
presets: {"foo": new Configuration(verboseTrace: true)},
chosenPresets: ["foo"]);
expect(configuration.presets, isEmpty);
expect(configuration.chosenPresets, equals(["foo"]));
expect(configuration.knownPresets, equals(["foo"]));
expect(configuration.verboseTrace, isTrue);
});
test("resolves a chosen presets in order", () {
var configuration = new Configuration(
presets: {
"foo": new Configuration(verboseTrace: true),
"bar": new Configuration(verboseTrace: false)
},
chosenPresets: ["foo", "bar"]);
expect(configuration.presets, isEmpty);
expect(configuration.chosenPresets, equals(["foo", "bar"]));
expect(configuration.knownPresets, unorderedEquals(["foo", "bar"]));
expect(configuration.verboseTrace, isFalse);
configuration = new Configuration(
presets: {
"foo": new Configuration(verboseTrace: true),
"bar": new Configuration(verboseTrace: false)
},
chosenPresets: ["bar", "foo"]);
expect(configuration.presets, isEmpty);
expect(configuration.chosenPresets, equals(["bar", "foo"]));
expect(configuration.knownPresets, unorderedEquals(["foo", "bar"]));
expect(configuration.verboseTrace, isTrue);
});
test("ignores inapplicable chosen presets", () {
var configuration = new Configuration(
presets: {},
chosenPresets: ["baz"]);
expect(configuration.presets, isEmpty);
expect(configuration.chosenPresets, equals(["baz"]));
expect(configuration.knownPresets, equals(isEmpty));
});
test("resolves presets through merging", () {
var configuration = new Configuration(presets: {
"foo": new Configuration(verboseTrace: true)
}).merge(new Configuration(chosenPresets: ["foo"]));
expect(configuration.presets, isEmpty);
expect(configuration.chosenPresets, equals(["foo"]));
expect(configuration.knownPresets, equals(["foo"]));
expect(configuration.verboseTrace, isTrue);
});
test("preserves known presets through merging", () {
var configuration = new Configuration(presets: {
"foo": new Configuration(verboseTrace: true)
}, chosenPresets: ["foo"])
.merge(new Configuration());
expect(configuration.presets, isEmpty);
expect(configuration.chosenPresets, equals(["foo"]));
expect(configuration.knownPresets, equals(["foo"]));
expect(configuration.verboseTrace, isTrue);
});
});
});
}