### # XML::SAX::Writer tests # Robin Berjon # 06/01/2002 - v0.01 ### use strict; package MyConsumer; @MyConsumer::ISA = qw( XML::SAX::Writer::ConsumerInterface ); sub new { my $self = shift->SUPER::new( my $output ); $$self = '' ; # Note the extra '$' return $self; } sub output { my $self = shift; $$self .= uc shift; } sub get_output { my $self = shift; return $$self; } package main; use Test::More tests => 15; use XML::SAX::Writer qw(); # StringConsumer my $ref1 = 'MUST_CLEAR'; my $str = XML::SAX::Writer::StringConsumer->new(\$ref1); isa_ok($str, 'XML::SAX::Writer::StringConsumer', 'StringConsumer'); $str->output('CONTENT'); my $res1 = $str->finalize; ok($$res1 eq 'CONTENT', 'content is set'); # ArrayConsumer my $arr = XML::SAX::Writer::ArrayConsumer->new([]); isa_ok($arr, 'XML::SAX::Writer::ArrayConsumer', 'ArrayConsumer'); $arr->output('CONTENT0'); $arr->output('CONTENT1'); my $res2 = $arr->finalize; ok($res2->[0] eq 'CONTENT0', 'content (1)'); ok($res2->[1] eq 'CONTENT1', 'content (2)'); # HandleConsumer and FileConsumer my $fil1 = XML::SAX::Writer::FileConsumer->new('test_file1'); isa_ok($fil1, 'XML::SAX::Writer::FileConsumer', 'FileConsumer'); isa_ok($fil1, 'XML::SAX::Writer::HandleConsumer', 'HandleConsumer'); $fil1->output('FILE ONE'); my $fil2 = XML::SAX::Writer::FileConsumer->new('test_file2'); $fil2->output('FILE TWO'); $fil1->output(' FILE ONE'); $fil2->output(' FILE TWO'); $fil1->finalize; $fil2->finalize; open FH1, "test_file1" or die $!; my $cnt1 = ; close FH1; open FH2, "test_file2" or die $!; my $cnt2 = ; close FH2; ok($cnt1 eq 'FILE ONE FILE ONE', 'file content (1)'); ok($cnt2 eq 'FILE TWO FILE TWO', 'file content (2)'); ## ## Now, test some of the consumers "in situ" ## sub push_events { my $w = XML::SAX::Writer->new( Output => shift ); $w->start_document( {} ); $w->start_element( { Name => "foo" } ); $w->end_element( { Name => "foo" } ); $w->end_document( {} ); } { my @events; push_events( sub { push @events, [ @_ ] } ); ok @events >= 3; ok $events[0]->[0], "start_document"; ok $events[1]->[0], "data"; ok $events[-1]->[0], "end_document"; ## This next test might break id X::S::W ever stops ## putting that space in there. ok join( "", map $_->[1], @events ), ""; } ## ## A custom consumer ## { my $c = MyConsumer->new; push_events( $c ); ok $c->get_output, ""; }