| 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.src.task.dart_test; | 5 library test.src.task.dart_test; |
| 6 | 6 |
| 7 import 'package:analyzer/file_system/file_system.dart'; |
| 8 import 'package:analyzer/file_system/memory_file_system.dart'; |
| 9 import 'package:analyzer/src/context/cache.dart'; |
| 10 import 'package:analyzer/src/generated/ast.dart'; |
| 11 import 'package:analyzer/src/generated/element.dart'; |
| 7 import 'package:analyzer/src/generated/engine.dart' | 12 import 'package:analyzer/src/generated/engine.dart' |
| 8 hide AnalysisTask, ParseDartTask, ScanDartTask; | 13 hide AnalysisTask, ParseDartTask, ScanDartTask; |
| 14 import 'package:analyzer/src/generated/error.dart'; |
| 15 import 'package:analyzer/src/generated/resolver.dart'; |
| 16 import 'package:analyzer/src/generated/sdk.dart'; |
| 9 import 'package:analyzer/src/generated/source.dart'; | 17 import 'package:analyzer/src/generated/source.dart'; |
| 18 import 'package:analyzer/src/generated/testing/ast_factory.dart'; |
| 10 import 'package:analyzer/src/task/dart.dart'; | 19 import 'package:analyzer/src/task/dart.dart'; |
| 20 import 'package:analyzer/src/task/driver.dart'; |
| 11 import 'package:analyzer/task/dart.dart'; | 21 import 'package:analyzer/task/dart.dart'; |
| 12 import 'package:analyzer/task/general.dart'; | 22 import 'package:analyzer/task/general.dart'; |
| 13 import 'package:analyzer/task/model.dart'; | 23 import 'package:analyzer/task/model.dart'; |
| 24 import 'package:typed_mock/typed_mock.dart'; |
| 14 import 'package:unittest/unittest.dart'; | 25 import 'package:unittest/unittest.dart'; |
| 15 | 26 |
| 16 import '../../generated/resolver_test.dart'; | 27 import '../../generated/resolver_test.dart'; |
| 17 import '../../generated/test_support.dart'; | 28 import '../../generated/test_support.dart'; |
| 18 import '../../reflective_tests.dart'; | 29 import '../../reflective_tests.dart'; |
| 19 | 30 |
| 20 main() { | 31 main() { |
| 21 groupSep = ' | '; | 32 groupSep = ' | '; |
| 22 runReflectiveTests(BuildCompilationUnitElementTaskTest); | 33 runReflectiveTests(BuildCompilationUnitElementTaskTest); |
| 34 runReflectiveTests(BuildLibraryElementTaskTest); |
| 23 runReflectiveTests(ParseDartTaskTest); | 35 runReflectiveTests(ParseDartTaskTest); |
| 24 runReflectiveTests(ScanDartTaskTest); | 36 runReflectiveTests(ScanDartTaskTest); |
| 25 } | 37 } |
| 26 | 38 |
| 27 @reflectiveTest | 39 @reflectiveTest |
| 28 class BuildCompilationUnitElementTaskTest extends EngineTestCase { | 40 class BuildCompilationUnitElementTaskTest extends EngineTestCase { |
| 29 test_buildInputs() { | 41 test_buildInputs() { |
| 30 AnalysisTarget target = new TestSource(); | 42 AnalysisTarget target = new TestSource(); |
| 31 Map<String, TaskInput> inputs = | 43 Map<String, TaskInput> inputs = |
| 32 BuildCompilationUnitElementTask.buildInputs(target); | 44 BuildCompilationUnitElementTask.buildInputs(target); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 BuildCompilationUnitElementTask.PARSED_UNIT_INPUT_NAME: | 118 BuildCompilationUnitElementTask.PARSED_UNIT_INPUT_NAME: |
| 107 parseOutputs[PARSED_UNIT] | 119 parseOutputs[PARSED_UNIT] |
| 108 }; | 120 }; |
| 109 buildTask.perform(); | 121 buildTask.perform(); |
| 110 | 122 |
| 111 return buildTask; | 123 return buildTask; |
| 112 } | 124 } |
| 113 } | 125 } |
| 114 | 126 |
| 115 @reflectiveTest | 127 @reflectiveTest |
| 128 class BuildLibraryElementTaskTest extends EngineTestCase { |
| 129 MemoryResourceProvider resourceProvider = new MemoryResourceProvider(); |
| 130 InternalAnalysisContext context = AnalysisContextFactory.contextWithCore(); |
| 131 |
| 132 Source librarySource; |
| 133 CompilationUnit libraryUnit; |
| 134 CompilationUnitElement libraryUnitElement; |
| 135 List<CompilationUnit> partUnits; |
| 136 |
| 137 BuildLibraryElementTask task; |
| 138 Map<ResultDescriptor<dynamic>, dynamic> outputs; |
| 139 LibraryElement libraryElement; |
| 140 |
| 141 void setUp() { |
| 142 DartSdk sdk = context.sourceFactory.dartSdk; |
| 143 context.sourceFactory = new SourceFactory(<UriResolver>[ |
| 144 new DartUriResolver(sdk), |
| 145 new ResourceUriResolver(resourceProvider) |
| 146 ]); |
| 147 } |
| 148 |
| 149 test_buildInputs() { |
| 150 ExtendedAnalysisContext context = new _MockContext(); |
| 151 // prepare sources |
| 152 File libraryFile = resourceProvider.newFile('/lib.dart', ''); |
| 153 File partFile1 = resourceProvider.newFile('/part1.dart', ''); |
| 154 File partFile2 = resourceProvider.newFile('/part2.dart', ''); |
| 155 Source librarySource = libraryFile.createSource(); |
| 156 Source partSource1 = partFile1.createSource(); |
| 157 Source partSource2 = partFile2.createSource(); |
| 158 // set INCLUDED_PARTS |
| 159 context.getCacheEntry(librarySource).setValue( |
| 160 INCLUDED_PARTS, <Source>[partSource1, partSource2]); |
| 161 // set BUILT_UNIT |
| 162 CompilationUnit libraryUnit = AstFactory.compilationUnit(); |
| 163 CompilationUnit partUnit1 = AstFactory.compilationUnit(); |
| 164 CompilationUnit partUnit2 = AstFactory.compilationUnit(); |
| 165 context.getCacheEntry(librarySource).setValue(BUILT_UNIT, libraryUnit); |
| 166 context.getCacheEntry(partSource1).setValue(BUILT_UNIT, partUnit1); |
| 167 context.getCacheEntry(partSource2).setValue(BUILT_UNIT, partUnit2); |
| 168 // request inputs |
| 169 WorkItem workItem = new WorkItem( |
| 170 context, librarySource, BuildLibraryElementTask.DESCRIPTOR); |
| 171 workItem.gatherInputs(null); |
| 172 Map<String, dynamic> inputs = workItem.inputs; |
| 173 expect(inputs, hasLength(2)); |
| 174 expect(inputs[BuildLibraryElementTask.DEFINING_BUILT_UNIT_INPUT_NAME], |
| 175 libraryUnit); |
| 176 expect(inputs[BuildLibraryElementTask.PART_BUILT_UNITS_INPUT_NAME], |
| 177 unorderedEquals([partUnit1, partUnit2])); |
| 178 } |
| 179 |
| 180 test_constructor() { |
| 181 AnalysisTarget target = new TestSource(); |
| 182 BuildLibraryElementTask task = new BuildLibraryElementTask(context, target); |
| 183 expect(task, isNotNull); |
| 184 expect(task.context, context); |
| 185 expect(task.target, target); |
| 186 } |
| 187 |
| 188 test_createTask() { |
| 189 AnalysisTarget target = new TestSource(); |
| 190 BuildLibraryElementTask task = |
| 191 BuildLibraryElementTask.createTask(context, target); |
| 192 expect(task, isNotNull); |
| 193 expect(task.context, context); |
| 194 expect(task.target, target); |
| 195 } |
| 196 |
| 197 test_description() { |
| 198 AnalysisTarget target = new TestSource(); |
| 199 BuildLibraryElementTask task = new BuildLibraryElementTask(null, target); |
| 200 expect(task.description, isNotNull); |
| 201 } |
| 202 |
| 203 test_descriptor() { |
| 204 TaskDescriptor descriptor = BuildLibraryElementTask.DESCRIPTOR; |
| 205 expect(descriptor, isNotNull); |
| 206 } |
| 207 |
| 208 test_perform() { |
| 209 _performBuildTask({ |
| 210 '/lib.dart': ''' |
| 211 library lib; |
| 212 part 'part1.dart'; |
| 213 part 'part2.dart'; |
| 214 ''', |
| 215 '/part1.dart': ''' |
| 216 part of lib; |
| 217 ''', |
| 218 '/part2.dart': ''' |
| 219 part of lib; |
| 220 ''' |
| 221 }); |
| 222 expect(task.caughtException, isNull); |
| 223 expect(outputs, hasLength(4)); |
| 224 // simple outputs |
| 225 expect(outputs[BUILD_LIBRARY_ERRORS], isEmpty); |
| 226 expect(outputs[IS_LAUNCHABLE], isFalse); |
| 227 expect(outputs[HAS_HTML_IMPORT], isFalse); |
| 228 // LibraryElement output |
| 229 expect(libraryElement, isNotNull); |
| 230 expect(libraryElement.entryPoint, isNull); |
| 231 expect(libraryElement.source, same(librarySource)); |
| 232 expect(libraryElement.definingCompilationUnit, libraryUnitElement); |
| 233 expect(libraryElement.parts, |
| 234 unorderedEquals([partUnits[0].element, partUnits[1].element])); |
| 235 // LibraryElement references |
| 236 expect((libraryUnit.directives[0] as LibraryDirective).element, |
| 237 same(libraryElement)); |
| 238 expect((partUnits[0].directives[0] as PartOfDirective).element, |
| 239 same(libraryElement)); |
| 240 expect((partUnits[1].directives[0] as PartOfDirective).element, |
| 241 same(libraryElement)); |
| 242 // CompilationUnitElement(s) |
| 243 { |
| 244 CompilationUnitElement unitElement = partUnits[0].element; |
| 245 expect(unitElement.uri, 'part1.dart'); |
| 246 expect(unitElement.uriOffset, 18); |
| 247 expect(unitElement.uriEnd, 30); |
| 248 expect((libraryUnit.directives[1] as PartDirective).element, |
| 249 same(unitElement)); |
| 250 } |
| 251 { |
| 252 CompilationUnitElement unitElement = partUnits[1].element; |
| 253 expect(unitElement.uri, 'part2.dart'); |
| 254 expect(unitElement.uriOffset, 37); |
| 255 expect(unitElement.uriEnd, 49); |
| 256 expect((libraryUnit.directives[2] as PartDirective).element, |
| 257 same(unitElement)); |
| 258 } |
| 259 } |
| 260 |
| 261 test_perform_error_missingLibraryDirectiveWithPart() { |
| 262 _performBuildTask({ |
| 263 '/lib.dart': ''' |
| 264 part 'part.dart'; |
| 265 ''', |
| 266 '/part.dart': ''' |
| 267 part of lib; |
| 268 ''' |
| 269 }); |
| 270 expect(task.caughtException, isNull); |
| 271 _assertErrorsWithCodes( |
| 272 [ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART]); |
| 273 } |
| 274 |
| 275 test_perform_error_partOfDifferentLibrary() { |
| 276 _performBuildTask({ |
| 277 '/lib.dart': ''' |
| 278 library lib; |
| 279 part 'part.dart'; |
| 280 ''', |
| 281 '/part.dart': ''' |
| 282 part of someOtherLib; |
| 283 ''' |
| 284 }); |
| 285 expect(task.caughtException, isNull); |
| 286 _assertErrorsWithCodes([StaticWarningCode.PART_OF_DIFFERENT_LIBRARY]); |
| 287 } |
| 288 |
| 289 test_perform_error_partOfNonPart() { |
| 290 _performBuildTask({ |
| 291 '/lib.dart': ''' |
| 292 library lib; |
| 293 part 'part.dart'; |
| 294 ''', |
| 295 '/part.dart': ''' |
| 296 // no part of |
| 297 ''' |
| 298 }); |
| 299 expect(task.caughtException, isNull); |
| 300 _assertErrorsWithCodes([CompileTimeErrorCode.PART_OF_NON_PART]); |
| 301 } |
| 302 |
| 303 test_perform_hasHtmlImport() { |
| 304 _performBuildTask({ |
| 305 '/lib.dart': ''' |
| 306 import 'dart:html'; |
| 307 ''' |
| 308 }); |
| 309 expect(outputs[HAS_HTML_IMPORT], isTrue); |
| 310 } |
| 311 |
| 312 test_perform_isLaunchable_inDefiningUnit() { |
| 313 _performBuildTask({ |
| 314 '/lib.dart': ''' |
| 315 library lib; |
| 316 main() { |
| 317 } |
| 318 ''' |
| 319 }); |
| 320 expect(outputs[IS_LAUNCHABLE], isTrue); |
| 321 expect(libraryElement.entryPoint, isNotNull); |
| 322 } |
| 323 |
| 324 test_perform_isLaunchable_inPartUnit() { |
| 325 _performBuildTask({ |
| 326 '/lib.dart': ''' |
| 327 library lib; |
| 328 part 'part.dart'; |
| 329 ''', |
| 330 '/part.dart': ''' |
| 331 part of lib; |
| 332 main() { |
| 333 } |
| 334 ''' |
| 335 }); |
| 336 expect(outputs[IS_LAUNCHABLE], isTrue); |
| 337 expect(libraryElement.entryPoint, isNotNull); |
| 338 } |
| 339 |
| 340 test_perform_patchTopLevelAccessors() { |
| 341 _performBuildTask({ |
| 342 '/lib.dart': ''' |
| 343 library lib; |
| 344 part 'part1.dart'; |
| 345 part 'part2.dart'; |
| 346 ''', |
| 347 '/part1.dart': ''' |
| 348 part of lib; |
| 349 int get test => 0; |
| 350 ''', |
| 351 '/part2.dart': ''' |
| 352 part of lib; |
| 353 void set test(_) {} |
| 354 ''' |
| 355 }); |
| 356 PropertyAccessorElement getter = partUnits[0].element.accessors[0]; |
| 357 PropertyAccessorElement setter = partUnits[1].element.accessors[0]; |
| 358 expect(getter.isGetter, isTrue); |
| 359 expect(setter.isSetter, isTrue); |
| 360 expect(getter.variable, isNotNull); |
| 361 expect(setter.variable, same(getter.variable)); |
| 362 } |
| 363 |
| 364 void _assertErrorsWithCodes(List<ErrorCode> expectedErrorCodes) { |
| 365 List<AnalysisError> errors = outputs[BUILD_LIBRARY_ERRORS]; |
| 366 GatheringErrorListener errorListener = new GatheringErrorListener(); |
| 367 errorListener.addAll(errors); |
| 368 errorListener.assertErrorsWithCodes(expectedErrorCodes); |
| 369 } |
| 370 |
| 371 CompilationUnit _buildCompilationUnit( |
| 372 InternalAnalysisContext context, String path, String content) { |
| 373 File file = resourceProvider.newFile(path, content); |
| 374 Source source = file.createSource(); |
| 375 |
| 376 ScanDartTask scanTask = new ScanDartTask(context, source); |
| 377 scanTask.inputs = {ScanDartTask.CONTENT_INPUT_NAME: content}; |
| 378 scanTask.perform(); |
| 379 Map<ResultDescriptor, dynamic> scanOutputs = scanTask.outputs; |
| 380 |
| 381 ParseDartTask parseTask = new ParseDartTask(context, source); |
| 382 parseTask.inputs = { |
| 383 ParseDartTask.LINE_INFO_INPUT_NAME: scanOutputs[LINE_INFO], |
| 384 ParseDartTask.TOKEN_STREAM_INPUT_NAME: scanOutputs[TOKEN_STREAM] |
| 385 }; |
| 386 parseTask.perform(); |
| 387 Map<ResultDescriptor, dynamic> parseOutputs = parseTask.outputs; |
| 388 |
| 389 BuildCompilationUnitElementTask buildTask = |
| 390 new BuildCompilationUnitElementTask(context, source); |
| 391 buildTask.inputs = { |
| 392 BuildCompilationUnitElementTask.PARSED_UNIT_INPUT_NAME: |
| 393 parseOutputs[PARSED_UNIT] |
| 394 }; |
| 395 buildTask.perform(); |
| 396 return buildTask.outputs[BUILT_UNIT]; |
| 397 } |
| 398 |
| 399 void _performBuildTask(Map<String, String> sourceMap) { |
| 400 Map<String, CompilationUnit> unitMap = <String, CompilationUnit>{}; |
| 401 sourceMap.forEach((String path, String content) { |
| 402 CompilationUnit unit = _buildCompilationUnit(context, path, content); |
| 403 unitMap[path] = unit; |
| 404 }); |
| 405 |
| 406 libraryUnit = unitMap.values.first; |
| 407 libraryUnitElement = libraryUnit.element; |
| 408 librarySource = libraryUnitElement.source; |
| 409 partUnits = unitMap.values.skip(1).toList(); |
| 410 |
| 411 task = new BuildLibraryElementTask(context, librarySource); |
| 412 task.inputs = { |
| 413 BuildLibraryElementTask.DEFINING_BUILT_UNIT_INPUT_NAME: libraryUnit, |
| 414 BuildLibraryElementTask.PART_BUILT_UNITS_INPUT_NAME: partUnits |
| 415 }; |
| 416 task.perform(); |
| 417 outputs = task.outputs; |
| 418 libraryElement = outputs[BUILT_LIBRARY_ELEMENT]; |
| 419 } |
| 420 } |
| 421 |
| 422 @reflectiveTest |
| 116 class ParseDartTaskTest extends EngineTestCase { | 423 class ParseDartTaskTest extends EngineTestCase { |
| 117 test_buildInputs() { | 424 test_buildInputs() { |
| 118 AnalysisTarget target = new TestSource(); | 425 AnalysisTarget target = new TestSource(); |
| 119 Map<String, TaskInput> inputs = ParseDartTask.buildInputs(target); | 426 Map<String, TaskInput> inputs = ParseDartTask.buildInputs(target); |
| 120 expect(inputs, isNotNull); | 427 expect(inputs, isNotNull); |
| 121 expect(inputs, hasLength(2)); | 428 expect(inputs, hasLength(2)); |
| 122 expect(inputs[ParseDartTask.LINE_INFO_INPUT_NAME], isNotNull); | 429 expect(inputs[ParseDartTask.LINE_INFO_INPUT_NAME], isNotNull); |
| 123 expect(inputs[ParseDartTask.TOKEN_STREAM_INPUT_NAME], isNotNull); | 430 expect(inputs[ParseDartTask.TOKEN_STREAM_INPUT_NAME], isNotNull); |
| 124 } | 431 } |
| 125 | 432 |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 ScanDartTask _performScanTask(String content) { | 597 ScanDartTask _performScanTask(String content) { |
| 291 AnalysisContext context = AnalysisContextFactory.contextWithCore(); | 598 AnalysisContext context = AnalysisContextFactory.contextWithCore(); |
| 292 AnalysisTarget target = new TestSource(); | 599 AnalysisTarget target = new TestSource(); |
| 293 | 600 |
| 294 ScanDartTask scanTask = new ScanDartTask(context, target); | 601 ScanDartTask scanTask = new ScanDartTask(context, target); |
| 295 scanTask.inputs = {ScanDartTask.CONTENT_INPUT_NAME: content}; | 602 scanTask.inputs = {ScanDartTask.CONTENT_INPUT_NAME: content}; |
| 296 scanTask.perform(); | 603 scanTask.perform(); |
| 297 return scanTask; | 604 return scanTask; |
| 298 } | 605 } |
| 299 } | 606 } |
| 607 |
| 608 class _MockContext extends TypedMock implements ExtendedAnalysisContext { |
| 609 Map<AnalysisTarget, CacheEntry> entryMap = <AnalysisTarget, CacheEntry>{}; |
| 610 |
| 611 @override |
| 612 CacheEntry getCacheEntry(AnalysisTarget target) { |
| 613 return entryMap.putIfAbsent(target, () => new CacheEntry()); |
| 614 } |
| 615 |
| 616 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| 617 } |
| OLD | NEW |