| Index: tools/testing/dart/environment.dart
|
| diff --git a/tools/testing/dart/environment.dart b/tools/testing/dart/environment.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d9458552770680b0add320b70a19707a1770d37e
|
| --- /dev/null
|
| +++ b/tools/testing/dart/environment.dart
|
| @@ -0,0 +1,105 @@
|
| +// Copyright (c) 2017, 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 'configuration.dart';
|
| +
|
| +typedef String _LookUpFunction(Configuration configuration);
|
| +typedef bool _BoolLookUpFunction(Configuration configuration);
|
| +
|
| +// TODO(29756): Instead of synthesized negated variables like "unchecked",
|
| +// consider adding support for "!" to status expressions.
|
| +final _variables = {
|
| + "analyzer": new _Variable.bool((c) => c.compiler == Compiler.dart2analyzer),
|
| + "arch": new _Variable((c) => c.architecture.name, Architecture.names),
|
| + "browser": new _Variable.bool((c) => c.runtime.isBrowser),
|
| + "builder_tag": new _Variable((c) => c.builderTag ?? "", const []),
|
| + "checked": new _Variable.bool((c) => c.isChecked),
|
| + "compiler": new _Variable((c) => c.compiler.name, Compiler.names),
|
| + "csp": new _Variable.bool((c) => c.isCsp),
|
| + "dart2js_with_kernel": new _Variable.bool((c) => c.useDart2JSWithKernel),
|
| + "fast_startup": new _Variable.bool((c) => c.useFastStartup),
|
| + "host_checked": new _Variable.bool((c) => c.isHostChecked),
|
| + "host_unchecked": new _Variable.bool((c) => !c.isHostChecked),
|
| + "hot_reload": new _Variable.bool((c) => c.hotReload),
|
| + "hot_reload_rollback": new _Variable.bool((c) => c.hotReloadRollback),
|
| + "ie": new _Variable.bool((c) => c.runtime.isIE),
|
| + "jscl": new _Variable.bool((c) => c.runtime.isJSCommandLine),
|
| + "minified": new _Variable.bool((c) => c.isMinified),
|
| + "mode": new _Variable((c) => c.mode.name, Mode.names),
|
| + "runtime": new _Variable((c) => c.runtime.name, Runtime.names),
|
| + "strong": new _Variable.bool((c) => c.isStrong),
|
| + "system": new _Variable((c) => c.system.name, System.names),
|
| + "unchecked": new _Variable.bool((c) => !c.isChecked),
|
| + "unminified": new _Variable.bool((c) => !c.isMinified),
|
| + "use_sdk": new _Variable.bool((c) => c.useSdk)
|
| +};
|
| +
|
| +/// Defines the variables that are available for use inside a status file
|
| +/// section header.
|
| +///
|
| +/// These mostly map to command line arguments with the same name, though this
|
| +/// is only a subset of the full set of command line arguments.
|
| +class Environment {
|
| + /// Validates that the variable with [name] exists and can be compared
|
| + /// against [value].
|
| + ///
|
| + /// If any errors are found, adds them to [errors].
|
| + static void validate(String name, String value, List<String> errors) {
|
| + var variable = _variables[name];
|
| + if (variable == null) {
|
| + errors.add('Unknown variable "$name".');
|
| + return;
|
| + }
|
| +
|
| + // The "builder_tag" variable doesn't have an enumerated set of values.
|
| + if (variable.allowedValues.isEmpty) return;
|
| +
|
| + if (!variable.allowedValues.contains(value)) {
|
| + errors.add(
|
| + 'Variable "$name" cannot have value "$value". Allowed values are:\n' +
|
| + variable.allowedValues.join(', ') +
|
| + '.');
|
| + }
|
| + }
|
| +
|
| + /// The configuration where variable data is found.
|
| + final Configuration _configuration;
|
| +
|
| + Environment(this._configuration);
|
| +
|
| + /// Looks up the value of the variable with [name].
|
| + String lookUp(String name) {
|
| + var variable = _variables[name];
|
| + if (variable == null) {
|
| + // This shouldn't happen since we validate variables before evaluating
|
| + // expressions.
|
| + throw new ArgumentError('Unknown variable "$variable".');
|
| + }
|
| +
|
| + return variable.lookUp(_configuration);
|
| + }
|
| +}
|
| +
|
| +// TODO(rnystrom): There's some overlap between these and _Option in
|
| +// options.dart. Unify?
|
| +/// Describes a variable name whose value can be tested in a status file.
|
| +///
|
| +/// Each variable is an enumerated string type that only accepts a limited range
|
| +/// of values. Each instance of this class defines one variable, the values it
|
| +/// permits, and the logic needed to look up the variable's value from a
|
| +/// [Configuration]
|
| +class _Variable {
|
| + final _LookUpFunction _lookUp;
|
| + final List<String> allowedValues;
|
| +
|
| + _Variable(this._lookUp, Iterable<String> allowed)
|
| + : allowedValues = allowed.toList();
|
| +
|
| + /// Creates a Boolean variable with allowed values "true" and "false".
|
| + _Variable.bool(_BoolLookUpFunction lookUp)
|
| + : _lookUp = ((configuration) => lookUp(configuration).toString()),
|
| + allowedValues = const ["true", "false"];
|
| +
|
| + String lookUp(Configuration configuration) => _lookUp(configuration);
|
| +}
|
|
|