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