The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
BEGIN {				# Magic Perl CORE pragma
    if ($ENV{PERL_CORE}) {
        chdir 't' if -d 't';
        @INC = '../lib';
    }
}

use strict;
use warnings;
use Test::More tests => 4 + (2 * (6 * (2 * 4) + 1));

BEGIN { use_ok('threads') }
BEGIN { use_ok('Thread::Conveyor::Monitored') }

cmp_ok( Thread::Conveyor::Monitored->frequency,'==',1000,
 'check default frequency' );
cmp_ok( Thread::Conveyor::Monitored->frequency( 100 ),'==',100,
 'check setting of default frequency' );

my @list : shared;
my $checkpointed : shared;

diag ( "Monitoring with checkpoints" );

foreach my $optimize (qw(cpu memory)) {
  $checkpointed = 0;

foreach my $times (10,11,9,100,101,99) {

diag ( "$times boxes optimized for $optimize" );

  check( Thread::Conveyor::Monitored->new(
   {
    optimize   => $optimize,
    monitor    => \&monitor,
    checkpoint => \&checkpoint,
    frequency  => 10,
   }
  ),$times );

  my $belt = Thread::Conveyor->new( {optimize => $optimize} );
  my $exit = 'exit';
  my $mbelt = Thread::Conveyor::Monitored->new(
   {
    monitor => 'monitor',
    belt => $belt,
    exit => $exit,
   }
  );
  check( $mbelt,$times,$exit,1 );
} #$times

  cmp_ok( $checkpointed,'==',31,	'check number of checkpoints' );

} #$optimize

sub check {

  my ($mbelt,$times,$exit,$shutdown) = @_;
  my $mthread = $mbelt->thread;
  @list = ();

  isa_ok( $mbelt, 'Thread::Conveyor::Monitored', 'check belt object type' );
  isa_ok( $mthread, 'threads',		'check thread object type' );

  my $belt = $mbelt->belt;
  $mbelt->put( [$_,$_+1] ) foreach 1..$times;
  my $onbelt = $mbelt->onbelt;
  ok( ($onbelt >= 0 and $onbelt <= $times), 'check number of values on belt' );

  $mbelt->shutdown;

  my $check = '';
  $check .= ($_.($_+1)) foreach 1..$times;
  is( join('',@list), $check,		'check whether monitoring ok' );
} #check

sub monitor { push( @list,join('',@{$_[0]}) ) }

sub checkpoint { $checkpointed++ }