# Before `make install' is performed this script should be runnable # with `make test'. After `make install' it should work as `perl # SAXParser.t' ######################### We start with some black magic to print on failure. END {ok(0) unless $loaded;} use Carp; use blib; use XML::Xerces; use Test::More tests => 12; use Config; use lib 't'; use TestUtils qw($PERSONAL_FILE_NAME); use vars qw($loaded $error); use strict; $loaded = 1; ok($loaded, "module loaded"); ######################### End of black magic. my $document = q[ Mike Pogue mpogue@us.ibm.com Tom Watson rtwatson@us.ibm.com Susan Hardenbrook susanhar@us.ibm.com ]; package MyDocumentHandler; use strict; use vars qw(@ISA); @ISA = qw(XML::Xerces::PerlDocumentHandler); sub start_element { my $self = shift; $self->{elements}++; } sub characters { my ($self,$str,$len) = @_; $self->{chars} += $len; } sub ignorable_whitespace { my ($self,$str,$len) = @_; $self->{ws} += $len; } sub reset_document { my ($self) = @_; $self->{ws} = 0; $self->{chars} = 0; $self->{elements} = 0; } package main; my $SAX = XML::Xerces::SAXParser->new(); my $DOCUMENT_HANDLER = MyDocumentHandler->new(); my $ERROR_HANDLER = XML::Xerces::PerlErrorHandler->new(); $SAX->setDocumentHandler($DOCUMENT_HANDLER); $SAX->setErrorHandler($ERROR_HANDLER); # reset the counts $DOCUMENT_HANDLER->reset_document(); $SAX->parse(XML::Xerces::MemBufInputSource->new($document, 'foo')); ok($DOCUMENT_HANDLER->{elements} == 10,'elements'); ok($DOCUMENT_HANDLER->{chars} == 141,'chars'); ok($DOCUMENT_HANDLER->{ws} == 0,'ws'); # test the overloaded parse version $SAX->parse($PERSONAL_FILE_NAME); pass('successful parse'); # reset the counts $DOCUMENT_HANDLER->reset_document(); # test the progressive parsing interface my $token = XML::Xerces::XMLPScanToken->new(); $SAX->parseFirst($PERSONAL_FILE_NAME,$token); while ($SAX->parseNext($token)) { # do nothing } pass('successful progressive parse'); ok($DOCUMENT_HANDLER->{elements} == 37, 'element count after progressive parse'); # reset the counts $DOCUMENT_HANDLER->reset_document(); $token = XML::Xerces::XMLPScanToken->new(); $SAX->parseFirst($PERSONAL_FILE_NAME,$token); while ($SAX->parseNext($token)) { last if $DOCUMENT_HANDLER->{elements} == 10; } pass('early exit from progressive parse'); ok($DOCUMENT_HANDLER->{elements} == 10, 'element count after early exit from progressive parse'); # test that we can reuse the parse again and again $document = <<\END; Boss Big chief@foo.com Worker One one@foo.com Worker Two two@foo.com END package MyErrorHandler; use strict; use vars qw(@ISA); @ISA = qw(XML::Xerces::PerlErrorHandler); sub warning { } sub error { my $LINE = $_[1]->getLineNumber; my $COLUMN = $_[1]->getColumnNumber; my $MESSAGE = $_[1]->getMessage; $::error = <<"EOE"; ERROR: LINE: $LINE COLUMN: $COLUMN MESSAGE: $MESSAGE EOE die(); } sub fatal_error { my $LINE = $_[1]->getLineNumber; my $COLUMN = $_[1]->getColumnNumber; my $MESSAGE = $_[1]->getMessage; $::error = <<"EOE"; FATAL ERROR: LINE: $LINE COLUMN: $COLUMN MESSAGE: $MESSAGE EOE die(); } 1; package main; $token = XML::Xerces::XMLPScanToken->new(); $SAX->setErrorHandler(MyErrorHandler->new()); $::error = ''; eval { $SAX->parseFirst(XML::Xerces::MemBufInputSource->new($document),$token); while ($SAX->parseNext($token)) { # do nothing } }; ok($::error,'fatal error in progressive parse') or diag("Here's the error: $@"); # reset the state for a new parse $::error = ''; $SAX->parseReset($token); $SAX->setErrorHandler(XML::Xerces::PerlErrorHandler->new()); eval {$SAX->parse($PERSONAL_FILE_NAME)}; ok((not $@),'successful parse after fatal error'); eval {$SAX->parse(XML::Xerces::MemBufInputSource->new($document))}; ok($@,'fatal error in parse');