blob: 3e0908219963c3bb74cd75a73f72b2b8753a1c18 [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')
library;
import 'package:boolean_selector/boolean_selector.dart';
import 'package:test/test.dart';
import 'package:test_core/src/runner/configuration/reporters.dart';
import 'package:test_core/src/runner/suite.dart';
import 'package:test_core/src/util/io.dart';
import '../../utils.dart';
void main() {
group('merge', () {
group('for most fields', () {
test('if neither is defined, preserves the default', () {
var merged = configuration().merge(configuration());
expect(merged.help, isFalse);
expect(merged.version, isFalse);
expect(merged.pauseAfterLoad, isFalse);
expect(merged.debug, isFalse);
expect(merged.color, equals(canUseSpecialChars));
expect(merged.configurationPath, equals('dart_test.yaml'));
expect(merged.reporter, equals(defaultReporter));
expect(merged.fileReporters, isEmpty);
expect(merged.pubServeUrl, isNull);
expect(merged.shardIndex, isNull);
expect(merged.totalShards, isNull);
expect(merged.testRandomizeOrderingSeed, isNull);
expect(merged.testSelections.keys.single, 'test');
});
test("if only the old configuration's is defined, uses it", () {
var merged = configuration(
help: true,
version: true,
pauseAfterLoad: true,
debug: true,
color: true,
configurationPath: 'special_test.yaml',
reporter: 'json',
fileReporters: {'json': 'out.json'},
pubServePort: 1234,
shardIndex: 3,
totalShards: 10,
testRandomizeOrderingSeed: 123,
testSelections: const {
'bar': {TestSelection()}
}).merge(configuration());
expect(merged.help, isTrue);
expect(merged.version, isTrue);
expect(merged.pauseAfterLoad, isTrue);
expect(merged.debug, isTrue);
expect(merged.color, isTrue);
expect(merged.configurationPath, equals('special_test.yaml'));
expect(merged.reporter, equals('json'));
expect(merged.fileReporters, equals({'json': 'out.json'}));
expect(merged.pubServeUrl!.port, equals(1234));
expect(merged.shardIndex, equals(3));
expect(merged.totalShards, equals(10));
expect(merged.testRandomizeOrderingSeed, 123);
expect(merged.testSelections.keys.single, 'bar');
});
test("if only the new configuration's is defined, uses it", () {
var merged = configuration().merge(configuration(
help: true,
version: true,
pauseAfterLoad: true,
debug: true,
color: true,
configurationPath: 'special_test.yaml',
reporter: 'json',
fileReporters: {'json': 'out.json'},
pubServePort: 1234,
shardIndex: 3,
totalShards: 10,
testRandomizeOrderingSeed: 123,
testSelections: const {
'bar': {TestSelection()}
}));
expect(merged.help, isTrue);
expect(merged.version, isTrue);
expect(merged.pauseAfterLoad, isTrue);
expect(merged.debug, isTrue);
expect(merged.color, isTrue);
expect(merged.configurationPath, equals('special_test.yaml'));
expect(merged.reporter, equals('json'));
expect(merged.fileReporters, equals({'json': 'out.json'}));
expect(merged.pubServeUrl!.port, equals(1234));
expect(merged.shardIndex, equals(3));
expect(merged.totalShards, equals(10));
expect(merged.testRandomizeOrderingSeed, 123);
expect(merged.testSelections.keys.single, 'bar');
});
test(
"if the two configurations conflict, uses the new configuration's "
'values', () {
var older = configuration(
help: true,
version: false,
pauseAfterLoad: true,
debug: true,
color: false,
configurationPath: 'special_test.yaml',
reporter: 'json',
fileReporters: {'json': 'old.json'},
pubServePort: 1234,
shardIndex: 2,
totalShards: 4,
testRandomizeOrderingSeed: 0,
testSelections: const {
'bar': {TestSelection()}
});
var newer = configuration(
help: false,
version: true,
pauseAfterLoad: false,
debug: false,
color: true,
configurationPath: 'test_special.yaml',
reporter: 'compact',
fileReporters: {'json': 'new.json'},
pubServePort: 5678,
shardIndex: 3,
totalShards: 10,
testRandomizeOrderingSeed: 123,
testSelections: const {
'blech': {TestSelection()}
});
var merged = older.merge(newer);
expect(merged.help, isFalse);
expect(merged.version, isTrue);
expect(merged.pauseAfterLoad, isFalse);
expect(merged.debug, isFalse);
expect(merged.color, isTrue);
expect(merged.configurationPath, equals('test_special.yaml'));
expect(merged.reporter, equals('compact'));
expect(merged.fileReporters, equals({'json': 'new.json'}));
expect(merged.pubServeUrl!.port, equals(5678));
expect(merged.shardIndex, equals(3));
expect(merged.totalShards, equals(10));
expect(merged.testRandomizeOrderingSeed, 123);
expect(merged.testSelections.keys.single, 'blech');
});
});
group('for chosenPresets', () {
test('if neither is defined, preserves the default', () {
var merged = configuration().merge(configuration());
expect(merged.chosenPresets, isEmpty);
});
test("if only the old configuration's is defined, uses it", () {
var merged = configuration(chosenPresets: ['baz', 'bang'])
.merge(configuration());
expect(merged.chosenPresets, equals(['baz', 'bang']));
});
test("if only the new configuration's is defined, uses it", () {
var merged = configuration()
.merge(configuration(chosenPresets: ['baz', 'bang']));
expect(merged.chosenPresets, equals(['baz', 'bang']));
});
test('if both are defined, unions them', () {
var merged = configuration(chosenPresets: ['baz', 'bang'])
.merge(configuration(chosenPresets: ['qux']));
expect(merged.chosenPresets, equals(['baz', 'bang', 'qux']));
});
});
group('for presets', () {
test('merges each nested configuration', () {
var merged = configuration(presets: {
'bang': configuration(pauseAfterLoad: true),
'qux': configuration(color: true)
}).merge(configuration(presets: {
'qux': configuration(color: false),
'zap': configuration(help: true)
}));
expect(merged.presets['bang']!.pauseAfterLoad, isTrue);
expect(merged.presets['qux']!.color, isFalse);
expect(merged.presets['zap']!.help, isTrue);
});
test('automatically resolves a matching chosen preset', () {
var config = configuration(
presets: {'foo': configuration(color: true)},
chosenPresets: ['foo']);
expect(config.presets, isEmpty);
expect(config.chosenPresets, equals(['foo']));
expect(config.knownPresets, equals(['foo']));
expect(config.color, isTrue);
});
test('resolves a chosen presets in order', () {
var config = configuration(presets: {
'foo': configuration(color: true),
'bar': configuration(color: false)
}, chosenPresets: [
'foo',
'bar'
]);
expect(config.presets, isEmpty);
expect(config.chosenPresets, equals(['foo', 'bar']));
expect(config.knownPresets, unorderedEquals(['foo', 'bar']));
expect(config.color, isFalse);
config = configuration(presets: {
'foo': configuration(color: true),
'bar': configuration(color: false)
}, chosenPresets: [
'bar',
'foo'
]);
expect(config.presets, isEmpty);
expect(config.chosenPresets, equals(['bar', 'foo']));
expect(config.knownPresets, unorderedEquals(['foo', 'bar']));
expect(config.color, isTrue);
});
test('ignores inapplicable chosen presets', () {
var config = configuration(presets: {}, chosenPresets: ['baz']);
expect(config.presets, isEmpty);
expect(config.chosenPresets, equals(['baz']));
expect(config.knownPresets, equals(isEmpty));
});
test('resolves presets through merging', () {
var config = configuration(presets: {'foo': configuration(color: true)})
.merge(configuration(chosenPresets: ['foo']));
expect(config.presets, isEmpty);
expect(config.chosenPresets, equals(['foo']));
expect(config.knownPresets, equals(['foo']));
expect(config.color, isTrue);
});
test('preserves known presets through merging', () {
var config = configuration(
presets: {'foo': configuration(color: true)},
chosenPresets: ['foo']).merge(configuration());
expect(config.presets, isEmpty);
expect(config.chosenPresets, equals(['foo']));
expect(config.knownPresets, equals(['foo']));
expect(config.color, isTrue);
});
});
group('for include and excludeTags', () {
test('if neither is defined, preserves the default', () {
var merged = configuration().merge(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 = configuration(
includeTags: BooleanSelector.parse('foo || bar'),
excludeTags: BooleanSelector.parse('baz || bang'))
.merge(configuration());
expect(merged.includeTags, equals(BooleanSelector.parse('foo || bar')));
expect(
merged.excludeTags, equals(BooleanSelector.parse('baz || bang')));
});
test("if only the configuration's is defined, uses it", () {
var merged = configuration().merge(configuration(
includeTags: BooleanSelector.parse('foo || bar'),
excludeTags: BooleanSelector.parse('baz || bang')));
expect(merged.includeTags, equals(BooleanSelector.parse('foo || bar')));
expect(
merged.excludeTags, equals(BooleanSelector.parse('baz || bang')));
});
test('if both are defined, unions or intersects them', () {
var older = configuration(
includeTags: BooleanSelector.parse('foo || bar'),
excludeTags: BooleanSelector.parse('baz || bang'));
var newer = configuration(
includeTags: BooleanSelector.parse('blip'),
excludeTags: BooleanSelector.parse('qux'));
var merged = older.merge(newer);
expect(merged.includeTags,
equals(BooleanSelector.parse('(foo || bar) && blip')));
expect(merged.excludeTags,
equals(BooleanSelector.parse('(baz || bang) || qux')));
});
});
group('for globalPatterns', () {
test('if neither is defined, preserves the default', () {
var merged = configuration().merge(configuration());
expect(merged.globalPatterns, isEmpty);
});
test("if only the old configuration's is defined, uses it", () {
var merged = configuration(globalPatterns: ['beep', 'boop'])
.merge(configuration());
expect(merged.globalPatterns, equals(['beep', 'boop']));
});
test("if only the new configuration's is defined, uses it", () {
var merged = configuration()
.merge(configuration(globalPatterns: ['beep', 'boop']));
expect(merged.globalPatterns, equals(['beep', 'boop']));
});
test('if both are defined, unions them', () {
var older = configuration(globalPatterns: ['beep', 'boop']);
var newer = configuration(globalPatterns: ['bonk']);
var merged = older.merge(newer);
expect(
merged.globalPatterns, unorderedEquals(['beep', 'boop', 'bonk']));
});
});
});
}