2 # -----------------------------------------------------------------------------
5 use lib
($0 =~ m
|^(.*/)| ?
$1 : ".");
8 &message
("Check that the xlsx exporter produces valid files.");
10 my $format = "Gnumeric_Excel:xlsx";
11 # FIXME: until get figure out how to check xlsx files against a schema,
12 # this is a very limited test.
13 my $schema = "$topsrc/test/ooxml-schema/sml.xsd";
15 &message
("Schema $schema not found");
18 my $chart_schema = "$topsrc/test/ooxml-schema/dml-chart.xsd";
19 if (!-r
$chart_schema) {
20 &message
("Schema $chart_schema not found");
21 $chart_schema = undef;
23 my $drawing_schema = "$topsrc/test/ooxml-schema/dml-spreadsheetDrawing.xsd";
24 if (!-r
$drawing_schema) {
25 &message
("Schema $drawing_schema not found");
26 $drawing_schema = undef;
29 my $sml_schema_patched_for_comments = undef;
30 my $sml_schema_patched_for_comments_warned = 0;
32 system ("grep", "-q", "-w", "CT_Text", $schema);
33 $sml_schema_patched_for_comments = ($?
== 0);
36 my $xmllint = &GnumericTest
::find_program
("xmllint");
37 my $unzip = &GnumericTest
::find_program
("unzip");
39 my @sources = &GnumericTest
::corpus
();
40 # xmllint hangs on these files. (Well, amath finishes but takes too
42 @sources = grep { !m{(^|/)(amath|crlibm|gamma)\.gnumeric$} } @sources;
48 my $checker = "$xmllint --noout" . ($schema ?
" --schema $schema" : "");
49 my $chart_checker = "$xmllint --noout" . ($chart_schema ?
" --schema $chart_schema" : "");
50 my $drawing_checker = "$xmllint --noout" . ($drawing_schema ?
" --schema $drawing_schema" : "");
51 my $basic_checker = "$xmllint --noout";
53 my %checkers = ( 0 => $checker,
55 2 => $drawing_checker,
56 -1 => $basic_checker);
58 foreach my $src (@sources) {
64 print STDERR
"Checking $src\n";
68 $tmp =~ s
|\
..*|.xlsx
|;
69 &GnumericTest
::junkfile
($tmp);
72 my $cmd = &GnumericTest
::quotearg
($ssconvert, '-T', $format, $src, $tmp);
73 print STDERR
"# $cmd\n" if $GnumericTest::verbose
;
76 print STDERR
"ssconvert failed to produce $tmp\n";
82 foreach (`$unzip -v $tmp`) {
83 next unless /^----/ ... /^----/;
84 next unless m{^\s*\d.*\s(\S+)$};
86 if (exists $members{$member}) {
87 print STDERR
"Duplicate member $member\n";
90 $members{$member} = 1;
93 my @check_members = (['xl/workbook.xml',0] , ['xl/styles.xml', 0]);
94 push @check_members, ['xl/sharedStrings.xml',0] if $members{'xl/sharedStrings.xml'};
95 foreach my $member (sort keys %members) {
96 if ($member =~ m{^xl/worksheets/sheet\d+\.xml$}) {
97 push @check_members, [$member,0]
98 } elsif ($member =~ m{^xl/comments\d+\.xml$}) {
99 if ($sml_schema_patched_for_comments) {
100 push @check_members, [$member,0];
102 if (!$sml_schema_patched_for_comments_warned) {
103 $sml_schema_patched_for_comments_warned = 1;
104 &message
("Comment checking requires a patched schema, see bug 790756.");
106 push @check_members, [$member,-1];
108 } elsif ($member =~ m{^xl/charts/chart\d+\.xml$}) {
109 push @check_members, [$member,1];
110 } elsif ($member =~ m{^xl/drawings/drawing\d+\.xml$}) {
111 push @check_members, [$member,2];
112 } elsif ($member =~ m{^[-a-zA-Z0-0_/.]+\.xml$}) {
113 push @check_members, [$member,-1];
114 } elsif ($member =~ m{^[-a-zA-Z0-0_/.]+\.rels$}) {
115 push @check_members, [$member,-1];
119 for (@check_members) {
120 my ($member,$typ) = @
$_;
121 my $this_checker = $checkers{$typ};
122 my $cmd = "$unzip -p $tmp '$member' | $this_checker";
123 print STDERR
"# $cmd\n" if $GnumericTest::verbose
;
124 my $out = `$cmd - 2>&1`;
125 if ($out ne '' && $out !~ /validates$/) {
126 print STDERR
"While checking $member from $tmp:\n";
127 &GnumericTest
::dump_indented
($out);
134 &GnumericTest
::removejunk
($tmp);
137 &GnumericTest
::report_skip
("No source files present") if $nbad + $ngood == 0;
140 print STDERR
"$nskipped files skipped.\n";
146 print STDERR
"Pass\n";