File: write.t

package info (click to toggle)
libxml-easy-perl 0.011-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 520 kB
  • sloc: perl: 2,200; makefile: 3
file content (146 lines) | stat: -rw-r--r-- 4,053 bytes parent folder | download | duplicates (4)
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
use warnings;
use strict;

BEGIN { unshift @INC, "./t/lib"; }
use Encode qw(decode);
use IO::File ();
use Params::Classify qw(scalar_class);
use Scalar::Util qw(blessed reftype);
use XML::Easy::Content ();
use XML::Easy::Element ();
use t::ErrorCases qw(
	COUNT_error_encname test_error_encname
	COUNT_error_content_recurse test_error_content_recurse
	COUNT_error_element_recurse test_error_element_recurse
);
use utf8 ();

use Test::More tests => 1 + 2*171 + 2 +
	COUNT_error_content_recurse*3 +
	COUNT_error_element_recurse*3 +
	COUNT_error_encname*4;

BEGIN { $SIG{__WARN__} = sub { die "WARNING: $_[0]" }; }

BEGIN { use_ok "XML::Easy::Text", qw(
		xml10_write_content xml10_write_element
		xml10_write_document xml10_write_extparsedent
); }

sub regraded($$);
sub regraded($$) {
	my($regrade, $x) = @_;
	my $class = scalar_class($x);
	if($class eq "STRING") {
		$regrade->($x);
	} elsif($class eq "BLESSED" || $class eq "REF") {
		my $blessed = blessed($x);
		my $type = reftype($x);
		if($type =~ /\A(?:REF|SCALAR|LVALUE|GLOB)\z/) {
			$x = \regraded($regrade, $$x);
		} elsif($type eq "ARRAY") {
			$x = [ map { regraded($regrade, $_) } @$x ];
		} elsif($type eq "HASH") {
			$x = { map {
				(regraded($regrade, $_) =>
					regraded($regrade, $x->{$_}))
			} keys %$x };
		} else {
			return $x;
		}
		bless($x, $blessed) if $class eq "BLESSED";
	}
	return $x;
}

sub upgraded($) { regraded(\&utf8::upgrade, $_[0]) }
sub downgraded($) { regraded(sub($) { utf8::downgrade($_[0], 1) }, $_[0]) }

my %writer = (
	c => \&xml10_write_content,
	e => \&xml10_write_element,
	d => \&xml10_write_document,
	x => \&xml10_write_extparsedent,
);

sub try_write($$$) {
	my $result = eval {
		$writer{$_[0]}->($_[1], defined($_[2]) ? ($_[2]) : ())
	};
	return $@ ne "" ? [ "error", $@ ] : [ "ok", $result ];
}

my $data_in = IO::File->new("t/write.data", "r") or die;
my $line = $data_in->getline;

while(1) {
	$line =~ /\A###(?:([a-z])([^\n]+)?)?\n\z/ or die;
	last unless defined $1;
	my($prod, $encname) = ($1, $2);
	$line = $data_in->getline;
	last unless defined $line;
	my $input = "";
	while($line ne "#\n") {
		die if $line =~ /\A###/;
		$input .= $line;
		$line = $data_in->getline;
		die unless defined $line;
	}
	die if $input eq "";
	$input = eval($input);
	my $correct = "";
	while(1) {
		$line = $data_in->getline;
		die unless defined $line;
		last if $line =~ /\A###/;
		$correct .= $line;
	}
	chomp $correct;
	$correct =~ tr/~/\r/;
	$correct =~ s/\$\((.*?)\)/$1 x 40000/seg;
	$correct =~ s/\$\{(.*?)\}/$1 x 32764/seg;
	$correct = decode("UTF-8", $correct);
	$correct = $correct =~ /\A[:'A-Za-z ]+\z/ ? [ "error", "$correct\n" ] :
						    [ "ok", $correct ];
	$encname = eval($encname) if defined $encname;
	is_deeply try_write($prod, upgraded($input), upgraded($encname)),
		$correct;
	is_deeply try_write($prod, downgraded($input), downgraded($encname)),
		$correct;
}

my $c0a = ["bop"];
my $c0o = XML::Easy::Content->new($c0a);
is xml10_write_content($c0a), xml10_write_content($c0o);
is xml10_write_extparsedent($c0a), xml10_write_extparsedent($c0o);

test_error_content_recurse \&xml10_write_content;
test_error_element_recurse \&xml10_write_element;
test_error_element_recurse \&xml10_write_document;
test_error_element_recurse sub { xml10_write_document($_[0], "UTF-8") };
test_error_content_recurse \&xml10_write_extparsedent;
test_error_content_recurse sub { xml10_write_extparsedent($_[0], "UTF-8") };

test_error_encname sub {
	die "invalid XML data: encoding name isn't a string\n"
		unless defined $_[0];
	xml10_write_document(XML::Easy::Element->new("foo", {}, [""]), $_[0]);
};
test_error_encname sub {
	die "invalid XML data: encoding name isn't a string\n"
		unless defined $_[0];
	xml10_write_extparsedent([""], $_[0]);
};

test_error_encname sub {
	die "invalid XML data: encoding name isn't a string\n"
		unless defined $_[0];
	xml10_write_document(undef, $_[0]);
};
test_error_encname sub {
	die "invalid XML data: encoding name isn't a string\n"
		unless defined $_[0];
	xml10_write_extparsedent(undef, $_[0]);
};

1;