| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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.driver; | 5 library analyzer.test.driver; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:convert'; | 8 import 'dart:convert'; |
| 9 | 9 |
| 10 import 'package:analyzer/dart/ast/ast.dart'; | 10 import 'package:analyzer/dart/ast/ast.dart'; |
| 11 import 'package:analyzer/dart/element/element.dart'; | 11 import 'package:analyzer/dart/element/element.dart'; |
| 12 import 'package:analyzer/error/error.dart'; | 12 import 'package:analyzer/error/error.dart'; |
| 13 import 'package:analyzer/file_system/file_system.dart'; | 13 import 'package:analyzer/file_system/file_system.dart'; |
| 14 import 'package:analyzer/file_system/memory_file_system.dart'; | 14 import 'package:analyzer/file_system/memory_file_system.dart'; |
| 15 import 'package:analyzer/source/package_map_resolver.dart'; | |
| 16 import 'package:analyzer/src/dart/analysis/byte_store.dart'; | 15 import 'package:analyzer/src/dart/analysis/byte_store.dart'; |
| 17 import 'package:analyzer/src/dart/analysis/driver.dart'; | 16 import 'package:analyzer/src/dart/analysis/driver.dart'; |
| 18 import 'package:analyzer/src/dart/analysis/file_state.dart'; | 17 import 'package:analyzer/src/dart/analysis/file_state.dart'; |
| 19 import 'package:analyzer/src/dart/analysis/status.dart'; | 18 import 'package:analyzer/src/dart/analysis/status.dart'; |
| 20 import 'package:analyzer/src/error/codes.dart'; | 19 import 'package:analyzer/src/error/codes.dart'; |
| 21 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl; | 20 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl; |
| 22 import 'package:analyzer/src/generated/source.dart'; | 21 import 'package:analyzer/src/generated/source.dart'; |
| 23 import 'package:convert/convert.dart'; | 22 import 'package:convert/convert.dart'; |
| 24 import 'package:crypto/crypto.dart'; | 23 import 'package:crypto/crypto.dart'; |
| 25 import 'package:test/test.dart'; | 24 import 'package:test/test.dart'; |
| 26 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 25 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 27 | 26 |
| 28 import '../../context/mock_sdk.dart'; | 27 import '../../context/mock_sdk.dart'; |
| 28 import 'base.dart'; |
| 29 | 29 |
| 30 main() { | 30 main() { |
| 31 defineReflectiveSuite(() { | 31 defineReflectiveSuite(() { |
| 32 defineReflectiveTests(AnalysisDriverTest); | 32 defineReflectiveTests(AnalysisDriverTest); |
| 33 defineReflectiveTests(AnalysisDriverSchedulerTest); | 33 defineReflectiveTests(AnalysisDriverSchedulerTest); |
| 34 }); | 34 }); |
| 35 } | 35 } |
| 36 | 36 |
| 37 /** | 37 /** |
| 38 * Returns a [Future] that completes after pumping the event queue [times] | 38 * Returns a [Future] that completes after pumping the event queue [times] |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 expect(allStatuses[0].isAnalyzing, isTrue); | 209 expect(allStatuses[0].isAnalyzing, isTrue); |
| 210 expect(allStatuses[1].isAnalyzing, isFalse); | 210 expect(allStatuses[1].isAnalyzing, isFalse); |
| 211 | 211 |
| 212 expect(allResults, hasLength(3)); | 212 expect(allResults, hasLength(3)); |
| 213 } | 213 } |
| 214 | 214 |
| 215 String _p(String path) => provider.convertPath(path); | 215 String _p(String path) => provider.convertPath(path); |
| 216 } | 216 } |
| 217 | 217 |
| 218 @reflectiveTest | 218 @reflectiveTest |
| 219 class AnalysisDriverTest { | 219 class AnalysisDriverTest extends BaseAnalysisDriverTest { |
| 220 static final MockSdk sdk = new MockSdk(); | |
| 221 | |
| 222 final MemoryResourceProvider provider = new MemoryResourceProvider(); | |
| 223 final ByteStore byteStore = new MemoryByteStore(); | |
| 224 final FileContentOverlay contentOverlay = new FileContentOverlay(); | |
| 225 | |
| 226 final StringBuffer logBuffer = new StringBuffer(); | |
| 227 PerformanceLog logger; | |
| 228 | |
| 229 AnalysisDriverScheduler scheduler; | |
| 230 AnalysisDriver driver; | |
| 231 final _Monitor idleStatusMonitor = new _Monitor(); | |
| 232 final List<AnalysisStatus> allStatuses = <AnalysisStatus>[]; | |
| 233 final List<AnalysisResult> allResults = <AnalysisResult>[]; | |
| 234 | |
| 235 String testProject; | |
| 236 String testFile; | |
| 237 | |
| 238 void setUp() { | |
| 239 new MockSdk(); | |
| 240 testProject = _p('/test/lib'); | |
| 241 testFile = _p('/test/lib/test.dart'); | |
| 242 logger = new PerformanceLog(logBuffer); | |
| 243 scheduler = new AnalysisDriverScheduler(logger); | |
| 244 driver = new AnalysisDriver( | |
| 245 scheduler, | |
| 246 logger, | |
| 247 provider, | |
| 248 byteStore, | |
| 249 contentOverlay, | |
| 250 new SourceFactory([ | |
| 251 new DartUriResolver(sdk), | |
| 252 new PackageMapUriResolver(provider, <String, List<Folder>>{ | |
| 253 'test': [provider.getFolder(testProject)] | |
| 254 }), | |
| 255 new ResourceUriResolver(provider) | |
| 256 ], null, provider), | |
| 257 new AnalysisOptionsImpl()..strongMode = true); | |
| 258 scheduler.start(); | |
| 259 driver.status.lastWhere((status) { | |
| 260 allStatuses.add(status); | |
| 261 if (status.isIdle) { | |
| 262 idleStatusMonitor.notify(); | |
| 263 } | |
| 264 }); | |
| 265 driver.results.listen(allResults.add); | |
| 266 } | |
| 267 | |
| 268 test_addedFiles() async { | 220 test_addedFiles() async { |
| 269 var a = _p('/test/lib/a.dart'); | 221 var a = _p('/test/lib/a.dart'); |
| 270 var b = _p('/test/lib/b.dart'); | 222 var b = _p('/test/lib/b.dart'); |
| 271 | 223 |
| 272 driver.addFile(a); | 224 driver.addFile(a); |
| 273 expect(driver.addedFiles, contains(a)); | 225 expect(driver.addedFiles, contains(a)); |
| 274 expect(driver.addedFiles, isNot(contains(b))); | 226 expect(driver.addedFiles, isNot(contains(b))); |
| 275 | 227 |
| 276 driver.removeFile(a); | 228 driver.removeFile(a); |
| 277 expect(driver.addedFiles, isNot(contains(a))); | 229 expect(driver.addedFiles, isNot(contains(a))); |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 expect(_getTopLevelVarType(ar.unit, 'A1'), 'double'); | 339 expect(_getTopLevelVarType(ar.unit, 'A1'), 'double'); |
| 388 expect(_getTopLevelVarType(ar.unit, 'A2'), 'double'); | 340 expect(_getTopLevelVarType(ar.unit, 'A2'), 'double'); |
| 389 } | 341 } |
| 390 { | 342 { |
| 391 AnalysisResult br = allResults.firstWhere((r) => r.path == b); | 343 AnalysisResult br = allResults.firstWhere((r) => r.path == b); |
| 392 expect(_getTopLevelVarType(br.unit, 'B1'), 'double'); | 344 expect(_getTopLevelVarType(br.unit, 'B1'), 'double'); |
| 393 } | 345 } |
| 394 } | 346 } |
| 395 | 347 |
| 396 test_changeFile_single() async { | 348 test_changeFile_single() async { |
| 397 _addTestFile('var V = 1;', priority: true); | 349 addTestFile('var V = 1;', priority: true); |
| 398 | 350 |
| 399 // Initial analysis. | 351 // Initial analysis. |
| 400 { | 352 { |
| 401 await _waitForIdle(); | 353 await _waitForIdle(); |
| 402 expect(allResults, hasLength(1)); | 354 expect(allResults, hasLength(1)); |
| 403 AnalysisResult result = allResults[0]; | 355 AnalysisResult result = allResults[0]; |
| 404 expect(result.path, testFile); | 356 expect(result.path, testFile); |
| 405 expect(_getTopLevelVarType(result.unit, 'V'), 'int'); | 357 expect(_getTopLevelVarType(result.unit, 'V'), 'int'); |
| 406 } | 358 } |
| 407 | 359 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 421 await _waitForIdle(); | 373 await _waitForIdle(); |
| 422 expect(allResults, hasLength(1)); | 374 expect(allResults, hasLength(1)); |
| 423 AnalysisResult result = allResults[0]; | 375 AnalysisResult result = allResults[0]; |
| 424 expect(result.path, testFile); | 376 expect(result.path, testFile); |
| 425 expect(_getTopLevelVarType(result.unit, 'V'), 'double'); | 377 expect(_getTopLevelVarType(result.unit, 'V'), 'double'); |
| 426 } | 378 } |
| 427 } | 379 } |
| 428 | 380 |
| 429 test_getResult() async { | 381 test_getResult() async { |
| 430 String content = 'int f() => 42;'; | 382 String content = 'int f() => 42;'; |
| 431 _addTestFile(content, priority: true); | 383 addTestFile(content, priority: true); |
| 432 | 384 |
| 433 AnalysisResult result = await driver.getResult(testFile); | 385 AnalysisResult result = await driver.getResult(testFile); |
| 434 expect(result.path, testFile); | 386 expect(result.path, testFile); |
| 435 expect(result.uri.toString(), 'package:test/test.dart'); | 387 expect(result.uri.toString(), 'package:test/test.dart'); |
| 436 expect(result.content, content); | 388 expect(result.content, content); |
| 437 expect(result.contentHash, _md5(content)); | 389 expect(result.contentHash, _md5(content)); |
| 438 expect(result.unit, isNotNull); | 390 expect(result.unit, isNotNull); |
| 439 expect(result.errors, hasLength(0)); | 391 expect(result.errors, hasLength(0)); |
| 440 | 392 |
| 441 var f = result.unit.declarations[0] as FunctionDeclaration; | 393 var f = result.unit.declarations[0] as FunctionDeclaration; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 463 driver.addFile(a); | 415 driver.addFile(a); |
| 464 driver.addFile(b); | 416 driver.addFile(b); |
| 465 await _waitForIdle(); | 417 await _waitForIdle(); |
| 466 | 418 |
| 467 AnalysisResult result = await driver.getResult(b); | 419 AnalysisResult result = await driver.getResult(b); |
| 468 expect(result.errors, isEmpty); | 420 expect(result.errors, isEmpty); |
| 469 } | 421 } |
| 470 | 422 |
| 471 test_getResult_errors() async { | 423 test_getResult_errors() async { |
| 472 String content = 'main() { int vv; }'; | 424 String content = 'main() { int vv; }'; |
| 473 _addTestFile(content, priority: true); | 425 addTestFile(content, priority: true); |
| 474 | 426 |
| 475 AnalysisResult result = await driver.getResult(testFile); | 427 AnalysisResult result = await driver.getResult(testFile); |
| 476 expect(result.path, testFile); | 428 expect(result.path, testFile); |
| 477 expect(result.errors, hasLength(1)); | 429 expect(result.errors, hasLength(1)); |
| 478 { | 430 { |
| 479 AnalysisError error = result.errors[0]; | 431 AnalysisError error = result.errors[0]; |
| 480 expect(error.offset, 13); | 432 expect(error.offset, 13); |
| 481 expect(error.length, 2); | 433 expect(error.length, 2); |
| 482 expect(error.errorCode, HintCode.UNUSED_LOCAL_VARIABLE); | 434 expect(error.errorCode, HintCode.UNUSED_LOCAL_VARIABLE); |
| 483 expect(error.message, "The value of the local variable 'vv' isn't used."); | 435 expect(error.message, "The value of the local variable 'vv' isn't used."); |
| 484 expect(error.correction, "Try removing the variable, or using it."); | 436 expect(error.correction, "Try removing the variable, or using it."); |
| 485 } | 437 } |
| 486 } | 438 } |
| 487 | 439 |
| 488 test_getResult_inferTypes_finalField() async { | 440 test_getResult_inferTypes_finalField() async { |
| 489 _addTestFile( | 441 addTestFile( |
| 490 r''' | 442 r''' |
| 491 class C { | 443 class C { |
| 492 final f = 42; | 444 final f = 42; |
| 493 } | 445 } |
| 494 ''', | 446 ''', |
| 495 priority: true); | 447 priority: true); |
| 496 await _waitForIdle(); | 448 await _waitForIdle(); |
| 497 | 449 |
| 498 AnalysisResult result = await driver.getResult(testFile); | 450 AnalysisResult result = await driver.getResult(testFile); |
| 499 expect(_getClassFieldType(result.unit, 'C', 'f'), 'int'); | 451 expect(_getClassFieldType(result.unit, 'C', 'f'), 'int'); |
| 500 } | 452 } |
| 501 | 453 |
| 502 test_getResult_inferTypes_instanceMethod() async { | 454 test_getResult_inferTypes_instanceMethod() async { |
| 503 _addTestFile( | 455 addTestFile( |
| 504 r''' | 456 r''' |
| 505 class A { | 457 class A { |
| 506 int m(double p) => 1; | 458 int m(double p) => 1; |
| 507 } | 459 } |
| 508 class B extends A { | 460 class B extends A { |
| 509 m(double p) => 2; | 461 m(double p) => 2; |
| 510 } | 462 } |
| 511 ''', | 463 ''', |
| 512 priority: true); | 464 priority: true); |
| 513 await _waitForIdle(); | 465 await _waitForIdle(); |
| 514 | 466 |
| 515 AnalysisResult result = await driver.getResult(testFile); | 467 AnalysisResult result = await driver.getResult(testFile); |
| 516 expect(_getClassMethodReturnType(result.unit, 'A', 'm'), 'int'); | 468 expect(_getClassMethodReturnType(result.unit, 'A', 'm'), 'int'); |
| 517 expect(_getClassMethodReturnType(result.unit, 'B', 'm'), 'int'); | 469 expect(_getClassMethodReturnType(result.unit, 'B', 'm'), 'int'); |
| 518 } | 470 } |
| 519 | 471 |
| 520 test_getResult_invalidUri_exports_dart() async { | 472 test_getResult_invalidUri_exports_dart() async { |
| 521 String content = r''' | 473 String content = r''' |
| 522 export 'dart:async'; | 474 export 'dart:async'; |
| 523 export 'dart:noSuchLib'; | 475 export 'dart:noSuchLib'; |
| 524 export 'dart:math'; | 476 export 'dart:math'; |
| 525 '''; | 477 '''; |
| 526 _addTestFile(content, priority: true); | 478 addTestFile(content, priority: true); |
| 527 | 479 |
| 528 AnalysisResult result = await driver.getResult(testFile); | 480 AnalysisResult result = await driver.getResult(testFile); |
| 529 expect(result.path, testFile); | 481 expect(result.path, testFile); |
| 530 // Has only exports for valid URIs. | 482 // Has only exports for valid URIs. |
| 531 List<ExportElement> imports = result.unit.element.library.exports; | 483 List<ExportElement> imports = result.unit.element.library.exports; |
| 532 expect( | 484 expect( |
| 533 imports.map((import) => import.exportedLibrary.source.uri.toString()), | 485 imports.map((import) => import.exportedLibrary.source.uri.toString()), |
| 534 unorderedEquals(['dart:async', 'dart:math'])); | 486 unorderedEquals(['dart:async', 'dart:math'])); |
| 535 } | 487 } |
| 536 | 488 |
| 537 test_getResult_invalidUri_imports_dart() async { | 489 test_getResult_invalidUri_imports_dart() async { |
| 538 String content = r''' | 490 String content = r''' |
| 539 import 'dart:async'; | 491 import 'dart:async'; |
| 540 import 'dart:noSuchLib'; | 492 import 'dart:noSuchLib'; |
| 541 import 'dart:math'; | 493 import 'dart:math'; |
| 542 '''; | 494 '''; |
| 543 _addTestFile(content, priority: true); | 495 addTestFile(content, priority: true); |
| 544 | 496 |
| 545 AnalysisResult result = await driver.getResult(testFile); | 497 AnalysisResult result = await driver.getResult(testFile); |
| 546 expect(result.path, testFile); | 498 expect(result.path, testFile); |
| 547 // Has only imports for valid URIs. | 499 // Has only imports for valid URIs. |
| 548 List<ImportElement> imports = result.unit.element.library.imports; | 500 List<ImportElement> imports = result.unit.element.library.imports; |
| 549 expect( | 501 expect( |
| 550 imports.map((import) => import.importedLibrary.source.uri.toString()), | 502 imports.map((import) => import.importedLibrary.source.uri.toString()), |
| 551 unorderedEquals(['dart:async', 'dart:math', 'dart:core'])); | 503 unorderedEquals(['dart:async', 'dart:math', 'dart:core'])); |
| 552 } | 504 } |
| 553 | 505 |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 692 var A2 = B1; | 644 var A2 = B1; |
| 693 '''); | 645 '''); |
| 694 { | 646 { |
| 695 AnalysisResult result = await driver.getResult(a); | 647 AnalysisResult result = await driver.getResult(a); |
| 696 expect(_getTopLevelVarType(result.unit, 'A1'), 'double'); | 648 expect(_getTopLevelVarType(result.unit, 'A1'), 'double'); |
| 697 expect(_getTopLevelVarType(result.unit, 'A2'), 'double'); | 649 expect(_getTopLevelVarType(result.unit, 'A2'), 'double'); |
| 698 } | 650 } |
| 699 } | 651 } |
| 700 | 652 |
| 701 test_getResult_thenRemove() async { | 653 test_getResult_thenRemove() async { |
| 702 _addTestFile('main() {}', priority: true); | 654 addTestFile('main() {}', priority: true); |
| 703 | 655 |
| 704 Future<AnalysisResult> resultFuture = driver.getResult(testFile); | 656 Future<AnalysisResult> resultFuture = driver.getResult(testFile); |
| 705 driver.removeFile(testFile); | 657 driver.removeFile(testFile); |
| 706 | 658 |
| 707 AnalysisResult result = await resultFuture; | 659 AnalysisResult result = await resultFuture; |
| 708 expect(result, isNotNull); | 660 expect(result, isNotNull); |
| 709 expect(result.path, testFile); | 661 expect(result.path, testFile); |
| 710 expect(result.unit, isNotNull); | 662 expect(result.unit, isNotNull); |
| 711 } | 663 } |
| 712 | 664 |
| 713 test_getResult_twoPendingFutures() async { | 665 test_getResult_twoPendingFutures() async { |
| 714 String content = 'main() {}'; | 666 String content = 'main() {}'; |
| 715 _addTestFile(content, priority: true); | 667 addTestFile(content, priority: true); |
| 716 | 668 |
| 717 Future<AnalysisResult> future1 = driver.getResult(testFile); | 669 Future<AnalysisResult> future1 = driver.getResult(testFile); |
| 718 Future<AnalysisResult> future2 = driver.getResult(testFile); | 670 Future<AnalysisResult> future2 = driver.getResult(testFile); |
| 719 | 671 |
| 720 // Both futures complete, with the same result. | 672 // Both futures complete, with the same result. |
| 721 AnalysisResult result1 = await future1; | 673 AnalysisResult result1 = await future1; |
| 722 AnalysisResult result2 = await future2; | 674 AnalysisResult result2 = await future2; |
| 723 expect(result2, same(result1)); | 675 expect(result2, same(result1)); |
| 724 expect(result1.path, testFile); | 676 expect(result1.path, testFile); |
| 725 expect(result1.unit, isNotNull); | 677 expect(result1.unit, isNotNull); |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1037 // But the change causes "a" to be reanalyzed. | 989 // But the change causes "a" to be reanalyzed. |
| 1038 await _waitForIdle(); | 990 await _waitForIdle(); |
| 1039 expect(allResults, hasLength(1)); | 991 expect(allResults, hasLength(1)); |
| 1040 { | 992 { |
| 1041 AnalysisResult ar = allResults.firstWhere((r) => r.path == a); | 993 AnalysisResult ar = allResults.firstWhere((r) => r.path == a); |
| 1042 expect(_getTopLevelVarType(ar.unit, 'A'), 'double'); | 994 expect(_getTopLevelVarType(ar.unit, 'A'), 'double'); |
| 1043 } | 995 } |
| 1044 } | 996 } |
| 1045 | 997 |
| 1046 test_removeFile_changeFile_notAnalyzed() async { | 998 test_removeFile_changeFile_notAnalyzed() async { |
| 1047 _addTestFile('main() {}'); | 999 addTestFile('main() {}'); |
| 1048 | 1000 |
| 1049 // We have a result. | 1001 // We have a result. |
| 1050 await _waitForIdle(); | 1002 await _waitForIdle(); |
| 1051 expect(allResults, hasLength(1)); | 1003 expect(allResults, hasLength(1)); |
| 1052 expect(allResults[0].path, testFile); | 1004 expect(allResults[0].path, testFile); |
| 1053 allResults.clear(); | 1005 allResults.clear(); |
| 1054 | 1006 |
| 1055 // Remove the file and send the change notification. | 1007 // Remove the file and send the change notification. |
| 1056 // The change notification does nothing, because the file is explicitly | 1008 // The change notification does nothing, because the file is explicitly |
| 1057 // or implicitly analyzed. | 1009 // or implicitly analyzed. |
| 1058 driver.removeFile(testFile); | 1010 driver.removeFile(testFile); |
| 1059 driver.changeFile(testFile); | 1011 driver.changeFile(testFile); |
| 1060 | 1012 |
| 1061 await _waitForIdle(); | 1013 await _waitForIdle(); |
| 1062 expect(allResults, isEmpty); | 1014 expect(allResults, isEmpty); |
| 1063 } | 1015 } |
| 1064 | 1016 |
| 1065 test_results_priority() async { | 1017 test_results_priority() async { |
| 1066 String content = 'int f() => 42;'; | 1018 String content = 'int f() => 42;'; |
| 1067 _addTestFile(content, priority: true); | 1019 addTestFile(content, priority: true); |
| 1068 | 1020 |
| 1069 await _waitForIdle(); | 1021 await _waitForIdle(); |
| 1070 | 1022 |
| 1071 expect(allResults, hasLength(1)); | 1023 expect(allResults, hasLength(1)); |
| 1072 AnalysisResult result = allResults.single; | 1024 AnalysisResult result = allResults.single; |
| 1073 expect(result.path, testFile); | 1025 expect(result.path, testFile); |
| 1074 expect(result.uri.toString(), 'package:test/test.dart'); | 1026 expect(result.uri.toString(), 'package:test/test.dart'); |
| 1075 expect(result.content, content); | 1027 expect(result.content, content); |
| 1076 expect(result.contentHash, _md5(content)); | 1028 expect(result.contentHash, _md5(content)); |
| 1077 expect(result.unit, isNotNull); | 1029 expect(result.unit, isNotNull); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1098 | 1050 |
| 1099 expect(allResults, hasLength(3)); | 1051 expect(allResults, hasLength(3)); |
| 1100 AnalysisResult result = allResults[0]; | 1052 AnalysisResult result = allResults[0]; |
| 1101 expect(result.path, b); | 1053 expect(result.path, b); |
| 1102 expect(result.unit, isNotNull); | 1054 expect(result.unit, isNotNull); |
| 1103 expect(result.errors, hasLength(0)); | 1055 expect(result.errors, hasLength(0)); |
| 1104 } | 1056 } |
| 1105 | 1057 |
| 1106 test_results_regular() async { | 1058 test_results_regular() async { |
| 1107 String content = 'int f() => 42;'; | 1059 String content = 'int f() => 42;'; |
| 1108 _addTestFile(content); | 1060 addTestFile(content); |
| 1109 await _waitForIdle(); | 1061 await _waitForIdle(); |
| 1110 | 1062 |
| 1111 expect(allResults, hasLength(1)); | 1063 expect(allResults, hasLength(1)); |
| 1112 AnalysisResult result = allResults.single; | 1064 AnalysisResult result = allResults.single; |
| 1113 expect(result.path, testFile); | 1065 expect(result.path, testFile); |
| 1114 expect(result.uri.toString(), 'package:test/test.dart'); | 1066 expect(result.uri.toString(), 'package:test/test.dart'); |
| 1115 expect(result.content, isNull); | 1067 expect(result.content, isNull); |
| 1116 expect(result.contentHash, _md5(content)); | 1068 expect(result.contentHash, _md5(content)); |
| 1117 expect(result.unit, isNull); | 1069 expect(result.unit, isNull); |
| 1118 expect(result.errors, hasLength(0)); | 1070 expect(result.errors, hasLength(0)); |
| 1119 } | 1071 } |
| 1120 | 1072 |
| 1121 test_results_status() async { | 1073 test_results_status() async { |
| 1122 _addTestFile('int f() => 42;'); | 1074 addTestFile('int f() => 42;'); |
| 1123 await _waitForIdle(); | 1075 await _waitForIdle(); |
| 1124 | 1076 |
| 1125 expect(allStatuses, hasLength(2)); | 1077 expect(allStatuses, hasLength(2)); |
| 1126 expect(allStatuses[0].isAnalyzing, isTrue); | 1078 expect(allStatuses[0].isAnalyzing, isTrue); |
| 1127 expect(allStatuses[0].isIdle, isFalse); | 1079 expect(allStatuses[0].isIdle, isFalse); |
| 1128 expect(allStatuses[1].isAnalyzing, isFalse); | 1080 expect(allStatuses[1].isAnalyzing, isFalse); |
| 1129 expect(allStatuses[1].isIdle, isTrue); | 1081 expect(allStatuses[1].isIdle, isTrue); |
| 1130 } | 1082 } |
| 1131 | 1083 |
| 1132 void _addTestFile(String content, {bool priority: false}) { | |
| 1133 provider.newFile(testFile, content); | |
| 1134 driver.addFile(testFile); | |
| 1135 if (priority) { | |
| 1136 driver.priorityFiles = [testFile]; | |
| 1137 } | |
| 1138 } | |
| 1139 | |
| 1140 ClassDeclaration _getClass(CompilationUnit unit, String name) { | 1084 ClassDeclaration _getClass(CompilationUnit unit, String name) { |
| 1141 for (CompilationUnitMember declaration in unit.declarations) { | 1085 for (CompilationUnitMember declaration in unit.declarations) { |
| 1142 if (declaration is ClassDeclaration) { | 1086 if (declaration is ClassDeclaration) { |
| 1143 if (declaration.name.name == name) { | 1087 if (declaration.name.name == name) { |
| 1144 return declaration; | 1088 return declaration; |
| 1145 } | 1089 } |
| 1146 } | 1090 } |
| 1147 } | 1091 } |
| 1148 fail('Cannot find the class $name in\n$unit'); | 1092 fail('Cannot find the class $name in\n$unit'); |
| 1149 return null; | 1093 return null; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1226 String _p(String path) => provider.convertPath(path); | 1170 String _p(String path) => provider.convertPath(path); |
| 1227 | 1171 |
| 1228 Future<Null> _waitForIdle() async { | 1172 Future<Null> _waitForIdle() async { |
| 1229 await idleStatusMonitor.signal; | 1173 await idleStatusMonitor.signal; |
| 1230 } | 1174 } |
| 1231 | 1175 |
| 1232 static String _md5(String content) { | 1176 static String _md5(String content) { |
| 1233 return hex.encode(md5.convert(UTF8.encode(content)).bytes); | 1177 return hex.encode(md5.convert(UTF8.encode(content)).bytes); |
| 1234 } | 1178 } |
| 1235 } | 1179 } |
| 1236 | |
| 1237 class _Monitor { | |
| 1238 Completer<Null> _completer = new Completer<Null>(); | |
| 1239 | |
| 1240 Future<Null> get signal async { | |
| 1241 await _completer.future; | |
| 1242 _completer = new Completer<Null>(); | |
| 1243 } | |
| 1244 | |
| 1245 void notify() { | |
| 1246 if (!_completer.isCompleted) { | |
| 1247 _completer.complete(null); | |
| 1248 } | |
| 1249 } | |
| 1250 } | |
| OLD | NEW |