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