The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use strict;
use warnings;
use Test::More;
use Carp;

$SIG{__DIE__} = sub { confess @_; };

BEGIN { plan tests => 22 }

use_ok('Cache::Memory');

my $cache = Cache::Memory->new(
		size_limit => 10,
		removal_strategy => 'Cache::RemovalStrategy::FIFO',
	);

is(ref($cache->removal_strategy()), 'Cache::RemovalStrategy::FIFO',
	'Removal strategy set to FIFO');

my $entry1 = $cache->entry('testkey');
my $entry2 = $cache->entry('testkey2');
my $entry3 = $cache->entry('testkey3');

# Test that entry1 is removed when entry2 overfills cache
$entry1->set('012345678');  # 9 bytes
ok($entry1->exists(), 'Entry added');
is($cache->size(), 9, 'Cache size correct');
$entry2->set('0123456'); # 7 bytes
ok($entry2->exists(), 'Second entry added');
ok(!$entry1->exists(), 'First entry removed');
is($cache->size(), 7, 'Cache size correct');

# Test that readding entry1 overfills cache and removes entry2
$entry1->set('012345678'); # 9 bytes
ok($entry1->exists(), 'First entry added');
ok(!$entry2->exists(), 'Second entry removed');
is($cache->size(), 9, 'Cache size correct');

# Test that entry1 is removed after entry2 & entry3 are added and overfill cache
$entry1->remove();
is($cache->size(), 0, 'Cache size correct');

$entry1->set('0123'); # 4 bytes
ok($entry1->exists(), 'First entry added');
$entry2->set('0123'); # 4 bytes
ok($entry1->exists(), 'Second entry added');
is($cache->size(), 8, 'Cache size correct');
$entry3->set('01234'); # 5 bytes
ok($entry3->exists(), 'Third entry added');
ok(!$entry1->exists(), 'First entry removed');
ok($entry2->exists(), 'Second entry remains');
is($cache->size(), 9, 'Cache size correct');

# Test that entry1 is removed even after entry1 is used (FIFO)
$entry1->remove();
$entry2->remove();
$entry3->remove();

$entry1->set('0123'); # 4 bytes
$entry2->set('0123'); # 4 bytes
$entry1->get();

$entry3->set('0123'); # 4 bytes
ok($entry3->exists(), 'Third entry added');
ok(!$entry1->exists(), 'First entry removed');
ok($entry2->exists(), 'Second entry remains');
is($cache->size(), 8, 'Cache size correct');