| 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 test.source.analysis_options_provider; | 5 library analyzer.test.source.analysis_options_provider_test; |
| 6 | 6 |
| 7 import 'dart:core'; |
| 8 |
| 9 import 'package:analyzer/file_system/file_system.dart'; |
| 7 import 'package:analyzer/file_system/memory_file_system.dart'; | 10 import 'package:analyzer/file_system/memory_file_system.dart'; |
| 8 import 'package:analyzer/source/analysis_options_provider.dart'; | 11 import 'package:analyzer/source/analysis_options_provider.dart'; |
| 12 import 'package:analyzer/src/generated/engine.dart'; |
| 13 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 9 import 'package:unittest/unittest.dart'; | 14 import 'package:unittest/unittest.dart'; |
| 10 import 'package:yaml/yaml.dart'; | 15 import 'package:yaml/yaml.dart'; |
| 11 | 16 |
| 17 import '../resource_utils.dart'; |
| 12 import '../utils.dart'; | 18 import '../utils.dart'; |
| 13 | 19 |
| 14 main() { | 20 main() { |
| 15 initializeTestEnvironment(); | 21 initializeTestEnvironment(); |
| 22 defineReflectiveTests(AnalysisOptionsProviderOldTest); |
| 23 defineReflectiveTests(AnalysisOptionsProviderNewTest); |
| 16 group('AnalysisOptionsProvider', () { | 24 group('AnalysisOptionsProvider', () { |
| 17 setUp(() { | 25 void expectMergesTo(String defaults, String overrides, String expected) { |
| 18 buildResourceProvider(); | |
| 19 }); | |
| 20 tearDown(() { | |
| 21 clearResourceProvider(); | |
| 22 }); | |
| 23 test('test_simple', () { | |
| 24 var optionsProvider = new AnalysisOptionsProvider(); | 26 var optionsProvider = new AnalysisOptionsProvider(); |
| 25 Map<String, YamlNode> options = | 27 var defaultOptions = optionsProvider.getOptionsFromString(defaults); |
| 26 optionsProvider.getOptions(resourceProvider.getFolder('/')); | 28 var overrideOptions = optionsProvider.getOptionsFromString(overrides); |
| 27 expect(options.length, equals(1)); | 29 var merged = optionsProvider.merge(defaultOptions, overrideOptions); |
| 28 expect(options['analyzer'], isNotNull); | 30 expect(merged, optionsProvider.getOptionsFromString(expected)); |
| 29 YamlMap analyzer = options['analyzer']; | 31 } |
| 30 expect(analyzer.length, equals(1)); | 32 |
| 31 expect(analyzer['ignore'], isNotNull); | 33 group('merging', () { |
| 32 YamlList ignore = analyzer['ignore']; | 34 test('integration', () { |
| 33 expect(ignore.length, equals(2)); | 35 expectMergesTo( |
| 34 expect(ignore[0], equals('ignoreme.dart')); | 36 ''' |
| 35 expect(ignore[1], equals('sdk_ext/**')); | 37 analyzer: |
| 36 }); | 38 plugins: |
| 37 test('test_doesnotexist', () { | 39 - p1 |
| 38 var optionsProvider = new AnalysisOptionsProvider(); | 40 - p2 |
| 39 Map<String, YamlNode> options = | 41 errors: |
| 40 optionsProvider.getOptions(resourceProvider.getFolder('/empty')); | 42 unused_local_variable : error |
| 41 expect(options.length, equals(0)); | 43 linter: |
| 44 rules: |
| 45 - camel_case_types |
| 46 - one_member_abstracts |
| 47 ''', |
| 48 ''' |
| 49 analyzer: |
| 50 plugins: |
| 51 - p3 |
| 52 errors: |
| 53 unused_local_variable : ignore # overrides error |
| 54 linter: |
| 55 rules: |
| 56 one_member_abstracts: false # promotes and disables |
| 57 always_specify_return_types: true |
| 58 ''', |
| 59 ''' |
| 60 analyzer: |
| 61 plugins: |
| 62 - p1 |
| 63 - p2 |
| 64 - p3 |
| 65 errors: |
| 66 unused_local_variable : ignore |
| 67 linter: |
| 68 rules: |
| 69 camel_case_types: true |
| 70 one_member_abstracts: false |
| 71 always_specify_return_types: true |
| 72 '''); |
| 73 }); |
| 42 }); | 74 }); |
| 43 }); | 75 }); |
| 76 |
| 44 group('AnalysisOptionsProvider', () { | 77 group('AnalysisOptionsProvider', () { |
| 45 setUp(() { | 78 test('test_bad_yaml (1)', () { |
| 46 buildResourceProvider(true); | 79 var src = ''' |
| 80 analyzer: # <= bang |
| 81 strong-mode: true |
| 82 '''; |
| 83 |
| 84 var optionsProvider = new AnalysisOptionsProvider(); |
| 85 expect(() => optionsProvider.getOptionsFromString(src), |
| 86 throwsA(new isInstanceOf<OptionsFormatException>())); |
| 47 }); | 87 }); |
| 48 tearDown(() { | 88 |
| 49 clearResourceProvider(); | 89 test('test_bad_yaml (2)', () { |
| 50 }); | 90 var src = ''' |
| 51 test('test_empty', () { | 91 analyzer: |
| 92 strong-mode:true # missing space (sdk/issues/24885) |
| 93 '''; |
| 94 |
| 52 var optionsProvider = new AnalysisOptionsProvider(); | 95 var optionsProvider = new AnalysisOptionsProvider(); |
| 53 Map<String, YamlNode> options = | 96 // Should not throw an exception. |
| 54 optionsProvider.getOptions(resourceProvider.getFolder('/')); | 97 var options = optionsProvider.getOptionsFromString(src); |
| 98 // Should return a non-null options list. |
| 55 expect(options, isNotNull); | 99 expect(options, isNotNull); |
| 56 }); | 100 }); |
| 57 }); | 101 }); |
| 58 group('AnalysisOptionsProvider', () { | 102 } |
| 59 setUp(() { | 103 |
| 60 buildResourceProvider(false, true); | 104 @reflectiveTest |
| 61 }); | 105 class AnalysisOptionsProviderNewTest extends AnalysisOptionsProviderTest { |
| 62 tearDown(() { | 106 String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE; |
| 63 clearResourceProvider(); | 107 } |
| 64 }); | 108 |
| 65 test('test_invalid', () { | 109 @reflectiveTest |
| 66 var optionsProvider = new AnalysisOptionsProvider(); | 110 class AnalysisOptionsProviderOldTest extends AnalysisOptionsProviderTest { |
| 67 bool exceptionCaught = false; | 111 String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_FILE; |
| 68 try { | 112 } |
| 69 Map<String, YamlNode> options = | 113 |
| 70 optionsProvider.getOptions(resourceProvider.getFolder('/')); | 114 abstract class AnalysisOptionsProviderTest { |
| 71 expect(options, isNotNull); | 115 TestPathTranslator pathTranslator; |
| 72 } catch (e) { | 116 ResourceProvider resourceProvider; |
| 73 exceptionCaught = true; | 117 |
| 74 } | 118 AnalysisOptionsProvider provider = new AnalysisOptionsProvider(); |
| 75 expect(exceptionCaught, isTrue); | 119 |
| 76 }); | 120 String get optionsFileName; |
| 77 }); | 121 |
| 78 } | 122 void setUp() { |
| 79 | 123 var rawProvider = new MemoryResourceProvider(); |
| 80 MemoryResourceProvider resourceProvider; | 124 resourceProvider = new TestResourceProvider(rawProvider); |
| 81 | 125 pathTranslator = new TestPathTranslator(rawProvider); |
| 82 buildResourceProvider([bool emptyAnalysisOptions = false, | 126 } |
| 83 bool badAnalysisOptions = false]) { | 127 |
| 84 resourceProvider = new MemoryResourceProvider(); | 128 void test_getOptions_crawlUp_hasInFolder() { |
| 85 resourceProvider.newFolder('/empty'); | 129 pathTranslator.newFolder('/foo/bar'); |
| 86 resourceProvider.newFolder('/tmp'); | 130 pathTranslator.newFile( |
| 87 if (badAnalysisOptions) { | 131 '/foo/$optionsFileName', |
| 88 resourceProvider.newFile('/.analysis_options', r''':'''); | 132 r''' |
| 89 } else if (emptyAnalysisOptions) { | 133 analyzer: |
| 90 resourceProvider.newFile('/.analysis_options', r''''''); | 134 ignore: |
| 91 } else { | 135 - foo |
| 92 resourceProvider.newFile( | 136 '''); |
| 93 '/.analysis_options', | 137 pathTranslator.newFile( |
| 94 r''' | 138 '/foo/bar/$optionsFileName', |
| 139 r''' |
| 140 analyzer: |
| 141 ignore: |
| 142 - bar |
| 143 '''); |
| 144 Map<String, YamlNode> options = _getOptions('/foo/bar', crawlUp: true); |
| 145 expect(options, hasLength(1)); |
| 146 { |
| 147 YamlMap analyzer = options['analyzer']; |
| 148 expect(analyzer, isNotNull); |
| 149 expect(analyzer['ignore'], unorderedEquals(['bar'])); |
| 150 } |
| 151 } |
| 152 |
| 153 void test_getOptions_crawlUp_hasInParent() { |
| 154 pathTranslator.newFolder('/foo/bar/baz'); |
| 155 pathTranslator.newFile( |
| 156 '/foo/$optionsFileName', |
| 157 r''' |
| 158 analyzer: |
| 159 ignore: |
| 160 - foo |
| 161 '''); |
| 162 pathTranslator.newFile( |
| 163 '/foo/bar/$optionsFileName', |
| 164 r''' |
| 165 analyzer: |
| 166 ignore: |
| 167 - bar |
| 168 '''); |
| 169 Map<String, YamlNode> options = _getOptions('/foo/bar/baz', crawlUp: true); |
| 170 expect(options, hasLength(1)); |
| 171 { |
| 172 YamlMap analyzer = options['analyzer']; |
| 173 expect(analyzer, isNotNull); |
| 174 expect(analyzer['ignore'], unorderedEquals(['bar'])); |
| 175 } |
| 176 } |
| 177 |
| 178 void test_getOptions_doesNotExist() { |
| 179 pathTranslator.newFolder('/notFile'); |
| 180 Map<String, YamlNode> options = _getOptions('/notFile'); |
| 181 expect(options, isEmpty); |
| 182 } |
| 183 |
| 184 void test_getOptions_empty() { |
| 185 pathTranslator.newFile('/$optionsFileName', r'''#empty'''); |
| 186 Map<String, YamlNode> options = _getOptions('/'); |
| 187 expect(options, isNotNull); |
| 188 expect(options, isEmpty); |
| 189 } |
| 190 |
| 191 void test_getOptions_invalid() { |
| 192 pathTranslator.newFile('/$optionsFileName', r''':'''); |
| 193 expect(() { |
| 194 _getOptions('/'); |
| 195 }, throws); |
| 196 } |
| 197 |
| 198 void test_getOptions_simple() { |
| 199 pathTranslator.newFile( |
| 200 '/$optionsFileName', |
| 201 r''' |
| 95 analyzer: | 202 analyzer: |
| 96 ignore: | 203 ignore: |
| 97 - ignoreme.dart | 204 - ignoreme.dart |
| 98 - 'sdk_ext/**' | 205 - 'sdk_ext/**' |
| 99 '''); | 206 '''); |
| 100 } | 207 Map<String, YamlNode> options = _getOptions('/'); |
| 101 } | 208 expect(options, hasLength(1)); |
| 102 | 209 { |
| 103 clearResourceProvider() { | 210 YamlMap analyzer = options['analyzer']; |
| 104 resourceProvider = null; | 211 expect(analyzer, hasLength(1)); |
| 105 } | 212 { |
| 106 | 213 YamlList ignore = analyzer['ignore']; |
| 107 emptyResourceProvider() { | 214 expect(ignore, hasLength(2)); |
| 108 resourceProvider = new MemoryResourceProvider(); | 215 expect(ignore[0], 'ignoreme.dart'); |
| 109 } | 216 expect(ignore[1], 'sdk_ext/**'); |
| 217 } |
| 218 } |
| 219 } |
| 220 |
| 221 Map<String, YamlNode> _getOptions(String posixPath, {bool crawlUp: false}) { |
| 222 Resource resource = pathTranslator.getResource(posixPath); |
| 223 return provider.getOptions(resource, crawlUp: crawlUp); |
| 224 } |
| 225 } |
| OLD | NEW |