use Test::More tests => 37; use strict; use warnings; use Data::Dumper; use_ok( 'Tree::RB' ); diag( "Testing Tree::RB $Tree::RB::VERSION" ); foreach my $m (qw[ new put iter rev_iter size ]) { can_ok('Tree::RB', $m); } my $tree = Tree::RB->new; isa_ok($tree, 'Tree::RB'); ok($tree->size == 0, 'New tree has size zero'); $tree->put('France' => 'Paris'); $tree->put('England' => 'London'); $tree->put('Hungary' => 'Budapest'); $tree->put('Ireland' => 'Dublin'); $tree->put('Egypt' => 'Cairo'); $tree->put('Germany' => 'Berlin'); ok($tree->size == 6, 'size check after inserts'); is($tree->min->key, 'Egypt', 'min'); is($tree->max->key, 'Ireland', 'max'); # Iterator tests my $it; $it = $tree->iter; isa_ok($it, 'Tree::RB::Iterator'); can_ok($it, 'next'); my @iter_tests = ( sub { my $node = $_[0]->next; ok($node->key eq 'Egypt' && $node->val eq 'Cairo', 'iterator check'); }, sub { my $node = $_[0]->next; ok($node->key eq 'England' && $node->val eq 'London', 'iterator check'); }, sub { my $node = $_[0]->next; ok($node->key eq 'France' && $node->val eq 'Paris', 'iterator check'); }, sub { my $node = $_[0]->next; ok($node->key eq 'Germany' && $node->val eq 'Berlin', 'iterator check'); }, sub { my $node = $_[0]->next; ok($node->key eq 'Hungary' && $node->val eq 'Budapest', 'iterator check'); }, sub { my $node = $_[0]->next; ok($node->key eq 'Ireland' && $node->val eq 'Dublin', 'iterator check'); }, sub { my $node = $_[0]->next; ok(!defined $node, 'iterator check - no more items'); }, ); foreach my $t (@iter_tests) { $t->($it); } # Reverse iterator tests $it = $tree->rev_iter; isa_ok($it, 'Tree::RB::Iterator'); can_ok($it, 'next'); my @rev_iter_tests = (reverse(@iter_tests[0 .. $#iter_tests-1]), $iter_tests[-1]); =pod Longer way to reverse my @rev_iter_tests = @iter_tests; @rev_iter_tests = (pop @rev_iter_tests, @rev_iter_tests); @rev_iter_tests = reverse @rev_iter_tests; =cut foreach my $t (@rev_iter_tests) { $t->($it); } # seeking my $node; $it = $tree->iter('France'); $node = $it->next; is($node->key, 'France', 'seek check, key exists'); $it = $tree->iter('Iceland'); $node = $it->next; is($node->key, 'Ireland', 'seek check, key does not exist but is lt max key'); $it = $tree->iter('Timbuktu'); $node = $it->next; ok(!defined $node, 'seek check, non existant key gt all keys') or diag(Dumper($node)); # seeking in reverse $it = $tree->rev_iter('Hungary'); $node = $it->next; is($node->key, 'Hungary', 'reverse seek check, key exists'); $node = $it->next; is($node->key, 'Germany', 'reverse seek check, next key lt this one'); $it = $tree->rev_iter('Finland'); $node = $it->next; is($node->key, 'England', 'reverse seek check, key does not exist but is gt min key'); $it = $tree->rev_iter('Albania'); $node = $it->next; ok(!defined $node, 'reverse seek check, non existant key lt all keys'); $tree->put('Timbuktu' => ''); is($tree->get('Timbuktu'), '', 'False values can be stored'); __END__