.gnumeric: if we see a shared array formula, fix it.
[gnumeric.git] / test / t6152-xlsx-syntax.pl
blobc7df90b4525356fe1aab89b78611ae76e3236583
1 #!/usr/bin/perl -w
2 # -----------------------------------------------------------------------------
4 use strict;
5 use lib ($0 =~ m|^(.*/)| ? $1 : ".");
6 use GnumericTest;
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";
14 if (!-r $schema) {
15 &message ("Schema $schema not found");
16 $schema = undef;
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;
31 if ($schema) {
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
41 # long.)
42 @sources = grep { !m{(^|/)(amath|crlibm|gamma)\.gnumeric$} } @sources;
44 my $nskipped = 0;
45 my $ngood = 0;
46 my $nbad = 0;
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,
54 1 => $chart_checker,
55 2 => $drawing_checker,
56 -1 => $basic_checker);
58 foreach my $src (@sources) {
59 if (!-r $src) {
60 $nskipped++;
61 next;
64 print STDERR "Checking $src\n";
66 my $tmp = $src;
67 $tmp =~ s|^.*/||;
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;
74 system ($cmd);
75 if (!-r $tmp) {
76 print STDERR "ssconvert failed to produce $tmp\n";
77 die "Fail\n";
81 my %members;
82 foreach (`$unzip -v $tmp`) {
83 next unless /^----/ ... /^----/;
84 next unless m{^\s*\d.*\s(\S+)$};
85 my $member = $1;
86 if (exists $members{$member}) {
87 print STDERR "Duplicate member $member\n";
88 die "Fail\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];
101 } else {
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);
128 $nbad++;
129 } else {
130 $ngood++;
134 &GnumericTest::removejunk ($tmp);
137 &GnumericTest::report_skip ("No source files present") if $nbad + $ngood == 0;
139 if ($nskipped > 0) {
140 print STDERR "$nskipped files skipped.\n";
143 if ($nbad > 0) {
144 die "Fail\n";
145 } else {
146 print STDERR "Pass\n";