The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#===============================================================================
#
#  DESCRIPTION:  Test flow
#
#       AUTHOR:  Aliaksandr P. Zahatski, <zahatski@gmail.com>
#===============================================================================
#$Id$
package Flow::Count;
use strict;
use warnings;
use Data::Dumper;
use base 'Flow';

sub begin {
    my $self = shift;
    return \@_;
}

sub flow {
    my $self = shift;
    $self->{count}++;
    \@_;
}

sub get_count {
    return $_[0]->{count};
}
1;

package MyFlow;
use base 'Flow';

1;

package main;
use strict;
use warnings;
use Test::More('no_plan');
use Data::Dumper;

#use Flow::Splice;
use_ok('Flow');
use_ok('Flow::Splice');
{
    my @array = ( 1 .. 20 );
    my $flow  = new Flow::Splice:: 10;
    my $count = new Flow::Count::;
    $flow->set_handler($count);
    $flow->run(@array);
    ok $count->{count} = 2, 'run flow ';

    my @a1 = ( 1 .. 21 );
    my $f1 = new Flow::Splice:: 10;
    my $c1 = new Flow::Count::;
    $f1->set_handler($c1);
    $f1->run(@a1);
    ok $c1->{count} = 3, '21 splice by  10';
}

{
    my $flow_count = new Flow::Count::;
    my $f1         = Flow::create_flow(
        'Flow::Splice' => 10,
        $flow_count, 'Flow::Count' => {}
    );
    $f1->run( 1 .. 11 );
    is $flow_count->get_count, 2, "create from mods";
    my $fc1 = new Flow::Count::;
    my $fc2 = new Flow::Count::;
    my $f2 =
      Flow::create_flow( 'Flow::Splice' => 11, $fc1, 'Flow::Splice' => 12 );
    my @flows = Flow::split_flow($f2);
    is scalar(@flows), 3, "split_flow mods1";
    my $f3 =
      Flow::create_flow( 'Flow::Splice' => 13, $fc2, 'Flow::Splice' => 15 );
    is scalar( Flow::split_flow($f3) ), 3, "split_flow mods2";
    my $f4 = Flow::create_flow( $f2, $f3 );
    is scalar( Flow::split_flow($f4) ), 6, "split flow for mod1 and mod2";
    $f4->run( 1 .. 13 );
    is $fc1->get_count(), 2, 'get count: 2';
    is $fc2->get_count(), 1, 'get count 1';

}

1;