The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

use Test::More tests => 19;
BEGIN { use_ok('Tree::Numbered') };

my $tree = Tree::Numbered->new(Place => 'Root', Status => 'superman');
ok ($tree, "constructor");
ok (!$tree->hasField('Value'), "Value not created");

my $child = $tree->append(Place => "First", Status => 'ok');
ok ($child, "append");
is ($tree, $child->getParentRef, "parent assignment");

my @fields = $child->getFieldNames;
my @want_fields = ('Place', 'Status');
ok (eq_set(\@fields, \@want_fields), "Fields ok");
ok ($child->getField('Place') eq 'First', "getField works");
$child->setField('Place', '#1');
ok ($child->getField('Place') eq '#1', "setField works");

my $secChild;
ok ($secChild = $tree->append(), "no fields");
ok ($secChild->getField('Place') eq 'Root', "field inheritance");
ok (!$tree->hasField('Value'), "Value not created when no params");

ok ($secChild = $child->append("First child"), "deep append");
ok ($secChild->hasField('Value'), "Value auto-created");

my $cloned = $tree->clone;
isa_ok($cloned, "Tree::Numbered", "cloning");
isn't ($tree, $cloned->nextNode->getParentRef, "parent assignment in cloning 1");
is ($cloned, $cloned->nextNode->getParentRef, "parent assignment in cloning 2");

@ch1 = sort $cloned->listChildNumbers;
@ch2 = sort $tree->listChildNumbers;
ok(eq_set(\@ch1, \@ch2), "cloning and descendants");
isnt ($cloned->getLuckyNumber, $tree->getLuckyNumber, "lucky numbers are different");

$tree->addField('Special', 'not special');
ok ($tree->getSpecial eq 'not special', "Autoloading and adding fields");

# For more info:
# use Data::Dumper;
# print Dumper($tree);