1#!/usr/bin/perl -w
2# -----------------------------------------------------------------------------
3
4use strict;
5use lib ($0 =~ m|^(.*/)| ? $1 : ".");
6use GnumericTest;
7
8&message ("Check that vba roundtrips through xls");
9
10my $src = "$samples/vba-725220.xls";
11&GnumericTest::report_skip ("file $src does not exist") unless -r $src;
12
13my $gsf = &GnumericTest::find_program ("gsf");
14
15my $dir1 = &gsf_list ($src);
16
17my $tmp = $src;
18$tmp =~ s|^.*/||;
19$tmp =~ s|\..*|-tmp.xls|;
20&GnumericTest::junkfile ($tmp);
21system ("$ssconvert $src $tmp");
22my $dir2 = &gsf_list ($tmp);
23
24foreach my $f (sort keys %$dir1) {
25    next unless ($f eq "\001Ole" ||
26		 $f eq "\001CompObj" ||
27		 $f =~ m{^_VBA_PROJECT_CUR/});
28    my $fprint = $f;
29    $fprint =~ s{\001}{\\001};
30    if (!exists $dir2->{$f}) {
31	die "$0: member $fprint is missing after conversion.\n";
32    } elsif ($dir1->{$f} ne $dir2->{$f}) {
33	die "$0: member $fprint changed length during conversion.\n";
34    } else {
35	my $d1 = `$gsf cat '$src' '$f'`;
36	my $d2 = `$gsf cat '$tmp' '$f'`;
37	if (length ($d1) ne $dir1->{$f}) {
38	    print "Member $fprint is strange\n";
39	} elsif ($d1 eq $d2) {
40	    print "Member $fprint is ok\n";
41	} else {
42	    die "$0: member $fprint changed contents during conversion.\n";
43	}
44    }
45}
46
47sub gsf_list {
48    my ($fn) = @_;
49
50    my $dir = {};
51    local (*FIL);
52    open (FIL, "$gsf list '$fn' | ") or die "Cannot parse $fn: $!\n";
53    while (<FIL>) {
54	next unless /^f\s.*\s(\d+)\s+(.*)$/;
55	$dir->{$2} = $1;
56    }
57    close FIL;
58    return $dir;
59}
60