| 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.driver_test; | 5 library test.src.task.driver_test; |
| 6 | 6 |
| 7 import 'package:analyzer/src/context/cache.dart'; | 7 import 'package:analyzer/src/context/cache.dart'; |
| 8 import 'package:analyzer/src/context/context.dart'; | 8 import 'package:analyzer/src/context/context.dart'; |
| 9 import 'package:analyzer/src/generated/engine.dart' | 9 import 'package:analyzer/src/generated/engine.dart' |
| 10 hide AnalysisContextImpl, AnalysisTask; | 10 hide AnalysisContextImpl, AnalysisTask; |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 expect(context.getCacheEntry(target).getValue(resultA), 10); | 272 expect(context.getCacheEntry(target).getValue(resultA), 10); |
| 273 expect(context.getCacheEntry(target).getValue(resultB), -2); | 273 expect(context.getCacheEntry(target).getValue(resultB), -2); |
| 274 // compute resultB | 274 // compute resultB |
| 275 expect(analysisDriver.performAnalysisTask(), true); | 275 expect(analysisDriver.performAnalysisTask(), true); |
| 276 expect(context.getCacheEntry(target).getValue(resultA), 10); | 276 expect(context.getCacheEntry(target).getValue(resultA), 10); |
| 277 expect(context.getCacheEntry(target).getValue(resultB), 20); | 277 expect(context.getCacheEntry(target).getValue(resultB), 20); |
| 278 // done | 278 // done |
| 279 expect(analysisDriver.performAnalysisTask(), false); | 279 expect(analysisDriver.performAnalysisTask(), false); |
| 280 } | 280 } |
| 281 | 281 |
| 282 test_performAnalysisTask_recordMemento() { |
| 283 AnalysisTarget target = new TestSource(); |
| 284 ResultDescriptor result = new ResultDescriptor('result', -1); |
| 285 // configure tasks |
| 286 TestAnalysisTask task; |
| 287 TaskDescriptor descriptor = new TaskDescriptor( |
| 288 'task', (context, target) => task, (target) => {}, [result]); |
| 289 task = new TestAnalysisTask(context, target, |
| 290 descriptor: descriptor, |
| 291 memento: 'my mem', |
| 292 results: [result], |
| 293 value: 10); |
| 294 taskManager.addTaskDescriptor(descriptor); |
| 295 context.explicitTargets.add(target); |
| 296 taskManager.addGeneralResult(result); |
| 297 // prepare work order |
| 298 expect(analysisDriver.performAnalysisTask(), true); |
| 299 expect(context.getCacheEntry(target).getValue(result), -1); |
| 300 // compute result |
| 301 expect(analysisDriver.performAnalysisTask(), true); |
| 302 expect(context.getCacheEntry(target).getValue(result), 10); |
| 303 expect(context.getCacheEntry(target).getMemento(result), 'my mem'); |
| 304 // done |
| 305 expect(analysisDriver.performAnalysisTask(), false); |
| 306 } |
| 307 |
| 282 test_performWorkItem_exceptionInTask() { | 308 test_performWorkItem_exceptionInTask() { |
| 283 AnalysisTarget target = new TestSource(); | 309 AnalysisTarget target = new TestSource(); |
| 284 ResultDescriptor result = new ResultDescriptor('result', null); | 310 ResultDescriptor result = new ResultDescriptor('result', null); |
| 285 CaughtException exception = | 311 CaughtException exception = |
| 286 new CaughtException(new AnalysisException(), null); | 312 new CaughtException(new AnalysisException(), null); |
| 287 TestAnalysisTask task; | 313 TestAnalysisTask task; |
| 288 TaskDescriptor descriptor = new TaskDescriptor( | 314 TaskDescriptor descriptor = new TaskDescriptor( |
| 289 'task', (context, target) => task, (target) => {}, [result]); | 315 'task', (context, target) => task, (target) => {}, [result]); |
| 290 task = new TestAnalysisTask(context, target, | 316 task = new TestAnalysisTask(context, target, |
| 291 descriptor: descriptor, exception: exception); | 317 descriptor: descriptor, exception: exception); |
| 292 WorkItem item = new WorkItem(context, target, descriptor); | 318 WorkItem item = new WorkItem(context, target, descriptor, null); |
| 293 | 319 |
| 294 analysisDriver.performWorkItem(item); | 320 analysisDriver.performWorkItem(item); |
| 295 CacheEntry targetEntry = context.getCacheEntry(item.target); | 321 CacheEntry targetEntry = context.getCacheEntry(item.target); |
| 296 expect(targetEntry.exception, exception); | 322 expect(targetEntry.exception, exception); |
| 297 expect(targetEntry.getState(result), CacheState.ERROR); | 323 expect(targetEntry.getState(result), CacheState.ERROR); |
| 298 } | 324 } |
| 299 | 325 |
| 300 test_performWorkItem_noException() { | 326 test_performWorkItem_noException() { |
| 301 AnalysisTarget target = new TestSource(); | 327 AnalysisTarget target = new TestSource(); |
| 302 ResultDescriptor result = new ResultDescriptor('result', null); | 328 ResultDescriptor result = new ResultDescriptor('result', null); |
| 303 TestAnalysisTask task; | 329 TestAnalysisTask task; |
| 304 TaskDescriptor descriptor = new TaskDescriptor( | 330 TaskDescriptor descriptor = new TaskDescriptor( |
| 305 'task', (context, target) => task, (target) => {}, [result]); | 331 'task', (context, target) => task, (target) => {}, [result]); |
| 306 task = new TestAnalysisTask(context, target, descriptor: descriptor); | 332 task = new TestAnalysisTask(context, target, descriptor: descriptor); |
| 307 WorkItem item = new WorkItem(context, target, descriptor); | 333 WorkItem item = new WorkItem(context, target, descriptor, null); |
| 308 | 334 |
| 309 analysisDriver.performWorkItem(item); | 335 analysisDriver.performWorkItem(item); |
| 310 CacheEntry targetEntry = context.getCacheEntry(item.target); | 336 CacheEntry targetEntry = context.getCacheEntry(item.target); |
| 311 expect(targetEntry.exception, isNull); | 337 expect(targetEntry.exception, isNull); |
| 312 expect(targetEntry.getState(result), CacheState.VALID); | 338 expect(targetEntry.getState(result), CacheState.VALID); |
| 313 } | 339 } |
| 314 | 340 |
| 315 test_performWorkItem_preExistingException() { | 341 test_performWorkItem_preExistingException() { |
| 316 AnalysisTarget target = new TestSource(); | 342 AnalysisTarget target = new TestSource(); |
| 317 ResultDescriptor result = new ResultDescriptor('result', null); | 343 ResultDescriptor result = new ResultDescriptor('result', null); |
| 318 TaskDescriptor descriptor = new TaskDescriptor('task', | 344 TaskDescriptor descriptor = new TaskDescriptor('task', |
| 319 (context, target) => new TestAnalysisTask(context, target), | 345 (context, target) => new TestAnalysisTask(context, target), |
| 320 (target) => {}, [result]); | 346 (target) => {}, [result]); |
| 321 CaughtException exception = | 347 CaughtException exception = |
| 322 new CaughtException(new AnalysisException(), null); | 348 new CaughtException(new AnalysisException(), null); |
| 323 WorkItem item = new WorkItem(context, target, descriptor); | 349 WorkItem item = new WorkItem(context, target, descriptor, null); |
| 324 item.exception = exception; | 350 item.exception = exception; |
| 325 | 351 |
| 326 analysisDriver.performWorkItem(item); | 352 analysisDriver.performWorkItem(item); |
| 327 CacheEntry targetEntry = context.getCacheEntry(item.target); | 353 CacheEntry targetEntry = context.getCacheEntry(item.target); |
| 328 expect(targetEntry.exception, exception); | 354 expect(targetEntry.exception, exception); |
| 329 expect(targetEntry.getState(result), CacheState.ERROR); | 355 expect(targetEntry.getState(result), CacheState.ERROR); |
| 330 } | 356 } |
| 331 | 357 |
| 332 test_reset() { | 358 test_reset() { |
| 333 ResultDescriptor inputResult = new ResultDescriptor('input', null); | 359 ResultDescriptor inputResult = new ResultDescriptor('input', null); |
| 334 TaskDescriptor descriptor = new TaskDescriptor('task', | 360 TaskDescriptor descriptor = new TaskDescriptor('task', |
| 335 (context, target) => new TestAnalysisTask(context, target), | 361 (context, target) => new TestAnalysisTask(context, target), |
| 336 (target) => {'one': inputResult.of(target)}, | 362 (target) => {'one': inputResult.of(target)}, |
| 337 [new ResultDescriptor('output', null)]); | 363 [new ResultDescriptor('output', null)]); |
| 338 analysisDriver.currentWorkOrder = | 364 analysisDriver.currentWorkOrder = |
| 339 new WorkOrder(taskManager, new WorkItem(null, null, descriptor)); | 365 new WorkOrder(taskManager, new WorkItem(null, null, descriptor, null)); |
| 340 | 366 |
| 341 analysisDriver.reset(); | 367 analysisDriver.reset(); |
| 342 expect(analysisDriver.currentWorkOrder, isNull); | 368 expect(analysisDriver.currentWorkOrder, isNull); |
| 343 } | 369 } |
| 344 | 370 |
| 345 /** | 371 /** |
| 346 * [complete] is `true` if the value of the result has already been computed. | 372 * [complete] is `true` if the value of the result has already been computed. |
| 347 * [priorityTarget] is `true` if the target is in the list of priority | 373 * [priorityTarget] is `true` if the target is in the list of priority |
| 348 * targets. | 374 * targets. |
| 349 * [priorityResult] is `true` if the result should only be computed for | 375 * [priorityResult] is `true` if the result should only be computed for |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 } | 413 } |
| 388 | 414 |
| 389 @reflectiveTest | 415 @reflectiveTest |
| 390 class WorkItemTest extends EngineTestCase { | 416 class WorkItemTest extends EngineTestCase { |
| 391 test_buildTask_complete() { | 417 test_buildTask_complete() { |
| 392 AnalysisContext context = new AnalysisContextImpl(); | 418 AnalysisContext context = new AnalysisContextImpl(); |
| 393 AnalysisTarget target = new TestSource(); | 419 AnalysisTarget target = new TestSource(); |
| 394 TaskDescriptor descriptor = new TaskDescriptor('task', | 420 TaskDescriptor descriptor = new TaskDescriptor('task', |
| 395 (context, target) => new TestAnalysisTask(context, target), | 421 (context, target) => new TestAnalysisTask(context, target), |
| 396 (target) => {}, [new ResultDescriptor('output', null)]); | 422 (target) => {}, [new ResultDescriptor('output', null)]); |
| 397 WorkItem item = new WorkItem(context, target, descriptor); | 423 Object memento = new Object(); |
| 424 WorkItem item = new WorkItem(context, target, descriptor, memento); |
| 398 AnalysisTask task = item.buildTask(); | 425 AnalysisTask task = item.buildTask(); |
| 399 expect(task, isNotNull); | 426 expect(task, isNotNull); |
| 427 expect(task.inputMemento, memento); |
| 400 } | 428 } |
| 401 | 429 |
| 402 test_buildTask_incomplete() { | 430 test_buildTask_incomplete() { |
| 403 AnalysisContext context = new AnalysisContextImpl(); | 431 AnalysisContext context = new AnalysisContextImpl(); |
| 404 AnalysisTarget target = new TestSource(); | 432 AnalysisTarget target = new TestSource(); |
| 405 ResultDescriptor inputResult = new ResultDescriptor('input', null); | 433 ResultDescriptor inputResult = new ResultDescriptor('input', null); |
| 406 List<ResultDescriptor> outputResults = | 434 List<ResultDescriptor> outputResults = |
| 407 <ResultDescriptor>[new ResultDescriptor('output', null)]; | 435 <ResultDescriptor>[new ResultDescriptor('output', null)]; |
| 408 TaskDescriptor descriptor = new TaskDescriptor('task', (context, target) => | 436 TaskDescriptor descriptor = new TaskDescriptor('task', (context, target) => |
| 409 new TestAnalysisTask(context, target, results: outputResults), | 437 new TestAnalysisTask(context, target, results: outputResults), |
| 410 (target) => {'one': inputResult.of(target)}, outputResults); | 438 (target) => {'one': inputResult.of(target)}, outputResults); |
| 411 WorkItem item = new WorkItem(context, target, descriptor); | 439 WorkItem item = new WorkItem(context, target, descriptor, null); |
| 412 expect(() => item.buildTask(), throwsStateError); | 440 expect(() => item.buildTask(), throwsStateError); |
| 413 } | 441 } |
| 414 | 442 |
| 415 test_create() { | 443 test_create() { |
| 416 AnalysisContext context = new AnalysisContextImpl(); | 444 AnalysisContext context = new AnalysisContextImpl(); |
| 417 AnalysisTarget target = new TestSource(); | 445 AnalysisTarget target = new TestSource(); |
| 446 Object memento = new Object(); |
| 418 TaskDescriptor descriptor = new TaskDescriptor( | 447 TaskDescriptor descriptor = new TaskDescriptor( |
| 419 'task', null, (target) => {}, [new ResultDescriptor('result', null)]); | 448 'task', null, (target) => {}, [new ResultDescriptor('result', null)]); |
| 420 WorkItem item = new WorkItem(context, target, descriptor); | 449 WorkItem item = new WorkItem(context, target, descriptor, memento); |
| 421 expect(item, isNotNull); | 450 expect(item, isNotNull); |
| 422 expect(item.context, context); | 451 expect(item.context, context); |
| 423 expect(item.descriptor, descriptor); | 452 expect(item.descriptor, descriptor); |
| 453 expect(item.memento, memento); |
| 424 expect(item.target, target); | 454 expect(item.target, target); |
| 425 } | 455 } |
| 426 | 456 |
| 427 test_gatherInputs_complete() { | 457 test_gatherInputs_complete() { |
| 428 TaskManager manager = new TaskManager(); | 458 TaskManager manager = new TaskManager(); |
| 429 AnalysisContext context = new AnalysisContextImpl(); | 459 AnalysisContext context = new AnalysisContextImpl(); |
| 430 AnalysisTarget target = new TestSource(); | 460 AnalysisTarget target = new TestSource(); |
| 431 TaskDescriptor descriptor = new TaskDescriptor('task', | 461 TaskDescriptor descriptor = new TaskDescriptor('task', |
| 432 (context, target) => new TestAnalysisTask(context, target), | 462 (context, target) => new TestAnalysisTask(context, target), |
| 433 (target) => {}, [new ResultDescriptor('output', null)]); | 463 (target) => {}, [new ResultDescriptor('output', null)]); |
| 434 WorkItem item = new WorkItem(context, target, descriptor); | 464 WorkItem item = new WorkItem(context, target, descriptor, null); |
| 435 WorkItem result = item.gatherInputs(manager); | 465 WorkItem result = item.gatherInputs(manager); |
| 436 expect(result, isNull); | 466 expect(result, isNull); |
| 437 expect(item.exception, isNull); | 467 expect(item.exception, isNull); |
| 438 } | 468 } |
| 439 | 469 |
| 440 test_gatherInputs_incomplete() { | 470 test_gatherInputs_incomplete() { |
| 441 TaskManager manager = new TaskManager(); | 471 TaskManager manager = new TaskManager(); |
| 442 AnalysisContext context = new AnalysisContextImpl(); | 472 AnalysisContextImpl context = new AnalysisContextImpl(); |
| 443 AnalysisTarget target = new TestSource(); | 473 AnalysisTarget target = new TestSource(); |
| 444 ResultDescriptor resultA = new ResultDescriptor('resultA', null); | 474 ResultDescriptor resultA = new ResultDescriptor('resultA', null); |
| 445 ResultDescriptor resultB = new ResultDescriptor('resultB', null); | 475 ResultDescriptor resultB = new ResultDescriptor('resultB', null); |
| 476 // prepare tasks |
| 446 TaskDescriptor task1 = new TaskDescriptor('task', (context, target) => | 477 TaskDescriptor task1 = new TaskDescriptor('task', (context, target) => |
| 447 new TestAnalysisTask(context, target, results: [resultA]), | 478 new TestAnalysisTask(context, target, results: [resultA]), |
| 448 (target) => {}, [resultA]); | 479 (target) => {}, [resultA]); |
| 449 TaskDescriptor task2 = new TaskDescriptor('task', | 480 TaskDescriptor task2 = new TaskDescriptor('task', |
| 450 (context, target) => new TestAnalysisTask(context, target), | 481 (context, target) => new TestAnalysisTask(context, target), |
| 451 (target) => {'one': resultA.of(target)}, [resultB]); | 482 (target) => {'one': resultA.of(target)}, [resultB]); |
| 452 manager.addTaskDescriptor(task1); | 483 manager.addTaskDescriptor(task1); |
| 453 manager.addTaskDescriptor(task2); | 484 manager.addTaskDescriptor(task2); |
| 454 WorkItem item = new WorkItem(context, target, task2); | 485 // configure memento for "resultA" |
| 455 expect(item.gatherInputs(manager), isNotNull); | 486 dynamic memento = 'main() {}'; |
| 487 { |
| 488 CacheEntry cacheEntry = context.getCacheEntry(target); |
| 489 cacheEntry.setValue(resultA, null, TargetedResult.EMPTY_LIST, memento); |
| 490 cacheEntry.setState(resultA, CacheState.INVALID); |
| 491 } |
| 492 // gather inputs |
| 493 WorkItem item = new WorkItem(context, target, task2, null); |
| 494 WorkItem inputItem = item.gatherInputs(manager); |
| 495 expect(inputItem, isNotNull); |
| 496 expect(inputItem.memento, memento); |
| 456 } | 497 } |
| 457 | 498 |
| 458 test_gatherInputs_invalid() { | 499 test_gatherInputs_invalid() { |
| 459 TaskManager manager = new TaskManager(); | 500 TaskManager manager = new TaskManager(); |
| 460 AnalysisContext context = new AnalysisContextImpl(); | 501 AnalysisContext context = new AnalysisContextImpl(); |
| 461 AnalysisTarget target = new TestSource(); | 502 AnalysisTarget target = new TestSource(); |
| 462 ResultDescriptor inputResult = new ResultDescriptor('input', null); | 503 ResultDescriptor inputResult = new ResultDescriptor('input', null); |
| 463 TaskDescriptor descriptor = new TaskDescriptor('task', | 504 TaskDescriptor descriptor = new TaskDescriptor('task', |
| 464 (context, target) => new TestAnalysisTask(context, target), | 505 (context, target) => new TestAnalysisTask(context, target), |
| 465 (target) => {'one': inputResult.of(target)}, | 506 (target) => {'one': inputResult.of(target)}, |
| 466 [new ResultDescriptor('output', null)]); | 507 [new ResultDescriptor('output', null)]); |
| 467 WorkItem item = new WorkItem(context, target, descriptor); | 508 WorkItem item = new WorkItem(context, target, descriptor, null); |
| 468 WorkItem result = item.gatherInputs(manager); | 509 WorkItem result = item.gatherInputs(manager); |
| 469 expect(result, isNull); | 510 expect(result, isNull); |
| 470 expect(item.exception, isNotNull); | 511 expect(item.exception, isNotNull); |
| 471 } | 512 } |
| 472 } | 513 } |
| 473 | 514 |
| 474 @reflectiveTest | 515 @reflectiveTest |
| 475 class WorkOrderTest extends EngineTestCase { | 516 class WorkOrderTest extends EngineTestCase { |
| 476 test_create() { | 517 test_create() { |
| 477 TaskManager manager = new TaskManager(); | 518 TaskManager manager = new TaskManager(); |
| 478 TaskDescriptor descriptor = new TaskDescriptor( | 519 TaskDescriptor descriptor = new TaskDescriptor( |
| 479 'task', null, (_) => {}, [new ResultDescriptor('result', null)]); | 520 'task', null, (_) => {}, [new ResultDescriptor('result', null)]); |
| 480 WorkOrder order = | 521 WorkOrder order = |
| 481 new WorkOrder(manager, new WorkItem(null, null, descriptor)); | 522 new WorkOrder(manager, new WorkItem(null, null, descriptor, null)); |
| 482 expect(order, isNotNull); | 523 expect(order, isNotNull); |
| 483 expect(order.currentItem, isNull); | 524 expect(order.currentItem, isNull); |
| 484 expect(order.pendingItems, hasLength(1)); | 525 expect(order.pendingItems, hasLength(1)); |
| 485 expect(order.taskManager, manager); | 526 expect(order.taskManager, manager); |
| 486 } | 527 } |
| 487 | 528 |
| 488 test_moveNext() { | 529 test_moveNext() { |
| 489 TaskManager manager = new TaskManager(); | 530 TaskManager manager = new TaskManager(); |
| 490 TaskDescriptor descriptor = new TaskDescriptor( | 531 TaskDescriptor descriptor = new TaskDescriptor( |
| 491 'task', null, (_) => {}, [new ResultDescriptor('result', null)]); | 532 'task', null, (_) => {}, [new ResultDescriptor('result', null)]); |
| 492 WorkItem workItem = new WorkItem(null, null, descriptor); | 533 WorkItem workItem = new WorkItem(null, null, descriptor, null); |
| 493 WorkOrder order = new WorkOrder(manager, workItem); | 534 WorkOrder order = new WorkOrder(manager, workItem); |
| 494 // "item" has no child items | 535 // "item" has no child items |
| 495 expect(order.moveNext(), isTrue); | 536 expect(order.moveNext(), isTrue); |
| 496 expect(order.current, workItem); | 537 expect(order.current, workItem); |
| 497 // done | 538 // done |
| 498 expect(order.moveNext(), isFalse); | 539 expect(order.moveNext(), isFalse); |
| 499 expect(order.current, isNull); | 540 expect(order.current, isNull); |
| 500 } | 541 } |
| 501 } | 542 } |
| 502 | 543 |
| 503 /** | 544 /** |
| 504 * An [AnalysisContextImpl] which allows to set explicit and implicit targets | 545 * An [AnalysisContextImpl] which allows to set explicit and implicit targets |
| 505 * directly. | 546 * directly. |
| 506 */ | 547 */ |
| 507 class _TestContext extends AnalysisContextImpl { | 548 class _TestContext extends AnalysisContextImpl { |
| 508 @override | 549 @override |
| 509 List<AnalysisTarget> explicitTargets = <AnalysisTarget>[]; | 550 List<AnalysisTarget> explicitTargets = <AnalysisTarget>[]; |
| 510 | 551 |
| 511 @override | 552 @override |
| 512 List<AnalysisTarget> priorityTargets = <AnalysisTarget>[]; | 553 List<AnalysisTarget> priorityTargets = <AnalysisTarget>[]; |
| 513 } | 554 } |
| OLD | NEW |