The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/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__