blob: 7a5b4244228add937eb334857d8650a955cb40a8 [file] [log] [blame]
// Copyright (c) 2018, 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:expect/minitest.dart';
import 'package:smith/smith.dart';
import 'test_helpers.dart';
void main() {
group("Configuration", () {
test("equality", () {
// Same.
expect(
Configuration("name", Architecture.x64, Compiler.dart2js, Mode.debug,
Runtime.vm, System.linux),
equals(Configuration("name", Architecture.x64, Compiler.dart2js,
Mode.debug, Runtime.vm, System.linux)));
// Mode debug != release.
expect(
Configuration("name", Architecture.x64, Compiler.dart2js, Mode.debug,
Runtime.vm, System.linux),
notEquals(Configuration("name", Architecture.x64, Compiler.dart2js,
Mode.release, Runtime.vm, System.linux)));
// Differ by non-required option.
expect(
Configuration("name", Architecture.x64, Compiler.dart2js, Mode.debug,
Runtime.vm, System.linux, enableAsserts: true),
notEquals(Configuration("name", Architecture.x64, Compiler.dart2js,
Mode.debug, Runtime.vm, System.linux,
enableAsserts: false)));
});
group(".expandTemplate()", () {
test("empty string", () {
expectExpandError("", {}, 'Template must not be empty.');
});
test("missing ')'", () {
expectExpandError(
"before-(oops", {}, 'Missing ")" in name template "before-(oops".');
});
test("no parentheses", () {
expect(
Configuration.expandTemplate("x64-dart2js-debug-vm-linux", {}),
equals([
Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
Compiler.dart2js, Mode.debug, Runtime.vm, System.linux)
]));
});
test("parentheses at beginning", () {
expect(
Configuration.expandTemplate(
"(ia32|x64)-dart2js-debug-vm-linux", {}),
equals([
Configuration("ia32-dart2js-debug-vm-linux", Architecture.ia32,
Compiler.dart2js, Mode.debug, Runtime.vm, System.linux),
Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
Compiler.dart2js, Mode.debug, Runtime.vm, System.linux)
]));
});
test("parentheses at end", () {
expect(
Configuration.expandTemplate(
"x64-dart2js-debug-vm-(linux|mac|win)", {}),
equals([
Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
Compiler.dart2js, Mode.debug, Runtime.vm, System.linux),
Configuration("x64-dart2js-debug-vm-mac", Architecture.x64,
Compiler.dart2js, Mode.debug, Runtime.vm, System.mac),
Configuration("x64-dart2js-debug-vm-win", Architecture.x64,
Compiler.dart2js, Mode.debug, Runtime.vm, System.win)
]));
});
test("expands all parenthesized sections", () {
expect(
Configuration.expandTemplate(
"(ia32|x64)-dart2js-(debug|release)-vm-(linux|mac|win)", {}),
equals([
Configuration("ia32-dart2js-debug-vm-linux", Architecture.ia32,
Compiler.dart2js, Mode.debug, Runtime.vm, System.linux),
Configuration("ia32-dart2js-debug-vm-mac", Architecture.ia32,
Compiler.dart2js, Mode.debug, Runtime.vm, System.mac),
Configuration("ia32-dart2js-debug-vm-win", Architecture.ia32,
Compiler.dart2js, Mode.debug, Runtime.vm, System.win),
Configuration("ia32-dart2js-release-vm-linux", Architecture.ia32,
Compiler.dart2js, Mode.release, Runtime.vm, System.linux),
Configuration("ia32-dart2js-release-vm-mac", Architecture.ia32,
Compiler.dart2js, Mode.release, Runtime.vm, System.mac),
Configuration("ia32-dart2js-release-vm-win", Architecture.ia32,
Compiler.dart2js, Mode.release, Runtime.vm, System.win),
Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
Compiler.dart2js, Mode.debug, Runtime.vm, System.linux),
Configuration("x64-dart2js-debug-vm-mac", Architecture.x64,
Compiler.dart2js, Mode.debug, Runtime.vm, System.mac),
Configuration("x64-dart2js-debug-vm-win", Architecture.x64,
Compiler.dart2js, Mode.debug, Runtime.vm, System.win),
Configuration("x64-dart2js-release-vm-linux", Architecture.x64,
Compiler.dart2js, Mode.release, Runtime.vm, System.linux),
Configuration("x64-dart2js-release-vm-mac", Architecture.x64,
Compiler.dart2js, Mode.release, Runtime.vm, System.mac),
Configuration("x64-dart2js-release-vm-win", Architecture.x64,
Compiler.dart2js, Mode.release, Runtime.vm, System.win)
]));
});
test("empty '()' is treated as empty string", () {
expect(
Configuration.expandTemplate("x64-()dart2js-debug-vm-linux", {}),
equals([
Configuration("x64-dart2js-debug-vm-linux", Architecture.x64,
Compiler.dart2js, Mode.debug, Runtime.vm, System.linux)
]));
});
});
group(".parse()", () {
test("infer required fields from name", () {
expect(
Configuration.parse("ia32-dart2js-debug-vm-linux", {}),
equals(Configuration(
"ia32-dart2js-debug-vm-linux",
Architecture.ia32,
Compiler.dart2js,
Mode.debug,
Runtime.vm,
System.linux)));
});
test("read required fields from options", () {
expect(
Configuration.parse("something", {
"architecture": "x64",
"compiler": "dart2js",
"mode": "debug",
"runtime": "vm",
"system": "linux"
}),
equals(Configuration("something", Architecture.x64,
Compiler.dart2js, Mode.debug, Runtime.vm, System.linux)));
});
test("required fields from both name and options", () {
expect(
Configuration.parse("dart2js-vm",
{"architecture": "x64", "mode": "debug", "system": "linux"}),
equals(Configuration("dart2js-vm", Architecture.x64,
Compiler.dart2js, Mode.debug, Runtime.vm, System.linux)));
});
test("'none' is not treated as compiler or runtime name", () {
expect(
Configuration.parse("none-x64-dart2js-debug-vm-linux", {}),
equals(Configuration(
"none-x64-dart2js-debug-vm-linux",
Architecture.x64,
Compiler.dart2js,
Mode.debug,
Runtime.vm,
System.linux)));
});
test("architecture defaults to 'x64'", () {
expect(Configuration.parse("dart2js-debug-vm-linux", {}).architecture,
equals(Architecture.x64));
});
test("compiler defaults to runtime's default compiler", () {
expect(Configuration.parse("vm", {}).compiler, equals(Compiler.none));
});
test("mode defaults to compiler's default mode", () {
expect(Configuration.parse("dartkp-vm-linux", {}).mode,
equals(Mode.debug));
expect(Configuration.parse("dart2js-vm-linux", {}).mode,
equals(Mode.release));
});
test("runtime defaults to compiler's default runtime", () {
expect(Configuration.parse("dartdevc", {}).runtime,
equals(Runtime.chrome));
});
test("runtime defaults to compiler's default runtime from option", () {
expect(Configuration.parse("wat", {"compiler": "dartdevc"}).runtime,
equals(Runtime.chrome));
});
test("system defaults to the host os", () {
expect(
Configuration.parse("dart2js-vm", {}).system, equals(System.host));
});
test("other options from map", () {
expect(
Configuration.parse("dart2js", {
"nnbd": "weak",
"builder-tag": "the tag",
"vm-options": ["vm stuff", "more vm stuff"],
"dart2js-options": ["dart2js stuff", "more dart2js stuff"],
"enable-experiment": ["semicolons", "interrobangs"],
"enable-asserts": true,
"checked": true,
"csp": true,
"host-checked": true,
"minified": true,
"hot-reload": true,
"hot-reload-rollback": true,
"use-sdk": true
}),
equals(Configuration("dart2js", Architecture.x64, Compiler.dart2js,
Mode.release, Runtime.d8, System.host,
nnbdMode: NnbdMode.weak,
builderTag: "the tag",
vmOptions: ["vm stuff", "more vm stuff"],
dart2jsOptions: ["dart2js stuff", "more dart2js stuff"],
experiments: ["semicolons", "interrobangs"],
enableAsserts: true,
isChecked: true,
isCsp: true,
isHostChecked: true,
isMinified: true,
useHotReload: true,
useHotReloadRollback: true,
useSdk: true)));
});
test("neither compiler nor runtime specified", () {
expectParseError(
"debug",
{},
'Must specify at least one of compiler or runtime in options or '
'configuration name.');
});
test("empty string", () {
expectParseError("", {}, 'Name must not be empty.');
});
test("redundant field", () {
expectParseError("dart2js-debug", {"mode": "debug"},
'Redundant mode in configuration name "debug" and options.');
});
test("duplicate field", () {
expectParseError(
"dart2js-debug",
{"mode": "release"},
'Found mode "release" in options and "debug" in configuration '
'name.');
});
test("multiple values for same option in name", () {
expectParseError(
"dart2js-debug-release",
{},
'Found multiple values for mode ("debug" and "release"), in '
'configuration name.');
});
test("null bool option", () {
expectParseError("dart2js", {"enable-asserts": null},
'Option "enable-asserts" was null.');
});
test("wrong type for bool option", () {
expectParseError("dart2js", {"enable-asserts": "false"},
'Option "enable-asserts" had value "false", which is not a bool.');
});
test("null string option", () {
expectParseError(
"dart2js", {"builder-tag": null}, 'Option "builder-tag" was null.');
});
test("wrong type for string option", () {
expectParseError("dart2js", {"builder-tag": true},
'Option "builder-tag" had value "true", which is not a string.');
});
test("unknown option", () {
expectParseError("dart2js", {"wat": "???"}, 'Unknown option "wat".');
});
});
group("constructor", () {});
group("optionsEqual()", () {
var debugWithAsserts = Configuration(
"name",
Architecture.x64,
Compiler.dart2js,
Mode.debug,
Runtime.vm,
System.linux,
enableAsserts: true,
);
var debugWithAsserts2 = Configuration(
"different-name",
Architecture.x64,
Compiler.dart2js,
Mode.debug,
Runtime.vm,
System.linux,
enableAsserts: true,
);
var debugNoAsserts = Configuration(
"name",
Architecture.x64,
Compiler.dart2js,
Mode.debug,
Runtime.vm,
System.linux,
);
var releaseNoAsserts = Configuration(
"name",
Architecture.x64,
Compiler.dart2js,
Mode.release,
Runtime.vm,
System.linux,
);
test("different options are not equal", () {
expect(debugWithAsserts.optionsEqual(debugNoAsserts), isFalse);
expect(debugNoAsserts.optionsEqual(releaseNoAsserts), isFalse);
expect(releaseNoAsserts.optionsEqual(debugWithAsserts), isFalse);
});
test("same options are equal", () {
expect(debugWithAsserts.optionsEqual(debugWithAsserts2), isTrue);
});
test("list elements are considered unordered", () {
var aThenB = Configuration("name", Architecture.x64, Compiler.dart2js,
Mode.release, Runtime.vm, System.linux,
vmOptions: ["a", "b"]);
var bThenA = Configuration("name", Architecture.x64, Compiler.dart2js,
Mode.release, Runtime.vm, System.linux,
vmOptions: ["b", "a"]);
expect(aThenB.optionsEqual(bThenA), isTrue);
});
});
group("visualCompare()", () {
var a = Configuration("dartdevc", Architecture.ia32, Compiler.dartdevc,
Mode.debug, Runtime.chrome, System.android,
builderTag: "a tag",
vmOptions: ["vm a1", "vm a2"],
dart2jsOptions: ["dart2js a1", "dart2js a2"],
experiments: ["experiment a1", "experiment a2"],
timeout: 1);
var b = Configuration(
"dart2js",
Architecture.x64,
Compiler.dart2js,
Mode.release,
Runtime.d8,
System.fuchsia,
nnbdMode: NnbdMode.strong,
builderTag: "b tag",
vmOptions: ["vm b1", "vm b2"],
dart2jsOptions: ["dart2js b1", "dart2js b2"],
experiments: ["experiment b1", "experiment b2"],
timeout: 2,
enableAsserts: true,
isChecked: true,
isCsp: true,
isHostChecked: true,
isMinified: true,
useAnalyzerCfe: true,
useAnalyzerFastaParser: true,
useElf: true,
useHotReload: true,
useHotReloadRollback: true,
useSdk: true,
);
test("everything different", () {
expect(a.visualCompare(b), equals("""
dartdevc
dart2js
architecture: ia32 x64
compiler: dartdevc dart2js
mode: debug release
runtime: chrome d8
system: android fuchsia
nnbd: legacy strong
sanitizer: none none
builder-tag: a tag b tag
vm-options: [vm a1, vm a2] [vm b1, vm b2]
dart2js-options: [dart2js a1, dart2js a2] [dart2js b1, dart2js b2]
experiments: [experiment a1, experiment a2] [experiment b1, experiment b2]
timeout: 1 2
enable-asserts: false true
checked: false true
csp: false true
host-checked: false true
minified: false true
use-cfe: false true
analyzer-use-fasta-parser: false true
host-checked: false true
hot-reload: false true
hot-reload-rollback: false true
use-sdk: false true
"""));
});
test("everything the same", () {
expect(a.visualCompare(a), equals("""
dartdevc
dartdevc
architecture: ia32 ia32
compiler: dartdevc dartdevc
mode: debug debug
runtime: chrome chrome
system: android android
nnbd: legacy legacy
sanitizer: none none
builder-tag: a tag a tag
vm-options: [vm a1, vm a2] [vm a1, vm a2]
dart2js-options: [dart2js a1, dart2js a2] [dart2js a1, dart2js a2]
experiments: [experiment a1, experiment a2] [experiment a1, experiment a2]
timeout: 1 1
"""));
});
});
});
}