BEGIN { # Magic Perl CORE pragma
if ($ENV{PERL_CORE}) {
chdir 't' if -d 't';
@INC = '../lib';
}
}
use strict;
use warnings;
my %Loaded;
BEGIN {
$Loaded{threads}= eval "use threads; 1";
$Loaded{forks}= eval "use forks; 1" if !$Loaded{threads};
}
use Thread::Queue::Monitored;
use Test::More;
diag "threads loaded" if $Loaded{threads};
diag "forks loaded" if $Loaded{forks};
ok( $Loaded{threads} || $Loaded{forks}, "thread-like module loaded" );
my $class= 'Thread::Queue::Monitored';
can_ok( $class, qw(
dequeue
dequeue_dontwait
dequeue_nb
enqueue
new
self
) );
# initializations
my @list : shared;
my $times= 1000;
# create new queue
check( $class->new( { monitor => \&monitor } ) );
# use existing queue
my ( $q, $t )= Thread::Queue->new;
my $exit= 'exit';
( $q, $t )= $class->new(
{
monitor => 'monitor',
queue => $q,
exit => $exit,
}
);
check( $q, $t, $exit );
# we're done
done_testing( 2 + ( 2 * 3 ) );
#-------------------------------------------------------------------------------
# IN: 1 value to push on list
sub monitor { push( @list, $_[0] ) } #monitor
#-------------------------------------------------------------------------------
# IN: 1 queue
# 2 thread
# 3 exit value
#
# good for 3 tests
sub check {
my ( $q, $t, $exit )= @_;
@list= ();
isa_ok( $q, $class, 'check queue object type' );
$q->enqueue($_) foreach 1 .. $times;
my $pending= $q->pending;
ok( ($pending >= 0 and $pending <= $times),
'check number of values on queue' );
$q->enqueue($exit); # stop monitoring
$t->join;
my $check= '';
$check .= $_ foreach 1 .. $times;
is( join( '', @list ), $check, 'check whether monitoring ok' );
} #check
#-------------------------------------------------------------------------------