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 => 1 + (2 * (4 * 9));

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

my $file = 'outmonitored';
my $handle;
my $class : shared;

diag( "Monitoring to file" );

foreach my $optimize (qw(cpu memory)) {

foreach my $times (10,100,1000,int(rand(1000))) {

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

  my $mbelt = Thread::Conveyor::Monitored->new(
   {
    optimize => $optimize,
    pre => sub {
                open( $handle,">$_[0]" ) or die "Could not open file";
                $class = ref(Thread::Conveyor::Monitored->belt);
               },
    monitor => sub { print $handle (%{$_[0]}) },
    post => sub {
                 close( $handle ) or die "Could not close file";
                 return 'anydone'
                },
   },
   $file
  );

  isa_ok( $mbelt, 'Thread::Conveyor::Monitored', 'check belt object type' );
  my $thread = $mbelt->thread;
  isa_ok( $thread, 'threads',		'check thread object type' );

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

  threads->yield until $class;
  ok( $class =~ m#^Thread::Conveyor::#,	'check result of ->belt' );

  is( ($mbelt->shutdown)[0],'anydone',	'check result of shutdown' );

  my $check = '';
  $check .= ($_.($_+1)) foreach 1..$times;
  ok( open( my $in,"<$file" ),		'check opening of file' );
  is( join('',<$in>), $check,		'check whether monitoring ok' );
  ok( close( $in ),			'check closing of file' );

  ok( unlink( $file ) );
  1 while unlink $file; # multiversioned filesystems
} #$times

} #$optimize