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 )