#!perl -w
#
# More Win32::API::Struct related tests
#
# $Id$
use strict;
use warnings;
use Test::More;
use Win32::API::Struct;
# TODO Move to Win32::API::Struct???
use constant CHAR_SIZE => 1;
use constant WORD_SIZE => 4;
sub chars {
my ($n) = @_;
$n += 0;
return $n * CHAR_SIZE;
}
sub words {
my ($n) = @_;
$n += 0;
return $n * WORD_SIZE;
}
# BEGIN {
# $Win32::API::DEBUG = 1;
# }
my $struct;
my $size;
my $test_cases = {
empty => {
typedef => [],
sizeof => 0,
},
#empty_with_spaces => {
# typedef => [qw( \n \n )],
# sizeof => 0,
#},
one_word => {
typedef => [qw(DWORD dwSize;)],
sizeof => words(1),
},
one_word_no_semicolon => {
typedef => [qw(DWORD dwSize)],
sizeof => words(1),
},
two_words => {
typedef => [qw(DWORD var1; DWORD var2;)],
sizeof => words(2),
},
three_words => {
typedef => [qw(DWORD var1; DWORD var2; DWORD var3;)],
sizeof => words(3),
},
four_words => {
typedef => [qw(DWORD var1; DWORD var2; DWORD var3; DWORD var4;)],
sizeof => words(4),
},
all_longs => {
typedef => [qw(LONG l1; LONG l2; LONG l3; LONG l4; LONG l5;)],
sizeof => words(5),
},
mixing_longs_and_dwords => {
typedef => [qw(DWORD var1; LONG var2; LONG var3;)],
sizeof => words(3),
},
# XXX Is align correct here??
one_char => {
typedef => [qw(CHAR c1;)],
sizeof => chars(1),
},
# XXX and here?
only_chars => {
typedef => [qw(CHAR c1; CHAR c2; CHAR c3;)],
sizeof => chars(3),
},
array_of_chars => {
typedef => [qw(CHAR array[100];)],
sizeof => chars(100),
},
compound_1 => {
typedef => [
qw(
DWORD dwTest;
CHAR szString[200];
LONG lpDouble;
DWORD dwTest2;
)
],
sizeof => words(3) + chars(200),
},
compound_2 => {
typedef => [
qw(
DWORD dwTest;
CHAR chTest;
CHAR szString[6];
)
],
sizeof => words(1) + chars(7),
todo => 'Breaks atm',
},
};
plan tests => 2 * scalar keys %{$test_cases};
for my $name (sort keys %{$test_cases}) {
my $data = $test_cases->{$name};
my @struct_def = @{$data->{typedef}};
my $align =
exists $data->{align}
? $data->{align}
: 'auto';
typedef Win32::API::Struct $name => @struct_def;
$struct = new Win32::API::Struct($name);
ok($struct, qq{"$name" struct defined});
if (exists $data->{todo}) {
local $TODO = $data->{todo};
$size = $struct->sizeof;
is($size, $data->{sizeof},
qq{Size of struct "$name" is calculated correctly ($size)});
}
else {
$size = $struct->sizeof;
is($size, $data->{sizeof},
qq{Size of struct "$name" is calculated correctly ($size)});
}
}