diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2020-01-20 10:50:34 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2020-01-20 10:50:34 +0900 |
commit | f228e79b87b7c5271c468f709e82c3f7d3305a3d (patch) | |
tree | ab2ae0ac32b5ef610a3901505b73d2fb6ce7daab /t/17callbacks.t | |
parent | af87c453a812a912c6585a6171e461a254bc9fc0 (diff) | |
download | perl-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.t | 322 |
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; +} + |