OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 library analyzer_cli.test.driver; | 5 library analyzer_cli.test.driver; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:io'; | 8 import 'dart:io'; |
9 | 9 |
10 import 'package:analyzer/error/error.dart'; | 10 import 'package:analyzer/error/error.dart'; |
11 import 'package:analyzer/source/analysis_options_provider.dart'; | 11 import 'package:analyzer/source/analysis_options_provider.dart'; |
12 import 'package:analyzer/source/error_processor.dart'; | 12 import 'package:analyzer/source/error_processor.dart'; |
13 import 'package:analyzer/src/error/codes.dart'; | 13 import 'package:analyzer/src/error/codes.dart'; |
14 import 'package:analyzer/src/generated/engine.dart'; | 14 import 'package:analyzer/src/generated/engine.dart'; |
15 import 'package:analyzer/src/generated/source.dart'; | 15 import 'package:analyzer/src/generated/source.dart'; |
16 import 'package:analyzer/src/services/lint.dart'; | 16 import 'package:analyzer/src/services/lint.dart'; |
| 17 import 'package:analyzer_cli/src/ansi.dart' as ansi; |
17 import 'package:analyzer_cli/src/driver.dart'; | 18 import 'package:analyzer_cli/src/driver.dart'; |
18 import 'package:analyzer_cli/src/options.dart'; | 19 import 'package:analyzer_cli/src/options.dart'; |
19 import 'package:cli_util/cli_util.dart' show getSdkDir; | 20 import 'package:cli_util/cli_util.dart' show getSdkDir; |
20 import 'package:path/path.dart' as path; | 21 import 'package:path/path.dart' as path; |
21 import 'package:test/test.dart'; | 22 import 'package:test/test.dart'; |
22 import 'package:yaml/src/yaml_node.dart'; | 23 import 'package:yaml/src/yaml_node.dart'; |
23 | 24 |
24 import 'utils.dart'; | 25 import 'utils.dart'; |
25 | 26 |
26 main() { | 27 main() { |
27 StringSink savedOutSink, savedErrorSink; | 28 StringSink savedOutSink, savedErrorSink; |
28 int savedExitCode; | 29 int savedExitCode; |
29 ExitHandler savedExitHandler; | 30 ExitHandler savedExitHandler; |
30 | 31 |
31 /// Base setup. | 32 /// Base setup. |
32 _setUp() { | 33 _setUp() { |
| 34 ansi.runningTests = true; |
33 savedOutSink = outSink; | 35 savedOutSink = outSink; |
34 savedErrorSink = errorSink; | 36 savedErrorSink = errorSink; |
35 savedExitHandler = exitHandler; | 37 savedExitHandler = exitHandler; |
36 savedExitCode = exitCode; | 38 savedExitCode = exitCode; |
37 exitHandler = (code) => exitCode = code; | 39 exitHandler = (code) => exitCode = code; |
38 outSink = new StringBuffer(); | 40 outSink = new StringBuffer(); |
39 errorSink = new StringBuffer(); | 41 errorSink = new StringBuffer(); |
40 } | 42 } |
41 | 43 |
42 /// Base teardown. | 44 /// Base teardown. |
43 _tearDown() { | 45 _tearDown() { |
44 outSink = savedOutSink; | 46 outSink = savedOutSink; |
45 errorSink = savedErrorSink; | 47 errorSink = savedErrorSink; |
46 exitCode = savedExitCode; | 48 exitCode = savedExitCode; |
47 exitHandler = savedExitHandler; | 49 exitHandler = savedExitHandler; |
| 50 ansi.runningTests = false; |
48 } | 51 } |
49 | 52 |
50 setUp(() => _setUp()); | 53 setUp(() => _setUp()); |
51 | 54 |
52 tearDown(() => _tearDown()); | 55 tearDown(() => _tearDown()); |
53 | 56 |
54 group('Driver', () { | 57 group('Driver', () { |
55 group('options', () { | 58 group('options', () { |
56 test('todos', () async { | 59 test('todos', () async { |
57 await drive('data/file_with_todo.dart'); | 60 await drive('data/file_with_todo.dart'); |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 /// Lints should be enabled. | 172 /// Lints should be enabled. |
170 expect(driver.context.analysisOptions.lint, isTrue); | 173 expect(driver.context.analysisOptions.lint, isTrue); |
171 | 174 |
172 /// The analysis options file only specifies 'camel_case_types'. | 175 /// The analysis options file only specifies 'camel_case_types'. |
173 var lintNames = getLints(driver.context).map((r) => r.name); | 176 var lintNames = getLints(driver.context).map((r) => r.name); |
174 expect(lintNames, orderedEquals(['camel_case_types'])); | 177 expect(lintNames, orderedEquals(['camel_case_types'])); |
175 }); | 178 }); |
176 | 179 |
177 test('generates lints', () async { | 180 test('generates lints', () async { |
178 await runLinter(); | 181 await runLinter(); |
179 expect(outSink.toString(), | 182 expect(_bulletToDash(outSink), |
180 contains('[lint] Name types using UpperCamelCase')); | 183 contains('lint - Name types using UpperCamelCase')); |
181 }); | 184 }); |
182 }); | 185 }); |
183 | 186 |
184 group('default lints - $designator', () { | 187 group('default lints - $designator', () { |
185 // Shared lint command. | 188 // Shared lint command. |
186 Future<Null> runLinter() async { | 189 Future<Null> runLinter() async { |
187 return await drive('data/linter_project/test_file.dart', | 190 return await drive('data/linter_project/test_file.dart', |
188 options: 'data/linter_project/$optionsFileName', | 191 options: 'data/linter_project/$optionsFileName', |
189 args: ['--lints']); | 192 args: ['--lints']); |
190 } | 193 } |
191 | 194 |
192 test('gets default lints', () async { | 195 test('gets default lints', () async { |
193 await runLinter(); | 196 await runLinter(); |
194 | 197 |
195 /// Lints should be enabled. | 198 /// Lints should be enabled. |
196 expect(driver.context.analysisOptions.lint, isTrue); | 199 expect(driver.context.analysisOptions.lint, isTrue); |
197 | 200 |
198 /// Default list should include camel_case_types. | 201 /// Default list should include camel_case_types. |
199 var lintNames = getLints(driver.context).map((r) => r.name); | 202 var lintNames = getLints(driver.context).map((r) => r.name); |
200 expect(lintNames, contains('camel_case_types')); | 203 expect(lintNames, contains('camel_case_types')); |
201 }); | 204 }); |
202 | 205 |
203 test('generates lints', () async { | 206 test('generates lints', () async { |
204 await runLinter(); | 207 await runLinter(); |
205 expect(outSink.toString(), | 208 expect(_bulletToDash(outSink), |
206 contains('[lint] Name types using UpperCamelCase')); | 209 contains('lint - Name types using UpperCamelCase')); |
207 }); | 210 }); |
208 }); | 211 }); |
209 | 212 |
210 group('no `--lints` flag (none in options) - $designator', () { | 213 group('no `--lints` flag (none in options) - $designator', () { |
211 // Shared lint command. | 214 // Shared lint command. |
212 Future<Null> runLinter() async { | 215 Future<Null> runLinter() async { |
213 return await drive('data/no_lints_project/test_file.dart', | 216 return await drive('data/no_lints_project/test_file.dart', |
214 options: 'data/no_lints_project/$optionsFileName'); | 217 options: 'data/no_lints_project/$optionsFileName'); |
215 } | 218 } |
216 | 219 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 ]); | 283 ]); |
281 expect(processorFor(unused_local_variable).severity, isNull); | 284 expect(processorFor(unused_local_variable).severity, isNull); |
282 | 285 |
283 // missing_return: error | 286 // missing_return: error |
284 var missing_return = new AnalysisError( | 287 var missing_return = new AnalysisError( |
285 new TestSource(), 0, 1, HintCode.MISSING_RETURN, [ | 288 new TestSource(), 0, 1, HintCode.MISSING_RETURN, [ |
286 ['x'] | 289 ['x'] |
287 ]); | 290 ]); |
288 expect(processorFor(missing_return).severity, ErrorSeverity.ERROR); | 291 expect(processorFor(missing_return).severity, ErrorSeverity.ERROR); |
289 expect( | 292 expect( |
290 outSink.toString(), | 293 _bulletToDash(outSink), |
291 contains( | 294 contains( |
292 "[error] This function declares a return type of 'int'")); | 295 "error - This function declares a return type of 'int'")); |
293 expect( | 296 expect( |
294 outSink.toString(), contains("1 error and 1 warning found.")); | 297 outSink.toString(), contains("1 error and 1 warning found.")); |
295 }); | 298 }); |
296 | 299 |
297 test('language', () async { | 300 test('language', () async { |
298 await doDrive(); | 301 await doDrive(); |
299 expect(driver.context.analysisOptions.enableSuperMixins, isTrue); | 302 expect(driver.context.analysisOptions.enableSuperMixins, isTrue); |
300 }); | 303 }); |
301 | 304 |
302 test('strongMode', () async { | 305 test('strongMode', () async { |
(...skipping 17 matching lines...) Expand all Loading... |
320 test('override fatal warning', () async { | 323 test('override fatal warning', () async { |
321 await doDrive(); | 324 await doDrive(); |
322 // missing_return: error | 325 // missing_return: error |
323 var undefined_function = new AnalysisError(new TestSource(), 0, 1, | 326 var undefined_function = new AnalysisError(new TestSource(), 0, 1, |
324 StaticTypeWarningCode.UNDEFINED_FUNCTION, [ | 327 StaticTypeWarningCode.UNDEFINED_FUNCTION, [ |
325 ['x'] | 328 ['x'] |
326 ]); | 329 ]); |
327 expect(processorFor(undefined_function).severity, | 330 expect(processorFor(undefined_function).severity, |
328 ErrorSeverity.WARNING); | 331 ErrorSeverity.WARNING); |
329 // Should not be made fatal by `--fatal-warnings`. | 332 // Should not be made fatal by `--fatal-warnings`. |
330 expect(outSink.toString(), | 333 expect(_bulletToDash(outSink), |
331 contains("[warning] The function 'baz' isn't defined")); | 334 contains("warning - The function 'baz' isn't defined")); |
332 expect( | 335 expect( |
333 outSink.toString(), contains("1 error and 1 warning found.")); | 336 outSink.toString(), contains("1 error and 1 warning found.")); |
334 }); | 337 }); |
335 }); | 338 }); |
336 } | 339 } |
337 | 340 |
338 createTests('old', AnalysisEngine.ANALYSIS_OPTIONS_FILE); | 341 createTests('old', AnalysisEngine.ANALYSIS_OPTIONS_FILE); |
339 createTests('new', AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE); | 342 createTests('new', AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE); |
340 | 343 |
341 test('include directive', () async { | 344 test('include directive', () async { |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 | 564 |
562 ErrorProcessor processorFor(AnalysisError error) => | 565 ErrorProcessor processorFor(AnalysisError error) => |
563 processors.firstWhere((p) => p.appliesTo(error)); | 566 processors.firstWhere((p) => p.appliesTo(error)); |
564 | 567 |
565 class TestSource implements Source { | 568 class TestSource implements Source { |
566 TestSource(); | 569 TestSource(); |
567 | 570 |
568 @override | 571 @override |
569 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); | 572 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
570 } | 573 } |
| 574 |
| 575 /// Normalize text with bullets. |
| 576 String _bulletToDash(item) => '$item'.replaceAll('•', '-'); |
OLD | NEW |