The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/env perl

use Test::More tests => 26;

use strict;
use warnings;

use XML::TreePuller;

my $puller = new_puller();

ok(defined($puller->reader));
ok(ref($puller->reader) eq 'XML::LibXML::Reader');

my $element = $puller->next;
ok(defined($element));
ok(ref($element) eq 'XML::TreePuller::Element');

ok($element->name eq 'element');
ok($element->text eq 'barbiddlemore biddle');

ok(ref($element->attribute) eq 'HASH');
ok($element->attribute->{one} eq '1');
ok(defined($element->attribute('one')));
ok($element->attribute('one') eq '1');
ok(! defined($element->attribute('bogus')));

my @results = $element->get_elements('baz');
ok(scalar(@results) == 2);
foreach (@results) {
	ok(ref($_) eq 'XML::TreePuller::Element');
}
ok($results[0]->text eq 'biddle');
ok($results[1]->text eq 'more biddle');
ok($element->get_elements() != $element);

$element = $element->get_elements('baz');
ok(defined($element));
ok(ref($element) eq 'XML::TreePuller::Element');
ok($element->text eq 'biddle');


#double check the next() method for the array interface
#since it did not get tested above
$puller = new_puller();
undef($element);
my $path;


($path, $element) = $puller->next;
ok($path eq '/element');
ok(ref($element) eq 'XML::TreePuller::Element');
ok($element->name eq 'element');
ok(! defined($puller->next));

sub new_puller {
	my $puller = XML::TreePuller->new(location => 't/data/10-smallelement.xml');
	ok(defined($puller));
	
	$puller->iterate_at('/element' => 'subtree');
		
	return $puller;
}