TaskWithSubtaskTest.pm.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:3k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. # Unit test for Task::WithSubtask
  2. package TaskWithSubtaskTest;
  3. use Test::More;
  4. use Task::WithSubtask;
  5. use Task::Testing;
  6. sub start {
  7. print "### Starting TaskWithSubtaskTestn";
  8. testBasicUsage();
  9. testStop();
  10. testSubtaskFailure();
  11. testMutexChanges();
  12. }
  13. sub testBasicUsage {
  14. print "Testing basic usage...n";
  15. my $task = new TaskWithSubtaskTest::TestTask();
  16. $task->activate();
  17. $task->iterate();
  18. is($task->getStatus(), Task::RUNNING, "Task is running.");
  19. ok(defined $task->getSubtask(), "Task has subtask.");
  20. $task->iterate();
  21. is($task->getStatus(), Task::DONE, "Task is done.");
  22. }
  23. sub testStop {
  24. print "Testing stop()...n";
  25. my $task = new TaskWithSubtaskTest::TestTask();
  26. $task->activate();
  27. $task->iterate();
  28. $task->stop();
  29. is($task->getStatus(), Task::STOPPED);
  30. $task = new TaskWithSubtaskTest::TestTask(autostop => 0);
  31. $task->activate();
  32. $task->iterate();
  33. $task->stop();
  34. is($task->getStatus(), Task::RUNNING);
  35. $task->iterate();
  36. is($task->getStatus(), Task::DONE);
  37. }
  38. sub testSubtaskFailure {
  39. print "Testing subtask failure...n";
  40. my $task = new TaskWithSubtaskTest::TestTask(autofail => 0);
  41. $task->activate();
  42. $task->iterate();
  43. is($task->getStatus(), Task::RUNNING, "Task is still running.");
  44. $task->getSubtask()->markFailed();
  45. $task->iterate();
  46. is($task->getStatus(), Task::DONE, "Task is done.");
  47. ok(!defined $task->getError());
  48. my $task = new TaskWithSubtaskTest::TestTask();
  49. $task->activate();
  50. $task->iterate();
  51. $task->getSubtask()->markFailed();
  52. is($task->getStatus(), Task::RUNNING, "Task is still running.");
  53. $task->iterate();
  54. is($task->getStatus(), Task::DONE, "Task is done.");
  55. ok(defined $task->getError());
  56. }
  57. sub testMutexChanges {
  58. print "Testing dynamic mutex changes...n";
  59. my $task = new Task::Testing(name => 'A', mutexes => ['3'], manageMutexes => 1);
  60. my $subtask = new Task::Testing(name => 'B', mutexes => ['1', '2']);
  61. $task->activate();
  62. is_deeply($task->getMutexes(), ['3']);
  63. $task->setSubtask($subtask);
  64. is_deeply($task->getMutexes(), ['1', '2']);
  65. $task->iterate();
  66. is_deeply($task->getMutexes(), ['1', '2']);
  67. $subtask->markDone();
  68. $task->iterate();
  69. is_deeply($task->getMutexes(), ['3']);
  70. $subtask = new Task::Testing(name => 'B', mutexes => []);
  71. $task->setSubtask($subtask);
  72. is_deeply($task->getMutexes(), []);
  73. $subtask->setMutexes('hello', 'world');
  74. is_deeply($task->getMutexes(), ['hello', 'world']);
  75. $subtask->markDone();
  76. $task->iterate();
  77. is_deeply($task->getMutexes(), ['3']);
  78. }
  79. package TaskWithSubtaskTest::TestTask;
  80. # A test task which has exactly one subtask. It works as follows:
  81. # - The first iteration will switch context to the subtask.
  82. # - The second iteration will run the subtask, which in turn only
  83. #   runs one iteration. The task is then complete.
  84. use base qw(Task::WithSubtask);
  85. sub activate {
  86. my ($self) = @_;
  87. $self->SUPER::activate();
  88. $self->{state} = 'Normal';
  89. }
  90. sub iterate {
  91. my ($self) = @_;
  92. return if (!$self->SUPER::iterate());
  93. if ($self->{state} eq 'Normal') {
  94. $self->setSubtask(new TaskWithSubtaskTest::TestSubtask);
  95. $self->{state} = 'Subtask Done';
  96. } else {
  97. $self->setDone();
  98. }
  99. }
  100. package TaskWithSubtaskTest::TestSubtask;
  101. use base qw(Task);
  102. sub iterate {
  103. my ($self) = @_;
  104. $self->SUPER::iterate();
  105. if ($self->{failed}) {
  106. $self->setError(0, "foo");
  107. } else {
  108. $self->setDone();
  109. }
  110. }
  111. sub markFailed {
  112. my ($self) = @_;
  113. $self->{failed} = 1;
  114. }
  115. 1;