| OLD | NEW |
| (Empty) | |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 #library("test_options_parser"); |
| 6 |
| 7 /** |
| 8 * Specification of a single test option. |
| 9 * |
| 10 * The name of the specification is used as the key for the option in |
| 11 * the Map returned from the [TestOptionParser] parse method. |
| 12 */ |
| 13 class _TestOptionSpecification { |
| 14 _TestOptionSpecification(this.name, |
| 15 this.description, |
| 16 this.keys, |
| 17 this.values, |
| 18 this.defaultValue, |
| 19 [this.type = 'string']); |
| 20 String name; |
| 21 String description; |
| 22 List<String> keys; |
| 23 List<String> values; |
| 24 String defaultValue; |
| 25 String type; |
| 26 } |
| 27 |
| 28 |
| 29 /** |
| 30 * Parser of test options. |
| 31 */ |
| 32 class TestOptionsParser { |
| 33 /** |
| 34 * Creates a test options parser initialized with the known options. |
| 35 */ |
| 36 TestOptionsParser() { |
| 37 _options = |
| 38 [ new _TestOptionSpecification( |
| 39 'mode', |
| 40 'Mode in which to run the tests', |
| 41 ['-m', '--mode'], |
| 42 ['all', 'debug', 'release'], |
| 43 'debug'), |
| 44 new _TestOptionSpecification( |
| 45 'component', |
| 46 'The component to test against', |
| 47 ['-c', '--component'], |
| 48 ['most', 'vm', 'dartc', 'chromium', 'dartium'], |
| 49 'vm'), |
| 50 new _TestOptionSpecification( |
| 51 'architecture', |
| 52 'The architecture to run tests for', |
| 53 ['-a', '--arch'], |
| 54 ['all', 'ia32', 'x64', 'simarm', 'arm'], |
| 55 'ia32'), |
| 56 new _TestOptionSpecification( |
| 57 'os', |
| 58 'The operating system to run tests on', |
| 59 ['-o', '--os'], |
| 60 ['linux', 'macos', 'windows'], |
| 61 new Platform().operatingSystem()), |
| 62 new _TestOptionSpecification( |
| 63 'checked', |
| 64 'Run tests in checked mode', |
| 65 ['--checked'], |
| 66 [], |
| 67 false, |
| 68 'bool'), |
| 69 new _TestOptionSpecification( |
| 70 'tasks', |
| 71 'The number of parallel tasks to run', |
| 72 ['-j', '--tasks'], |
| 73 [], |
| 74 new Platform().numberOfProcessors(), |
| 75 'int'), |
| 76 new _TestOptionSpecification( |
| 77 'help', |
| 78 'Print list of options', |
| 79 ['-h', '--help'], |
| 80 [], |
| 81 false, |
| 82 'bool')]; |
| 83 } |
| 84 |
| 85 |
| 86 /** |
| 87 * Parse a list of strings as test options. |
| 88 * |
| 89 * Returns a Map mapping from option keys to values. When |
| 90 * encountering the first non-option string, the rest of the |
| 91 * arguments are stored in the returned Map under the 'rest' key. |
| 92 */ |
| 93 Map parse(List<String> arguments) { |
| 94 var configuration = new Map(); |
| 95 // Build configuration of default values. |
| 96 for (var option in _options) { |
| 97 configuration[option.name] = option.defaultValue; |
| 98 } |
| 99 // Overwrite with the arguments passed to the test script. |
| 100 var numArguments = arguments.length; |
| 101 for (var i = 0; i < numArguments; i++) { |
| 102 // Extract name and value for options. |
| 103 var arg = arguments[i]; |
| 104 var name = ''; |
| 105 var value = ''; |
| 106 if (arg.startsWith('--')) { |
| 107 if (arg == '--help') { |
| 108 _printHelp(); |
| 109 return null; |
| 110 } |
| 111 var split = arg.lastIndexOf('='); |
| 112 name = arg; |
| 113 value = ''; |
| 114 if (split != -1) { |
| 115 name = arg.substring(0, split); |
| 116 value = arg.substring(split + 1, arg.length); |
| 117 } |
| 118 } else if (arg.startsWith('-')) { |
| 119 if (arg == '-h') { |
| 120 _printHelp(); |
| 121 return null; |
| 122 } |
| 123 name = arg; |
| 124 if ((i + 1) >= arguments.length) { |
| 125 print('No value supplied for option $name'); |
| 126 return null; |
| 127 } |
| 128 value = arguments[++i]; |
| 129 } else { |
| 130 // The option name does not start with '-' or '--' so we |
| 131 // assume that the rest of the arguments specify tests or test |
| 132 // suites to run. |
| 133 configuration['rest'] = arguments.getRange(i, numArguments - i); |
| 134 return configuration; |
| 135 } |
| 136 // Find the option specification for the name. |
| 137 var spec = _getSpecification(name); |
| 138 if (spec == null) { |
| 139 print('Unknown test option $name'); |
| 140 return null; |
| 141 } |
| 142 // Parse the value for the option. |
| 143 if (spec.type == 'bool') { |
| 144 if (!value.isEmpty()) { |
| 145 print('No value expected for bool option $name'); |
| 146 return null; |
| 147 } |
| 148 configuration[spec.name] = true; |
| 149 } else if (spec.type == 'int') { |
| 150 try { |
| 151 configuration[spec.name] = Math.parseInt(value); |
| 152 } catch (var e) { |
| 153 print('Integer value expected for int option $name'); |
| 154 return null; |
| 155 } |
| 156 } else { |
| 157 assert(spec.type == 'string'); |
| 158 if (spec.values.lastIndexOf(value) == -1) { |
| 159 print('Unknown value ($value) for option $name'); |
| 160 return null; |
| 161 } |
| 162 configuration[spec.name] = value; |
| 163 } |
| 164 } |
| 165 |
| 166 return configuration; |
| 167 } |
| 168 |
| 169 |
| 170 /** |
| 171 * Print out usage information. |
| 172 */ |
| 173 void _printHelp() { |
| 174 print('usage: dart_bin test.dart [options]\n'); |
| 175 print('Options:\n'); |
| 176 for (var option in _options) { |
| 177 print('${option.name}: ${option.description}.'); |
| 178 for (var name in option.keys) { |
| 179 assert(name.startsWith('-')); |
| 180 var buffer = new StringBuffer();; |
| 181 buffer.add(name); |
| 182 if (option.type == 'bool') { |
| 183 assert(option.values.empty()); |
| 184 } else { |
| 185 buffer.add(name.startsWith('--') ? '=' : ' '); |
| 186 if (option.type == 'int') { |
| 187 assert(option.values.empty()); |
| 188 buffer.add('n (default: ${option.defaultValue})'); |
| 189 } else { |
| 190 buffer.add('['); |
| 191 bool first = true; |
| 192 for (var value in option.values) { |
| 193 if (!first) buffer.add(", "); |
| 194 if (value == option.defaultValue) buffer.add('*'); |
| 195 buffer.add(value); |
| 196 first = false; |
| 197 } |
| 198 buffer.add(']'); |
| 199 } |
| 200 } |
| 201 print(buffer.toString()); |
| 202 } |
| 203 print(''); |
| 204 } |
| 205 } |
| 206 |
| 207 |
| 208 /** |
| 209 * Find the test option specification for a given option key. |
| 210 */ |
| 211 _TestOptionSpecification _getSpecification(String name) { |
| 212 for (var option in _options) { |
| 213 if (option.keys.some((key) => key == name)) { |
| 214 return option; |
| 215 } |
| 216 } |
| 217 return null; |
| 218 } |
| 219 |
| 220 |
| 221 List<_TestOptionSpecification> _options; |
| 222 } |
| 223 |
| OLD | NEW |