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;

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
#-------------------------------------------------------------------------------