Algorithm-SlidingWindow

 view release on metacpan or  search on metacpan

t/basic.t  view on Meta::CPAN

use strict;
use warnings;

use Test::More;

use lib 'lib';
use Algorithm::SlidingWindow;

sub dies_like {
    my ($code, $re) = @_;
    my $ok = eval { $code->(); 1 };
    my $err = $@;

    ok(!$ok, "dies as expected");
    like($err, $re, "error matches");
}


# --- constructor validation ---

dies_like(sub { Algorithm::SlidingWindow->new() }, qr/capacity is required/);
dies_like(sub { Algorithm::SlidingWindow->new(capacity => 0) }, qr/capacity must be > 0/);
dies_like(sub { Algorithm::SlidingWindow->new(capacity => 'x') }, qr/capacity must be a positive integer/);
dies_like(sub { Algorithm::SlidingWindow->new(capacity => 5, nope => 1) }, qr/unknown argument 'nope'/);
dies_like(sub { Algorithm::SlidingWindow->new(capacity => 5, on_evict => 123) }, qr/on_evict must be a CODE reference/);


# --- basic behavior ---

my @evicted;
my $w = Algorithm::SlidingWindow->new(
    capacity => 3,
    on_evict => sub { push @evicted, $_[0] },
);

ok($w->is_empty, "starts empty");
ok(!$w->is_full,  "starts not full");
is($w->capacity, 3, "capacity accessor");
is($w->size, 0, "size starts 0");
is_deeply([ $w->values ], [], "values empty");
is($w->oldest, undef, "oldest empty");
is($w->newest, undef, "newest empty");

$w->add(10);
is($w->size, 1, "size after add 1");
is_deeply([ $w->values ], [10], "values after add 1");
is($w->oldest, 10, "oldest after add 1");
is($w->newest, 10, "newest after add 1");

$w->add(20, 30);
is($w->size, 3, "size at capacity");
ok($w->is_full, "is_full true");
is_deeply([ $w->values ], [10, 20, 30], "values at capacity");
is($w->oldest, 10, "oldest at capacity");
is($w->newest, 30, "newest at capacity");

# eviction behavior: overwrite-oldest
$w->add(40); # evicts 10
is_deeply(\@evicted, [10], "evicted oldest on overflow");
is_deeply([ $w->values ], [20, 30, 40], "values after overflow 1");
is($w->oldest, 20, "oldest after overflow 1");
is($w->newest, 40, "newest after overflow 1");

# multiple add overflow
$w->add(50, 60); # should evict 20 then 30
is_deeply(\@evicted, [10, 20, 30], "evicted in correct order on multi-add");



( run in 2.363 seconds using v1.01-cache-2.11-cpan-cdf2f3d4e48 )