1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 22;
use Test::Exception;
BEGIN {
use_ok('Tree::Simple::Visitor::GetAllDescendents');
}
use Tree::Simple;
my $tree = Tree::Simple->new(Tree::Simple->ROOT)
->addChildren(
Tree::Simple->new("1")
->addChildren(
Tree::Simple->new("1.1"),
Tree::Simple->new("1.2")
->addChildren(
Tree::Simple->new("1.2.1"),
Tree::Simple->new("1.2.2")
),
Tree::Simple->new("1.3")
),
Tree::Simple->new("2")
->addChildren(
Tree::Simple->new("2.1"),
Tree::Simple->new("2.2")
),
Tree::Simple->new("3")
->addChildren(
Tree::Simple->new("3.1"),
Tree::Simple->new("3.2"),
Tree::Simple->new("3.3")
),
Tree::Simple->new("4")
->addChildren(
Tree::Simple->new("4.1")
)
);
isa_ok($tree, 'Tree::Simple');
can_ok("Tree::Simple::Visitor::GetAllDescendents", 'new');
my $visitor = Tree::Simple::Visitor::GetAllDescendents->new();
isa_ok($visitor, 'Tree::Simple::Visitor::GetAllDescendents');
isa_ok($visitor, 'Tree::Simple::Visitor');
can_ok($visitor, 'visit');
can_ok($visitor, 'getAllDescendents');
can_ok($visitor, 'setTraversalMethod');
can_ok($visitor, 'setNodeFilter');
$tree->accept($visitor);
is_deeply(
[ $visitor->getAllDescendents() ],
[ qw/1 1.1 1.2 1.2.1 1.2.2 1.3 2 2.1 2.2 3 3.1 3.2 3.3 4 4.1/ ],
'... our descendents match');
can_ok($visitor, 'setNodeFilter');
$visitor->setNodeFilter(sub { "*" . $_[0]->getNodeValue() });
$tree->accept($visitor);
is_deeply(
[ $visitor->getAllDescendents() ],
[ qw/*1 *1.1 *1.2 *1.2.1 *1.2.2 *1.3 *2 *2.1 *2.2 *3 *3.1 *3.2 *3.3 *4 *4.1/ ],
'... our paths descendents again');
use_ok('Tree::Simple::Visitor::BreadthFirstTraversal');
$visitor->setNodeFilter(sub { $_[0]->getNodeValue() });
$visitor->setTraversalMethod(Tree::Simple::Visitor::BreadthFirstTraversal->new());
$tree->accept($visitor);
is_deeply(
[ $visitor->getAllDescendents() ],
[ qw/1 2 3 4 1.1 1.2 1.3 2.1 2.2 3.1 3.2 3.3 4.1 1.2.1 1.2.2/ ],
'... our bredth-first descendents match');
# test some error conditions
throws_ok {
$visitor->visit();
} qr/Insufficient Arguments/, '... this should die';
throws_ok {
$visitor->visit("Fail");
} qr/Insufficient Arguments/, '... this should die';
throws_ok {
$visitor->visit([]);
} qr/Insufficient Arguments/, '... this should die';
throws_ok {
$visitor->visit(bless({}, "Fail"));
} qr/Insufficient Arguments/, '... this should die';
throws_ok {
$visitor->setTraversalMethod();
} qr/Insufficient Arguments/, '... this should die';
throws_ok {
$visitor->setTraversalMethod("Fail");
} qr/Insufficient Arguments/, '... this should die';
throws_ok {
$visitor->setTraversalMethod([]);
} qr/Insufficient Arguments/, '... this should die';
throws_ok {
$visitor->setTraversalMethod(bless({}, "Fail"));
} qr/Insufficient Arguments/, '... this should die';
|