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