The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test;  #-*-perl-*-
BEGIN { plan test => 4 }

use Tree::Fat;

sub cursor_test {
    my $o = shift->new;
    my @e = qw(a b c d e f g h i j k l m n o p q r s t u v w x y z);
    my $max = $#e;
    for (@e) { $o->insert($_, $_); }

    # forward
    my $c = $o->new_cursor;
    $c->moveto('start');
    for (my $r=0; $r <= @e+2; $r++) {
	my @r=();
#	warn $r;
	for (my $s=0; $s <= $r; $s++) {
	    push(@r, ($c->each(1))[0]);
#	    $c->dump;
	}
	for (my $s=0; $s <= $r; $s++) { 
	    push(@r, ($c->each(-1))[0]);
#	    $c->dump;
	}
	my $mess1 = join('',@r);
	my @tmp = (@e[0..$r], reverse(@e[0..($r-1)]));
	my $mess2 = join('', map {defined $_? $_ : '' } @tmp);
	if ($mess1 ne $mess2) {
	    die "Expecting '$mess2', got '$mess1'";
	}
#	warn "$mess1\n";
    }
    ok(1);

    # backward
    $c->moveto('end');
    for (my $r=0; $r <= @e+2; $r++) {
	my @r=();
#	warn $r;
	for (my $s=0; $s <= $r; $s++) {
	    push(@r, ($c->each(-1))[0]);
#	    warn "each-1\n"; $c->dump;
	}
	for (my $s=0; $s <= $r; $s++) { 
	    push(@r, ($c->each(1))[0]);
#	    warn "each1\n"; $c->dump;
	}
	my $mess1 = join('',@r);
	my $ex = $max-$r;
	my $mess2 = join('', reverse(@e[($ex<0?0:$ex)..$max]),
			 @e[($ex+1<0?0:$ex+1)..$max]);
	if ($mess1 ne $mess2) {
	    die "Expecting '$mess2', got '$mess1'";
	}
#	warn "$mess1\n";
    }
    ok(1);
}

my $p = 'Tree::Fat';
cursor_test($p);
$p->unique(0);
cursor_test($p);