20_Tree_Simple_Visitor_test.t [plain text]
use strict;
use warnings;
use Test::More tests => 37;
use Test::Exception;
BEGIN {
use_ok('Tree::Simple::Visitor');
};
use Tree::Simple;
my $SIMPLE_SUB = sub { "test sub" };
$SIMPLE_SUB->();
can_ok("Tree::Simple::Visitor", 'new');
my $visitor = Tree::Simple::Visitor->new();
isa_ok($visitor, 'Tree::Simple::Visitor');
my $tree = Tree::Simple->new(Tree::Simple->ROOT)
->addChildren(
Tree::Simple->new("1")
->addChildren(
Tree::Simple->new("1.1"),
Tree::Simple->new("1.2")
->addChild(Tree::Simple->new("1.2.1")),
Tree::Simple->new("1.3")
),
Tree::Simple->new("2"),
Tree::Simple->new("3"),
);
isa_ok($tree, 'Tree::Simple');
$tree->accept($visitor);
can_ok($visitor, 'getResults');
is_deeply(
[ $visitor->getResults() ],
[ qw(1 1.1 1.2 1.2.1 1.3 2 3)],
'... got what we expected');
can_ok($visitor, 'setNodeFilter');
my $node_filter = sub { return "_" . $_[0]->getNodeValue() };
$visitor->setNodeFilter($node_filter);
can_ok($visitor, 'getNodeFilter');
is($visitor->getNodeFilter(), "$node_filter", '... got back what we put in');
$tree->accept($visitor);
is_deeply(
scalar $visitor->getResults(),
[ qw(_1 _1.1 _1.2 _1.2.1 _1.3 _2 _3)],
'... got what we expected');
throws_ok {
$visitor->setNodeFilter();
} qr/Insufficient Arguments/, '... this should die';
throws_ok {
$visitor->setNodeFilter([]);
} qr/Insufficient Arguments/, '... this should die';
can_ok("Tree::Simple::Visitor", 'RECURSIVE');
can_ok("Tree::Simple::Visitor", 'CHILDREN_ONLY');
my $visitor1 = Tree::Simple::Visitor->new($SIMPLE_SUB);
isa_ok($visitor1, 'Tree::Simple::Visitor');
my $visitor2 = Tree::Simple::Visitor->new($SIMPLE_SUB, Tree::Simple::Visitor->CHILDREN_ONLY);
isa_ok($visitor2, 'Tree::Simple::Visitor');
my $visitor3 = Tree::Simple::Visitor->new($SIMPLE_SUB, Tree::Simple::Visitor->RECURSIVE);
isa_ok($visitor3, 'Tree::Simple::Visitor');
throws_ok {
my $test = Tree::Simple::Visitor->new($SIMPLE_SUB, "Fail")
} qr/Insufficient Arguments \: Depth arguement must be either RECURSIVE or CHILDREN_ONLY/,
'... we are expecting this error';
throws_ok {
my $test = Tree::Simple::Visitor->new($SIMPLE_SUB, 100)
} qr/Insufficient Arguments \: Depth arguement must be either RECURSIVE or CHILDREN_ONLY/,
'... we are expecting this error';
throws_ok {
my $test = Tree::Simple::Visitor->new("Fail");
} qr/Insufficient Arguments \: filter function argument must be a subroutine reference/,
'... we are expecting this error';
throws_ok {
my $test = Tree::Simple::Visitor->new([]);
} qr/Insufficient Arguments \: filter function argument must be a subroutine reference/,
'... we are expecting this error';
can_ok($visitor1, 'visit');
throws_ok {
$visitor1->visit();
} qr/Insufficient Arguments \: You must supply a valid Tree\:\:Simple object/,
'... we are expecting this error';
throws_ok {
$visitor1->visit("Fail");
} qr/Insufficient Arguments \: You must supply a valid Tree\:\:Simple object/,
'... we are expecting this error';
throws_ok {
$visitor1->visit([]);
} qr/Insufficient Arguments \: You must supply a valid Tree\:\:Simple object/,
'... we are expecting this error';
my $BAD_OBJECT = bless({}, "Test");
throws_ok {
$visitor1->visit($BAD_OBJECT);
} qr/Insufficient Arguments \: You must supply a valid Tree\:\:Simple object/,
'... we are expecting this error';
my $tree1 = Tree::Simple->new(Tree::Simple->ROOT)
->addChildren(
Tree::Simple->new("1.0"),
Tree::Simple->new("2.0"),
Tree::Simple->new("3.0"),
);
isa_ok($tree1, 'Tree::Simple');
cmp_ok($tree1->getChildCount(), '==', 3, '... there are 3 children here');
lives_ok {
$tree1->accept($visitor1);
} '.. this passes fine';
lives_ok {
$tree1->accept($visitor2);
} '.. this passes fine';
lives_ok {
$tree1->accept($visitor3);
} '.. this passes fine';
{
my $visitor = Tree::Simple::Visitor->new();
ok(!$visitor->includeTrunk(), '... this should be false right now');
$visitor->includeTrunk("true");
ok($visitor->includeTrunk(), '... this should be true now');
$visitor->includeTrunk(undef);
ok($visitor->includeTrunk(), '... this should be true still');
$visitor->includeTrunk("");
ok(!$visitor->includeTrunk(), '... this should be false again');
}
{
my $visitor = Tree::Simple::Visitor->new();
my $filter = sub { "filter" };
$visitor->setNodeFilter($filter);
is($visitor->getNodeFilter(), $filter, 'our node filter is set correctly');
$visitor->clearNodeFilter();
ok(! defined($visitor->getNodeFilter()), '... our node filter has now been undefined');
}