summaryrefslogtreecommitdiff
path: root/t/17callbacks.t
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2020-01-20 10:50:34 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2020-01-20 10:50:34 +0900
commitf228e79b87b7c5271c468f709e82c3f7d3305a3d (patch)
treeab2ae0ac32b5ef610a3901505b73d2fb6ce7daab /t/17callbacks.t
parentaf87c453a812a912c6585a6171e461a254bc9fc0 (diff)
downloadperl-XML-LibXML-f228e79b87b7c5271c468f709e82c3f7d3305a3d.tar.gz
perl-XML-LibXML-f228e79b87b7c5271c468f709e82c3f7d3305a3d.tar.bz2
perl-XML-LibXML-f228e79b87b7c5271c468f709e82c3f7d3305a3d.zip
Imported Upstream version 2.0134upstream/2.0134
Diffstat (limited to 't/17callbacks.t')
-rw-r--r--t/17callbacks.t322
1 files changed, 322 insertions, 0 deletions
diff --git a/t/17callbacks.t b/t/17callbacks.t
new file mode 100644
index 0000000..dafaee0
--- /dev/null
+++ b/t/17callbacks.t
@@ -0,0 +1,322 @@
+# $Id$
+
+use strict;
+use warnings;
+
+use lib './t/lib';
+use TestHelpers qw(slurp);
+use Counter;
+use Stacker;
+
+# Should be 25.
+use Test::More tests => 25;
+use XML::LibXML;
+
+sub _create_counter_pair
+{
+ my ($worker_cb, $predicate_cb) = @_;
+
+ my $non_global_counter = Counter->new(
+ {
+ gen_cb => sub {
+ my $inc_cb = shift;
+ return sub {
+ return $worker_cb->(
+ sub {
+ if (!$predicate_cb->())
+ {
+ $inc_cb->()
+ }
+ return;
+ }
+ )->(@_);
+ }
+ },
+ }
+ );
+
+ my $global_counter = Counter->new(
+ {
+ gen_cb => sub {
+ my $inc_cb = shift;
+ return sub {
+ return $worker_cb->(
+ sub {
+ if ($predicate_cb->())
+ {
+ $inc_cb->()
+ }
+ return;
+ }
+ )->(@_);
+ }
+ },
+ }
+ );
+
+ return ($non_global_counter, $global_counter);
+}
+
+my ($open1_non_global_counter, $open1_global_counter) =
+ _create_counter_pair(
+ sub {
+ my $cond_cb = shift;
+ return sub {
+ my $fn = shift;
+ # warn("open: $f\n");
+
+ if (open my $fh, '<', $fn)
+ {
+ $cond_cb->();
+ return $fh;
+ }
+ else
+ {
+ return 0;
+ }
+ };
+ },
+ sub { return defined($XML::LibXML::open_cb); },
+ );
+
+my $open2_counter = Counter->new(
+ {
+ gen_cb => sub {
+ my $inc_cb = shift;
+ return sub {
+ my ($fn) = @_;
+ # warn("open2: $_[0]\n");
+
+ $fn =~ s/([^\d])(\.xml)$/${1}4$2/; # use a different file
+ my ($ret, $verdict);
+ if ($verdict = open (my $file, '<', $fn))
+ {
+ $ret = $file;
+ }
+ else
+ {
+ $ret = 0;
+ }
+
+ $inc_cb->();
+
+ return $ret;
+ };
+ },
+ }
+);
+
+my ($match1_non_global_counter, $match1_global_counter) =
+ _create_counter_pair(
+ sub {
+ my $cond_cb = shift;
+ return sub {
+ $cond_cb->();
+
+ return 1;
+ };
+ },
+ sub { return defined($XML::LibXML::match_cb); },
+ );
+
+my ($close1_non_global_counter, $close1_global_counter) =
+ _create_counter_pair(
+ sub {
+ my $cond_cb = shift;
+ return sub {
+ my ($fh) = @_;
+ # warn("open: $f\n");
+
+ $cond_cb->();
+
+ if ($fh)
+ {
+ $fh->close();
+ }
+
+ return 1;
+ };
+ },
+ sub { return defined($XML::LibXML::close_cb); },
+ );
+
+my ($read1_non_global_counter, $read1_global_counter) =
+ _create_counter_pair(
+ sub {
+ my $cond_cb = shift;
+ return sub {
+ my ($fh) = @_;
+ # warn "read!";
+ my $rv = undef;
+ my $n = 0;
+ if ( $fh ) {
+ $n = $fh->read( $rv , $_[1] );
+ if ($n > 0)
+ {
+ $cond_cb->();
+ }
+ }
+ return $rv;
+ };
+ },
+ sub { return defined($XML::LibXML::read_cb); },
+ );
+
+{
+ # first test checks if local callbacks work
+ my $parser = XML::LibXML->new();
+ # TEST
+ ok($parser, 'Parser was initted.');
+
+ $parser->match_callback( $match1_non_global_counter->cb() );
+ $parser->read_callback( $read1_non_global_counter->cb() );
+ $parser->open_callback( $open1_non_global_counter->cb() );
+ $parser->close_callback( $close1_non_global_counter->cb() );
+
+ $parser->expand_xinclude( 1 );
+
+ my $dom = $parser->parse_file("example/test.xml");
+
+ # TEST
+ $read1_non_global_counter->test(2, 'read1 for expand_include called twice.');
+ # TEST
+ $close1_non_global_counter->test(2, 'close1 for expand_include called twice.');
+ # TEST
+ $match1_non_global_counter->test(2, 'match1 for expand_include called twice.');
+
+ # TEST
+ $open1_non_global_counter->test(2, 'expand_include open1 worked.');
+
+ # TEST
+ ok($dom, 'DOM was returned.');
+ # warn $dom->toString();
+
+ my $root = $dom->getDocumentElement();
+
+ my @nodes = $root->findnodes( 'xml/xsl' );
+ # TEST
+ ok( scalar(@nodes), 'Found nodes.' );
+}
+
+{
+ # test per parser callbacks. These tests must not fail!
+
+ my $parser = XML::LibXML->new();
+ my $parser2 = XML::LibXML->new();
+
+ # TEST
+ ok($parser, '$parser was init.');
+ # TEST
+ ok($parser2, '$parser2 was init.');
+
+ $parser->match_callback( $match1_non_global_counter->cb() );
+ $parser->read_callback( $read1_non_global_counter->cb() );
+ $parser->open_callback( $open1_non_global_counter->cb() );
+ $parser->close_callback( $close1_non_global_counter->cb() );
+
+ $parser->expand_xinclude( 1 );
+
+ $parser2->match_callback( \&match2 );
+ $parser2->read_callback( \&read2 );
+ $parser2->open_callback( $open2_counter->cb() );
+ $parser2->close_callback( \&close2 );
+
+ $parser2->expand_xinclude( 1 );
+
+ my $dom1 = $parser->parse_file( "example/test.xml");
+ my $dom2 = $parser2->parse_file("example/test.xml");
+
+ # TEST
+ $read1_non_global_counter->test(2, 'read1 for $parser out of ($parser,$parser2)');
+ # TEST
+ $close1_non_global_counter->test(2, 'close1 for $parser out of ($parser,$parser2)');
+
+ # TEST
+ $match1_non_global_counter->test(2, 'match1 for $parser out of ($parser,$parser2)');
+ # TEST
+ $open1_non_global_counter->test(2, 'expand_include for $parser out of ($parser,$parser2)');
+ # TEST
+ $open2_counter->test(2, 'expand_include for $parser2 out of ($parser,$parser2)');
+ # TEST
+ ok($dom1, '$dom1 was returned');
+ # TEST
+ ok($dom2, '$dom2 was returned');
+
+ my $val1 = ( $dom1->findnodes( "/x/xml/text()") )[0]->string_value();
+ my $val2 = ( $dom2->findnodes( "/x/xml/text()") )[0]->string_value();
+
+ $val1 =~ s/^\s*|\s*$//g;
+ $val2 =~ s/^\s*|\s*$//g;
+
+ # TEST
+
+ is( $val1, "test", ' TODO : Add test name' );
+ # TEST
+ is( $val2, "test 4", ' TODO : Add test name' );
+}
+
+chdir("example/complex") || die "chdir: $!";
+
+my $str = slurp('complex.xml');
+
+{
+ # tests if callbacks are called correctly within DTDs
+ my $parser2 = XML::LibXML->new();
+ $parser2->expand_xinclude( 1 );
+ my $dom = $parser2->parse_string($str);
+ # TEST
+ ok($dom, '$dom was init.');
+}
+
+
+$XML::LibXML::match_cb = $match1_global_counter->cb();
+$XML::LibXML::open_cb = $open1_global_counter->cb();
+$XML::LibXML::read_cb = $read1_global_counter->cb();
+$XML::LibXML::close_cb = $close1_global_counter->cb();
+
+{
+ # tests if global callbacks are working
+ my $parser = XML::LibXML->new();
+ # TEST
+ ok($parser, '$parser was init');
+
+ # TEST
+ ok($parser->parse_string($str), 'parse_string returns a true value.');
+
+ # TEST
+ $open1_global_counter->test(3, 'open1 for global counter.');
+
+ # TEST
+ $match1_global_counter->test(3, 'match1 for global callback.');
+
+ # TEST
+ $close1_global_counter->test(3, 'close1 for global callback.');
+
+ # TEST
+ $read1_global_counter->test(3, 'read1 for global counter.');
+}
+
+sub match2 {
+ # warn "match2: $_[0]\n";
+ return 1;
+}
+
+sub close2 {
+ # warn "close2 $_[0]\n";
+ if ( $_[0] ) {
+ $_[0]->close();
+ }
+ return 1;
+}
+
+sub read2 {
+ # warn "read2!";
+ my $rv = undef;
+ my $n = 0;
+ if ( $_[0] ) {
+ $n = $_[0]->read( $rv , $_[1] );
+ # warn "read!" if $n > 0;
+ }
+ return $rv;
+}
+