use strict;
use warnings;

use Test::More;

use_ok 'Parallel::Subs';

my @tests = (
    {},
    { max_process         => 1 },
    { max_process_per_cpu => 2 },
    { max_memory          => 128 },
);

foreach my $opts (@tests) {

    my $p = Parallel::Subs->new(%$opts);
    isa_ok $p, 'Parallel::Subs', "new with " . join( ' => ', %$opts );
    ok $p->add( sub { 1 } ),        "can add a scalar job";
    ok $p->add( sub { "string"; } ), "can add a string job";
    ok $p->add( sub { { hash => 42 }; } ), "can add a hash job";
    ok $p->add( sub { [ 1 .. 5 ]; } ), "can add an array job";
    ok $p->run(), "can run test in parallel";

    is_deeply $p->results(),
      [
        1, 'string',
        { 'hash' => 42 },
        [
            1,
            2,
            3,
            4,
            5
        ]
      ],
      "can get results from jobs";
}

# create a new object
my $p = Parallel::Subs->new();

for my $job (qw/a list of jobs to run/) {
    ok $p->add( sub { compute_this_job($job); } ), "can add job $job";
}

ok $p->run(), "can run test in parallel";

is_deeply $p->results(),
  [
    {
        'time'                => 1,
        'job'                 => 'a',
        'your data key for a' => 1
    },
    {
        'time'                   => 1,
        'job'                    => 'list',
        'your data key for list' => 4
    },
    {
        'time'                 => 2,
        'your data key for of' => 2,
        'job'                  => 'of'
    },
    {
        'time'                   => 1,
        'your data key for jobs' => 4,
        'job'                    => 'jobs'
    },
    {
        'your data key for to' => 2,
        'time'                 => 2,
        'job'                  => 'to'
    },
    {
        'your data key for run' => 3,
        'time'                  => 0,
        'job'                   => 'run'
    }
  ],
  "can get results for all tests";

done_testing;
exit;

sub compute_this_job {
    my $job = shift || '';

    my $time = int( length($job) % 3 );

    # start some job
    sleep($time);
    print '- finish job ' . $job . "\n";

    # will never stop at the same time
    return {
        job    => $job, 'your data key for ' . $job => length($job),
        'time' => $time
    };
}


