- Minor improvements.

- Added tests for GDI and USER.
This commit is contained in:
Patrik Stridvall 2002-10-02 19:54:14 +00:00 committed by Alexandre Julliard
parent d313073247
commit df6d37e0f2
3 changed files with 379 additions and 34 deletions

View file

@ -69,6 +69,17 @@ sub name {
} }
} }
sub pack {
my $self = shift;
my $pack = \${$self->{PACK}};
local $_ = shift;
if(defined($_)) { $$pack = $_; }
return $$pack;
}
sub fields { sub fields {
my $self = shift; my $self = shift;

View file

@ -52,3 +52,251 @@ WIN32_FILE_ATTRIBUTE_DATA
WIN32_FIND_DATAA WIN32_FIND_DATAA
WIN32_FIND_DATAW WIN32_FIND_DATAW
WIN32_STREAM_ID WIN32_STREAM_ID
%%%dlls/gdi/tests
%%pack
%description
Unit tests for data structure packing
%include
wingdi.h
%struct
ABC
ABCFLOAT
BITMAP
BITMAPCOREHEADER
# BITMAPCOREINFO
BITMAPFILEHEADER
# BITMAPINFO
BITMAPINFOHEADER
# BITMAPV4HEADER
# BITMAPV5HEADER
BLENDFUNCTION
# CHARSETINFO
CIEXYZ
# CIEXYZTRIPLE
# COLORADJUSTMENT
# DEVMODEA
# DEVMODEW
# DIBSECTION
DISPLAY_DEVICEA
DISPLAY_DEVICEW
DOCINFOA
DOCINFOW
EMR
EMRABORTPATH
EMRANGLEARC
EMRARC
EMRBITBLT
# EMRCREATEBRUSHINDIRECT
# EMRCREATECOLORSPACE
# EMRCREATECOLORSPACEW
EMRCREATEDIBPATTERNBRUSHPT
EMRCREATEMONOBRUSH
# EMRCREATEPALETTE
# EMRCREATEPEN
EMRDELETECOLORSPACE
EMRDELETEOBJECT
EMRELLIPSE
EMREOF
EMREXCLUDECLIPRECT
# EMREXTCREATEFONTINDIRECTW
# EMREXTCREATEPEN
EMREXTFLOODFILL
# EMREXTSELECTCLIPRGN
# EMREXTTEXTOUTA
EMRFILLPATH
# EMRFILLRGN
EMRFORMAT
# EMRFRAMERGN
# EMRGDICOMMENT
# EMRGLSBOUNDEDRECORD
# EMRGLSRECORD
# EMRINVERTRGN
EMRLINETO
EMRMASKBLT
EMRMODIFYWORLDTRANSFORM
EMROFFSETCLIPRGN
# EMRPIXELFORMAT
EMRPLGBLT
# EMRPOLYDRAW
EMRPOLYLINE
EMRPOLYPOLYLINE
# EMRPOLYTEXTOUTA
EMRRESIZEPALETTE
EMRRESTOREDC
EMRROUNDRECT
EMRSCALEVIEWPORTEXTEX
EMRSELECTCLIPPATH
EMRSELECTPALETTE
EMRSETARCDIRECTION
EMRSETBKCOLOR
EMRSETBRUSHORGEX
# EMRSETCOLORADJUSTMENT
EMRSETDIBITSTODEIVCE
EMRSETMAPPERFLAGS
EMRSETMITERLIMIT
EMRSETPALETTEENTRIES
EMRSETPIXELV
EMRSETTEXTJUSTIFICATION
EMRSETVIEWPORTEXTEX
EMRSETWORLDTRANSFORM
EMRSTRETCHBLT
EMRSTRETCHDIBITS
EMRTEXT
# ENHMETAHEADER
ENHMETARECORD
# ENUMLOGFONTA
# ENUMLOGFONTEXA
# ENUMLOGFONTEXW
# ENUMLOGFONTW
# EXTLOGFONTA
# EXTLOGFONTW
EXTLOGPEN
# FIXED
FONTSIGNATURE
GCP_RESULTSA
GCP_RESULTSW
# GLYPHMETRICS
GRADIENT_RECT
GRADIENT_TRIANGLE
HANDLETABLE
KERNINGPAIR
LOCALESIGNATURE
LOGBRUSH
# LOGCOLORSPACEA
# LOGCOLORSPACEW
# LOGFONTA
# LOGFONTW
LOGPALETTE
LOGPEN
MAT2
METAFILEPICT
METAHEADER
METARECORD
# NEWTEXTMETRICA
# NEWTEXTMETRICEXA
# NEWTEXTMETRICEXW
# NEWTEXTMETRICW
# OUTLINETEXTMETRICA
# OUTLINETEXTMETRICW
PALETTEENTRY
# PANOSE
PELARRAY
PIXELFORMATDESCRIPTOR
POINTFX
# POLYTEXTA
# POLYTEXTW
# RASTERIZER_STATUS
RGBQUAD
# RGBTRIPLE
# RGNDATA
# RGNDATAHEADER
TEXTMETRICA
TEXTMETRICW
# TRIVERTEX
# TTPOLYCURVE
# TTPOLYGONHEADER
XFORM
%%%dlls/user/tests
%%pack
%description
Unit tests for data structure packing
%include
winbase.h
winuser.h
%struct
# ACCEL
ACCESSTIMEOUT
ANIMATIONINFO
CBTACTIVATESTRUCT
CBT_CREATEWNDA
CBT_CREATEWNDW
CLIENTCREATESTRUCT
COMPAREITEMSTRUCT
COPYDATASTRUCT
CREATESTRUCTA
CREATESTRUCTW
CURSORINFO
CWPRETSTRUCT
CWPSTRUCT
DEBUGHOOKINFO
DELETEITEMSTRUCT
DLGITEMTEMPLATE
DLGTEMPLATE
DRAWITEMSTRUCT
DRAWTEXTPARAMS
EVENTMSG
FILTERKEYS
HARDWAREHOOKSTRUCT
HARDWAREINPUT
HELPINFO
HELPWININFOA
HELPWININFOW
HIGHCONTRASTA
HIGHCONTRASTW
ICONINFO
# ICONMETRICSA
# ICONMETRICSW
# INPUT
KBDLLHOOKSTRUCT
KEYBDINPUT
MDICREATESTRUCTA
MDICREATESTRUCTW
MDINEXTMENU
MEASUREITEMSTRUCT
MENUINFO
MENUITEMINFOA
MENUITEMINFOW
# MENUITEMTEMPLATE
MENUITEMTEMPLATEHEADER
MINIMIZEDMETRICS
MINMAXINFO
MONITORINFO
# MONITORINFOEXA
# MONITORINFOEXW
MOUSEHOOKSTRUCT
MOUSEINPUT
MOUSEKEYS
MSG
MSGBOXPARAMSA
MSGBOXPARAMSW
MSLLHOOKSTRUCT
MULTIKEYHELPA
MULTIKEYHELPW
NCCALCSIZE_PARAMS
NMHDR
# NONCLIENTMETRICSA
# NONCLIENTMETRICSW
PAINTSTRUCT
SCROLLINFO
SERIALKEYSA
SERIALKEYSW
SOUNDSENTRYA
SOUNDSENTRYW
STICKYKEYS
STYLESTRUCT
TOGGLEKEYS
TPMPARAMS
TRACKMOUSEEVENT
WINDOWINFO
WINDOWPLACEMENT
WINDOWPOS
WNDCLASSA
WNDCLASSEXA
WNDCLASSEXW
WNDCLASSW

View file

@ -91,6 +91,7 @@ foreach my $file (@files) {
my $line; my $line;
my $type; my $type;
my @packs = (4);
my $update_output = sub { my $update_output = sub {
my $progress = ""; my $progress = "";
@ -116,9 +117,28 @@ foreach my $file (@files) {
}; };
$parser->set_found_line_callback($found_line); $parser->set_found_line_callback($found_line);
my $found_preprocessor = sub {
my $begin_line = shift;
my $begin_column = shift;
my $preprocessor = shift;
local $_ = $preprocessor;
if (/^\#\s*include\s+\"pshpack(\d+)\.h\"$/) {
push @packs, $1;
} elsif(/^\#\s*include\s+\"poppack\.h\"$/) {
unshift @packs;
}
return 1;
};
$parser->set_found_preprocessor_callback($found_preprocessor);
my $found_type = sub { my $found_type = sub {
$type = shift; $type = shift;
my $pack = $packs[$#packs];
$type->pack($pack);
my $name = $type->name; my $name = $type->name;
$file2types{$file}{$name} = $type; $file2types{$file}{$name} = $type;
@ -139,20 +159,25 @@ foreach my $file (@files) {
$output->prefix(""); $output->prefix("");
} }
########################################################################
# output_header
sub output_header { sub output_header {
local *OUT = shift; local *OUT = shift;
my $test_dir = shift; my $test_dir = shift;
my $test = shift; my @tests = @{(shift)};
print OUT "/* File generated automatically from $wine_dir/tools/winapi/test.dat; do not edit! */\n"; print OUT "/* File generated automatically from tools/winapi/test.dat; do not edit! */\n";
print OUT "/* This file can be copied, modified and distributed without restriction. */\n"; print OUT "/* This file can be copied, modified and distributed without restriction. */\n";
print OUT "\n"; print OUT "\n";
print OUT "/*\n"; print OUT "/*\n";
my @description = $tests->get_section($test_dir, $test, "description"); foreach my $test (@tests) {
foreach my $description (@description) { my @description = $tests->get_section($test_dir, $test, "description");
print OUT " * $description\n"; foreach my $description (@description) {
print OUT " * $description\n";
}
} }
print OUT " */\n"; print OUT " */\n";
@ -160,25 +185,37 @@ sub output_header {
print OUT "#include <stdio.h>\n"; print OUT "#include <stdio.h>\n";
print OUT "\n"; print OUT "\n";
print OUT "#include \"wine/test.h\"\n"; print OUT "#include \"wine/test.h\"\n";
my @includes = $tests->get_section($test_dir, $test, "include"); foreach my $test (@tests) {
foreach my $include (@includes) { my @includes = $tests->get_section($test_dir, $test, "include");
print OUT "#include \"$include\"\n"; foreach my $include (@includes) {
print OUT "#include \"$include\"\n";
}
} }
print OUT "\n"; print OUT "\n";
print OUT "START_TEST(generated_$test)\n";
print OUT "{\n";
} }
########################################################################
# output_footer
sub output_footer { sub output_footer {
local *OUT = shift; local *OUT = shift;
my $test_dir = shift; my $test_dir = shift;
my $test = shift; my @tests = @{(shift)};
print OUT "START_TEST(generated)\n";
print OUT "{\n";
foreach my $test (@tests) {
print OUT " test_$test();\n";
}
print OUT "}\n"; print OUT "}\n";
} }
########################################################################
# output_field_size
my %type_name2size;
sub field_size { sub field_size {
my $name = shift; my $name = shift;
my $field_type = shift; my $field_type = shift;
@ -194,15 +231,19 @@ sub field_size {
} }
my $size; my $size;
if(/^(?:(?:signed\s+|unsigned\s+)?char|CHAR|BYTE|UCHAR)$/) { if (defined($size = $type_name2size{$field_type})) {
# Nothing
} elsif(/^(?:(?:signed\s+|unsigned\s+)?char|CHAR|BYTE|UCHAR)$/) {
$size = 1; $size = 1;
} elsif (/^(?:(?:signed\s+|unsigned\s+)?short|UWORD|WCHAR|WORD)$/) { } elsif (/^(?:(?:signed\s+|unsigned\s+)?short|ATOM|UWORD|WCHAR|WORD)$/) {
$size = 2; $size = 2;
} elsif (/^(?:FILETIME|LARGE_INTEGER|LONGLONG|ULONGLONG)$/) { } elsif (/^(?:FILETIME|LARGE_INTEGER|LONGLONG|ULONGLONG)$/) {
$size = 8; $size = 8;
} elsif (/^(?:SYSTEMTIME)$/) { } elsif (/^(?:EMR|POINTL?|SIZEL)$/) {
$size = 8;
} elsif (/^(?:RECTL?|SYSTEMTIME)$/) {
$size = 16; $size = 16;
} elsif (/^(?:CRITICAL_SECTION)$/) { } elsif (/^(?:CRITICAL_SECTION|XFORM)$/) {
$size = 24; $size = 24;
} elsif (/^(?:DCB)$/) { } elsif (/^(?:DCB)$/) {
$size = 28; $size = 28;
@ -232,27 +273,37 @@ sub field_size {
} }
######################################################################## ########################################################################
# output_file # output_test_pack
sub output_file { sub output_test_pack {
local *OUT = shift; local *OUT = shift;
my $test_dir = shift; my $test_dir = shift;
my $test = shift; my $test = shift;
output_header(\*OUT, $test_dir, $test);
my @includes = $tests->get_section($test_dir, $test, "include"); my @includes = $tests->get_section($test_dir, $test, "include");
my @type_names = $tests->get_section($test_dir, $test, "struct"); my @type_names = $tests->get_section($test_dir, $test, "struct");
my %type_name_not_used;
foreach my $type_name (@type_names) {
$type_name_not_used{$type_name} = 1;
}
# FIXME: Topological sort of @type_names
foreach my $include (@includes) { foreach my $include (@includes) {
my $types = $file2types{"include/$include"}; my $types = $file2types{"include/$include"};
foreach my $type_name (@type_names) { foreach my $type_name (@type_names) {
my $pack = 4; # FIXME: Not always correct
my $type = $$types{$type_name}; my $type = $$types{$type_name};
if (!defined($type)) {
next;
}
$type_name_not_used{$type_name} = 0;
my $pack = $type->pack;
my $offset = 0; my $offset = 0;
my $offset_bits = 0; my $offset_bits = 0;
@ -284,7 +335,8 @@ sub output_file {
if ($type_size % $pack != 0) { if ($type_size % $pack != 0) {
$type_size = (int($type_size / $pack) + 1) * $pack; $type_size = (int($type_size / $pack) + 1) * $pack;
} }
$type_name2size{$type_name} = $type_size;
print OUT " ok(sizeof($type_name) == $type_size, "; print OUT " ok(sizeof($type_name) == $type_size, ";
print OUT "\"sizeof($type_name) == %d (expected $type_size)\", "; print OUT "\"sizeof($type_name) == %d (expected $type_size)\", ";
print OUT "sizeof($type_name));\n"; print OUT "sizeof($type_name));\n";
@ -292,13 +344,47 @@ sub output_file {
} }
} }
output_footer(\*OUT, $test_dir, $test); foreach my $type_name (@type_names) {
} if ($type_name_not_used{$type_name}) {
$output->write("$test_dir: $test: $type_name: type not found (ignored)\n");
foreach my $test (@tests) { }
my @test_dirs = $tests->get_test_dirs($test);
foreach my $test_dir (@test_dirs) {
my $file = "$wine_dir/$test_dir/generated_$test.c";
replace_file($file, \&output_file, $test_dir, $test);
} }
} }
########################################################################
# output_file
sub output_file {
local *OUT = shift;
my $test_dir = shift;
my @tests = @{(shift)};
output_header(\*OUT, $test_dir, \@tests);
foreach my $test (@tests) {
print OUT "void test_$test(void)\n";
print OUT "{\n";
if ($test eq "pack") {
output_test_pack(\*OUT, $test_dir, $test);
} else {
die "no such test ($test)\n";
}
print OUT "}\n";
print OUT "\n";
}
output_footer(\*OUT, $test_dir, \@tests);
}
########################################################################
# main
my @test_dirs = $tests->get_test_dirs();
foreach my $test_dir (@test_dirs) {
my $file = "$wine_dir/$test_dir/generated.c";
replace_file($file, \&output_file, $test_dir, \@tests);
}