forked from OpenKore/openkore
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTaskWithSubtaskTest.pm
More file actions
143 lines (115 loc) · 3.32 KB
/
TaskWithSubtaskTest.pm
File metadata and controls
143 lines (115 loc) · 3.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# Unit test for Task::WithSubtask
package TaskWithSubtaskTest;
use Test::More;
use Task::WithSubtask;
use Task::Testing;
sub start {
print "### Starting TaskWithSubtaskTest\n";
testBasicUsage();
testStop();
testSubtaskFailure();
testMutexChanges();
}
sub testBasicUsage {
print "Testing basic usage...\n";
my $task = new TaskWithSubtaskTest::TestTask();
$task->activate();
$task->iterate();
is($task->getStatus(), Task::RUNNING, "Task is running.");
ok(defined $task->getSubtask(), "Task has subtask.");
$task->iterate();
is($task->getStatus(), Task::DONE, "Task is done.");
}
sub testStop {
print "Testing stop()...\n";
my $task = new TaskWithSubtaskTest::TestTask();
$task->activate();
$task->iterate();
$task->stop();
is($task->getStatus(), Task::STOPPED);
$task = new TaskWithSubtaskTest::TestTask(autostop => 0);
$task->activate();
$task->iterate();
$task->stop();
is($task->getStatus(), Task::RUNNING);
$task->iterate();
is($task->getStatus(), Task::DONE);
}
sub testSubtaskFailure {
print "Testing subtask failure...\n";
my $task = new TaskWithSubtaskTest::TestTask(autofail => 0);
$task->activate();
$task->iterate();
is($task->getStatus(), Task::RUNNING, "Task is still running.");
$task->getSubtask()->markFailed();
$task->iterate();
is($task->getStatus(), Task::DONE, "Task is done.");
ok(!defined $task->getError());
my $task = new TaskWithSubtaskTest::TestTask();
$task->activate();
$task->iterate();
$task->getSubtask()->markFailed();
is($task->getStatus(), Task::RUNNING, "Task is still running.");
$task->iterate();
is($task->getStatus(), Task::DONE, "Task is done.");
ok(defined $task->getError());
}
sub testMutexChanges {
print "Testing dynamic mutex changes...\n";
my $task = new Task::Testing(name => 'A', mutexes => ['3'], manageMutexes => 1);
my $subtask = new Task::Testing(name => 'B', mutexes => ['1', '2']);
$task->activate();
is_deeply($task->getMutexes(), ['3']);
$task->setSubtask($subtask);
is_deeply($task->getMutexes(), ['1', '2']);
$task->iterate();
is_deeply($task->getMutexes(), ['1', '2']);
$subtask->markDone();
$task->iterate();
is_deeply($task->getMutexes(), ['3']);
$subtask = new Task::Testing(name => 'B', mutexes => []);
$task->setSubtask($subtask);
is_deeply($task->getMutexes(), []);
$subtask->setMutexes('hello', 'world');
is_deeply($task->getMutexes(), ['hello', 'world']);
$subtask->markDone();
$task->iterate();
is_deeply($task->getMutexes(), ['3']);
}
package TaskWithSubtaskTest::TestTask;
# A test task which has exactly one subtask. It works as follows:
# - The first iteration will switch context to the subtask.
# - The second iteration will run the subtask, which in turn only
# runs one iteration. The task is then complete.
use base qw(Task::WithSubtask);
sub activate {
my ($self) = @_;
$self->SUPER::activate();
$self->{state} = 'Normal';
}
sub iterate {
my ($self) = @_;
return if (!$self->SUPER::iterate());
if ($self->{state} eq 'Normal') {
$self->setSubtask(new TaskWithSubtaskTest::TestSubtask);
$self->{state} = 'Subtask Done';
} else {
$self->setDone();
}
}
package TaskWithSubtaskTest::TestSubtask;
use base qw(Task);
sub iterate {
my ($self) = @_;
$self->SUPER::iterate();
if ($self->{failed}) {
$self->setError(0, "foo");
} else {
$self->setDone();
}
}
sub markFailed {
my ($self) = @_;
$self->{failed} = 1;
}
1;