BPM-Engine

 view release on metacpan or  search on metacpan

t/04-run/12-patterns.t  view on Meta::CPAN

my $DEBUG = 0;

ok(my $engine = BPM::Engine->new(
  #logger => BPM::Engine::Logger->new,
  #log_dispatch_conf => 't/etc/log_screen.conf',
  log_dispatch_conf => {
    class     => 'Log::Dispatch::Screen',
    min_level => $DEBUG ? 'debug' : 'warning',
    stderr    => 1,
    format    => '[%p] %m at %F line %L%n',
    },
  schema => schema(),
  callback => sub {
    my($runner, $entity, $event, $node, $instance) = @_;

    my $act = $entity eq 'process' ? $node->process_uid : $instance->activity->activity_uid;
    #warn "$event $entity $act";
#return 0 if($entity eq 'process' && $event eq 'complete');
    return 1 unless($entity eq 'activity' && $event eq 'execute');

    #isa_ok($node,     'BPM::Engine::Store::Result::ActivityTask');
    #isa_ok($instance, 'BPM::Engine::Store::Result::ActivityInstance');

    my $pi = $instance->process_instance;
    my $taken = $pi->attribute('pathtaken')->value || '';
    $taken = $taken->[0] if(ref($taken));
    $taken .= '-' if $taken;

    my @act = split(/\./, $node->activity_uid);
    my $act_id = pop(@act);
    $pi->attribute('pathtaken', $taken . $act_id);

    # repeat+while loops
    if($pi->process->process_uid =~ /^wcp21/ && $act_id eq 'A') {
        $pi->attribute(cycle => $pi->attribute('cycle')->value - 1);
        }
    # nested-loops
    elsif($pi->process->process_uid eq 'wcp10b2') {
        $pi->attribute(inner_loop => $pi->attribute('inner_loop')->value - 1) if $act_id eq 'B-OR-Join';
        $pi->attribute(outer_loop => $pi->attribute('outer_loop')->value - 1) if $act_id eq 'A-XOR-Join';
        }

    return 1;
    },
  ));
my($package, $process);

##$package = $engine->get_packages({ package_uid => '01-basic.xpdl'})->first;
##$process = $engine->get_process_definitions({ package_id => $package->id, process_uid => 'wcp1' })->first;

#-- basic patterns
if(1) {
$package = $engine->create_package('./t/var/01-basic.xpdl');

# wcp1
diag('sequence');
ok($process = $package->processes({ process_uid => 'wcp1' })->first);
is(sequence_for(), 'A-B-C', 'wcp1 sequence matches');

# wcp2
diag('parallel split (AND-split) and synchronization (AND-join)');
$process = $package->processes({ process_uid => 'wcp2' })->first;
is(sequence_for(), 'A-B-C-D', 'wcp2 sequence matches');

# wcp4
diag('exclusive choice (XOR-split) + simple merge (XOR-join)');
$process = $package->processes({ process_uid => 'wcp4' })->first;
is(sequence_for(WhereToGo => 'B'), 'A-B-E', 'wcp4 sequence matches');
is(sequence_for(WhereToGo => 'C'), 'A-C-E', 'wcp4 sequence matches');
is(sequence_for(), 'A-D-E', 'wcp4 sequence matches');
#} 'no memory leaks';

#*

}

#-- branching & sync
if(1) {
$package = $engine->create_package('./t/var/02-branching.xpdl');

# wcp6
diag('Multiple Choice (OR-split) and Structured Synchronizing Merge (OR-join)');
$process = $package->processes({ process_uid => 'wcp6' })->first;
is(sequence_for(), 'A-GW1-D-GW2-E', 'wcp6 sequence matches');
is(sequence_for(do_B => 0, do_C => 0), 'A-GW1-D-GW2-E', 'wcp6 sequence matches');
is(sequence_for(do_B => 1), 'A-GW1-B-GW2-E', 'wcp6 sequence matches');
is(sequence_for(do_C => 1), 'A-GW1-C-GW2-E', 'wcp6 sequence matches');
is(sequence_for(do_B => 0, do_C => 1), 'A-GW1-C-GW2-E', 'wcp6 sequence matches');
is(sequence_for(do_B => 1, do_C => 1), 'A-GW1-B-C-GW2-E', 'wcp6 sequence matches');

# wcp8
diag('Multi Merge (AND/OR-split + XOR-join)');
$process = $package->processes({ process_uid => 'wcp8' })->first;
throws_ok { sequence_for() } qr/deadlock/i, 'deadlock caught okay'; # OTHERWISE transition missing
is(sequence_for(WhereToGo => 'B'), 'Start-A-B-E-End', 'wcp8 sequence matches');
is(sequence_for(WhereToGo => 'BC'), 'Start-A-B-C-E-E-End-End', 'wcp8 sequence matches');
is(sequence_for(WhereToGo => 'BCD'), 'Start-A-B-C-D-E-E-E-End-End-End', 'wcp8 sequence matches');
}

if(1) {
# wcp37
diag('Local Synchronizing Merge (acyclic OR-splits/joins)');
$process = $package->processes({ process_uid => 'wcp37' })->first;
is(sequence_for(), 'MC-A-SM-End', 'wcp37 sequence matches');
is(sequence_for(multi_choice => 'BC'), 'MC-B-C-DC-E-SM-End', 'wcp37 sequence matches');
is(sequence_for(multi_choice => 'BC', deferred_choice => 'D'), 'MC-B-C-DC-D-SM-End', 'wcp37 sequence matches');

# wcp38
diag('General Synchronizing Merge (cyclic OR-splits/joins)');
$process = $package->processes({ process_uid => 'wcp38' })->first;
is(sequence_for(), 'MC-A-SM-End', 'wcp38 sequence matches');
#is(sequence_for(), 'MC-A-B-C-SM-DC-D-E-SM-End', 'wcp38 sequence matches');
}

#-- iteration
if(1) {
$package = $engine->create_package('./t/var/06-iteration.xpdl');
if(1){
# wcp21
diag('Structured Loop (Pre-Test, while-loop)');
ok($process = $package->processes({ process_uid => 'wcp21a' })->first);



( run in 1.203 second using v1.01-cache-2.11-cpan-f56aa216473 )