The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

########################################################################
# test whether the debug-mode dispatcher works properly (via jobcount
# of zero).
########################################################################

use v5.10;
use strict;

use Test::More;

use Symbol          qw( qualify_to_ref  );

use Parallel::Queue qw( fork );

ok __PACKAGE__->can( 'runqueue' ), "Installed 'runqueue'";

########################################################################
# create and remove files.

my $dir     = './tmp/';

-d $dir || mkdir $dir, 0770
or die "Roadkill: '$0' unable to make '$dir': $!";

my @filz = map { $dir . $_ } ( 'aa' .. 'at' );

eval { unlink @filz };

my @pass_1
= map
{
    my $path = $_;
    sub
    {
        open my $fh, '>', $path
        or die "Open: '$path', $!";

        0
    }
}
@filz;

my @pass_2
= map
{
    my $path = $_;
    sub
    {
        unlink $path
        or die "Unlink: $path: $!";

        0
    }
}
@filz;

for my $name ( qw( run_nofork ) )
{
    my $ref = qualify_to_ref $name, 'Parallel::Queue';

    undef &{ *$ref };

    *$ref   = sub { BAIL_OUT "Fork tests using run_nofork" };
}

########################################################################
# run in debug mode without forking/threading off
# the individual jobs.

my @buffer  = ();
my $n       = 0;

for my $i ( 1, 4 )
{
    @buffer = runqueue $i, @pass_1;
    $n      = @buffer;

    ok ! $n, "Pass 1 jobs remaining: $n (n=$i)";

    @buffer = grep { -e } @filz;

    ok @buffer ~~ @filz, "Files created (n=$i)";

    @buffer = runqueue $i, @pass_2;
    $n      = @buffer;

    ok ! $n, "Pass 2 jobs remaining: $n (n=$i)";

    @buffer = grep { -e } @filz;

    ok ! @buffer,  "Files removed (n=$i)";
}

eval { unlink glob "./tmp/$$*"; };
eval { rmdir "./tmp" };

done_testing;

########################################################################
# cleanup on the way out

eval
{
    unlink @filz;
};

__END__