BPM-Engine
view release on metacpan or search on metacpan
t/04-run/02-runner.t view on Meta::CPAN
test_state(completed => [qw/B C DC E MC SM/], active => [qw/End/], deferred => [qw/End/]);
complete_active(); # complete End
test_state(completed => [qw/B C DC E End End MC SM/], active => [qw//], deferred => [qw//]);
is($pi->workflow_instance->state->name, 'closed.completed');
}
diag('General Synchronizing Merge');
if(1) {
my $params = { multi_choice => 'B,XOR', deferred_choice => undef };
($runner, $process, $pi) = runner($engine, 'wcp38', $params);
$pi->apply_transition('start');
my $act = $process->start_activities->[0];
my $aiMC = $act->new_instance({
process_instance_id => $pi->id
});
is($aiMC->workflow_instance->state->name, 'open.not_running.ready');
$runner->start_activity($act, $aiMC, 1);
is($aiMC->workflow_instance->state->name, 'open.running.assigned');
complete_active(); # complete MC
$aiMC->discard_changes();
is($aiMC->workflow_instance->state->name, 'closed.completed');
is($aiMC->state, 'closed.completed');
test_state(completed => ['MC'], active => ['B','XOR'], deferred => []);
complete_active(); # complete XOR + B
test_state(completed => ['MC','B','XOR'], active => ['C'], deferred => ['SM']);
complete_active(); # complete C
test_state(completed => ['MC','B','XOR','C'], active => ['DC'], deferred => ['SM']);
complete_active(); # complete DC, back to XOR
test_state(completed => ['MC','B','XOR','C','DC'], active => ['XOR'], deferred => ['SM']);
complete_active(); # complete XOR2
test_state(completed => ['B','C','DC','MC','XOR','XOR'], active => ['C'], deferred => ['SM']);
complete_active(); # complete C
test_state(completed => ['B','C','C','DC','MC','XOR','XOR'], active => ['DC'], deferred => ['SM']);
if(1) {
$pi->attribute(deferred_choice => 'D');
complete_active(); # complete DC, follow to D
test_state(completed => ['B','C','C','DC','DC','MC','XOR','XOR'], active => ['D'], deferred => ['SM']);
complete_active(); # complete D
#test_state(completed => [qw/B C C D DC DC MC SM XOR XOR/], active => ['SM'], deferred => []);
test_state(completed => [qw/B C C D DC DC MC XOR XOR/], active => ['SM'], deferred => ['SM']);
complete_active(); # complete SM
test_state(completed => [qw/B C C D DC DC MC SM SM XOR XOR/], active => ['End'], deferred => []);
}
else {
$pi->attribute(deferred_choice => 'E');
complete_active(); # complete DC, follow DC-E
# path D was blocked, deferred SM now enabled (path D blocked in MC-localJoin), so should fire and execute
test_state(completed => [qw/B C C DC DC MC XOR XOR/], active => ['E','SM'], deferred => []);
complete_active(); # complete E+SM
test_state(completed => [qw/B C C DC DC E End MC SM XOR XOR/], active => ['End'], deferred => []);
complete_active(); # complete End
test_state(completed => [qw/B C C DC DC E End End MC SM XOR XOR/], active => [], deferred => []);
}
}
diag('Nested Loops');
if(1) {
#dc->join->states
#C-DC closes cycle, sets prev DC.join(XOR) to 'joined'
my $params = { inner_loop => 1, outer_loop => 1 };
($runner, $process, $pi) = runner($engine, 'wcp10b2', $params);
$pi->apply_transition('start');
my $act = $process->start_activities->[0];
my $ai = $act->new_instance({
process_instance_id => $pi->id
});
is($ai->workflow_instance->state->name, 'open.not_running.ready');
$runner->start_activity($act, $ai, 1);
is($ai->workflow_instance->state->name, 'open.running.assigned');
complete_active(); # complete Start
test_state(completed => [qw/Start/], active => [qw/A/], deferred => []);
complete_active(); # complete A-Join1
test_state(completed => [qw/Start A/], active => [qw/B/], deferred => []);
complete_active(); # complete B-Join2
test_state(completed => [qw/Start A B/], active => [qw/C/], deferred => []);
if(1) {
complete_active(); # complete C-Split2, back to B-Join2 AND forward to D-Split1
test_state(completed => [qw/Start A B C/], active => [qw/B D/], deferred => []);
complete_active(); # complete B+D
test_state(completed => [qw/Start A B C B D/], active => [qw/A C/], deferred => []);
$pi->attribute(inner_loop => 0);
complete_active(); # complete A+C
test_state(completed => [qw/Start A B C B D A C/], active => [qw/B D/], deferred => []);
complete_active(); # complete B+D
test_state(completed => [qw/Start A B C B D A C B D/], active => [qw/C A/], deferred => []);
complete_active(); # complete C+A
test_state(completed => [qw/Start A B C B D A C B D C A/], active => [qw/D B/], deferred => []);
$pi->attribute(outer_loop => 0);
complete_active(); # complete B+D
test_state(completed => [qw/Start A B C B D A C B D C A B D/], active => [qw/C End/], deferred => []);
( run in 0.853 second using v1.01-cache-2.11-cpan-39bf76dae61 )