OLD | NEW |
---|---|
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import 'dart:async'; | 5 import 'dart:async'; |
6 | 6 |
7 import 'package:front_end/compiler_options.dart'; | 7 import 'package:front_end/compiler_options.dart'; |
8 import 'package:front_end/memory_file_system.dart'; | 8 import 'package:front_end/memory_file_system.dart'; |
9 import 'package:front_end/src/base/processed_options.dart'; | 9 import 'package:front_end/src/base/processed_options.dart'; |
10 import 'package:front_end/src/fasta/fasta.dart' show ByteSink; | 10 import 'package:front_end/src/fasta/fasta.dart' show ByteSink; |
11 import 'package:front_end/src/fasta/fasta_codes.dart'; | |
11 import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter; | 12 import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter; |
12 import 'package:kernel/kernel.dart' show Program, Library, CanonicalName; | 13 import 'package:kernel/kernel.dart' show Program, Library, CanonicalName; |
14 import 'package:package_config/packages.dart' show Packages; | |
13 | 15 |
14 import 'package:test/test.dart'; | 16 import 'package:test/test.dart'; |
15 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 17 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
16 | 18 |
17 main() { | 19 main() { |
18 defineReflectiveSuite(() { | 20 defineReflectiveSuite(() { |
19 defineReflectiveTests(ProcessedOptionsTest); | 21 defineReflectiveTests(ProcessedOptionsTest); |
20 }); | 22 }); |
21 } | 23 } |
22 | 24 |
23 @reflectiveTest | 25 @reflectiveTest |
24 class ProcessedOptionsTest { | 26 class ProcessedOptionsTest { |
25 final fileSystem = new MemoryFileSystem(Uri.parse('file:///')); | 27 MemoryFileSystem fileSystem = new MemoryFileSystem(Uri.parse('file:///')); |
26 | 28 |
27 Program _mockOutline; | 29 Program _mockOutline; |
28 | 30 |
29 Program get mockSummary => _mockOutline ??= | 31 Program get mockSummary => _mockOutline ??= |
30 new Program(libraries: [new Library(Uri.parse('file:///a/b.dart'))]); | 32 new Program(libraries: [new Library(Uri.parse('file:///a/b.dart'))]); |
31 | 33 |
32 test_compileSdk_false() { | 34 test_compileSdk_false() { |
33 for (var value in [false, true]) { | 35 for (var value in [false, true]) { |
34 var raw = new CompilerOptions()..compileSdk = value; | 36 var raw = new CompilerOptions()..compileSdk = value; |
35 var processed = new ProcessedOptions(raw); | 37 var processed = new ProcessedOptions(raw); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
75 fileSystem.entityForUri(uri).writeAsBytesSync(sink.builder.takeBytes()); | 77 fileSystem.entityForUri(uri).writeAsBytesSync(sink.builder.takeBytes()); |
76 } | 78 } |
77 | 79 |
78 Future<Null> checkMockSummary(CompilerOptions raw) async { | 80 Future<Null> checkMockSummary(CompilerOptions raw) async { |
79 var processed = new ProcessedOptions(raw); | 81 var processed = new ProcessedOptions(raw); |
80 var sdkSummary = await processed.loadSdkSummary(new CanonicalName.root()); | 82 var sdkSummary = await processed.loadSdkSummary(new CanonicalName.root()); |
81 expect(sdkSummary.libraries.single.importUri, | 83 expect(sdkSummary.libraries.single.importUri, |
82 mockSummary.libraries.single.importUri); | 84 mockSummary.libraries.single.importUri); |
83 } | 85 } |
84 | 86 |
87 checkPackageExpansion( | |
88 String packageName, String packageDir, Packages packages) { | |
89 var input = Uri.parse('package:$packageName/a.dart'); | |
90 var expected = Uri.parse('file:///$packageDir/a.dart'); | |
ahe
2017/07/14 13:44:58
Is this a real file or a fake URI?
Siggi Cherem (dart-lang)
2017/07/14 19:54:07
All fake. Tracked in https://github.com/dart-lang/
| |
91 expect(packages.resolve(input), expected); | |
92 } | |
93 | |
85 test_getUriTranslator_explicitPackagesFile() async { | 94 test_getUriTranslator_explicitPackagesFile() async { |
86 // This .packages file should be ignored. | 95 // This .packages file should be ignored. |
87 fileSystem | 96 fileSystem |
88 .entityForUri(Uri.parse('file:///.packages')) | 97 .entityForUri(Uri.parse('file:///.packages')) |
89 .writeAsStringSync('foo:bar\n'); | 98 .writeAsStringSync('foo:bar\n'); |
90 // This one should be used. | 99 // This one should be used. |
91 fileSystem | 100 fileSystem |
92 .entityForUri(Uri.parse('file:///explicit.packages')) | 101 .entityForUri(Uri.parse('file:///explicit.packages')) |
93 .writeAsStringSync('foo:baz\n'); | 102 .writeAsStringSync('foo:baz\n'); |
94 var raw = new CompilerOptions() | 103 var raw = new CompilerOptions() |
95 ..fileSystem = fileSystem | 104 ..fileSystem = fileSystem |
96 ..packagesFileUri = Uri.parse('file:///explicit.packages'); | 105 ..packagesFileUri = Uri.parse('file:///explicit.packages'); |
97 var processed = new ProcessedOptions(raw); | 106 var processed = new ProcessedOptions(raw); |
98 var uriTranslator = await processed.getUriTranslator(); | 107 var uriTranslator = await processed.getUriTranslator(); |
99 expect(uriTranslator.packages, {'foo': Uri.parse('file:///baz/')}); | 108 checkPackageExpansion('foo', 'baz', uriTranslator.packages); |
100 } | 109 } |
101 | 110 |
102 test_getUriTranslator_explicitPackagesFile_withBaseLocation() async { | 111 test_getUriTranslator_explicitPackagesFile_withBaseLocation() async { |
103 // This .packages file should be ignored. | 112 // This .packages file should be ignored. |
104 fileSystem | 113 fileSystem |
105 .entityForUri(Uri.parse('file:///.packages')) | 114 .entityForUri(Uri.parse('file:///.packages')) |
106 .writeAsStringSync('foo:bar\n'); | 115 .writeAsStringSync('foo:bar\n'); |
107 // This one should be used. | 116 // This one should be used. |
108 fileSystem | 117 fileSystem |
109 .entityForUri(Uri.parse('file:///base/location/explicit.packages')) | 118 .entityForUri(Uri.parse('file:///base/location/explicit.packages')) |
110 .writeAsStringSync('foo:baz\n'); | 119 .writeAsStringSync('foo:baz\n'); |
111 var raw = new CompilerOptions() | 120 var raw = new CompilerOptions() |
112 ..fileSystem = fileSystem | 121 ..fileSystem = fileSystem |
113 ..packagesFileUri = Uri.parse('file:///base/location/explicit.packages'); | 122 ..packagesFileUri = Uri.parse('file:///base/location/explicit.packages'); |
114 var processed = new ProcessedOptions(raw); | 123 var processed = new ProcessedOptions(raw); |
115 var uriTranslator = await processed.getUriTranslator(); | 124 var uriTranslator = await processed.getUriTranslator(); |
116 expect(uriTranslator.packages, | 125 checkPackageExpansion('foo', 'base/location/baz', uriTranslator.packages); |
117 {'foo': Uri.parse('file:///base/location/baz/')}); | 126 } |
127 | |
128 test_getUriTranslator_implicitPackagesFile_ambiguous() async { | |
129 // This .packages file should be ignored. | |
130 fileSystem | |
131 .entityForUri(Uri.parse('file:///.packages')) | |
ahe
2017/07/14 13:44:58
Use custom URI.
I don't like seeing error message
Siggi Cherem (dart-lang)
2017/07/14 19:54:06
tracking here https://github.com/dart-lang/sdk/iss
| |
132 .writeAsStringSync('foo:bar\n'); | |
133 // This one should be used. | |
134 fileSystem | |
135 .entityForUri(Uri.parse('file:///explicit.packages')) | |
136 .writeAsStringSync('foo:baz\n'); | |
137 var raw = new CompilerOptions() | |
138 ..fileSystem = fileSystem | |
139 ..packagesFileUri = Uri.parse('file:///explicit.packages'); | |
140 var processed = new ProcessedOptions(raw); | |
141 var uriTranslator = await processed.getUriTranslator(); | |
142 checkPackageExpansion('foo', 'baz', uriTranslator.packages); | |
143 } | |
144 | |
145 test_getUriTranslator_implicitPackagesFile_nextToScript() async { | |
146 // Fake the existence of the base directory. | |
147 fileSystem | |
148 .entityForUri(Uri.parse('file:///base/location/')) | |
149 .writeAsStringSync(''); | |
150 // Packages directory should be ignored (.packages file takes precedence). | |
151 fileSystem | |
152 .entityForUri(Uri.parse('file:///base/location/packages/')) | |
153 .writeAsStringSync(''); | |
154 // This .packages file should be ignored. | |
155 fileSystem | |
156 .entityForUri(Uri.parse('file:///.packages')) | |
157 .writeAsStringSync('foo:bar\n'); | |
158 // This one should be used. | |
159 fileSystem | |
160 .entityForUri(Uri.parse('file:///base/location/.packages')) | |
161 .writeAsStringSync('foo:baz\n'); | |
162 var raw = new CompilerOptions()..fileSystem = fileSystem; | |
163 var processed = new ProcessedOptions( | |
164 raw, false, [Uri.parse('file:///base/location/script.dart')]); | |
165 var uriTranslator = await processed.getUriTranslator(); | |
166 checkPackageExpansion('foo', 'base/location/baz', uriTranslator.packages); | |
167 } | |
168 | |
169 test_getUriTranslator_implicitPackagesFile_searchAbove() async { | |
170 // Fake the existence of the base directory. | |
171 fileSystem | |
172 .entityForUri(Uri.parse('file:///base/location/')) | |
173 .writeAsStringSync(''); | |
174 // This .packages file should be ignored. | |
175 fileSystem | |
176 .entityForUri(Uri.parse('file:///.packages')) | |
177 .writeAsStringSync('foo:bar\n'); | |
178 // This one should be used. | |
179 fileSystem | |
180 .entityForUri(Uri.parse('file:///base/.packages')) | |
181 .writeAsStringSync('foo:baz\n'); | |
182 var raw = new CompilerOptions()..fileSystem = fileSystem; | |
183 var processed = new ProcessedOptions( | |
184 raw, false, [Uri.parse('file:///base/location/script.dart')]); | |
185 var uriTranslator = await processed.getUriTranslator(); | |
186 checkPackageExpansion('foo', 'base/baz', uriTranslator.packages); | |
187 } | |
188 | |
189 test_getUriTranslator_implicitPackagesFile_packagesDirectory() async { | |
190 // Fake the existence of the base directory. | |
191 fileSystem | |
192 .entityForUri(Uri.parse('file:///base/location/')) | |
193 .writeAsStringSync(''); | |
194 fileSystem | |
195 .entityForUri(Uri.parse('file:///base/location/packages/')) | |
196 .writeAsStringSync(''); | |
197 | |
198 // Both of these .packages file should be ignored. | |
199 fileSystem | |
200 .entityForUri(Uri.parse('file:///.packages')) | |
201 .writeAsStringSync('foo:bar\n'); | |
202 fileSystem | |
203 .entityForUri(Uri.parse('file:///base/.packages')) | |
204 .writeAsStringSync('foo:baz\n'); | |
205 var raw = new CompilerOptions()..fileSystem = fileSystem; | |
206 var processed = new ProcessedOptions( | |
207 raw, false, [Uri.parse('file:///base/location/script.dart')]); | |
208 var uriTranslator = await processed.getUriTranslator(); | |
209 checkPackageExpansion( | |
210 'foo', 'base/location/packages/foo', uriTranslator.packages); | |
211 } | |
212 | |
213 test_getUriTranslator_implicitPackagesFile_noPackages() async { | |
214 // Fake the existence of the base directory. | |
215 fileSystem | |
216 .entityForUri(Uri.parse('file:///base/location/')) | |
217 .writeAsStringSync(''); | |
218 var errors = []; | |
219 // .packages file should be ignored. | |
220 var raw = new CompilerOptions() | |
221 ..fileSystem = fileSystem | |
222 ..onError = (e) => errors.add(e); | |
223 var processed = new ProcessedOptions( | |
224 raw, false, [Uri.parse('file:///base/location/script.dart')]); | |
225 var uriTranslator = await processed.getUriTranslator(); | |
226 expect(errors, isEmpty); | |
227 expect(uriTranslator.packages.asMap(), isEmpty); | |
118 } | 228 } |
119 | 229 |
120 test_getUriTranslator_noPackages() async { | 230 test_getUriTranslator_noPackages() async { |
231 var errors = []; | |
121 // .packages file should be ignored. | 232 // .packages file should be ignored. |
122 fileSystem | 233 fileSystem |
123 .entityForUri(Uri.parse('file:///.packages')) | 234 .entityForUri(Uri.parse('file:///.packages')) |
124 .writeAsStringSync('foo:bar\n'); | 235 .writeAsStringSync('foo:bar\n'); |
125 var raw = new CompilerOptions() | 236 var raw = new CompilerOptions() |
126 ..fileSystem = fileSystem | 237 ..fileSystem = fileSystem |
127 ..packagesFileUri = new Uri(); | 238 ..packagesFileUri = new Uri() |
239 ..onError = (e) => errors.add(e); | |
128 var processed = new ProcessedOptions(raw); | 240 var processed = new ProcessedOptions(raw); |
129 var uriTranslator = await processed.getUriTranslator(); | 241 var uriTranslator = await processed.getUriTranslator(); |
130 expect(uriTranslator.packages, isEmpty); | 242 expect(uriTranslator.packages.asMap(), isEmpty); |
243 expect(errors.single.message, | |
244 startsWith(_stringPrefixOf(templateInvalidPackagesFile))); | |
245 } | |
246 | |
247 test_validateOptions_noInputs() async { | |
248 fileSystem | |
249 .entityForUri(Uri.parse('file:///foo.dart')) | |
250 .writeAsStringSync('main(){}\n'); | |
251 var errors = []; | |
252 var raw = new CompilerOptions() | |
253 ..fileSystem = fileSystem | |
254 ..onError = (e) => errors.add(e); | |
255 var options = new ProcessedOptions(raw); | |
256 var result = await options.validateOptions(); | |
257 expect(errors.single.message, messageMissingInputs.message); | |
258 expect(result, isFalse); | |
259 } | |
260 | |
261 test_validateOptions_input_doesnt_exist() async { | |
262 var errors = []; | |
263 var raw = new CompilerOptions() | |
264 ..fileSystem = fileSystem | |
265 ..onError = (e) => errors.add(e); | |
266 var options = new ProcessedOptions(raw, false, [Uri.parse('foo.dart')]); | |
267 var result = await options.validateOptions(); | |
268 expect(errors.single.message, | |
269 startsWith(_stringPrefixOf(templateMissingInputFile))); | |
270 expect(result, isFalse); | |
131 } | 271 } |
132 | 272 |
133 test_validateOptions_root_exists() async { | 273 test_validateOptions_root_exists() async { |
134 var sdkRoot = Uri.parse('file:///sdk/root/'); | 274 var sdkRoot = Uri.parse('file:///sdk/root/'); |
135 fileSystem | 275 fileSystem |
136 // Note: this test is a bit hackish because the memory file system | 276 // Note: this test is a bit hackish because the memory file system |
137 // doesn't have the notion of directories. | 277 // doesn't have the notion of directories. |
138 .entityForUri(sdkRoot) | 278 .entityForUri(sdkRoot) |
139 .writeAsStringSync('\n'); | 279 .writeAsStringSync('\n'); |
140 fileSystem | 280 fileSystem |
141 .entityForUri(sdkRoot.resolve('outline.dill')) | 281 .entityForUri(sdkRoot.resolve('outline.dill')) |
142 .writeAsStringSync('\n'); | 282 .writeAsStringSync('\n'); |
283 fileSystem | |
284 .entityForUri(Uri.parse('file:///foo.dart')) | |
285 .writeAsStringSync('main(){}\n'); | |
143 | 286 |
144 var errors = []; | 287 var errors = []; |
145 var raw = new CompilerOptions() | 288 var raw = new CompilerOptions() |
146 ..sdkRoot = sdkRoot | 289 ..sdkRoot = sdkRoot |
147 ..fileSystem = fileSystem | 290 ..fileSystem = fileSystem |
148 ..onError = (e) => errors.add(e); | 291 ..onError = (e) => errors.add(e); |
149 var options = new ProcessedOptions(raw); | 292 var options = new ProcessedOptions(raw, false, [Uri.parse('foo.dart')]); |
150 var result = await options.validateOptions(); | 293 var result = await options.validateOptions(); |
151 // Note: we check this first so test failures show the cause directly. | 294 // Note: we check this first so test failures show the cause directly. |
152 expect(errors, isEmpty); | 295 expect(errors, isEmpty); |
153 expect(result, isTrue); | 296 expect(result, isTrue); |
154 } | 297 } |
155 | 298 |
156 test_validateOptions_root_doesnt_exists() async { | 299 test_validateOptions_root_doesnt_exists() async { |
300 fileSystem | |
301 .entityForUri(Uri.parse('file:///foo.dart')) | |
302 .writeAsStringSync('main(){}\n'); | |
157 var sdkRoot = Uri.parse('file:///sdk/root'); | 303 var sdkRoot = Uri.parse('file:///sdk/root'); |
158 var errors = []; | 304 var errors = []; |
159 var raw = new CompilerOptions() | 305 var raw = new CompilerOptions() |
160 ..sdkRoot = sdkRoot | 306 ..sdkRoot = sdkRoot |
161 ..fileSystem = fileSystem | 307 ..fileSystem = fileSystem |
162 ..onError = (e) => errors.add(e); | 308 ..onError = (e) => errors.add(e); |
163 var options = new ProcessedOptions(raw); | 309 var options = new ProcessedOptions(raw, false, [Uri.parse('foo.dart')]); |
164 expect(await options.validateOptions(), isFalse); | 310 expect(await options.validateOptions(), isFalse); |
165 expect(errors.first.message, contains("SDK root directory not found")); | 311 expect(errors.first.message, |
312 startsWith(_stringPrefixOf(templateMissingSdkRoot))); | |
166 } | 313 } |
167 | 314 |
168 test_validateOptions_summary_exists() async { | 315 test_validateOptions_summary_exists() async { |
169 var sdkSummary = Uri.parse('file:///sdk/root/outline.dill'); | 316 var sdkSummary = Uri.parse('file:///sdk/root/outline.dill'); |
170 fileSystem.entityForUri(sdkSummary).writeAsStringSync('\n'); | 317 fileSystem.entityForUri(sdkSummary).writeAsStringSync('\n'); |
318 fileSystem | |
319 .entityForUri(Uri.parse('file:///foo.dart')) | |
320 .writeAsStringSync('main(){}\n'); | |
171 | 321 |
172 var errors = []; | 322 var errors = []; |
173 var raw = new CompilerOptions() | 323 var raw = new CompilerOptions() |
174 ..sdkSummary = sdkSummary | 324 ..sdkSummary = sdkSummary |
175 ..fileSystem = fileSystem | 325 ..fileSystem = fileSystem |
176 ..onError = (e) => errors.add(e); | 326 ..onError = (e) => errors.add(e); |
177 var options = new ProcessedOptions(raw); | 327 var options = new ProcessedOptions(raw, false, [Uri.parse('foo.dart')]); |
178 var result = await options.validateOptions(); | 328 var result = await options.validateOptions(); |
179 expect(errors, isEmpty); | 329 expect(errors, isEmpty); |
180 expect(result, isTrue); | 330 expect(result, isTrue); |
181 } | 331 } |
182 | 332 |
183 test_validateOptions_summary_doesnt_exists() async { | 333 test_validateOptions_summary_doesnt_exists() async { |
334 fileSystem | |
335 .entityForUri(Uri.parse('file:///foo.dart')) | |
336 .writeAsStringSync('main(){}\n'); | |
184 var sdkSummary = Uri.parse('file:///sdk/root/outline.dill'); | 337 var sdkSummary = Uri.parse('file:///sdk/root/outline.dill'); |
185 var errors = []; | 338 var errors = []; |
186 var raw = new CompilerOptions() | 339 var raw = new CompilerOptions() |
187 ..sdkSummary = sdkSummary | 340 ..sdkSummary = sdkSummary |
188 ..fileSystem = fileSystem | 341 ..fileSystem = fileSystem |
189 ..onError = (e) => errors.add(e); | 342 ..onError = (e) => errors.add(e); |
190 var options = new ProcessedOptions(raw); | 343 var options = new ProcessedOptions(raw, false, [Uri.parse('foo.dart')]); |
191 expect(await options.validateOptions(), isFalse); | 344 expect(await options.validateOptions(), isFalse); |
192 expect(errors.first.message, contains("SDK summary not found")); | 345 expect(errors.single.message, |
346 startsWith(_stringPrefixOf(templateMissingSdkSummary))); | |
193 } | 347 } |
194 | 348 |
195 test_validateOptions_inferred_summary_exists() async { | 349 test_validateOptions_inferred_summary_exists() async { |
196 var sdkRoot = Uri.parse('file:///sdk/root/'); | 350 var sdkRoot = Uri.parse('file:///sdk/root/'); |
197 var sdkSummary = Uri.parse('file:///sdk/root/outline.dill'); | 351 var sdkSummary = Uri.parse('file:///sdk/root/outline.dill'); |
198 fileSystem.entityForUri(sdkRoot).writeAsStringSync('\n'); | 352 fileSystem.entityForUri(sdkRoot).writeAsStringSync('\n'); |
199 fileSystem.entityForUri(sdkSummary).writeAsStringSync('\n'); | 353 fileSystem.entityForUri(sdkSummary).writeAsStringSync('\n'); |
354 fileSystem | |
355 .entityForUri(Uri.parse('file:///foo.dart')) | |
356 .writeAsStringSync('main(){}\n'); | |
200 | 357 |
201 var errors = []; | 358 var errors = []; |
202 var raw = new CompilerOptions() | 359 var raw = new CompilerOptions() |
203 ..sdkRoot = sdkRoot | 360 ..sdkRoot = sdkRoot |
204 ..fileSystem = fileSystem | 361 ..fileSystem = fileSystem |
205 ..onError = (e) => errors.add(e); | 362 ..onError = (e) => errors.add(e); |
206 var options = new ProcessedOptions(raw); | 363 var options = new ProcessedOptions(raw, false, [Uri.parse('foo.dart')]); |
207 var result = await options.validateOptions(); | 364 var result = await options.validateOptions(); |
208 expect(errors, isEmpty); | 365 expect(errors, isEmpty); |
209 expect(result, isTrue); | 366 expect(result, isTrue); |
210 } | 367 } |
211 | 368 |
212 test_validateOptions_inferred_summary_doesnt_exists() async { | 369 test_validateOptions_inferred_summary_doesnt_exists() async { |
213 var sdkRoot = Uri.parse('file:///sdk/root/'); | 370 var sdkRoot = Uri.parse('file:///sdk/root/'); |
214 var sdkSummary = Uri.parse('file:///sdk/root/outline.dill'); | 371 var sdkSummary = Uri.parse('file:///sdk/root/outline.dill'); |
215 fileSystem.entityForUri(sdkRoot).writeAsStringSync('\n'); | 372 fileSystem.entityForUri(sdkRoot).writeAsStringSync('\n'); |
373 fileSystem | |
374 .entityForUri(Uri.parse('file:///foo.dart')) | |
375 .writeAsStringSync('main(){}\n'); | |
216 var errors = []; | 376 var errors = []; |
217 var raw = new CompilerOptions() | 377 var raw = new CompilerOptions() |
218 ..sdkSummary = sdkSummary | 378 ..sdkSummary = sdkSummary |
219 ..fileSystem = fileSystem | 379 ..fileSystem = fileSystem |
220 ..onError = (e) => errors.add(e); | 380 ..onError = (e) => errors.add(e); |
221 var options = new ProcessedOptions(raw); | 381 var options = new ProcessedOptions(raw, false, [Uri.parse('foo.dart')]); |
222 expect(await options.validateOptions(), isFalse); | 382 expect(await options.validateOptions(), isFalse); |
223 expect(errors.first.message, contains("SDK summary not found")); | 383 expect(errors.single.message, |
384 startsWith(_stringPrefixOf(templateMissingSdkSummary))); | |
385 } | |
386 | |
387 /// Returns the longest prefix of the text in a message template that doesn't | |
388 /// mention a template argument. | |
389 _stringPrefixOf(Template template) { | |
390 var messageTemplate = template.messageTemplate; | |
391 var index = messageTemplate.indexOf('#'); | |
392 var prefix = messageTemplate.substring(0, index - 1); | |
393 | |
394 // Check that the prefix is not empty and that it contains more than one | |
395 // word. | |
396 expect(prefix.length > 0, isTrue); | |
397 expect(prefix.contains(' '), isTrue); | |
398 return prefix; | |
224 } | 399 } |
225 } | 400 } |
OLD | NEW |