The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

###############################################################################
#
# Testcases for Spreadsheet::WriteExcel.
#
# Tests for the basic property types used in OLE property sets.
#
# reverse('©'), Auguest 2008, John McNamara, jmcnamara@cpan.org
#


use strict;
use Carp;

use Spreadsheet::WriteExcel::Properties ':testing';
use Time::Local 'timegm';
use Test::More tests => 13;


###############################################################################
#
# Tests setup
#
my $target;
my $result;
my $caption;
my $string;
my $codepage;
my $smiley = chr 0x263A;
my $filetime;


###############################################################################
#
# Test 1. Pack a VT_I2.
#
$caption    = " \tDoc properties: _pack_VT_I2(1252)";
$target     = join " ",  qw(
                            02 00 00 00 E4 04 00 00
                           );

$result     = unpack_record( _pack_VT_I2(1252) );
is($result, $target, $caption);


###############################################################################
#
# Test 2. Pack a VT_LPSTR string and check for padding.
#
$string     = '';
$codepage   = 0x04E4;
$caption    = " \tDoc properties: _pack_VT_LPSTR('$string',\t$codepage')";
$target     = join " ",  qw(
                            1E 00 00 00 01 00 00 00 00 00 00 00
                           );

$result     = unpack_record( _pack_VT_LPSTR($string, $codepage) );
is($result, $target, $caption);


###############################################################################
#
# Test 3. Pack a VT_LPSTR string and check for padding.
#
$string     = 'a';
$codepage   = 0x04E4;
$caption    = " \tDoc properties: _pack_VT_LPSTR('$string',\t$codepage')";
$target     = join " ",  qw(
                            1E 00 00 00 02 00 00 00 61 00 00 00
                           );

$result     = unpack_record( _pack_VT_LPSTR($string, $codepage) );
is($result, $target, $caption);


###############################################################################
#
# Test 4. Pack a VT_LPSTR string and check for padding.
#
$string     = 'bb';
$codepage   = 0x04E4;
$caption    = " \tDoc properties: _pack_VT_LPSTR('$string',\t$codepage')";
$target     = join " ",  qw(
                            1E 00 00 00 03 00 00 00 62 62 00 00
                           );

$result     = unpack_record( _pack_VT_LPSTR($string, $codepage) );
is($result, $target, $caption);


###############################################################################
#
# Test 5. Pack a VT_LPSTR string and check for padding.
#
$string     = 'ccc';
$codepage   = 0x04E4;
$caption    = " \tDoc properties: _pack_VT_LPSTR('$string',\t$codepage')";
$target     = join " ",  qw(
                            1E 00 00 00 04 00 00 00 63 63 63 00
                           );

$result     = unpack_record( _pack_VT_LPSTR($string, $codepage) );
is($result, $target, $caption);


###############################################################################
#
# Test 6. Pack a VT_LPSTR string and check for padding.
#
$string     = 'dddd';
$codepage   = 0x04E4;
$caption    = " \tDoc properties: _pack_VT_LPSTR('$string',\t$codepage')";
$target     = join " ",  qw(
                            1E 00 00 00 05 00 00 00 64 64 64 64 00 00 00 00
                           );

$result     = unpack_record( _pack_VT_LPSTR($string, $codepage) );
is($result, $target, $caption);


###############################################################################
#
# Test 7. Pack a VT_LPSTR string and check for padding.
#
$string     = 'Username';
$codepage   = 0x04E4;
$caption    = " \tDoc properties: _pack_VT_LPSTR('$string',\t$codepage')";
$target     = join " ",  qw(
                            1E 00 00 00 09 00 00 00 55 73 65 72 6E 61 6D 65
                            00 00 00 00
                           );

$result     = unpack_record( _pack_VT_LPSTR($string, $codepage) );
is($result, $target, $caption);


###############################################################################
#
# Test 8. Pack a VT_LPSTR UTF8 string.
#
SKIP: {

skip " \t_pack_VT_LPSTR(utf8). Test requires Perl 5.8 Unicode support.", 1
     if $] < 5.008;

$string     = "$smiley";
$codepage   = 0xFDE9;
$caption    = " \tDoc properties: _pack_VT_LPSTR('\$smiley',\t$codepage')";
$target     = join " ",  qw(
                            1E 00 00 00 04 00 00 00 E2 98 BA 00
                           );

$result     = unpack_record( _pack_VT_LPSTR($string, $codepage) );
is($result, $target, $caption);

}


###############################################################################
#
# Test 9. Pack a VT_LPSTR UTF8 string.
#
SKIP: {

skip " \t_pack_VT_LPSTR(utf8). Test requires Perl 5.8 Unicode support.", 1
     if $] < 5.008;

$string     = "a$smiley";
$codepage   = 0xFDE9;
$caption    = " \tDoc properties: _pack_VT_LPSTR('a\$smiley',\t$codepage')";
$target     = join " ",  qw(
                            1E 00 00 00 05 00 00 00 61 E2 98 BA 00 00 00 00
                           );

$result     = unpack_record( _pack_VT_LPSTR($string, $codepage) );
is($result, $target, $caption);

}


###############################################################################
#
# Test 10. Pack a VT_LPSTR UTF8 string.
#
SKIP: {

skip " \t_pack_VT_LPSTR(utf8). Test requires Perl 5.8 Unicode support.", 1
     if $] < 5.008;

$string     = "aa$smiley";
$codepage   = 0xFDE9;
$caption    = " \tDoc properties: _pack_VT_LPSTR('aa\$smiley',\t$codepage')";
$target     = join " ",  qw(
                            1E 00 00 00 06 00 00 00 61 61 E2 98 BA 00 00 00
                           );

$result     = unpack_record( _pack_VT_LPSTR($string, $codepage) );
is($result, $target, $caption);

}


###############################################################################
#
# Test 11. Pack a VT_LPSTR UTF8 string.
#
SKIP: {

skip " \t_pack_VT_LPSTR(utf8). Test requires Perl 5.8 Unicode support.", 1
     if $] < 5.008;

$string     = "aaa$smiley";
$codepage   = 0xFDE9;
$caption    = " \tDoc properties: _pack_VT_LPSTR('aaa\$smiley',\t$codepage')";
$target     = join " ",  qw(
                            1E 00 00 00 07 00 00 00 61 61 61 E2 98 BA 00 00
                           );

$result     = unpack_record( _pack_VT_LPSTR($string, $codepage) );
is($result, $target, $caption);

}


###############################################################################
#
# Test 12. Pack a VT_LPSTR UTF8 string.
#
SKIP: {

skip " \t_pack_VT_LPSTR(utf8). Test requires Perl 5.8 Unicode support.", 1
     if $] < 5.008;

$string     = "aaaa$smiley";
$codepage   = 0xFDE9;
$caption    = " \tDoc properties: _pack_VT_LPSTR('aaaa\$smiley',\t$codepage')";
$target     = join " ",  qw(
                            1E 00 00 00 08 00 00 00 61 61 61 61 E2 98 BA 00
                           );

$result     = unpack_record( _pack_VT_LPSTR($string, $codepage) );
is($result, $target, $caption);

}


###############################################################################
#
# Test 13. Pack a VT_FILETIME.
#

# Wed Aug 13 01:40:00 2008
# $sec,$min,$hour,$mday,$mon,$year
# We normalise the time using timegm() so that the tests don't fail due to
# different timezones.
$filetime   = [localtime(timegm(0, 40, 0, 13, 7, 108))];

$caption    = " \tDoc properties: _pack_VT_FILETIME()";
$target     = join " ",  qw(
                            40 00 00 00 00 70 EB 1D DD FC C8 01
                           );

$result     = unpack_record( _pack_VT_FILETIME($filetime) );
is($result, $target, $caption);


###############################################################################
#
# Unpack the binary data into a format suitable for printing in tests.
#
sub unpack_record {
    return join ' ', map {sprintf "%02X", $_} unpack "C*", $_[0];
}


__END__