#!/usr/bin/perl -w use Test; BEGIN { $| = 1; plan tests => 100; } use XML::Generator (); ok(1); my $x = XML::Generator->new(); ok($x); my $xml = $x->foo(); ok($xml, ''); $xml = $x->bar(42); ok($xml, '42'); $xml = $x->baz({'foo'=>3}); ok($xml, ''); $xml = $x->bam({'bar'=>42},$x->foo(),"qux"); ok($xml, 'qux'); eval { require Tie::IxHash; }; if ($@) { skip('Tie::IxHash not installed', 1); } else { tie %h, 'Tie::IxHash'; @h{'a'..'z'} = 1..26; $xml = $x->foo(\%h); ok($xml, ''); } $xml = $x->new(3); ok($xml, '3'); $xml = $x->import(3); ok($xml, '3'); $xml = $x->foo(['baz']); ok($xml, ''); $xml = $x->foo(['baz','bam']); ok($xml, ''); $xml = $x->foo(['baz'],{'bar'=>42},3); ok($xml, '3'); $xml = $x->foo(['baz','bam'],{'bar'=>42},3); ok($xml, '3'); $xml = $x->foo({'id' => 4}, 3, 5); ok($xml, '35'); $xml = $x->foo({'id' => 4}, 0, 5); ok($xml, '05'); $xml = $x->foo({'id' => 4}, 3, 0); ok($xml, '30'); my $foo_bar = "foo-bar"; $xml = $x->$foo_bar(42); ok($xml, '42'); $x = new XML::Generator 'escape' => 'always'; $xml = $x->foo({'bar' => '4"4'}, '<&>"\<', \"<>"); ok($xml, '<&>"\<<>'); $x = new XML::Generator 'escape' => 'unescaped'; $xml = $x->foo({'bar' => '4\"4'}, '<&>"\<', \"&& 6 < 5"); ok($xml, '<&>"<&& 6 < 5'); $x = new XML::Generator 'namespace' => ['A']; $xml = $x->foo({'bar' => 42}, $x->bar(['B'], {'bar' => 54})); ok($xml, ''); $x = new XML::Generator 'conformance' => 'strict'; $xml = $x->xmldecl(); ok($xml, qq(\n)); $xml = $x->xmlcmnt("test"); ok($xml, ''); $x = new XML::Generator 'conformance' => 'strict', 'version' => '1.1', 'encoding' => 'iso-8859-2'; $xml = $x->xmldecl(); ok($xml, qq(\n)); $xml = $x->xmldecl(version => undef, encoding => undef, standalone => undef); ok($xml, qq(\n)); $xml = $x->xmldecl(version => '1.0', encoding => 'utf8', standalone => 'no'); ok($xml, qq(\n)); $xml = $x->xmlpi("target", "option" => "value"); ok($xml, ''); eval { $x->xmlfoo(); }; ok($@, qr{names beginning with 'xml' are reserved by the W3C}); eval { $x->foo({xmlfoo => 4}); }; ok($@, qr{names beginning with 'xml' are reserved by the W3C}); eval { my $t = "42"; $x->$t(); }; ok($@, qr{name \[42] may not begin with a number}); eval { $x->q({42=>'the answer'}); }; ok($@, qr{name \[42] may not begin with a number}); eval { my $t = "g:"; $x->$t(); }; ok($@, qr{name \[g:] contains illegal character\(s\)}); $xml = $x->foo(['bar'], {'baz:foo' => 'qux', 'fob' => 'gux'}); ok($xml eq '' || $xml eq '', 1, $xml); $xml = $x->foo(['bar' => 'bam'], {'baz:foo' => 'qux', 'fob' => 'gux'}); ok($xml eq '' || $xml eq '', 1, $xml); $x = new XML::Generator; $xml = $x->xml(); ok($xml, ''); $x = new XML::Generator 'conformance' => 'strict', 'dtd' => [ 'foo', 'SYSTEM', '"http://foo.com/foo"' ]; $xml = $x->xmldecl(); ok($xml, ' '); $xml = $x->xmlcdata("test"); ok($xml, ''); $x = new XML::Generator 'pretty' => 2, 'conformance' => 'strict'; $xml = $x->foo($x->bar()); ok($xml, ' '); $xml = $x->foo($x->xmlcdata("bar"), $x->xmlpi("baz")); ok($xml, ''); # test that cdata is not intended when pretty printing is on $xml = $x->foo($x->bam($x->xmlcdata("bar\nbar"))); ok($xml, ' '); $x = new XML::Generator 'conformance' => 'strict'; $xml = $x->foo(42); $xml = $x->xml($xml); ok($xml, ' 42'); eval { $x->xml(); }; ok($@ =~ /usage/, 1); eval { $x->xml(3); }; ok($@ =~ /arguments to xml/, 1); eval { $xml = $x->bar($xml); }; ok($@ =~ /cannot embed/, 1); $x = new XML::Generator 'pretty' => 2; $xml = $x->foo($x->bar($x->baz())); ok($xml, ' '); $xml = $x->foo("\n"); ok($xml, ' '); $x = new XML::Generator 'empty' => 'close'; $xml = $x->foo(); ok($xml, ''); $x = new XML::Generator 'empty' => 'ignore'; $xml = $x->foo(); ok($xml, ''); eval { $x = new XML::Generator 'empty' => 'ignore', 'conformance' => 'strict'; }; ok($@ =~ /not allowed/, 1); $x = new XML::Generator 'conformance' => 'strict'; $xml = $x->foo(); $cmnt = $x->xmlcmnt("comment"); $pi = $x->xmlpi("foo"); $xml = $x->xml($cmnt, $xml, $pi); ok($xml, ' '); $x = new XML::Generator 'empty' => 'compact'; $xml = $x->foo(); ok($xml, ''); $x = new XML::Generator 'empty' => 'args'; $xml = $x->foo(1); ok($xml, '1'); $xml = $x->foo(''); ok($xml, ''); $xml = $x->foo(); ok($xml, ''); $xml = $x->foo(undef); ok($xml, ''); $x = XML::Generator->new(escape => 'always,high-bit'); $xml = $x->foo("<\242>"); ok($xml, '<¢>'); # check :options $x = XML::Generator->new(':standard'); $xml = $x->foo('<', $x->xmlcmnt('c')); ok($xml, '<'); $x = XML::Generator->new(':pretty'); $xml = $x->foo('<', $x->bar($x->xmlcmnt('c'))); ok($xml, '< '); $x = XML::Generator->new(':strict', escape => 'high-bit'); $xml = $x->foo("\\<\242", $x->xmlpi('g')); ok($xml, ''); { my $w; local $SIG{__WARN__} = sub { $w .= $_[0] }; $x = XML::Generator->new(':import'); ok($w =~ /Useless use of/, 1); $w = ''; } # test AUTOLOAD package Test1; use XML::Generator ':import'; ::ok(foo(), ''); package Test2; use XML::Generator ':pretty'; ::ok(foo(bar()), ' '); package Test3; sub AUTOLOAD { return "foo" if our $AUTOLOAD =~ /bar/; return; } use XML::Generator; ::ok(barnyard(), 'foo'); ::ok(foo(), undef); package Test6; sub AUTOLOAD { return "foo" if our $AUTOLOAD =~ /bar/; return; } use XML::Generator qw(:import); ::ok(barnyard(), ''); ::ok(foo(), ''); package Test7; sub AUTOLOAD { return "foo" if our $AUTOLOAD =~ /bar/; return; } use XML::Generator qw(:stacked); ::ok(barnyard(), 'foo'); ::ok(foo(), ''); ::ok(foo(barnyard()), 'foo'); # misc package main; $x = XML::Generator->new(':strict', allowed_xml_tags => ['xmlfoo']); $xml = $x->xmlfoo('biznatch'); ok($xml, 'biznatch'); $xml = $x->xmlcmnt('--'); ok($xml, ''); $A = XML::Generator->new(namespace => ['A']); $B = XML::Generator->new(namespace => ['B' => 'bee']); $xml = $A->foo($B->bar($A->baz())); ok($xml, ''); $xml = $A->foo($A->bar($B->baz())); ok($xml, ''); $xml = $A->foo($B->bar($B->baz())); ok($xml, ''); $C = XML::Generator->new(namespace => [undef]); $xml = $A->foo($C->bar($B->baz())); ok($xml, ''); $D = XML::Generator->new(); $xml = $D->foo(['A'],$D->bar([undef],$D->baz(['B'=>'bee']))); ok($xml, ''); $E = XML::Generator->new(); $xml = $E->foo(['A'],$E->bar([undef],$E->baz(['B'=>'bee'], $E->bum(['A'])))); ok($xml, ''); package MyGenerator; sub AUTOLOAD { my($tag) = our $AUTOLOAD =~ /.*::(.*)/; return '©' if $tag eq 'copy'; return; } use XML::Generator qw(:pretty :stacked); package Test8; MyGenerator->import(); $xml = html(title("My Title",copy())); ::ok($xml, ' My Title© '); package TestDoc1_1; use XML::Generator ':pretty'; $prt = foo(bar({ baz => 3 }, bam()), bar([ 'qux' => 'http://qux.com/' ], "Hey there, world")); ::ok($prt, ' Hey there, world '); package TestDoc1_2; use XML::Generator (); my $X = XML::Generator->new(':pretty'); $prt = $X->foo($X->bar({ baz => 3 }, $X->bam()), $X->bar([ 'qux' => 'http://qux.com/' ], "Hey there, world")); ::ok($prt, ' Hey there, world '); package TestDoc2; use XML::Generator; my $gen = XML::Generator->new(':pretty'); $prt = $gen->person( $gen->name("Bob"), $gen->age(34), $gen->job("Accountant") ); ::ok($prt, ' Bob 34 Accountant '); my $shoe_size = "shoe-size"; $xml = $gen->$shoe_size("12 1/2"); ::ok($xml, '12 1/2'); $xml = $gen->account( $gen->open(['transaction'], 2000), $gen->deposit(['transaction'], { date => '1999.04.03'}, 1500) ); ::ok($xml, ' 2000 1500 '); $xml = $gen->account( $gen->open(['transaction'], 2000), $gen->deposit(['transaction'], { date => '1999.04.03'}, $gen->amount(['transaction'], 1500) ) ); ::ok($xml, ' 2000 1500 '); $xml = $gen->widget(['wru' => 'http://www.widgets-r-us.com/xml/'], {'id' => 123}, $gen->contents()); ::ok($xml, ' '); package TestDoc3; my $html = XML::Generator->new( pretty => 2, namespace => [HTML => "http://www.w3.org/TR/REC-html40"]); $pt = $html->html( $html->body( $html->font({ face => 'Arial' }, "Hello, there"))); ::ok($pt, ' Hello, there '); $html = XML::Generator->new( pretty => 2, namespace => ["http://www.w3.org/TR/REC-html40"]); $pt = $html->html( $html->body( $html->font({ 'face' => 'Arial' }, "Hello, there"))); ::ok($pt, ' Hello, there '); my $a = XML::Generator->new(escape => 'always,high-bit'); $pt = $a->foo("<\242>"); ::ok($pt, '<¢>'); $gen = XML::Generator->new(escape => 'always,apos'); $pt = $gen->foo({'bar' => "It's all good"}); ::ok($pt, ''); $gen = XML::Generator->new(pretty => 2); $pt = $gen->foo($gen->bar('baz'), $gen->qux({ tricky => 'no'}, 'quux')); ::ok($pt, ' baz quux '); $gen = XML::Generator->new(namespace => [foo => "http://foo.com/"], qualifiedAttributes => 1); $pt = $gen->bar({baz => 3}); ::ok($pt, ''); $pt = $gen->bar({'wow:baz' => 3}); ::ok($pt, ''); package TestMult; $gen = XML::Generator->new(namespace => ['foo' => 'foo uri', 'bar' => 'bar uri']); $pt = $gen->baz(); ::ok($pt, ''); $pt = $gen->bam(['#default' => 'default uri']); ::ok($pt, ''); $pt = $gen->bam(['#default' => 'default uri', 'foo' => 'foo uri']); ::ok($pt, ''); $pt = $gen->bam(['foo' => 'foo uri', '#default' => 'default uri']); ::ok($pt, ''); package TestRDF; my @contact = (contact => "http://www.w3.org/2000/10/swap/pim/contact#"); $gen = XML::Generator->new(':pretty'); $pt = $gen->xml( $gen->RDF([ rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#", @contact ], $gen->Person(\@contact, { 'rdf:about' => "http://www.w3.org/People/EM/contact#me" }, $gen->fullName(\@contact, 'Eric Miller'), $gen->mailbox(\@contact, {'rdf:resource' => "mailto:em\@w3.org"}), $gen->personalTitle(\@contact, 'Dr.')))); ::ok($pt, ' Eric Miller Dr. '); package TestEscapingEntities; use XML::Generator escape => 'always,even-entities', conformance => 'strict', pretty => 2; ::ok(tag(">"), '&gt;'); package TestInvalidChars1; use XML::Generator filter_invalid_chars => '1'; ::ok(tag(map chr, 0, 0x1, 0x8, 0xB, 0xC, 0xE..0x1F, 0x7F..0x84, 0x86..0x9F), ''); package TestInvalidCharsUnderStrict; use XML::Generator ':strict'; ::ok(tag("\0"), ''); package TestInvalidCharsUnderStrict2; use XML::Generator ':strict', 'filter_invalid_chars' => 0; ::ok(tag("\0"), "\0");