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