The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#-*- mode: perl;-*-

package main;

use constant SIZE => 5;

use Test::More tests => 6+(4*SIZE);
use Algorithm::SkipList 0.70;
ok(1);

my $List = new Algorithm::SkipList;

{
  no warnings;
  ok(!defined $List->first_key); # make sure this returns nothing
}

my @data = sort (0..(SIZE-1)); # test '0' as key for last_key

my %hash = map { $_ => sprintf('%04d', $_); } @data;

ok(SIZE == @data);

foreach (@data) {
  $List->insert($_, $hash{$_});
}
ok($List->size == @data);

# check that next_key works without first_key

foreach (@data) {
  ok($_ eq $List->next_key);
}

# check that first_key/next_key still work
{
  my $i = 0;

  ok($data[$i++] eq $List->first_key);

  while (my $key = $List->next_key) {
    ok($data[$i++] eq $key);
  }
}

# test reset method

{
  ok($data[0] eq $List->first_key);
  $List->reset;
  ok($data[0] eq $List->next_key);
}

$List->reset;

{
  my $i = 0;

  while (my ($key, $value) = $List->next) {
    ok($data[$i++] eq $key);
    ok($hash{$key} eq $value);
  }
}

__END__

$List->reset;

my @prev = reverse @data;

{
  my $i = 0;

  while (my ($key, $value) = $List->prev) {
    print STDERR "\t$key\t$value\n";
#    ok($prev[$i++] eq $key);
#    ok($hash{$key} eq $value);
  }
}