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 RocksDB;
use File::Temp;

my $name = File::Temp::tmpnam;

my $db = RocksDB->new($name, { create_if_missing => 1 });
$db->put(foo => 'bar');
$db->put(bar => 'baz');
$db->put(baz => 'foo');

my $iter = $db->new_iterator;
isa_ok $iter, 'RocksDB::Iterator';
$iter->seek_to_first;
ok $iter->valid;
is $iter->key, 'bar';
is $iter->value, 'baz';
$iter->next;
ok $iter->valid;
is $iter->key, 'baz';
is $iter->value, 'foo';
$iter->next;
ok $iter->valid;
is $iter->key, 'foo';
is $iter->value, 'bar';
$iter->next;
ok !$iter->valid;

$iter->seek_to_first;
$iter->seek_to_last;
ok $iter->valid;
is $iter->key, 'foo';
is $iter->value, 'bar';

$iter->seek('baz');
ok $iter->valid;
is $iter->key, 'baz';
is $iter->value, 'foo';

$iter->seek_to_first;
my $i = 0;
while (my ($key, $value) = $iter->each) {
    if ($i == 0) {
        is $key, 'bar';
        is $value, 'baz';
    } elsif ($i == 1) {
        is $key, 'baz';
        is $value, 'foo';
    } elsif ($i == 2) {
        is $key, 'foo';
        is $value, 'bar';
    } else {
        die "BUG: key: $key, value: $value";
    }
    $i++;
}

$iter->seek_to_last;
$i = 0;
while (my ($key, $value) = $iter->reverse_each) {
    if ($i == 0) {
        is $key, 'foo';
        is $value, 'bar';
    } elsif ($i == 1) {
        is $key, 'baz';
        is $value, 'foo';
    } elsif ($i == 2) {
        is $key, 'bar';
        is $value, 'baz';
    } else {
        die "BUG: key: $key, value: $value";
    }
    $i++;
}

done_testing;

END {
    RocksDB->destroy_db($name);
}