blob: 699c9a7ae766516bef73cfa0c2f9473fa399f238 [file] [log] [blame]
// Copyright (c) 2024, 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 'package:analyzer/error/error.dart';
import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../generated/test_support.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(AnalysisOptionsTest);
});
}
@reflectiveTest
class AnalysisOptionsTest {
final AnalysisOptionsProvider optionsProvider = AnalysisOptionsProvider();
// TODO(srawlins): Add tests that exercise
// `optionsProvider.getOptionsFromString` throwing an exception.
AnalysisOptionsImpl parseOptions(String content) =>
AnalysisOptionsImpl.fromYaml(
optionsMap: optionsProvider.getOptionsFromString(content));
test_analyzer_cannotIgnore() {
var analysisOptions = parseOptions('''
analyzer:
cannot-ignore:
- one_error_code
- another
''');
var unignorableNames = analysisOptions.unignorableNames;
expect(unignorableNames, unorderedEquals(['ONE_ERROR_CODE', 'ANOTHER']));
}
test_analyzer_cannotIgnore_severity() {
var analysisOptions = parseOptions('''
analyzer:
cannot-ignore:
- error
''');
var unignorableNames = analysisOptions.unignorableNames;
expect(unignorableNames, contains('INVALID_ANNOTATION'));
expect(unignorableNames.length, greaterThan(500));
}
test_analyzer_cannotIgnore_severity_withProcessor() {
var analysisOptions = parseOptions('''
analyzer:
errors:
unused_import: error
cannot-ignore:
- error
''');
var unignorableNames = analysisOptions.unignorableNames;
expect(unignorableNames, contains('UNUSED_IMPORT'));
}
test_analyzer_chromeos_checks() {
var analysisOptions = parseOptions('''
analyzer:
optional-checks:
chrome-os-manifest-checks
''');
expect(analysisOptions.chromeOsManifestChecks, true);
}
test_analyzer_chromeos_checks_map() {
var analysisOptions = parseOptions('''
analyzer:
optional-checks:
chrome-os-manifest-checks : true
''');
expect(analysisOptions.chromeOsManifestChecks, true);
}
test_analyzer_errors_cannotBeIgnoredByUniqueName() {
var analysisOptions = parseOptions('''
analyzer:
errors:
return_type_invalid_for_catch_error: ignore
''');
var processors = analysisOptions.errorProcessors;
expect(processors, hasLength(1));
var warning = AnalysisError.tmp(
source: TestSource(),
offset: 0,
length: 1,
errorCode: WarningCode.RETURN_TYPE_INVALID_FOR_CATCH_ERROR,
arguments: [
['x'],
['y'],
],
);
var processor = processors.first;
expect(processor.appliesTo(warning), isFalse);
}
test_analyzer_errors_severityIsError() {
var analysisOptions = parseOptions('''
analyzer:
errors:
unused_local_variable: error
''');
var processors = analysisOptions.errorProcessors;
expect(processors, hasLength(1));
var warning = AnalysisError.tmp(
source: TestSource(),
offset: 0,
length: 1,
errorCode: WarningCode.UNUSED_LOCAL_VARIABLE,
arguments: [
['x'],
],
);
var processor = processors.first;
expect(processor.appliesTo(warning), isTrue);
expect(processor.severity, ErrorSeverity.ERROR);
}
test_analyzer_errors_severityIsIgnore() {
var analysisOptions = parseOptions('''
analyzer:
errors:
invalid_assignment: ignore
''');
var processors = analysisOptions.errorProcessors;
expect(processors, hasLength(1));
var error = AnalysisError.tmp(
source: TestSource(),
offset: 0,
length: 1,
errorCode: CompileTimeErrorCode.INVALID_ASSIGNMENT,
arguments: [
['x'],
['y'],
],
);
var processor = processors.first;
expect(processor.appliesTo(error), isTrue);
expect(processor.severity, isNull);
}
test_analyzer_errors_sharedNameAppliesToAllSharedCodes() {
var analysisOptions = parseOptions('''
analyzer:
errors:
invalid_return_type_for_catch_error: ignore
''');
var processors = analysisOptions.errorProcessors;
expect(processors, hasLength(1));
var warning = AnalysisError.tmp(
source: TestSource(),
offset: 0,
length: 1,
errorCode: WarningCode.RETURN_TYPE_INVALID_FOR_CATCH_ERROR,
arguments: [
['x'],
['y'],
],
);
var processor = processors.first;
expect(processor.appliesTo(warning), isTrue);
expect(processor.severity, isNull);
}
test_analyzer_exclude() {
var analysisOptions = parseOptions('''
analyzer:
exclude:
- foo/bar.dart
- 'test/**'
''');
var excludes = analysisOptions.excludePatterns;
expect(excludes, unorderedEquals(['foo/bar.dart', 'test/**']));
}
test_analyzer_exclude_withNonStrings() {
var analysisOptions = parseOptions('''
analyzer:
exclude:
- foo/bar.dart
- 'test/**'
- a: b
''');
var excludes = analysisOptions.excludePatterns;
expect(excludes, unorderedEquals(['foo/bar.dart', 'test/**']));
}
test_analyzer_legacyPlugins_list() {
// TODO(srawlins): Test legacy plugins as a list of non-scalar values
// (`- angular2: yes`).
var analysisOptions = parseOptions('''
analyzer:
plugins:
- angular2
- intl
''');
var names = analysisOptions.enabledLegacyPluginNames;
expect(names, ['angular2']);
}
test_analyzer_legacyPlugins_map() {
// TODO(srawlins): Test legacy plugins as a map of scalar values
// (`angular2: yes`).
var analysisOptions = parseOptions('''
analyzer:
plugins:
angular2:
enabled: true
''');
var names = analysisOptions.enabledLegacyPluginNames;
expect(names, ['angular2']);
}
test_analyzer_legacyPlugins_string() {
var analysisOptions = parseOptions('''
analyzer:
plugins:
angular2
''');
var names = analysisOptions.enabledLegacyPluginNames;
expect(names, ['angular2']);
}
test_analyzer_optionalChecks_propagateLinterExceptions_default() {
var analysisOptions = parseOptions('''
analyzer:
optional-checks:
''');
expect(analysisOptions.propagateLinterExceptions, false);
}
test_analyzer_optionalChecks_propagateLinterExceptions_empty() {
var analysisOptions = parseOptions('''
analyzer:
optional-checks:
propagate-linter-exceptions
''');
expect(analysisOptions.propagateLinterExceptions, true);
}
test_analyzer_optionalChecks_propagateLinterExceptions_false() {
var analysisOptions = parseOptions('''
analyzer:
optional-checks:
propagate-linter-exceptions: false
''');
expect(analysisOptions.propagateLinterExceptions, false);
}
test_analyzer_optionalChecks_propagateLinterExceptions_true() {
var analysisOptions = parseOptions('''
analyzer:
optional-checks:
propagate-linter-exceptions: true
''');
expect(analysisOptions.propagateLinterExceptions, true);
}
test_codeStyle_format_false() {
var analysisOptions = parseOptions('''
code-style:
format: false
''');
expect(analysisOptions.codeStyleOptions.useFormatter, false);
}
test_codeStyle_format_true() {
var analysisOptions = parseOptions('''
code-style:
format: true
''');
expect(analysisOptions.codeStyleOptions.useFormatter, true);
}
}