File: writer.t

package info (click to toggle)
libxml-struct-perl 0.27-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, buster, forky, sid, trixie
  • size: 220 kB
  • sloc: perl: 600; xml: 17; sh: 6; makefile: 2
file content (92 lines) | stat: -rw-r--r-- 2,570 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
use strict;
use Test::More;
use XML::Struct::Writer;
use Encode;

my $writer = XML::Struct::Writer->new;
my $struct = [
    greet => { }, [
        "Hello, ",
        [ emph => { color => "blue'" } , [ "World" ] ],
        "!"
    ]
];
my $dom = $writer->writeDocument( $struct );
isa_ok $dom, 'XML::LibXML::Document';
my $xml = <<'XML';
<?xml version="1.0" encoding="UTF-8"?>
<greet>Hello, <emph color="blue'">World</emph>!</greet>
XML
is $dom->serialize, $xml, 'writeDocument via DOM';

my $str = "";
XML::Struct::Writer->new( to => \$str )->writeDocument($struct);
is $str, $xml, 'writeDocument via SAX';

$struct = [ doc => { a => 1 }, [ "\x{2603}" ] ]; 
$xml = encode("UTF-8", <<XML);
<?xml version="1.0" encoding="UTF-8"?>
<doc a="1">\x{2603}</doc>
XML

$dom = $writer->writeDocument($struct);
is $dom->serialize, $xml, 'writeDocument with UTF-8 via DOM';
$str = "";
XML::Struct::Writer->new( to => \$str )->writeDocument($struct);
is $str, $xml, 'writeDocument with UTF-8 via SAX';

$str = "";
XML::Struct::Writer->new( to => \$str, xmldecl => 0, pretty => 1 )->writeDocument($struct);
$xml = encode("UTF-8", "<doc a=\"1\">\x{2603}</doc>\n");
is $str, $xml, 'omit xml declaration';

$struct = [
    doc => [ 
        [ name => [ "alice" ] ],
        [ name => [ "bob" ] ],
    ] 
];
$xml = <<XML;
<?xml version="1.0" encoding="UTF-8"?>
<doc>
  <name>alice</name>
  <name>bob</name>
</doc>
XML
$writer->attributes(0);
$dom = $writer->writeDocument($struct);
is $dom->serialize(1), $xml, "writeDocument indented, no attributes";
$str = "";
XML::Struct::Writer->new( to => \$str, pretty => 1, attributes => 0 )->writeDocument($struct);
is $str, $xml, 'writeDocument pretty, no attributes via SAX';

{
    package MyHandler;
    use Moo;
    has buf => (is => 'rw', default => sub { [ ] });
    sub start_document { push @{$_[0]->buf}, "start" }
    sub start_element {  push @{$_[0]->buf}, $_[1] }
    sub end_element {  push @{$_[0]->buf}, $_[1] }
    sub characters { push @{$_[0]->buf}, $_[1] }
    sub end_document { push @{$_[0]->buf}, "end"}
    sub result { $_[0]->buf }
}

$writer = XML::Struct::Writer->new( handler => MyHandler->new );
$xml = $writer->write( [ "foo", { x => 1 }, [ ["bar"], "text" ] ] );
is_deeply $xml, [
    "start",
    { Name => "foo", Attributes => { x => 1 } },
    { Name => "bar" },
    { Name => "bar" },
    { Data => "text" },
    { Name => "foo" },
    "end"
], 'custom handler';

$writer->xmldecl(0);
$writer->to(\$str);
$writer->write( [ "foo", { x => 1 } ] );
is $str, "<foo x=\"1\"/>\n", 'reset to/handler';

done_testing;