#!/usr/bin/perl -wl
###############################################################################
#
# A test for Spreadsheet::WriteExcel.
#
# Tests for valid worksheet name handling.
#
# reverse('©'), March 2005, John McNamara, jmcnamara@cpan.org
#
use strict;
use Spreadsheet::WriteExcel;
use Test::More tests => 69;
# Tests for valid and invalid worksheet names
my @tests1 = (
# Tests for valid names
[ 'PASS', undef, 'No worksheet name' ],
[ 'PASS', '', 'Blank worksheet name' ],
[ 'PASS', 'Sheet10', 'Valid worksheet name' ],
[ 'PASS', 'a' x 31, 'Valid 31 char name' ],
# Tests for invalid names
[ 'FAIL', 'Sheet1', 'Caught duplicate name' ],
[ 'FAIL', 'Sheet2', 'Caught duplicate name' ],
[ 'FAIL', 'Sheet3', 'Caught duplicate name' ],
[ 'FAIL', 'sheet1', 'Caught case-insensitive name'],
[ 'FAIL', 'SHEET1', 'Caught case-insensitive name'],
[ 'FAIL', 'sheetz', 'Caught case-insensitive name'],
[ 'FAIL', 'SHEETZ', 'Caught case-insensitive name'],
[ 'FAIL', 'a' x 32, 'Caught long name' ],
[ 'FAIL', '[', 'Caught invalid char' ],
[ 'FAIL', ']', 'Caught invalid char' ],
[ 'FAIL', ':', 'Caught invalid char' ],
[ 'FAIL', '*', 'Caught invalid char' ],
[ 'FAIL', '?', 'Caught invalid char' ],
[ 'FAIL', '/', 'Caught invalid char' ],
[ 'FAIL', '\\', 'Caught invalid char' ],
);
###############################################################################
#
# Tests 1. ASCII tests
#
my $test_file = "temp_test_file.xml";
my $workbook = Spreadsheet::WriteExcel->new($test_file);
my $worksheet1 = $workbook->add_worksheet(); # Implicit name 'Sheet1'
my $worksheet2 = $workbook->add_worksheet(); # Implicit name 'Sheet2'
my $worksheet3 = $workbook->add_worksheet('Sheet3');
my $worksheet4 = $workbook->add_worksheet('Sheetz');
for my $test_ref (@tests1) {
my $target = $test_ref->[0];
my $sheetname = $test_ref->[1];
my $caption = $test_ref->[2];
eval {$workbook->_check_sheetname($sheetname)};
my $result = $@ ? 'FAIL' : 'PASS';
$sheetname = 'undef' unless defined $sheetname;
is($result, $target, sprintf " \t%-7s %-28s: %s",
'ASCII:', $caption, $sheetname);
}
$workbook->close();
###############################################################################
#
# Tests 2. UTF16-BE tests
#
$workbook = Spreadsheet::WriteExcel->new($test_file);
$worksheet1 = $workbook->add_worksheet(); # Implicit name 'Sheet1'
$worksheet2 = $workbook->add_worksheet(); # Implicit name 'Sheet2'
$worksheet3 = $workbook->add_worksheet('Sheet3');
$worksheet4 = $workbook->add_worksheet("\0S\0h\0e\0e\0t\0z", 1);
for my $test_ref (@tests1) {
my $target = $test_ref->[0];
my $sheetname = $test_ref->[1];
my $caption = $test_ref->[2];
# Convert ASCII to UTF16-BE if not blank or undef
$sheetname = pack "n*", unpack "C*", $sheetname if $sheetname;
eval {$workbook->_check_sheetname($sheetname, 1)};
my $result = $@ ? 'FAIL' : 'PASS';
$sheetname = 'undef' unless defined $sheetname;
# Change null byte to \0 for printing
$sheetname =~ s/\0/\\0/g;
is($result, $target, sprintf " \t%-7s %-28s: %s",
'UTF-16:', $caption, $sheetname);
}
$workbook->close();
###############################################################################
#
# Tests 3. UTF-8 tests
#
SKIP: {
my $uni = chr 0x263A;
my @tests2 = (
# Tests for valid names
[ 'PASS', $uni, 'Unicode char' ],
[ 'PASS', $uni x 31, 'Valid 31 char name' ],
# Tests for invalid names
[ 'FAIL', chr 0x0438, 'Caught duplicate name' ],
[ 'FAIL', chr 0x0418, 'Caught case-insensitive name'],
[ 'FAIL', $uni x 32, 'Caught long name' ],
[ 'FAIL', '[' . $uni, 'Caught invalid char' ],
[ 'FAIL', ']' . $uni, 'Caught invalid char' ],
[ 'FAIL', ':' . $uni, 'Caught invalid char' ],
[ 'FAIL', '*' . $uni, 'Caught invalid char' ],
[ 'FAIL', '?' . $uni, 'Caught invalid char' ],
[ 'FAIL', '/' . $uni, 'Caught invalid char' ],
[ 'FAIL', '\\'. $uni, 'Caught invalid char' ],
);
skip "\tskipped tests requires Perl 5.8 Unicode support", 0 + @tests1 + @tests2 if $] < 5.008;
$workbook = Spreadsheet::WriteExcel->new($test_file);
$worksheet1 = $workbook->add_worksheet(); # Implicit name 'Sheet1'
$worksheet2 = $workbook->add_worksheet(); # Implicit name 'Sheet2'
$worksheet3 = $workbook->add_worksheet('Sheet3');
$worksheet4 = $workbook->add_worksheet("\0S\0h\0e\0e\0t\0z", 1);
my $worksheet5 = $workbook->add_worksheet(chr 0x0438);
for my $test_ref (@tests1) {
my $target = $test_ref->[0];
my $sheetname = $test_ref->[1];
my $caption = $test_ref->[2];
require Encode;
$sheetname = Encode::encode_utf8($sheetname) if $sheetname;
eval {$workbook->_check_sheetname($sheetname)};
my $result = $@ ? 'FAIL' : 'PASS';
$sheetname = 'undef' unless defined $sheetname;
# Change null byte to \0 for printing
$sheetname =~ s/\0/\\0/g;
is($result, $target, sprintf " \t%-7s %-28s: %s",
'UTF-8:', $caption, $sheetname);
}
for my $test_ref (@tests2) {
my $target = $test_ref->[0];
my $sheetname = $test_ref->[1];
my $caption = $test_ref->[2];
eval {$workbook->_check_sheetname($sheetname)};
my $result = $@ ? 'FAIL' : 'PASS';
$sheetname = 'undef' unless defined $sheetname;
is($result, $target, sprintf " \t%-7s %-28s: %s",
'UTF-8:', $caption, '');
}
$workbook->close();
}
unlink $test_file;
__END__