| Index: pkg/analyzer_cli/test/driver_test.dart
|
| diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
|
| deleted file mode 100644
|
| index 3151c519af9b0108fb176ee01f2f30ad9efdca88..0000000000000000000000000000000000000000
|
| --- a/pkg/analyzer_cli/test/driver_test.dart
|
| +++ /dev/null
|
| @@ -1,484 +0,0 @@
|
| -// Copyright (c) 2015, 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.
|
| -
|
| -@TestOn("vm")
|
| -library analyzer_cli.test.driver;
|
| -
|
| -import 'dart:io';
|
| -
|
| -import 'package:analyzer/plugin/options.dart';
|
| -import 'package:analyzer/source/analysis_options_provider.dart';
|
| -import 'package:analyzer/src/generated/engine.dart';
|
| -import 'package:analyzer/src/generated/error.dart';
|
| -import 'package:analyzer/src/generated/source.dart';
|
| -import 'package:analyzer/src/plugin/plugin_configuration.dart';
|
| -import 'package:analyzer/src/services/lint.dart';
|
| -import 'package:analyzer_cli/src/bootloader.dart';
|
| -import 'package:analyzer_cli/src/driver.dart';
|
| -import 'package:analyzer_cli/src/options.dart';
|
| -import 'package:path/path.dart' as path;
|
| -import 'package:plugin/plugin.dart';
|
| -import 'package:test/test.dart';
|
| -import 'package:yaml/src/yaml_node.dart';
|
| -
|
| -main() {
|
| - group('Driver', () {
|
| - StringSink savedOutSink, savedErrorSink;
|
| - int savedExitCode;
|
| - setUp(() {
|
| - savedOutSink = outSink;
|
| - savedErrorSink = errorSink;
|
| - savedExitCode = exitCode;
|
| - outSink = new StringBuffer();
|
| - errorSink = new StringBuffer();
|
| - });
|
| - tearDown(() {
|
| - outSink = savedOutSink;
|
| - errorSink = savedErrorSink;
|
| - exitCode = savedExitCode;
|
| - });
|
| -
|
| - group('options', () {
|
| - test('custom processor', () {
|
| - Driver driver = new Driver();
|
| - TestProcessor processor = new TestProcessor();
|
| - driver.userDefinedPlugins = [new TestPlugin(processor)];
|
| - driver.start([
|
| - '--options',
|
| - 'test/data/test_options.yaml',
|
| - 'test/data/test_file.dart'
|
| - ]);
|
| - expect(processor.options['test_plugin'], isNotNull);
|
| - expect(processor.exception, isNull);
|
| - });
|
| - });
|
| -
|
| - group('exit codes', () {
|
| - StringSink savedOutSink, savedErrorSink;
|
| - int savedExitCode;
|
| - ExitHandler savedExitHandler;
|
| - setUp(() {
|
| - savedOutSink = outSink;
|
| - savedErrorSink = errorSink;
|
| - savedExitCode = exitCode;
|
| - savedExitHandler = exitHandler;
|
| - exitHandler = (code) => exitCode = code;
|
| - outSink = new StringBuffer();
|
| - errorSink = new StringBuffer();
|
| - });
|
| - tearDown(() {
|
| - outSink = savedOutSink;
|
| - errorSink = savedErrorSink;
|
| - exitCode = savedExitCode;
|
| - exitHandler = savedExitHandler;
|
| - });
|
| -
|
| - test('fatal hints', () {
|
| - drive('test/data/file_with_hint.dart', args: ['--fatal-hints']);
|
| - expect(exitCode, 3);
|
| - });
|
| -
|
| - test('not fatal hints', () {
|
| - drive('test/data/file_with_hint.dart');
|
| - expect(exitCode, 0);
|
| - });
|
| -
|
| - test('fatal errors', () {
|
| - drive('test/data/file_with_error.dart');
|
| - expect(exitCode, 3);
|
| - });
|
| -
|
| - test('not fatal warnings', () {
|
| - drive('test/data/file_with_warning.dart');
|
| - expect(exitCode, 0);
|
| - });
|
| -
|
| - test('fatal warnings', () {
|
| - drive('test/data/file_with_warning.dart', args: ['--fatal-warnings']);
|
| - expect(exitCode, 3);
|
| - });
|
| -
|
| - test('missing options file', () {
|
| - drive('test/data/test_file.dart', options: 'test/data/NO_OPTIONS_HERE');
|
| - expect(exitCode, 3);
|
| - });
|
| -
|
| - test('missing dart file', () {
|
| - drive('test/data/NO_DART_FILE_HERE.dart');
|
| - expect(exitCode, 3);
|
| - });
|
| -
|
| - test('part file', () {
|
| - drive('test/data/library_and_parts/part2.dart');
|
| - expect(exitCode, 3);
|
| - });
|
| -
|
| - test('non-dangling part file', () {
|
| - Driver driver = new Driver();
|
| - driver.start([
|
| - 'test/data/library_and_parts/lib.dart',
|
| - 'test/data/library_and_parts/part1.dart',
|
| - ]);
|
| - expect(exitCode, 0);
|
| - });
|
| -
|
| - test('extra part file', () {
|
| - Driver driver = new Driver();
|
| - driver.start([
|
| - 'test/data/library_and_parts/lib.dart',
|
| - 'test/data/library_and_parts/part1.dart',
|
| - 'test/data/library_and_parts/part2.dart',
|
| - ]);
|
| - expect(exitCode, 3);
|
| - });
|
| - });
|
| -
|
| - group('linter', () {
|
| - group('lints in options', () {
|
| - StringSink savedOutSink;
|
| - Driver driver;
|
| -
|
| - setUp(() {
|
| - savedOutSink = outSink;
|
| - outSink = new StringBuffer();
|
| -
|
| - driver = new Driver();
|
| - driver.start([
|
| - '--options',
|
| - 'test/data/linter_project/.analysis_options',
|
| - '--lints',
|
| - 'test/data/linter_project/test_file.dart'
|
| - ]);
|
| - });
|
| - tearDown(() {
|
| - outSink = savedOutSink;
|
| - });
|
| -
|
| - test('gets analysis options', () {
|
| - /// Lints should be enabled.
|
| - expect(driver.context.analysisOptions.lint, isTrue);
|
| -
|
| - /// The .analysis_options file only specifies 'camel_case_types'.
|
| - var lintNames = getLints(driver.context).map((r) => r.name);
|
| - expect(lintNames, orderedEquals(['camel_case_types']));
|
| - });
|
| -
|
| - test('generates lints', () {
|
| - expect(outSink.toString(),
|
| - contains('[lint] Name types using UpperCamelCase.'));
|
| - });
|
| - });
|
| -
|
| - group('default lints', () {
|
| - StringSink savedOutSink;
|
| - Driver driver;
|
| -
|
| - setUp(() {
|
| - savedOutSink = outSink;
|
| - outSink = new StringBuffer();
|
| -
|
| - driver = new Driver();
|
| - driver.start([
|
| - '--lints',
|
| - 'test/data/linter_project/test_file.dart',
|
| - '--options',
|
| - 'test/data/linter_project/.analysis_options'
|
| - ]);
|
| - });
|
| - tearDown(() {
|
| - outSink = savedOutSink;
|
| - });
|
| -
|
| - test('gets default lints', () {
|
| - /// Lints should be enabled.
|
| - expect(driver.context.analysisOptions.lint, isTrue);
|
| -
|
| - /// Default list should include camel_case_types.
|
| - var lintNames = getLints(driver.context).map((r) => r.name);
|
| - expect(lintNames, contains('camel_case_types'));
|
| - });
|
| -
|
| - test('generates lints', () {
|
| - expect(outSink.toString(),
|
| - contains('[lint] Name types using UpperCamelCase.'));
|
| - });
|
| - });
|
| -
|
| - group('no `--lints` flag (none in options)', () {
|
| - StringSink savedOutSink;
|
| - Driver driver;
|
| -
|
| - setUp(() {
|
| - savedOutSink = outSink;
|
| - outSink = new StringBuffer();
|
| -
|
| - driver = new Driver();
|
| - driver.start([
|
| - 'test/data/no_lints_project/test_file.dart',
|
| - '--options',
|
| - 'test/data/no_lints_project/.analysis_options'
|
| - ]);
|
| - });
|
| - tearDown(() {
|
| - outSink = savedOutSink;
|
| - });
|
| -
|
| - test('lints disabled', () {
|
| - expect(driver.context.analysisOptions.lint, isFalse);
|
| - });
|
| -
|
| - test('no registered lints', () {
|
| - expect(getLints(driver.context), isEmpty);
|
| - });
|
| -
|
| - test('no generated warnings', () {
|
| - expect(outSink.toString(), contains('No issues found'));
|
| - });
|
| - });
|
| - });
|
| -
|
| - test('containsLintRuleEntry', () {
|
| - Map<String, YamlNode> options;
|
| - options = parseOptions('''
|
| -linter:
|
| - rules:
|
| - - foo
|
| - ''');
|
| - expect(containsLintRuleEntry(options), true);
|
| - options = parseOptions('''
|
| - ''');
|
| - expect(containsLintRuleEntry(options), false);
|
| - options = parseOptions('''
|
| -linter:
|
| - rules:
|
| - # - foo
|
| - ''');
|
| - expect(containsLintRuleEntry(options), true);
|
| - options = parseOptions('''
|
| -linter:
|
| - # rules:
|
| - # - foo
|
| - ''');
|
| - expect(containsLintRuleEntry(options), false);
|
| - });
|
| -
|
| - group('options processing', () {
|
| - group('error filters', () {
|
| - StringSink savedOutSink;
|
| - Driver driver;
|
| -
|
| - setUp(() {
|
| - savedOutSink = outSink;
|
| - outSink = new StringBuffer();
|
| -
|
| - driver = new Driver();
|
| - driver.start([
|
| - 'test/data/options_tests_project/test_file.dart',
|
| - '--options',
|
| - 'test/data/options_tests_project/.analysis_options'
|
| - ]);
|
| - });
|
| - tearDown(() {
|
| - outSink = savedOutSink;
|
| - });
|
| -
|
| - test('filters', () {
|
| - var filters =
|
| - driver.context.getConfigurationData(CONFIGURED_ERROR_FILTERS);
|
| - expect(filters, hasLength(1));
|
| -
|
| - var unused_error = new AnalysisError(
|
| - new TestSource(), 0, 1, HintCode.UNUSED_LOCAL_VARIABLE, [
|
| - ['x']
|
| - ]);
|
| - expect(filters.any((filter) => filter(unused_error)), isTrue);
|
| - });
|
| -
|
| - test('language config', () {
|
| - expect(driver.context.analysisOptions.enableSuperMixins, isTrue);
|
| - });
|
| - });
|
| - });
|
| -
|
| - group('in temp directory', () {
|
| - StringSink savedOutSink, savedErrorSink;
|
| - int savedExitCode;
|
| - Directory savedCurrentDirectory;
|
| - Directory tempDir;
|
| - setUp(() {
|
| - savedOutSink = outSink;
|
| - savedErrorSink = errorSink;
|
| - savedExitCode = exitCode;
|
| - outSink = new StringBuffer();
|
| - errorSink = new StringBuffer();
|
| - savedCurrentDirectory = Directory.current;
|
| - tempDir = Directory.systemTemp.createTempSync('analyzer_');
|
| - });
|
| - tearDown(() {
|
| - outSink = savedOutSink;
|
| - errorSink = savedErrorSink;
|
| - exitCode = savedExitCode;
|
| - Directory.current = savedCurrentDirectory;
|
| - tempDir.deleteSync(recursive: true);
|
| - });
|
| -
|
| - test('packages folder', () {
|
| - Directory.current = tempDir;
|
| - new File(path.join(tempDir.path, 'test.dart')).writeAsStringSync('''
|
| -import 'package:foo/bar.dart';
|
| -main() {
|
| - baz();
|
| -}
|
| - ''');
|
| - Directory packagesDir =
|
| - new Directory(path.join(tempDir.path, 'packages'));
|
| - packagesDir.createSync();
|
| - Directory fooDir = new Directory(path.join(packagesDir.path, 'foo'));
|
| - fooDir.createSync();
|
| - new File(path.join(fooDir.path, 'bar.dart')).writeAsStringSync('''
|
| -void baz() {}
|
| - ''');
|
| - new Driver().start(['test.dart']);
|
| - expect(exitCode, 0);
|
| - });
|
| -
|
| - test('no package resolution', () {
|
| - Directory.current = tempDir;
|
| - new File(path.join(tempDir.path, 'test.dart')).writeAsStringSync('''
|
| -import 'package:path/path.dart';
|
| -main() {}
|
| - ''');
|
| - new Driver().start(['test.dart']);
|
| - expect(exitCode, 3);
|
| - String stdout = outSink.toString();
|
| - expect(stdout, contains('[error] Target of URI does not exist'));
|
| - expect(stdout, contains('1 error found.'));
|
| - expect(errorSink.toString(), '');
|
| - });
|
| -
|
| - test('bad package root', () {
|
| - new Driver().start(['--package-root', 'does/not/exist', 'test.dart']);
|
| - String stdout = outSink.toString();
|
| - expect(exitCode, 3);
|
| - expect(
|
| - stdout,
|
| - contains(
|
| - 'Package root directory (does/not/exist) does not exist.'));
|
| - });
|
| - });
|
| - });
|
| - group('Bootloader', () {
|
| - group('plugin processing', () {
|
| - StringSink savedErrorSink;
|
| - setUp(() {
|
| - savedErrorSink = errorSink;
|
| - errorSink = new StringBuffer();
|
| - });
|
| - tearDown(() {
|
| - errorSink = savedErrorSink;
|
| - });
|
| - test('bad format', () {
|
| - BootLoader loader = new BootLoader();
|
| - loader.createImage([
|
| - '--options',
|
| - 'test/data/bad_plugin_options.yaml',
|
| - 'test/data/test_file.dart'
|
| - ]);
|
| - expect(
|
| - errorSink.toString(),
|
| - equals('Plugin configuration skipped: Unrecognized plugin config '
|
| - 'format, expected `YamlMap`, got `YamlList` '
|
| - '(line 2, column 4)\n'));
|
| - });
|
| - test('plugin config', () {
|
| - BootLoader loader = new BootLoader();
|
| - Image image = loader.createImage([
|
| - '--options',
|
| - 'test/data/plugin_options.yaml',
|
| - 'test/data/test_file.dart'
|
| - ]);
|
| - var plugins = image.config.plugins;
|
| - expect(plugins, hasLength(1));
|
| - expect(plugins.first.name, equals('my_plugin1'));
|
| - });
|
| - group('plugin validation', () {
|
| - test('requires class name', () {
|
| - expect(
|
| - validate(new PluginInfo(
|
| - name: 'test_plugin', libraryUri: 'my_package/foo.dart')),
|
| - isNotNull);
|
| - });
|
| - test('requires library URI', () {
|
| - expect(
|
| - validate(
|
| - new PluginInfo(name: 'test_plugin', className: 'MyPlugin')),
|
| - isNotNull);
|
| - });
|
| - test('check', () {
|
| - expect(
|
| - validate(new PluginInfo(
|
| - name: 'test_plugin',
|
| - className: 'MyPlugin',
|
| - libraryUri: 'my_package/foo.dart')),
|
| - isNull);
|
| - });
|
| - });
|
| - });
|
| - });
|
| -}
|
| -
|
| -const emptyOptionsFile = 'test/data/empty_options.yaml';
|
| -
|
| -/// Start a driver for the given [source], optionally providing additional
|
| -/// [args] and an [options] file path. The value of [options] defaults to
|
| -/// an empty options file to avoid unwanted configuration from an otherwise
|
| -/// discovered options file.
|
| -void drive(String source,
|
| - {String options: emptyOptionsFile,
|
| - List<String> args: const <String>[]}) =>
|
| - new Driver().start(['--options', options, source]..addAll(args));
|
| -
|
| -Map<String, YamlNode> parseOptions(String src) =>
|
| - new AnalysisOptionsProvider().getOptionsFromString(src);
|
| -
|
| -class TestPlugin extends Plugin {
|
| - TestProcessor processor;
|
| - TestPlugin(this.processor);
|
| -
|
| - @override
|
| - String get uniqueIdentifier => 'test_plugin.core';
|
| -
|
| - @override
|
| - void registerExtensionPoints(RegisterExtensionPoint register) {
|
| - // None
|
| - }
|
| -
|
| - @override
|
| - void registerExtensions(RegisterExtension register) {
|
| - register(OPTIONS_PROCESSOR_EXTENSION_POINT_ID, processor);
|
| - }
|
| -}
|
| -
|
| -class TestProcessor extends OptionsProcessor {
|
| - Map<String, YamlNode> options;
|
| - Exception exception;
|
| -
|
| - @override
|
| - void onError(Exception exception) {
|
| - this.exception = exception;
|
| - }
|
| -
|
| - @override
|
| - void optionsProcessed(
|
| - AnalysisContext context, Map<String, YamlNode> options) {
|
| - this.options = options;
|
| - }
|
| -}
|
| -
|
| -class TestSource implements Source {
|
| - TestSource();
|
| -
|
| - @override
|
| - noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
|
| -}
|
|
|