The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

use Test::More;
use common::sense;
use Async::ResourcePool;

=head1 TESTS

=over 4

=cut

=item Invalidated resources are not dispatched

Description

=cut

package Resource {
    sub new {
        bless {}, shift;
    }

    sub close {
        shift->{closed} = 1
    }

    sub is_closed {
        shift->{closed} == 1
    }
}

subtest "Invalidated resources are not dispatched" => sub {
    my $pool = Async::ResourcePool->new(
        limit => 1,
        factory => sub {
            my ($pool, $available) = @_;

            $available->(Resource->new);
        }
    );

    our $invalidated;

    $pool->lease(
        sub {
            ($invalidated) = @_;

            # First release the resource...
            $pool->release($invalidated);
        }
    );

    # Then invalidate it.  It's now on the available queue.
    $pool->invalidate($invalidated);

    # Ensure we don't get it.
    $pool->lease(
        sub {
            my ($resource) = @_;

            ok $resource != $invalidated,
            "The given resource is not the one we invalidated."
        }
    );
};

done_testing;