The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
# @(#) $Id$

use strict;
use warnings;

use Test::More;

BEGIN {
    foreach ( qw( XML::SAX::Base XML::SAX::Writer ) ) {
        eval "use $_";
        plan skip_all => "$_ not present" if $@;
    }
}

use Test::XML::SAX;

# A Dummy SAX Filter.
{
    package My::XML::Filter;
    @My::XML::Filter::ISA = 'XML::SAX::Base';
    sub start_element {
        my ($self, $data) = @_;
        $data->{ Name }      =~ s/\bfoo\b/bar/;
        $data->{ LocalName } =~ s/\bfoo\b/bar/;
        $self->SUPER::start_element( $data );
    }
    sub end_element {
        my ($self, $data) = @_;
        $data->{ Name }      =~ s/\bfoo\b/bar/;
        $data->{ LocalName } =~ s/\bfoo\b/bar/;
        $self->SUPER::end_element( $data );
    }
}

test_all_sax_parsers( \&do_tests, 6 );

sub do_tests {
    my ($p, $numtests) = @_;
    my $handler = My::XML::Filter->new;

    # XXX These should really come seperately as they are not parser
    # specific...
    eval { test_sax() };
    like( $@, qr/^usage: /, 'test_sax() no args failure' );
    eval { test_sax( $handler ) };
    like( $@, qr/^usage: /, 'test_sax() 1 args failure' );
    eval { test_sax( $handler, '<foo/>' ) };
    like( $@, qr/^usage: /, 'test_sax() 2 args failure' );
    eval { test_sax( 'handler', '<foo/>', '<bar/>' ) };
    like( $@, qr/^usage: /, 'test_sax() 1st arg type failure' );

    test_sax( $handler, '<foo />', '<bar/>', "translates foo to bar ($p)" );
    test_sax( $handler, '<moo />', '<moo/>', "leaves moo alone ($p)" );
}

# Local Variables:
# mode: cperl
# cperl-indent-level: 4
# indent-tabs-mode: nil
# End:
# vim: set ai et sw=4 syntax=perl :