blob: c1ec09312133fba0bb388d96d44ded4040b2d81b [file] [log] [blame] [edit]
// 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.
import 'package:analyzer/src/lint/config.dart';
import 'package:test/test.dart';
import 'package:yaml/yaml.dart';
import '../util/yaml_test.dart';
main() {
defineTests();
}
defineTests() {
/// Process the given option [fileContents] and produce a corresponding
/// [LintConfig]. Return `null` if [fileContents] is not a YAML map, or
/// does not have the `linter` child map.
Map<String, RuleConfig>? processAnalysisOptionsFile(String fileContents) {
var yaml = loadYamlNode(fileContents);
if (yaml is YamlMap) {
return parseLinterSection(yaml);
}
return null;
}
// In the future, options might be marshaled in maps and passed to rules.
// acme:
// some_rule:
// some_option: # Note this nesting might be arbitrarily complex?
// - param1
// - param2
group('lint config', () {
group('rule', () {
test('configs', () {
var ruleConfigs = parseLinterSection(
loadYamlNode('''
linter:
# Unsupported sections here to check that no exceptions are thrown when
# YAML includes unknown sections.
files:
include: foo # un-quoted
exclude:
- 'test/**' # file globs can be scalars or lists
- '**/_data.dart' # unquoted stars treated by YAML as aliases
rules:
style_guide:
unnecessary_getters: false #disable
camel_case_types: true #enable
pub:
package_names: false
''')
as YamlMap,
);
expect(ruleConfigs, hasLength(3));
});
test('config', () {
var ruleConfigs = parseLinterSection(
loadYamlNode('''
linter:
rules:
style_guide:
unnecessary_getters: false
''')
as YamlMap,
)!;
expect(ruleConfigs, hasLength(1));
var ruleConfig = ruleConfigs.values.first;
expect(ruleConfig.group, 'style_guide');
expect(ruleConfig.name, 'unnecessary_getters');
expect(ruleConfig.isEnabled, isFalse);
expect(ruleConfig.disables('unnecessary_getters'), isTrue);
});
});
});
group('analysis options', () {
group('parsing', () {
group('groups', () {
test('basic', () {
var src = '''
plugin_a:
option_a: false
plugin_b:
option_b: true
linter:
rules:
style_guide:
unnecessary_getters: false #disable
camel_case_types: true #enable
''';
var ruleConfigs = processAnalysisOptionsFile(src)!;
var ruleNames = ruleConfigs.values.map((rc) => rc.name);
expect(ruleNames, hasLength(2));
expect(ruleNames, contains('unnecessary_getters'));
expect(ruleNames, contains('camel_case_types'));
});
});
group('w/o groups', () {
test('rule list', () {
var src = '''
plugin_a:
option_a: false
plugin_b:
option_b: true
linter:
rules:
- camel_case_types
''';
var ruleConfigs = processAnalysisOptionsFile(src)!;
expect(ruleConfigs, hasLength(1));
// Verify that defaults are enabled.
expect(ruleConfigs.values.first.isEnabled, isTrue);
});
test('rule map (bools)', () {
var src = '''
plugin_a:
option_a: false
plugin_b:
option_b: true
linter:
rules:
camel_case_types: true #enable
unnecessary_getters: false #disable
''';
var ruleConfigs = processAnalysisOptionsFile(src)!.values.toList();
ruleConfigs.sort(
(RuleConfig rc1, RuleConfig rc2) => rc1.name.compareTo(rc2.name),
);
expect(ruleConfigs, hasLength(2));
expect(ruleConfigs[0].name, 'camel_case_types');
expect(ruleConfigs[0].isEnabled, isTrue);
expect(ruleConfigs[1].name, 'unnecessary_getters');
expect(ruleConfigs[1].isEnabled, isFalse);
});
});
});
test('empty file', () {
expect(processAnalysisOptionsFile(''), isNull);
});
test('bad format', () {
expect(processAnalysisOptionsFile('foo: '), isNull);
});
});
group('options processing', () {
group('raw maps', () {
Map<String, RuleConfig> parseMap(Map<Object, Object?> map) {
return parseLinterSection(wrap(map) as YamlMap)!;
}
test('rule list', () {
var options = <Object, Object?>{};
var lintOptions = {
'rules': ['camel_case_types'],
};
options['linter'] = lintOptions;
var ruleConfigs = parseMap(options);
expect(ruleConfigs, isNotNull);
expect(ruleConfigs, hasLength(1));
});
test('rule map (bool)', () {
var options = <Object, Object?>{};
var lintOptions = {
'rules': {'camel_case_types': true},
};
options['linter'] = lintOptions;
var ruleConfigs = parseMap(options);
expect(ruleConfigs, isNotNull);
expect(ruleConfigs, hasLength(1));
});
test('nested rule map (bool)', () {
var options = <Object, Object?>{};
var lintOptions = {
'rules': {
'style_guide': {'camel_case_types': true},
},
};
options['linter'] = lintOptions;
var ruleConfigs = parseMap(options);
expect(ruleConfigs, isNotNull);
expect(ruleConfigs, hasLength(1));
});
test('nested rule map (string)', () {
var options = <Object, Object?>{};
var lintOptions = {
'rules': {
'style_guide': {'camel_case_types': true},
},
};
options['linter'] = lintOptions;
var ruleConfigs = parseMap(options);
expect(ruleConfigs, isNotNull);
expect(ruleConfigs, hasLength(1));
});
});
});
}