Wine-devel
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
June 2018
- 68 participants
- 583 discussions
[PATCH 1/4] wsdapi: Add support for listening for UDP multicast broadcasts.
by Owen Rudge 07 Jun '18
by Owen Rudge 07 Jun '18
07 Jun '18
Signed-off-by: Owen Rudge <orudge(a)codeweavers.com>
---
dlls/wsdapi/network.c | 278
+++++++++++++++++++++++++++++++++++++++++-
dlls/wsdapi/wsdapi_internal.h | 4 +
2 files changed, 281 insertions(+), 1 deletion(-)
2
1
[PATCH 2/2] schedsvc: Add support for running missed tasks at the service start.
by Dmitry Timoshkov 07 Jun '18
by Dmitry Timoshkov 07 Jun '18
07 Jun '18
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/schedsvc/atsvc.c | 24 ++++++++++++++++++++++++
dlls/schedsvc/schedsvc_private.h | 1 +
dlls/schedsvc/svc_main.c | 1 +
3 files changed, 26 insertions(+)
diff --git a/dlls/schedsvc/atsvc.c b/dlls/schedsvc/atsvc.c
index da837d8a8e..6c6e3e109e 100644
--- a/dlls/schedsvc/atsvc.c
+++ b/dlls/schedsvc/atsvc.c
@@ -1033,6 +1033,30 @@ void check_task_time(void)
LeaveCriticalSection(&at_job_list_section);
}
+void check_missed_task_time(void)
+{
+ FILETIME current_ft, last_ft;
+ struct job_t *job;
+
+ GetSystemTimeAsFileTime(¤t_ft);
+ FileTimeToLocalFileTime(¤t_ft, ¤t_ft);
+
+ EnterCriticalSection(&at_job_list_section);
+
+ LIST_FOR_EACH_ENTRY(job, &at_job_list, struct job_t, entry)
+ {
+ if (SystemTimeToFileTime(&job->data.last_runtime, &last_ft))
+ {
+ if (job_runs_at(job, &last_ft, ¤t_ft))
+ {
+ run_job(job);
+ }
+ }
+ }
+
+ LeaveCriticalSection(&at_job_list_section);
+}
+
void remove_job(const WCHAR *name)
{
struct job_t *job;
diff --git a/dlls/schedsvc/schedsvc_private.h b/dlls/schedsvc/schedsvc_private.h
index 10892d55ca..117c6f51ed 100644
--- a/dlls/schedsvc/schedsvc_private.h
+++ b/dlls/schedsvc/schedsvc_private.h
@@ -31,6 +31,7 @@ void update_process_status(DWORD pid) DECLSPEC_HIDDEN;
BOOL get_next_runtime(LARGE_INTEGER *rt) DECLSPEC_HIDDEN;
void check_task_time(void) DECLSPEC_HIDDEN;
void load_at_tasks(void) DECLSPEC_HIDDEN;
+void check_missed_task_time(void) DECLSPEC_HIDDEN;
static inline WCHAR *heap_strdupW(const WCHAR *src)
{
diff --git a/dlls/schedsvc/svc_main.c b/dlls/schedsvc/svc_main.c
index 2bba674b07..8e23a049db 100644
--- a/dlls/schedsvc/svc_main.c
+++ b/dlls/schedsvc/svc_main.c
@@ -54,6 +54,7 @@ static DWORD WINAPI tasks_monitor_thread(void *arg)
TRACE("Starting...\n");
load_at_tasks();
+ check_missed_task_time();
htimer = CreateWaitableTimerW(NULL, FALSE, NULL);
if (htimer == NULL)
--
2.16.3
1
0
[PATCH 1/4] testbot: Handle staging at the Job level and avoid race conditions.
by Francois Gouget 06 Jun '18
by Francois Gouget 06 Jun '18
06 Jun '18
When a patch or executable is submitted for testing it is stored in the
staging directory for two reasons, first because the corresponding Job
does not exist yet, and second because the process may not have write
permissions to the Job directory.
So far transfering the file to the Job directory was the responsibility
of the Step that needs it. However this breaks down when more than one
Step needs that file (e.g. a Windows executable build Step and a Wine
testing one).
There is also a (very unlikely) race condition between the scheduler
and the Job creation: the Scheduler could run the first saved Task, mark
it and the Job as completed before the Job's other Steps and Tasks get
saved to the database. Those would then never get run since the Jobs
has completed.
So this patch makes staging the responsibility of the Job and introduces
a staging Status for it.
It also introduces a new Status which indicates the Job is still being
set up to avoid race conditions.
Note that this patch preserves the Step-based staging mechanism for
backward compatibility during the transition.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
Note:
* This requires updating the database schema and restarting the TestBot
Engine and web server.
* The following patches switch each Job creator to the new scheme.
testbot/bin/CheckForWinetestUpdate.pl | 2 ++
testbot/ddl/update36.sql | 4 +++
testbot/ddl/winetestbot.sql | 2 +-
testbot/lib/WineTestBot/Engine/Scheduler.pm | 30 ++++++++++++++++++++-
testbot/lib/WineTestBot/Jobs.pm | 20 +++++++++++---
testbot/lib/WineTestBot/Patches.pm | 1 +
testbot/web/Submit.pl | 1 +
7 files changed, 54 insertions(+), 6 deletions(-)
create mode 100644 testbot/ddl/update36.sql
diff --git a/testbot/bin/CheckForWinetestUpdate.pl b/testbot/bin/CheckForWinetestUpdate.pl
index f41148f12..17dab8236 100755
--- a/testbot/bin/CheckForWinetestUpdate.pl
+++ b/testbot/bin/CheckForWinetestUpdate.pl
@@ -200,6 +200,7 @@ sub AddJob($$$)
# First create a new job
my $Jobs = CreateJobs();
my $NewJob = $Jobs->Add();
+ $NewJob->Status("queued");
$NewJob->User(GetBatchUser());
$NewJob->Priority($BaseJob && $Bits == 32 ? 8 : 9);
$NewJob->Remarks($Remarks);
@@ -243,6 +244,7 @@ sub AddReconfigJob()
# First create a new job
my $Jobs = CreateJobs();
my $NewJob = $Jobs->Add();
+ $NewJob->Status("queued");
$NewJob->User(GetBatchUser());
$NewJob->Priority(3);
$NewJob->Remarks($Remarks);
diff --git a/testbot/ddl/update36.sql b/testbot/ddl/update36.sql
new file mode 100644
index 000000000..2f4bf7fa2
--- /dev/null
+++ b/testbot/ddl/update36.sql
@@ -0,0 +1,4 @@
+USE winetestbot;
+
+ALTER TABLE Jobs
+ MODIFY Status ENUM('new', 'staging', 'queued', 'running', 'completed', 'badpatch', 'badbuild', 'boterror', 'canceled') NOT NULL;
diff --git a/testbot/ddl/winetestbot.sql b/testbot/ddl/winetestbot.sql
index 9a28385a9..1e7b1edd1 100644
--- a/testbot/ddl/winetestbot.sql
+++ b/testbot/ddl/winetestbot.sql
@@ -113,7 +113,7 @@ CREATE TABLE Jobs
BranchName VARCHAR(20) NOT NULL,
UserName VARCHAR(40) NOT NULL,
Priority INT(1) NOT NULL,
- Status ENUM('queued', 'running', 'completed', 'badpatch', 'badbuild', 'boterror', 'canceled') NOT NULL,
+ Status ENUM('new', 'staging', 'queued', 'running', 'completed', 'badpatch', 'badbuild', 'boterror', 'canceled') NOT NULL,
Remarks VARCHAR(128) NULL,
Submitted DATETIME NOT NULL,
Ended DATETIME NULL,
diff --git a/testbot/lib/WineTestBot/Engine/Scheduler.pm b/testbot/lib/WineTestBot/Engine/Scheduler.pm
index 10c0b70ed..85bc0f397 100644
--- a/testbot/lib/WineTestBot/Engine/Scheduler.pm
+++ b/testbot/lib/WineTestBot/Engine/Scheduler.pm
@@ -30,6 +30,8 @@ WineTestBot::Engine::Scheduler - Schedules the TestBot tasks
use Exporter 'import';
our @EXPORT = qw(ScheduleJobs CheckJobs);
+use File::Copy;
+
use WineTestBot::Config;
use WineTestBot::Engine::Events;
use WineTestBot::Jobs;
@@ -524,11 +526,37 @@ sub _ScheduleTasks($)
# Process the jobs in decreasing priority order
my $JobRank;
my $Jobs = CreateJobs($Sched->{VMs});
- $Jobs->AddFilter("Status", ["queued", "running"]);
+ $Jobs->AddFilter("Status", ["staging", "queued", "running"]);
foreach my $Job (sort CompareJobPriority @{$Jobs->GetItems()})
{
$JobRank++;
+ if ($Job->Status eq "staging")
+ {
+ # Move the file(s) from the staging directory to the job directory
+ my %Staged;
+ my $JobDir = $Job->CreateDir();
+ foreach my $Step (@{$Job->Steps->Clone()->GetItems()})
+ {
+ # Ignore steps that need a file provided by the previous step
+ next if ($Step->PreviousNo or !defined $Step->FileName);
+ # Skip the step if its file has already been staged
+ next if ($Staged{$Step->FileName});
+
+ my $StagingFile = "job". $Job->Id ."_". $Step->FileName;
+ if (move("$DataDir/staging/$StagingFile", "$JobDir/". $Step->FileName))
+ {
+ $Staged{$Step->FileName} = 1;
+ }
+ else
+ {
+ LogMsg "Could not move the '$StagingFile' staging file: $!";
+ }
+ }
+ $Job->Status("queued");
+ $Job->Save();
+ }
+
# The per-step lists of VMs that should be getting ready to run
# before we prepare the next step
my %StepVMs = ("" => []); # no dependency for the first step
diff --git a/testbot/lib/WineTestBot/Jobs.pm b/testbot/lib/WineTestBot/Jobs.pm
index 13a389586..3fd78aaa2 100644
--- a/testbot/lib/WineTestBot/Jobs.pm
+++ b/testbot/lib/WineTestBot/Jobs.pm
@@ -1,6 +1,6 @@
# -*- Mode: Perl; perl-indent-level: 2; indent-tabs-mode: nil -*-
# Copyright 2009 Ge van Geldorp
-# Copyright 2012-2017 Francois Gouget
+# Copyright 2012-2018 Francois Gouget
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -52,7 +52,19 @@ A Job's lifecycle is as follows:
=over
=item *
-A Job is created with Status set to queued which means it is ready to run.
+A Job is created with Status set to new. During this time the process setting
+up the Job can add new Steps and Tasks to it. It can also put the required
+input files into place in the staging directory with a name of the form
+'job<JobID>_<FileName>' where <JobId> is the Id of the new Job, and FileName is
+the name of a file a Step depends on.
+
+=item *
+Once the Job set up is complete its Status is set to staging. This indicates
+that the TestBot Engine can retrieve the files it depends on from the staging
+directory and move them to the Job's directory.
+
+=item *
+Then the Status is set to queued which indicates the Job is ready to run.
=item *
As soon as one of the Step starts running, the Job's Status field is set to
@@ -93,7 +105,7 @@ sub InitializeNew($$)
my ($self, $Collection) = @_;
$self->Branch(CreateBranches()->GetDefaultBranch());
- $self->Status("queued");
+ $self->Status("new");
$self->Submitted(time());
$self->SUPER::InitializeNew($Collection);
@@ -446,7 +458,7 @@ my @PropertyDescriptors = (
CreateItemrefPropertyDescriptor("Branch", "Branch", !1, 1, \&CreateBranches, ["BranchName"]),
CreateItemrefPropertyDescriptor("User", "Author", !1, 1, \&CreateUsers, ["UserName"]),
CreateBasicPropertyDescriptor("Priority", "Priority", !1, 1, "N", 1),
- CreateEnumPropertyDescriptor("Status", "Status", !1, 1, ['queued', 'running', 'completed', 'badpatch', 'badbuild', 'boterror', 'canceled']),
+ CreateEnumPropertyDescriptor("Status", "Status", !1, 1, ['new', 'staging', 'queued', 'running', 'completed', 'badpatch', 'badbuild', 'boterror', 'canceled']),
CreateBasicPropertyDescriptor("Remarks", "Remarks", !1, !1, "A", 128),
CreateBasicPropertyDescriptor("Submitted", "Submitted", !1, !1, "DT", 19),
CreateBasicPropertyDescriptor("Ended", "Ended", !1, !1, "DT", 19),
diff --git a/testbot/lib/WineTestBot/Patches.pm b/testbot/lib/WineTestBot/Patches.pm
index d5be1b355..4f428133f 100644
--- a/testbot/lib/WineTestBot/Patches.pm
+++ b/testbot/lib/WineTestBot/Patches.pm
@@ -166,6 +166,7 @@ sub Submit($$$)
# Create a new job for this patch
my $NewJob = $Jobs->Add();
+ $NewJob->Status("queued");
$NewJob->User($User);
$NewJob->Priority(6);
my $PropertyDescriptor = $Jobs->GetPropertyDescriptorByName("Remarks");
diff --git a/testbot/web/Submit.pl b/testbot/web/Submit.pl
index ae69e7ce5..8e22621fd 100644
--- a/testbot/web/Submit.pl
+++ b/testbot/web/Submit.pl
@@ -774,6 +774,7 @@ sub OnSubmit($)
# First create a new job
my $Jobs = CreateJobs();
my $NewJob = $Jobs->Add();
+ $NewJob->Status("queued");
$NewJob->User($self->GetCurrentSession()->User);
$NewJob->Priority(5);
if ($self->GetParam("Remarks"))
--
2.17.0
1
3
[PATCH] testbot: Also mark the VM for maintenance if the reverts get stuck.
by Francois Gouget 06 Jun '18
by Francois Gouget 06 Jun '18
06 Jun '18
When a VM takes a long time to revert the LibvirtTool.pl process
typically remains stuck in the Sys::Virt::DomainSnapshot::revert_to()
call and cannot enforce the timeout itself, thus causing the timeout to
be detected at the TestBot Engine level.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
Live QEmu snapshots are still unusable when when the clock is set to the
LibVirt default, that is:
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
testbot/lib/WineTestBot/Engine/Scheduler.pm | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/testbot/lib/WineTestBot/Engine/Scheduler.pm b/testbot/lib/WineTestBot/Engine/Scheduler.pm
index a191f0e1c..10c0b70ed 100644
--- a/testbot/lib/WineTestBot/Engine/Scheduler.pm
+++ b/testbot/lib/WineTestBot/Engine/Scheduler.pm
@@ -267,8 +267,15 @@ sub _CheckAndClassifyVMs()
{
# The child process got stuck!
$FoundVMErrors = 1;
+ my $NewStatus = "dirty";
+ if ($VM->Status eq "reverting" or $VM->Status eq "sleeping")
+ {
+ my $Errors = ($VM->Errors || 0) + 1;
+ $VM->Errors($Errors);
+ $NewStatus = "maintenance" if ($Errors >= $MaxVMErrors);
+ }
+ $VM->Status($NewStatus);
$VM->KillChild();
- $VM->Status("dirty");
$VM->Save();
$VM->RecordResult($Sched->{records}, "boterror stuck process");
$Sched->{lambvms}->{$VMKey} = 1;
--
2.17.0
1
0
06 Jun '18
Signed-off-by: Owen Rudge <orudge(a)codeweavers.com>
---
dlls/wsdapi/discovery.c | 9 +++++++++
dlls/wsdapi/wsdapi_internal.h | 1 +
2 files changed, 10 insertions(+)
1
0
06 Jun '18
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
Same object is generated with or without this patch when adding
"-g0 -DNDEBUG -DWINETEST_NO_LINE_NUMBERS" to the CFLAGS.
dlls/comctl32/tests/combo.c | 4 ++--
dlls/comctl32/tests/edit.c | 6 +++---
dlls/comctl32/tests/header.c | 4 ++--
dlls/comctl32/tests/imagelist.c | 2 +-
dlls/comctl32/tests/ipaddress.c | 4 ++--
dlls/comctl32/tests/listbox.c | 2 +-
dlls/comctl32/tests/listview.c | 14 +++++++-------
dlls/comctl32/tests/monthcal.c | 7 +++----
dlls/comctl32/tests/mru.c | 4 ++--
dlls/comctl32/tests/progress.c | 2 +-
dlls/comctl32/tests/rebar.c | 4 ++--
dlls/comctl32/tests/status.c | 2 +-
dlls/comctl32/tests/taskdialog.c | 3 +--
dlls/comctl32/tests/toolbar.c | 16 ++++++++--------
dlls/comctl32/tests/tooltips.c | 4 ++--
dlls/comctl32/tests/treeview.c | 14 +++++++-------
dlls/comctl32/tests/updown.c | 12 ++++++------
17 files changed, 51 insertions(+), 53 deletions(-)
diff --git a/dlls/comctl32/tests/combo.c b/dlls/comctl32/tests/combo.c
index 83b36f212f..5fee206fd1 100644
--- a/dlls/comctl32/tests/combo.c
+++ b/dlls/comctl32/tests/combo.c
@@ -264,7 +264,7 @@ static void test_comboex_WM_LBUTTONDOWN(void)
WS_VISIBLE|WS_CHILD|CBS_DROPDOWN, 0, 0, 200, 150,
hComboExParentWnd, NULL, hMainHinst, NULL);
- for (i = 0; i < sizeof(choices)/sizeof(UINT); i++){
+ for (i = 0; i < ARRAY_SIZE(choices); i++){
COMBOBOXEXITEMW cbexItem;
wsprintfW(buffer, stringFormat, choices[i]);
@@ -1169,7 +1169,7 @@ static void test_combo_dropdown_size(DWORD style)
{15, 50, 3},
};
- for (test = 0; test < sizeof(info_height) / sizeof(info_height[0]); test++)
+ for (test = 0; test < ARRAY_SIZE(info_height); test++)
{
const struct list_size_info *info_test = &info_height[test];
int height_item; /* Height of a list item */
diff --git a/dlls/comctl32/tests/edit.c b/dlls/comctl32/tests/edit.c
index 7e9e7e7634..a5097d1cbb 100644
--- a/dlls/comctl32/tests/edit.c
+++ b/dlls/comctl32/tests/edit.c
@@ -2969,7 +2969,7 @@ static void test_EM_GETLINE(void)
hwnd[0] = create_editcontrol(ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0);
hwnd[1] = create_editcontrolW(ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0);
- for (i = 0; i < sizeof(hwnd)/sizeof(hwnd[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(hwnd); i++)
{
static const WCHAR strW[] = {'t','e','x','t',0};
static const char *str = "text";
@@ -2994,13 +2994,13 @@ static void test_EM_GETLINE(void)
ok(!strcmp(buff, str), "Unexpected line data %s.\n", buff);
memset(buffW, 0, sizeof(buffW));
- *(WORD *)buffW = sizeof(buffW)/sizeof(buffW[0]);
+ *(WORD *)buffW = ARRAY_SIZE(buffW);
r = SendMessageW(hwnd[i], EM_GETLINE, 0, (LPARAM)buffW);
ok(r == lstrlenW(strW), "Failed to get a line %d.\n", r);
ok(!lstrcmpW(buffW, strW), "Unexpected line data %s.\n", wine_dbgstr_w(buffW));
memset(buffW, 0, sizeof(buffW));
- *(WORD *)buffW = sizeof(buffW)/sizeof(buffW[0]);
+ *(WORD *)buffW = ARRAY_SIZE(buffW);
r = SendMessageW(hwnd[i], EM_GETLINE, 1, (LPARAM)buffW);
ok(r == lstrlenW(strW), "Failed to get a line %d.\n", r);
ok(!lstrcmpW(buffW, strW), "Unexpected line data %s.\n", wine_dbgstr_w(buffW));
diff --git a/dlls/comctl32/tests/header.c b/dlls/comctl32/tests/header.c
index 7ea80519a6..3428936cd7 100644
--- a/dlls/comctl32/tests/header.c
+++ b/dlls/comctl32/tests/header.c
@@ -1130,7 +1130,7 @@ static void test_hdm_index_messages(HWND hParent)
ok_sequence(sequences, PARENT_SEQ_INDEX, add_header_to_parent_seq,
"adder header control to parent", FALSE);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
- for (i = 0; i < sizeof(item_texts)/sizeof(item_texts[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(item_texts); i++)
{
hdItem.mask = HDI_TEXT | HDI_WIDTH | HDI_FORMAT;
hdItem.pszText = (char*)item_texts[i];
@@ -1170,7 +1170,7 @@ static void test_hdm_index_messages(HWND hParent)
hdItem.mask = HDI_TEXT | HDI_WIDTH;
hdItem.pszText = buffA;
- hdItem.cchTextMax = sizeof(buffA)/sizeof(buffA[0]);
+ hdItem.cchTextMax = ARRAY_SIZE(buffA);
retVal = SendMessageA(hChild, HDM_GETITEMA, 0, (LPARAM) &hdItem);
ok(retVal == TRUE, "Getting the 1st header item should return TRUE, got %d\n", retVal);
diff --git a/dlls/comctl32/tests/imagelist.c b/dlls/comctl32/tests/imagelist.c
index 1c307e4ed3..3bb7902a13 100644
--- a/dlls/comctl32/tests/imagelist.c
+++ b/dlls/comctl32/tests/imagelist.c
@@ -1096,7 +1096,7 @@ static void image_list_init(HIMAGELIST himl, INT grow)
check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, grow, ILC_COLOR24, "total 0");
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
image_list_add_bitmap(himl, td[i].grey, i + 1);
check_iml_data(himl, td[i].cx, td[i].cy, td[i].cur, td[i].max, grow, td[i].bpp, td[i].comment);
diff --git a/dlls/comctl32/tests/ipaddress.c b/dlls/comctl32/tests/ipaddress.c
index 52581899a7..cc79b7bf11 100644
--- a/dlls/comctl32/tests/ipaddress.c
+++ b/dlls/comctl32/tests/ipaddress.c
@@ -50,12 +50,12 @@ static void test_get_set_text(void)
}
/* check text just after creation */
- r = GetWindowTextA(hwnd, ip, sizeof(ip)/sizeof(CHAR));
+ r = GetWindowTextA(hwnd, ip, ARRAY_SIZE(ip));
expect(7, r);
ok(strcmp(ip, "0.0.0.0") == 0, "Expected null IP address, got %s\n", ip);
SendMessageA(hwnd, IPM_SETADDRESS, 0, MAKEIPADDRESS(127, 0, 0, 1));
- r = GetWindowTextA(hwnd, ip, sizeof(ip)/sizeof(CHAR));
+ r = GetWindowTextA(hwnd, ip, ARRAY_SIZE(ip));
expect(9, r);
ok(strcmp(ip, "127.0.0.1") == 0, "Expected 127.0.0.1, got %s\n", ip);
diff --git a/dlls/comctl32/tests/listbox.c b/dlls/comctl32/tests/listbox.c
index 1513bea7f5..f44fdff77f 100644
--- a/dlls/comctl32/tests/listbox.c
+++ b/dlls/comctl32/tests/listbox.c
@@ -48,7 +48,7 @@ static int strcmp_aw(LPCWSTR strw, const char *stra)
WCHAR buf[1024];
if (!stra) return 1;
- MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, sizeof(buf)/sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, ARRAY_SIZE(buf));
return lstrcmpW(strw, buf);
}
diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c
index c2d33c41f5..e9b715ee41 100644
--- a/dlls/comctl32/tests/listview.c
+++ b/dlls/comctl32/tests/listview.c
@@ -2328,7 +2328,7 @@ static void test_multiselect(void)
r = SendMessageA(hwnd, LVM_GETSELECTIONMARK, 0, 0);
ok(r == 0, "got %d\n", r);
- for (i = 0; i < sizeof(task_list)/sizeof(task_list[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(task_list); i++) {
DWORD selected_count;
LVITEMA item;
@@ -3481,7 +3481,7 @@ static void test_norecompute(void)
item.mask = LVIF_TEXT | LVIF_NORECOMPUTE;
item.iItem = 0;
item.pszText = buff;
- item.cchTextMax = sizeof(buff)/sizeof(CHAR);
+ item.cchTextMax = ARRAY_SIZE(buff);
res = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item);
expect(TRUE, res);
ok(lstrcmpA(buff, testA) == 0, "Expected (%s), got (%s)\n", testA, buff);
@@ -3495,7 +3495,7 @@ static void test_norecompute(void)
item.mask = LVIF_TEXT | LVIF_NORECOMPUTE;
item.iItem = 1;
item.pszText = buff;
- item.cchTextMax = sizeof(buff)/sizeof(CHAR);
+ item.cchTextMax = ARRAY_SIZE(buff);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
res = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item);
@@ -3520,7 +3520,7 @@ static void test_norecompute(void)
item.mask = LVIF_TEXT | LVIF_NORECOMPUTE;
item.iItem = 0;
item.pszText = buff;
- item.cchTextMax = sizeof(buff)/sizeof(CHAR);
+ item.cchTextMax = ARRAY_SIZE(buff);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
res = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item);
expect(TRUE, res);
@@ -4662,7 +4662,7 @@ static void test_canceleditlabel(void)
ok(!IsWindow(hwndedit), "Expected edit control to be destroyed\n");
memset(&itema, 0, sizeof(itema));
itema.pszText = buff;
- itema.cchTextMax = sizeof(buff)/sizeof(CHAR);
+ itema.cchTextMax = ARRAY_SIZE(buff);
ret = SendMessageA(hwnd, LVM_GETITEMTEXTA, 0, (LPARAM)&itema);
expect(5, ret);
ok(strcmp(buff, test1) == 0, "Expected label text not to change\n");
@@ -5658,7 +5658,7 @@ static void test_dispinfo(void)
g_disp_A_to_W = TRUE;
item.pszText = (char*)buff;
- item.cchTextMax = sizeof(buff)/sizeof(WCHAR);
+ item.cchTextMax = ARRAY_SIZE(buff);
ret = SendMessageA(hwnd, LVM_GETITEMTEXTA, 0, (LPARAM)&item);
ok(ret == sizeof(testA)-1, "got %d, expected 4\n", ret);
g_disp_A_to_W = FALSE;
@@ -6177,7 +6177,7 @@ static void test_state_image(void)
};
int i;
- for (i = 0; i < sizeof(styles)/sizeof(styles[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(styles); i++)
{
static char text[] = "Item";
static char subtext[] = "Subitem";
diff --git a/dlls/comctl32/tests/monthcal.c b/dlls/comctl32/tests/monthcal.c
index 85822a320c..7c78540333 100644
--- a/dlls/comctl32/tests/monthcal.c
+++ b/dlls/comctl32/tests/monthcal.c
@@ -1216,7 +1216,7 @@ if (0)
} else {
title_index++;
- if (sizeof(title_hits) / sizeof(title_hits[0]) <= title_index)
+ if (ARRAY_SIZE(title_hits) <= title_index)
break;
todo_wine_if(title_hits[title_index].todo)
@@ -1241,8 +1241,7 @@ if (0)
todo_wine ok(month_count + year_count >= 1, "Not enough month and year items\n");
- ok(r.right <= x && title_index + 1 == sizeof(title_hits) / sizeof(title_hits[0]),
- "Wrong title layout\n");
+ ok(r.right <= x && title_index + 1 == ARRAY_SIZE(title_hits), "Wrong title layout\n");
DestroyWindow(hwnd);
}
@@ -2016,7 +2015,7 @@ static void test_sel_notify(void)
};
int i;
- for(i = 0; i < sizeof styles / sizeof styles[0]; i++)
+ for(i = 0; i < ARRAY_SIZE(styles); i++)
{
hwnd = create_monthcal_control(styles[i].val);
SetWindowLongPtrA(hwnd, GWLP_ID, SEL_NOTIFY_TEST_ID);
diff --git a/dlls/comctl32/tests/mru.c b/dlls/comctl32/tests/mru.c
index dfad6f859d..b3d3e7a265 100644
--- a/dlls/comctl32/tests/mru.c
+++ b/dlls/comctl32/tests/mru.c
@@ -118,7 +118,7 @@ static LSTATUS mru_RegDeleteTreeA(HKEY hKey, LPCSTR lpszSubKey)
dwMaxSubkeyLen++;
dwMaxValueLen++;
dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
- if (dwMaxLen > sizeof(szNameBuf)/sizeof(CHAR))
+ if (dwMaxLen > ARRAY_SIZE(szNameBuf))
{
/* Name too big: alloc a buffer for it */
if (!(lpszName = heap_alloc(dwMaxLen * sizeof(CHAR))))
@@ -480,7 +480,7 @@ static void test_CreateMRUListLazyA(void)
return;
}
- for (i = 0; i < sizeof(create_lazyA)/sizeof(create_lazya_t); i++)
+ for (i = 0; i < ARRAY_SIZE(create_lazyA); i++)
{
const create_lazya_t *ptr = &create_lazyA[i];
HANDLE hMRU;
diff --git a/dlls/comctl32/tests/progress.c b/dlls/comctl32/tests/progress.c
index b911021be0..497cb47d3c 100644
--- a/dlls/comctl32/tests/progress.c
+++ b/dlls/comctl32/tests/progress.c
@@ -258,7 +258,7 @@ static void test_PBM_STEPIT(void)
HWND progress;
int i, j;
- for (i = 0; i < sizeof(stepit_tests)/sizeof(stepit_tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(stepit_tests); i++)
{
struct stepit_test *test = &stepit_tests[i];
LRESULT ret;
diff --git a/dlls/comctl32/tests/rebar.c b/dlls/comctl32/tests/rebar.c
index 7dae3a7dbe..3b1be77497 100644
--- a/dlls/comctl32/tests/rebar.c
+++ b/dlls/comctl32/tests/rebar.c
@@ -826,7 +826,7 @@ static DWORD resize_numtests = 0;
RECT r; \
int value; \
const rbresize_test_result_t *res = &resize_results[resize_numtests++]; \
- assert(resize_numtests <= sizeof(resize_results)/sizeof(resize_results[0])); \
+ assert(resize_numtests <= ARRAY_SIZE(resize_results)); \
GetWindowRect(hRebar, &r); \
MapWindowPoints(HWND_DESKTOP, hMainWnd, (LPPOINT)&r, 2); \
if ((dwStyles[i] & (CCS_NOPARENTALIGN|CCS_NODIVIDER)) == CCS_NOPARENTALIGN) {\
@@ -853,7 +853,7 @@ static void test_resize(void)
CCS_TOP | WS_BORDER, CCS_NOPARENTALIGN | CCS_NODIVIDER | WS_BORDER, CCS_NORESIZE | WS_BORDER,
CCS_NOMOVEY | WS_BORDER};
- const int styles_count = sizeof(dwStyles) / sizeof(dwStyles[0]);
+ const int styles_count = ARRAY_SIZE(dwStyles);
int i;
for (i = 0; i < styles_count; i++)
diff --git a/dlls/comctl32/tests/status.c b/dlls/comctl32/tests/status.c
index 2308974761..d78bd20262 100644
--- a/dlls/comctl32/tests/status.c
+++ b/dlls/comctl32/tests/status.c
@@ -127,7 +127,7 @@ static int CALLBACK check_height_font_enumproc(ENUMLOGFONTEXA *enumlf, NEWTEXTME
if (type != TRUETYPE_FONTTYPE)
facename = enumlf->elfLogFont.lfFaceName;
- for (i = 0; i < sizeof(sizes)/sizeof(sizes[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(sizes); i++)
{
HFONT hFont;
TEXTMETRICA tm;
diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
index 432b89bd15..cca700cd18 100644
--- a/dlls/comctl32/tests/taskdialog.c
+++ b/dlls/comctl32/tests/taskdialog.c
@@ -152,8 +152,7 @@ static void init_test_message(UINT message, WPARAM wParam, LPARAM lParam, struct
}
#define run_test(info, expect_button, seq, context) \
- run_test_(info, expect_button, seq, context, \
- sizeof(seq)/sizeof(seq[0]) - 1, __FILE__, __LINE__)
+ run_test_(info, expect_button, seq, context, ARRAY_SIZE(seq) - 1, __FILE__, __LINE__)
static void run_test_(TASKDIALOGCONFIG *info, int expect_button, const struct message_info *test_messages,
const char *context, int test_messages_len, const char *file, int line)
diff --git a/dlls/comctl32/tests/toolbar.c b/dlls/comctl32/tests/toolbar.c
index 5fd6133e1f..41807258f4 100644
--- a/dlls/comctl32/tests/toolbar.c
+++ b/dlls/comctl32/tests/toolbar.c
@@ -387,7 +387,7 @@ static void basic_test(void)
WS_CHILD | TBSTYLE_LIST,
100,
0, NULL, 0,
- buttons, sizeof(buttons)/sizeof(buttons[0]),
+ buttons, ARRAY_SIZE(buttons),
0, 0, 20, 16, sizeof(TBBUTTON));
ok(hToolbar != NULL, "Toolbar creation\n");
SendMessageA(hToolbar, TB_ADDSTRINGA, 0, (LPARAM)"test\000");
@@ -1315,7 +1315,7 @@ static DWORD tbsize_alt_numtests = 0;
compare(buttonCount, res->nButtons, "%d"); \
for (i=0; i<min(buttonCount, res->nButtons); i++) { \
ok(SendMessageA(hToolbar, TB_GETITEMRECT, i, (LPARAM)&rc) == 1, "TB_GETITEMRECT\n"); \
- if (broken(tbsize_alt_numtests < sizeof(tbsize_alt_results)/sizeof(tbsize_alt_results[0]) && \
+ if (broken(tbsize_alt_numtests < ARRAY_SIZE(tbsize_alt_results) && \
EqualRect(&rc, &tbsize_alt_results[tbsize_alt_numtests].rcButton))) { \
win_skip("Alternate rect found\n"); \
tbsize_alt_numtests++; \
@@ -1939,13 +1939,13 @@ static void test_setrows(void)
| CCS_NOMOVEY | CCS_TOP,
0,
0, NULL, 0,
- buttons, sizeof(buttons)/sizeof(buttons[0]),
+ buttons, ARRAY_SIZE(buttons),
20, 20, 0, 0, sizeof(TBBUTTON));
ok(hToolbar != NULL, "Toolbar creation\n");
ok(SendMessageA(hToolbar, TB_AUTOSIZE, 0, 0) == 0, "TB_AUTOSIZE failed\n");
/* test setting rows to each of 1-10 with bLarger true and false */
- for (i=0; i<(sizeof(tbrows_results) / sizeof(tbrows_result_t)); i++) {
+ for (i=0; i<ARRAY_SIZE(tbrows_results); i++) {
RECT rc;
int rows;
@@ -2058,7 +2058,7 @@ static void test_get_set_style(void)
WS_CHILD | TBSTYLE_LIST,
100,
0, NULL, 0,
- buttons, sizeof(buttons)/sizeof(buttons[0]),
+ buttons, ARRAY_SIZE(buttons),
0, 0, 20, 16, sizeof(TBBUTTON));
ok(hToolbar != NULL, "Toolbar creation\n");
SendMessageA(hToolbar, TB_ADDSTRINGA, 0, (LPARAM)"test\000");
@@ -2276,7 +2276,7 @@ static void test_TB_GET_SET_EXTENDEDSTYLE(void)
return;
}
- for (i = 0; i < sizeof(extended_style_test)/sizeof(extended_style_t); i++)
+ for (i = 0; i < ARRAY_SIZE(extended_style_test); i++)
{
ptr = &extended_style_test[i];
@@ -2397,7 +2397,7 @@ static void test_save(void)
params.pszValueName = value;
rebuild_toolbar_with_buttons( &wnd );
- SendMessageW( wnd, TB_ADDBUTTONSW, sizeof(more_btns) / sizeof(more_btns[0]), (LPARAM)more_btns );
+ SendMessageW(wnd, TB_ADDBUTTONSW, ARRAY_SIZE(more_btns), (LPARAM)more_btns);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
res = SendMessageW( wnd, TB_SAVERESTOREW, TRUE, (LPARAM)¶ms );
@@ -2423,7 +2423,7 @@ static void test_save(void)
ok( res, "restoring failed\n" );
ok_sequence(sequences, PARENT_SEQ_INDEX, restore_parent_seq, "restore", FALSE);
count = SendMessageW( wnd, TB_BUTTONCOUNT, 0, 0 );
- ok( count == sizeof(expect_btns) / sizeof(expect_btns[0]), "got %d\n", count );
+ ok( count == ARRAY_SIZE(expect_btns), "got %d\n", count );
for (i = 0; i < count; i++)
{
diff --git a/dlls/comctl32/tests/tooltips.c b/dlls/comctl32/tests/tooltips.c
index af95a569bb..0cb7afd688 100644
--- a/dlls/comctl32/tests/tooltips.c
+++ b/dlls/comctl32/tests/tooltips.c
@@ -183,7 +183,7 @@ static void test_customdraw(void) {
GetCursorPos(&orig_pos);
for (iterationNumber = 0;
- iterationNumber < sizeof(expectedResults)/sizeof(expectedResults[0]);
+ iterationNumber < ARRAY_SIZE(expectedResults);
iterationNumber++) {
HWND parent, hwndTip;
@@ -821,7 +821,7 @@ static void test_longtextW(void)
toolinfoW.hinst = GetModuleHandleW(NULL);
toolinfoW.uFlags = 0;
toolinfoW.uId = 0x1234ABCD;
- MultiByteToWideChar(CP_ACP, 0, longtextA, -1, bufW, sizeof(bufW)/sizeof(bufW[0]));
+ MultiByteToWideChar(CP_ACP, 0, longtextA, -1, bufW, ARRAY_SIZE(bufW));
lenW = lstrlenW(bufW);
toolinfoW.lpszText = bufW;
toolinfoW.lParam = 0xdeadbeef;
diff --git a/dlls/comctl32/tests/treeview.c b/dlls/comctl32/tests/treeview.c
index 5cf397f3af..33edaaf4b4 100644
--- a/dlls/comctl32/tests/treeview.c
+++ b/dlls/comctl32/tests/treeview.c
@@ -527,7 +527,7 @@ static void test_callback(void)
tvi.hItem = hRoot;
tvi.mask = TVIF_TEXT;
tvi.pszText = buf;
- tvi.cchTextMax = sizeof(buf)/sizeof(buf[0]);
+ tvi.cchTextMax = ARRAY_SIZE(buf);
ret = TreeView_GetItemA(hTree, &tvi);
expect(TRUE, ret);
ok(strcmp(tvi.pszText, TEST_CALLBACK_TEXT) == 0, "Callback item text mismatch %s vs %s\n",
@@ -706,7 +706,7 @@ static void test_getitemtext(void)
HWND hTree;
CHAR szBuffer[80] = "Blah";
- int nBufferSize = sizeof(szBuffer)/sizeof(CHAR);
+ int nBufferSize = ARRAY_SIZE(szBuffer);
hTree = create_treeview_control(0);
fill_tree(hTree);
@@ -1630,7 +1630,7 @@ static void test_itemedit(void)
item.mask = TVIF_TEXT;
item.hItem = hRoot;
item.pszText = buffA;
- item.cchTextMax = sizeof(buffA)/sizeof(CHAR);
+ item.cchTextMax = ARRAY_SIZE(buffA);
r = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item);
expect(TRUE, r);
ok(!strcmp("x", buffA), "Expected item text to change\n");
@@ -1664,7 +1664,7 @@ static void test_itemedit(void)
ok(IsWindow(edit), "Expected valid handle\n");
g_beginedit_alter_text = FALSE;
- GetWindowTextA(edit, buffA, sizeof(buffA)/sizeof(CHAR));
+ GetWindowTextA(edit, buffA, ARRAY_SIZE(buffA));
ok(!strcmp(buffA, "<edittextaltered>"), "got string %s\n", buffA);
DestroyWindow(hTree);
@@ -1991,7 +1991,7 @@ static void test_TVS_SINGLEEXPAND(void)
SetWindowLongA(hTree, GWL_STYLE, GetWindowLongA(hTree, GWL_STYLE) | TVS_SINGLEEXPAND);
/* to avoid painting related notifications */
ShowWindow(hTree, SW_HIDE);
- for (i = 0; i < sizeof(items)/sizeof(items[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(items); i++)
{
ins.hParent = items[i].parent ? *items[i].parent : TVI_ROOT;
ins.hInsertAfter = TVI_FIRST;
@@ -2000,7 +2000,7 @@ static void test_TVS_SINGLEEXPAND(void)
*items[i].handle = TreeView_InsertItemA(hTree, &ins);
}
- for (i = 0; i < sizeof(sequence_tests)/sizeof(sequence_tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(sequence_tests); i++)
{
flush_sequences(sequences, NUM_MSG_SEQUENCES);
ret = SendMessageA(hTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)(*sequence_tests[i].select));
@@ -2009,7 +2009,7 @@ static void test_TVS_SINGLEEXPAND(void)
ok_sequence(sequences, PARENT_SEQ_INDEX, sequence_tests[i].sequence, context, FALSE);
}
- for (i = 0; i < sizeof(items)/sizeof(items[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(items); i++)
{
ret = SendMessageA(hTree, TVM_GETITEMSTATE, (WPARAM)(*items[i].handle), 0xFFFF);
ok(ret == items[i].final_state, "singleexpand items[%d]: expected state 0x%x got 0x%x\n",
diff --git a/dlls/comctl32/tests/updown.c b/dlls/comctl32/tests/updown.c
index f549c41583..1f4e38f0eb 100644
--- a/dlls/comctl32/tests/updown.c
+++ b/dlls/comctl32/tests/updown.c
@@ -697,13 +697,13 @@ static void test_updown_base(void)
r = SendMessageA(updown, UDM_SETPOS, 0, 10);
expect(50, r);
- GetWindowTextA(g_edit, text, sizeof(text)/sizeof(CHAR));
+ GetWindowTextA(g_edit, text, ARRAY_SIZE(text));
ok(lstrcmpA(text, "10") == 0, "Expected '10', got '%s'\n", text);
r = SendMessageA(updown, UDM_SETBASE, 16, 0);
expect(10, r);
- GetWindowTextA(g_edit, text, sizeof(text)/sizeof(CHAR));
+ GetWindowTextA(g_edit, text, ARRAY_SIZE(text));
/* FIXME: currently hex output isn't properly formatted, but for this
test only change from initial text matters */
ok(lstrcmpA(text, "10") != 0, "Expected '0x000A', got '%s'\n", text);
@@ -837,20 +837,20 @@ static void test_UDS_SETBUDDYINT(void)
style = GetWindowLongA(updown, GWL_STYLE);
ok(style & UDS_SETBUDDYINT, "Expected UDS_SETBUDDY to be set\n");
SendMessageA(updown, UDM_SETPOS, 0, 20);
- GetWindowTextA(g_edit, text, sizeof(text)/sizeof(CHAR));
+ GetWindowTextA(g_edit, text, ARRAY_SIZE(text));
ok(lstrlenA(text) == 0, "Expected empty string\n");
DestroyWindow(updown);
/* creating with UDS_SETBUDDYINT */
updown = create_updown_control(UDS_SETBUDDYINT | UDS_ALIGNRIGHT, g_edit);
- GetWindowTextA(g_edit, text, sizeof(text)/sizeof(CHAR));
+ GetWindowTextA(g_edit, text, ARRAY_SIZE(text));
/* 50 is initial value here */
ok(lstrcmpA(text, "50") == 0, "Expected '50', got '%s'\n", text);
/* now remove style flag */
style = GetWindowLongA(updown, GWL_STYLE);
SetWindowLongA(updown, GWL_STYLE, style & ~UDS_SETBUDDYINT);
SendMessageA(updown, UDM_SETPOS, 0, 20);
- GetWindowTextA(g_edit, text, sizeof(text)/sizeof(CHAR));
+ GetWindowTextA(g_edit, text, ARRAY_SIZE(text));
ok(lstrcmpA(text, "20") == 0, "Expected '20', got '%s'\n", text);
/* set edit text directly, check position */
strcpy(text, "10");
@@ -872,7 +872,7 @@ static void test_UDS_SETBUDDYINT(void)
style = GetWindowLongA(updown, GWL_STYLE);
SetWindowLongA(updown, GWL_STYLE, style | UDS_SETBUDDYINT);
SendMessageA(updown, UDM_SETPOS, 0, 30);
- GetWindowTextA(g_edit, text, sizeof(text)/sizeof(CHAR));
+ GetWindowTextA(g_edit, text, ARRAY_SIZE(text));
ok(lstrcmpA(text, "30") == 0, "Expected '30', got '%s'\n", text);
DestroyWindow(updown);
}
--
2.14.4
2
1
[PATCH] comctl32/taskdialog/tests: Add a basic taskdialog creator as interactive test
by Fabian Maurer 06 Jun '18
by Fabian Maurer 06 Jun '18
06 Jun '18
Signed-off-by: Fabian Maurer <dark.shadow4(a)web.de>
---
dlls/comctl32/tests/resources.h | 5 +++
dlls/comctl32/tests/rsrc.rc | 17 +++++++++
dlls/comctl32/tests/taskdialog.c | 62 ++++++++++++++++++++++++++++++++
3 files changed, 84 insertions(+)
diff --git a/dlls/comctl32/tests/resources.h b/dlls/comctl32/tests/resources.h
index 3a89cd7baf..0e4ff6702c 100644
--- a/dlls/comctl32/tests/resources.h
+++ b/dlls/comctl32/tests/resources.h
@@ -48,4 +48,9 @@
#define IDC_PS_COMBO1 1020
#define IDC_PS_PUSHBUTTON1 1021
+#define IDC_TASKDIALOG_CREATE 1030
+#define IDC_TASKDIALOG_TEXT_TITLE 1031
+#define IDC_TASKDIALOG_TEXT_MAIN 1032
+#define IDC_TASKDIALOG_TEXT_CONTENT 1033
+
#endif /* __WINE_COMCTL32_TEST_RESOURCES_H */
diff --git a/dlls/comctl32/tests/rsrc.rc b/dlls/comctl32/tests/rsrc.rc
index 959130e2f1..fad3f71858 100644
--- a/dlls/comctl32/tests/rsrc.rc
+++ b/dlls/comctl32/tests/rsrc.rc
@@ -173,3 +173,20 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "Cancel", IDCANCEL, 100, 60, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
EDITTEXT 1000, 5, 5, 150, 50, WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | ES_AUTOVSCROLL | ES_WANTRETURN
}
+
+TAKDIALOG_CREATOR DIALOG 0, 0, 600, 500
+STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_CENTER
+CAPTION "Taskdialog Creator"
+FONT 8, "MS Shell Dlg"
+{
+ LTEXT "Title:", -1, 5, 5, 70, 15, BS_CENTER
+ EDITTEXT IDC_TASKDIALOG_TEXT_TITLE, 75, 5, 450, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_WANTRETURN
+
+ LTEXT "Main Instruction:", -1, 5, 25, 70, 50, BS_CENTER
+ EDITTEXT IDC_TASKDIALOG_TEXT_MAIN, 75, 25, 450, 50, WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN
+
+ LTEXT "Content:", -1, 5, 80, 70, 50, BS_CENTER
+ EDITTEXT IDC_TASKDIALOG_TEXT_CONTENT, 75, 80, 450, 50, WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN
+
+ PUSHBUTTON "Create Taskdialog", IDC_TASKDIALOG_CREATE, 260, 460, 80, 30, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+}
diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
index 432b89bd15..3b78f4fbf7 100644
--- a/dlls/comctl32/tests/taskdialog.c
+++ b/dlls/comctl32/tests/taskdialog.c
@@ -28,6 +28,7 @@
#include "wine/test.h"
#include "v6util.h"
#include "msg.h"
+#include "resources.h"
#define WM_TD_CALLBACK (WM_APP) /* Custom dummy message to wrap callback notifications */
@@ -374,6 +375,61 @@ static void test_timer(void)
pTaskDialogIndirect(&info, NULL, NULL, NULL);
}
+/* Caller must free the buffer */
+static WCHAR* control_get_text(HWND hdlg, int id_control)
+{
+ HWND hwnd_control = GetDlgItem(hdlg, id_control);
+ int text_length = GetWindowTextLengthW(hwnd_control);
+ WCHAR *text = heap_alloc((text_length + 1) * sizeof(WCHAR));
+ GetWindowTextW(hwnd_control, text, text_length + 1);
+ return text;
+}
+
+static void taskdialog_creator_create(HWND hdlg)
+{
+ TASKDIALOGCONFIG info = { 0 };
+ WCHAR *text_title;
+ WCHAR *text_main_instruction;
+ WCHAR *text_content;
+
+ text_title = control_get_text(hdlg, IDC_TASKDIALOG_TEXT_TITLE);
+ text_main_instruction = control_get_text(hdlg, IDC_TASKDIALOG_TEXT_MAIN);
+ text_content = control_get_text(hdlg, IDC_TASKDIALOG_TEXT_CONTENT);
+
+ info.cbSize = sizeof(TASKDIALOGCONFIG);
+ info.hwndParent = hdlg;
+ info.pszWindowTitle = text_title;
+ info.pszMainInstruction = text_main_instruction;
+ info.pszContent = text_content;
+
+ pTaskDialogIndirect(&info, NULL, NULL, NULL);
+
+ heap_free(text_title);
+ heap_free(text_main_instruction);
+ heap_free(text_content);
+}
+
+static INT_PTR CALLBACK taskdialog_creator_proc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam)
+{
+ switch (msg)
+ {
+ case WM_COMMAND:
+ if (HIWORD(wparam) == BN_CLICKED && LOWORD(wparam) == IDC_TASKDIALOG_CREATE)
+ {
+ taskdialog_creator_create(hdlg);
+ }
+ break;
+ case WM_CLOSE:
+ EndDialog(hdlg, 0);
+ break;
+
+ default:
+ break;
+ }
+
+ return FALSE;
+}
+
START_TEST(taskdialog)
{
ULONG_PTR ctx_cookie;
@@ -405,6 +461,12 @@ START_TEST(taskdialog)
ok(pTaskDialogIndirect == ptr_ordinal, "got wrong pointer for ordinal 345, %p expected %p\n",
ptr_ordinal, pTaskDialogIndirect);
+ if (winetest_interactive)
+ {
+ DialogBoxParamA(GetModuleHandleA(NULL), "TAKDIALOG_CREATOR", NULL, taskdialog_creator_proc, 0);
+ return;
+ }
+
init_msg_sequences(sequences, NUM_MSG_SEQUENCES);
test_invalid_parameters();
--
2.17.1
3
4
[PATCH v2] comctl32/edit/tests: Add interactive test showing a rendering glitch
by Fabian Maurer 06 Jun '18
by Fabian Maurer 06 Jun '18
06 Jun '18
v2: Only run test when WINETEST_INTERACTIVE is set
Signed-off-by: Fabian Maurer <dark.shadow4(a)web.de>
---
dlls/comctl32/tests/edit.c | 35 +++++++++++++++++++++++++++++++++++
dlls/comctl32/tests/rsrc.rc | 12 ++++++++++++
2 files changed, 47 insertions(+)
diff --git a/dlls/comctl32/tests/edit.c b/dlls/comctl32/tests/edit.c
index 7e9e7e7634..fa8ded377d 100644
--- a/dlls/comctl32/tests/edit.c
+++ b/dlls/comctl32/tests/edit.c
@@ -3094,6 +3094,36 @@ static void test_change_focus(void)
DestroyWindow(hwnd);
}
+static INT_PTR CALLBACK dialog_proc_interactive(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam)
+{
+ switch (msg)
+ {
+ case WM_COMMAND:
+ if (HIWORD(wparam) == BN_CLICKED)
+ {
+ EndDialog(hdlg, LOWORD(wparam));
+ }
+ break;
+ case WM_CLOSE:
+ EndDialog(hdlg, IDCANCEL);
+ break;
+
+ default:
+ break;
+ }
+
+ return FALSE;
+}
+
+static void test_rendering_interactive(void)
+{
+ int button_clicked;
+
+ button_clicked = DialogBoxParamA(GetModuleHandleA(NULL), "EDIT_OVERLAPPING_LABEL", NULL, dialog_proc_interactive, 0);
+ todo_wine
+ ok(button_clicked == IDOK, "Interactive test 'edit overlapping label' failed.\n");
+}
+
START_TEST(edit)
{
ULONG_PTR ctx_cookie;
@@ -3139,6 +3169,11 @@ START_TEST(edit)
test_wordbreak_proc();
test_change_focus();
+ if (winetest_interactive)
+ {
+ test_rendering_interactive();
+ }
+
UnregisterWindowClasses();
unload_v6_module(ctx_cookie, hCtx);
diff --git a/dlls/comctl32/tests/rsrc.rc b/dlls/comctl32/tests/rsrc.rc
index 327aa225e1..959130e2f1 100644
--- a/dlls/comctl32/tests/rsrc.rc
+++ b/dlls/comctl32/tests/rsrc.rc
@@ -78,6 +78,18 @@ FONT 8, "MS Shell Dlg"
{
}
+EDIT_OVERLAPPING_LABEL DIALOG 0, 0, 200, 80
+STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_CENTER
+CAPTION "Does the edit box look alright?"
+FONT 8, "MS Shell Dlg"
+{
+ LTEXT "Title:", -1, 5, 5, 70, 15, BS_CENTER
+ EDITTEXT 1000, 60, 5, 450, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_WANTRETURN
+
+ PUSHBUTTON "OK", IDOK, 20, 60, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+ PUSHBUTTON "Broken", IDNO, 100, 60, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+}
+
STRINGTABLE
{
IDS_TBADD1 "abc"
--
2.17.1
3
4
06 Jun '18
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
Just format_msg.c for now as the diff is huge.
Same object is generated with or without this patch when adding
"-g0 -DWINETEST_NO_LINE_NUMBERS" to the CFLAGS.
dlls/kernel32/tests/format_msg.c | 408 ++++++++++++++++-----------------------
1 file changed, 164 insertions(+), 244 deletions(-)
diff --git a/dlls/kernel32/tests/format_msg.c b/dlls/kernel32/tests/format_msg.c
index 43e4d35c8a..57ee78af9e 100644
--- a/dlls/kernel32/tests/format_msg.c
+++ b/dlls/kernel32/tests/format_msg.c
@@ -136,8 +136,7 @@ static void test_message_from_string_wide(void)
DWORD r, error;
/* the basics */
- r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, test, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), NULL);
+ r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, test, 0, 0, out, ARRAY_SIZE(out), NULL);
ok(!lstrcmpW(test, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4, "failed: r=%d\n", r);
@@ -146,15 +145,13 @@ static void test_message_from_string_wide(void)
{
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- FormatMessageW(FORMAT_MESSAGE_FROM_STRING, NULL, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), NULL);
+ FormatMessageW(FORMAT_MESSAGE_FROM_STRING, NULL, 0, 0, out, ARRAY_SIZE(out), NULL);
}
/* empty string */
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, empty, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), NULL);
+ r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, empty, 0, 0, out, ARRAY_SIZE(out), NULL);
error = GetLastError();
ok(!lstrcmpW(empty, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==0, "succeeded: r=%d\n", r);
@@ -163,8 +160,7 @@ static void test_message_from_string_wide(void)
/* format placeholder with no specifier */
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, fmt_null, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), NULL);
+ r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, fmt_null, 0, 0, out, ARRAY_SIZE(out), NULL);
error = GetLastError();
ok(!memcmp(out, init_buf, sizeof(init_buf)),
"Expected the buffer to be unchanged\n");
@@ -174,8 +170,7 @@ static void test_message_from_string_wide(void)
/* test string with format placeholder with no specifier */
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, fmt_tnull, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), NULL);
+ r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, fmt_tnull, 0, 0, out, ARRAY_SIZE(out), NULL);
error = GetLastError();
ok(!memcmp(out, init_buf, sizeof(init_buf)) ||
broken(!memcmp(out, broken_buf, sizeof(broken_buf))), /* W2K3+ */
@@ -186,8 +181,7 @@ static void test_message_from_string_wide(void)
/* insertion with no variadic arguments */
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, fmt_1, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), NULL);
+ r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, fmt_1, 0, 0, out, ARRAY_SIZE(out), NULL);
error = GetLastError();
ok(!memcmp(out, init_buf, sizeof(init_buf)),
"Expected the buffer to be unchanged\n");
@@ -197,7 +191,7 @@ static void test_message_from_string_wide(void)
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, fmt_1, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), NULL);
+ 0, out, ARRAY_SIZE(out), NULL);
error = GetLastError();
ok(!memcmp(out, init_buf, sizeof(init_buf)),
"Expected the buffer to be unchanged\n");
@@ -205,86 +199,72 @@ static void test_message_from_string_wide(void)
ok(error==ERROR_INVALID_PARAMETER, "last error %u\n", error);
/* using the format feature */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1s, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), test);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1s, 0, 0, out, ARRAY_SIZE(out), test);
ok(!lstrcmpW(test, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* no format */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), test);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1, 0, 0, out, ARRAY_SIZE(out), test);
ok(!lstrcmpW(test, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* two pieces */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_12, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), te, st);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_12, 0, 0, out, ARRAY_SIZE(out), te, st);
ok(!lstrcmpW(test, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* three pieces */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), t, s, e);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123, 0, 0, out, ARRAY_SIZE(out), t, s, e);
ok(!lstrcmpW(test, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* s doesn't seem to work in format strings */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_s, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), test);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_s, 0, 0, out, ARRAY_SIZE(out), test);
ok(!lstrcmpW(&fmt_s[1], out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==3, "failed: r=%d\n", r);
/* nor ls */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_ls, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), test);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_ls, 0, 0, out, ARRAY_SIZE(out), test);
ok(!lstrcmpW(&fmt_ls[1], out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4, "failed: r=%d\n", r);
/* nor S */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_S, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), test);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_S, 0, 0, out, ARRAY_SIZE(out), test);
ok(!lstrcmpW(&fmt_S[1], out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==3, "failed: r=%d\n", r);
/* nor ws */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_ws, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), test);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_ws, 0, 0, out, ARRAY_SIZE(out), test);
ok(!lstrcmpW(&fmt_ws[1], out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4, "failed: r=%d\n", r);
/* as characters */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123c, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), 't', 'e', 's');
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123c, 0, 0, out, ARRAY_SIZE(out), 't', 'e', 's');
ok(!lstrcmpW(test, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* lc is unicode */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123lc, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), 't', 'e', 's');
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123lc, 0, 0, out, ARRAY_SIZE(out), 't', 'e', 's');
ok(!lstrcmpW(test, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* wc is unicode */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123wc, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), 't', 'e', 's');
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123wc, 0, 0, out, ARRAY_SIZE(out), 't', 'e', 's');
ok(!lstrcmpW(test, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* C is unicode */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123C, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), 't', 'e', 's');
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123C, 0, 0, out, ARRAY_SIZE(out), 't', 'e', 's');
ok(!lstrcmpW(test, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* some numbers */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123d, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), 1, 2, 3);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_123d, 0, 0, out, ARRAY_SIZE(out), 1, 2, 3);
ok(!lstrcmpW(s_123d, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==3,"failed: r=%d\n", r);
/* a single digit with some spacing */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_14d, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), 1);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_14d, 0, 0, out, ARRAY_SIZE(out), 1);
ok(!lstrcmpW(s_14d, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
@@ -294,125 +274,105 @@ static void test_message_from_string_wide(void)
ok(r==4,"failed: r=%d\n", r);
/* two digit decimal number */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_14d, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), 11);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_14d, 0, 0, out, ARRAY_SIZE(out), 11);
ok(!lstrcmpW(s_14d2, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* a hex number */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_14x, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), 11);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_14x, 0, 0, out, ARRAY_SIZE(out), 11);
ok(!lstrcmpW(s_14x, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* a hex number, upper case */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_14X, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), 11);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_14X, 0, 0, out, ARRAY_SIZE(out), 11);
ok(!lstrcmpW(s_14X, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* a hex number, upper case, left justified */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1_4X, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), 11);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1_4X, 0, 0, out, ARRAY_SIZE(out), 11);
ok(!lstrcmpW(s_1_4X, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* a long hex number, upper case */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_14X, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), 0x1ab);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_14X, 0, 0, out, ARRAY_SIZE(out), 0x1ab);
ok(!lstrcmpW(s_1AB, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* two percent... */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_2pct, 0,
- 0, out, sizeof(out)/sizeof(WCHAR));
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_2pct, 0, 0, out, ARRAY_SIZE(out));
ok(!lstrcmpW(s_2pct, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* periods are special cases */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_2dot1d, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), 0x1ab);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_2dot1d, 0, 0, out, ARRAY_SIZE(out), 0x1ab);
ok(!lstrcmpW(s_2dot147, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==8,"failed: r=%d\n", r);
/* %0 ends the line */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_t0t, 0,
- 0, out, sizeof(out)/sizeof(WCHAR));
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_t0t, 0, 0, out, ARRAY_SIZE(out));
ok(!lstrcmpW(test, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* %! prints an exclamation */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_yah, 0,
- 0, out, sizeof(out)/sizeof(WCHAR));
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_yah, 0, 0, out, ARRAY_SIZE(out));
ok(!lstrcmpW(s_yah, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* %space */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_space, 0,
- 0, out, sizeof(out)/sizeof(WCHAR));
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_space, 0, 0, out, ARRAY_SIZE(out));
ok(!lstrcmpW(s_space, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* %n yields \r\n, %r yields \r, %t yields \t */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_nrt, 0,
- 0, out, sizeof(out)/sizeof(WCHAR));
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_nrt, 0, 0, out, ARRAY_SIZE(out));
ok(!lstrcmpW(s_nrt, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* line feed */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_hi_lf, 0,
- 0, out, sizeof(out)/sizeof(WCHAR));
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_hi_lf, 0, 0, out, ARRAY_SIZE(out));
ok(!lstrcmpW(s_hi_crlf, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* carriage return line feed */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_hi_crlf, 0,
- 0, out, sizeof(out)/sizeof(WCHAR));
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_hi_crlf, 0, 0, out, ARRAY_SIZE(out));
ok(!lstrcmpW(s_hi_crlf, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* carriage return */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_cr, 0,
- 0, out, sizeof(out)/sizeof(WCHAR));
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_cr, 0, 0, out, ARRAY_SIZE(out));
ok(!lstrcmpW(s_crlf, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==2,"failed: r=%d\n", r);
/* double carriage return line feed */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_crcrlf, 0,
- 0, out, sizeof(out)/sizeof(WCHAR));
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_crcrlf, 0, 0, out, ARRAY_SIZE(out));
ok(!lstrcmpW(s_crlfcrlf, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
/* null string as argument */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1, 0,
- 0, out, sizeof(out)/sizeof(WCHAR), NULL);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1, 0, 0, out, ARRAY_SIZE(out), NULL);
ok(!lstrcmpW(s_null, out),"failed out=[%s]\n", wine_dbgstr_w(out));
ok(r==6,"failed: r=%d\n",r);
/* precision and width */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_13s,
- 0, 0, out, sizeof(out)/sizeof(WCHAR), t );
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_13s, 0, 0, out, ARRAY_SIZE(out), t );
ok(!lstrcmpW(s_spt, out),"failed out=[%s]\n", wine_dbgstr_w(out));
ok(r==3, "failed: r=%d\n",r);
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1os,
- 0, 0, out, sizeof(out)/sizeof(WCHAR), 4, t );
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1os, 0, 0, out, ARRAY_SIZE(out), 4, t );
ok(!lstrcmpW( s_sp3t, out),"failed out=[%s]\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n",r);
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_142u,
- 0, 0, out, sizeof(out)/sizeof(WCHAR), 3 );
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_142u, 0, 0, out, ARRAY_SIZE(out), 3 );
ok(!lstrcmpW( s_sp03, out),"failed out=[%s]\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n",r);
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1oou,
- 0, 0, out, sizeof(out)/sizeof(WCHAR), 5, 3, 1 );
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1oou, 0, 0, out, ARRAY_SIZE(out), 5, 3, 1 );
ok(!lstrcmpW( s_sp001, out),"failed out=[%s]\n", wine_dbgstr_w(out));
ok(r==5,"failed: r=%d\n",r);
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1oou1oou,
- 0, 0, out, sizeof(out)/sizeof(WCHAR), 5, 3, 1, 4, 2 );
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1oou1oou, 0, 0, out, ARRAY_SIZE(out),
+ 5, 3, 1, 4, 2 );
ok(!lstrcmpW( s_sp001002, out),"failed out=[%s]\n", wine_dbgstr_w(out));
ok(r==11,"failed: r=%d\n",r);
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1oou3oou,
- 0, 0, out, sizeof(out)/sizeof(WCHAR), 5, 3, 1, 6, 4, 2 );
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1oou3oou, 0, 0, out, ARRAY_SIZE(out),
+ 5, 3, 1, 6, 4, 2 );
ok(!lstrcmpW( s_sp001sp002, out) ||
broken(!lstrcmpW(s_sp001004, out)), /* NT4/Win2k */
"failed out=[%s]\n", wine_dbgstr_w(out));
@@ -421,11 +381,11 @@ static void test_message_from_string_wide(void)
{
ULONG_PTR args[] = { 6, 4, 2, 5, 3, 1 };
r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, fmt_1oou1oou,
- 0, 0, out, sizeof(out)/sizeof(WCHAR), (__ms_va_list *)args );
+ 0, 0, out, ARRAY_SIZE(out), (__ms_va_list *)args );
ok(!lstrcmpW(s_sp002sp003, out),"failed out=[%s]\n", wine_dbgstr_w(out));
ok(r==13,"failed: r=%d\n",r);
r = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, fmt_1oou4oou,
- 0, 0, out, sizeof(out)/sizeof(WCHAR), (__ms_va_list *)args );
+ 0, 0, out, ARRAY_SIZE(out), (__ms_va_list *)args );
ok(!lstrcmpW(s_sp002sp001, out),"failed out=[%s]\n", wine_dbgstr_w(out));
ok(r==12,"failed: r=%d\n",r);
}
@@ -434,25 +394,25 @@ static void test_message_from_string_wide(void)
/* line feed */
r = doitW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_hi_lf, 0,
- 0, out, sizeof(out)/sizeof(WCHAR));
+ 0, out, ARRAY_SIZE(out));
ok(!lstrcmpW(s_hi_sp, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==3,"failed: r=%d\n", r);
/* carriage return line feed */
r = doitW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_hi_crlf, 0,
- 0, out, sizeof(out)/sizeof(WCHAR));
+ 0, out, ARRAY_SIZE(out));
ok(!lstrcmpW(s_hi_sp, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==3,"failed: r=%d\n", r);
/* carriage return */
r = doitW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_cr, 0,
- 0, out, sizeof(out)/sizeof(WCHAR));
+ 0, out, ARRAY_SIZE(out));
ok(!lstrcmpW(s_sp, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==1,"failed: r=%d\n", r);
/* double carriage return line feed */
r = doitW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_crcrlf, 0,
- 0, out, sizeof(out)/sizeof(WCHAR));
+ 0, out, ARRAY_SIZE(out));
ok(!lstrcmpW(s_2sp, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==2,"failed: r=%d\n", r);
}
@@ -465,8 +425,7 @@ static void test_message_from_string(void)
static const WCHAR szwTest[] = { 't','e','s','t',0};
/* the basics */
- r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "test", 0,
- 0, out, sizeof(out)/sizeof(CHAR),NULL);
+ r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "test", 0, 0, out, ARRAY_SIZE(out),NULL);
ok(!strcmp("test", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
@@ -475,15 +434,13 @@ static void test_message_from_string(void)
{
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- FormatMessageA(FORMAT_MESSAGE_FROM_STRING, NULL, 0,
- 0, out, sizeof(out)/sizeof(CHAR), NULL);
+ FormatMessageA(FORMAT_MESSAGE_FROM_STRING, NULL, 0, 0, out, ARRAY_SIZE(out), NULL);
}
/* empty string */
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "", 0,
- 0, out, sizeof(out)/sizeof(CHAR), NULL);
+ r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(!memcmp(out, init_buf, sizeof(init_buf)), "Expected the buffer to be untouched\n");
ok(r==0, "succeeded: r=%d\n", r);
ok(GetLastError()==0xdeadbeef,
@@ -492,8 +449,7 @@ static void test_message_from_string(void)
/* format placeholder with no specifier */
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "%", 0,
- 0, out, sizeof(out)/sizeof(CHAR), NULL);
+ r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "%", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(!memcmp(out, init_buf, sizeof(init_buf)),
"Expected the buffer to be untouched\n");
ok(r==0, "succeeded: r=%d\n", r);
@@ -503,8 +459,7 @@ static void test_message_from_string(void)
/* test string with format placeholder with no specifier */
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "test%", 0,
- 0, out, sizeof(out)/sizeof(CHAR), NULL);
+ r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "test%", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(!memcmp(out, init_buf, sizeof(init_buf)),
"Expected the buffer to be untouched\n");
ok(r==0, "succeeded: r=%d\n", r);
@@ -514,8 +469,7 @@ static void test_message_from_string(void)
/* insertion with no variadic arguments */
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "%1", 0,
- 0, out, sizeof(out)/sizeof(CHAR), NULL);
+ r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "%1", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(!memcmp(out, init_buf, sizeof(init_buf)), "Expected the buffer to be untouched\n");
ok(r==0, "succeeded: r=%d\n", r);
ok(GetLastError()==ERROR_INVALID_PARAMETER, "last error %u\n", GetLastError());
@@ -523,194 +477,167 @@ static void test_message_from_string(void)
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
r = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, "%1", 0,
- 0, out, sizeof(out)/sizeof(CHAR), NULL);
+ 0, out, ARRAY_SIZE(out), NULL);
ok(!memcmp(out, init_buf, sizeof(init_buf)), "Expected the buffer to be untouched\n");
ok(r==0, "succeeded: r=%d\n", r);
ok(GetLastError()==ERROR_INVALID_PARAMETER, "last error %u\n", GetLastError());
/* using the format feature */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!s!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), "test");
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!s!", 0, 0, out, ARRAY_SIZE(out), "test");
ok(!strcmp("test", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* no format */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1", 0,
- 0, out, sizeof(out)/sizeof(CHAR), "test");
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1", 0, 0, out, ARRAY_SIZE(out), "test");
ok(!strcmp("test", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* two pieces */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1%2", 0,
- 0, out, sizeof(out)/sizeof(CHAR), "te","st");
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1%2", 0, 0, out, ARRAY_SIZE(out), "te","st");
ok(!strcmp("test", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* three pieces */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1%3%2%1", 0,
- 0, out, sizeof(out)/sizeof(CHAR), "t","s","e");
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1%3%2%1", 0, 0, out, ARRAY_SIZE(out), "t","s","e");
ok(!strcmp("test", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* s doesn't seem to work in format strings */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%!s!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), "test");
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%!s!", 0, 0, out, ARRAY_SIZE(out), "test");
ok(!strcmp("!s!", out),"failed out=[%s]\n",out);
ok(r==3,"failed: r=%d\n",r);
/* ls is unicode */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!ls!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), szwTest);
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!ls!", 0, 0, out, ARRAY_SIZE(out), szwTest);
ok(!strcmp("test", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* S is unicode */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!S!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), szwTest);
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!S!", 0, 0, out, ARRAY_SIZE(out), szwTest);
ok(!strcmp("test", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* ws is unicode */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!ws!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), szwTest);
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!ws!", 0, 0, out, ARRAY_SIZE(out), szwTest);
ok(!strcmp("test", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* as characters */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!c!%2!c!%3!c!%1!c!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), 't','e','s');
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!c!%2!c!%3!c!%1!c!", 0, 0, out, ARRAY_SIZE(out),
+ 't','e','s');
ok(!strcmp("test", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* lc is unicode */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!lc!%2!lc!%3!lc!%1!lc!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), 't','e','s');
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!lc!%2!lc!%3!lc!%1!lc!", 0, 0, out, ARRAY_SIZE(out),
+ 't','e','s');
ok(!strcmp("test", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* wc is unicode */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!wc!%2!wc!%3!wc!%1!wc!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), 't','e','s');
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!wc!%2!wc!%3!wc!%1!wc!", 0, 0, out, ARRAY_SIZE(out),
+ 't','e','s');
ok(!strcmp("test", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* C is unicode */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!C!%2!C!%3!C!%1!C!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), 't','e','s');
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!C!%2!C!%3!C!%1!C!", 0, 0, out, ARRAY_SIZE(out),
+ 't','e','s');
ok(!strcmp("test", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* some numbers */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!d!%2!d!%3!d!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), 1,2,3);
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!d!%2!d!%3!d!", 0, 0, out, ARRAY_SIZE(out), 1,2,3);
ok(!strcmp("123", out),"failed out=[%s]\n",out);
ok(r==3,"failed: r=%d\n",r);
/* a single digit with some spacing */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!4d!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), 1);
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!4d!", 0, 0, out, ARRAY_SIZE(out), 1);
ok(!strcmp(" 1", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* a single digit, left justified */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!-4d!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), 1);
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!-4d!", 0, 0, out, ARRAY_SIZE(out), 1);
ok(!strcmp("1 ", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* two digit decimal number */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!4d!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), 11);
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!4d!", 0, 0, out, ARRAY_SIZE(out), 11);
ok(!strcmp(" 11", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* a hex number */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!4x!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), 11);
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!4x!", 0, 0, out, ARRAY_SIZE(out), 11);
ok(!strcmp(" b", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* a hex number, upper case */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!4X!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), 11);
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!4X!", 0, 0, out, ARRAY_SIZE(out), 11);
ok(!strcmp(" B", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* a hex number, upper case, left justified */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!-4X!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), 11);
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!-4X!", 0, 0, out, ARRAY_SIZE(out), 11);
ok(!strcmp("B ", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* a long hex number, upper case */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!4X!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), 0x1ab);
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1!4X!", 0, 0, out, ARRAY_SIZE(out), 0x1ab);
ok(!strcmp(" 1AB", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* two percent... */
- r = doit(FORMAT_MESSAGE_FROM_STRING, " %%%% ", 0,
- 0, out, sizeof(out)/sizeof(CHAR));
+ r = doit(FORMAT_MESSAGE_FROM_STRING, " %%%% ", 0, 0, out, ARRAY_SIZE(out));
ok(!strcmp(" %% ", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* periods are special cases */
- r = doit(FORMAT_MESSAGE_FROM_STRING, " %.%. %1!d!", 0,
- 0, out, sizeof(out)/sizeof(CHAR), 0x1ab);
+ r = doit(FORMAT_MESSAGE_FROM_STRING, " %.%. %1!d!", 0, 0, out, ARRAY_SIZE(out), 0x1ab);
ok(!strcmp(" .. 427", out),"failed out=[%s]\n",out);
ok(r==7,"failed: r=%d\n",r);
/* %0 ends the line */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "test%0test", 0,
- 0, out, sizeof(out)/sizeof(CHAR));
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "test%0test", 0, 0, out, ARRAY_SIZE(out));
ok(!strcmp("test", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* %! prints an exclamation */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "yah%!%0 ", 0,
- 0, out, sizeof(out)/sizeof(CHAR));
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "yah%!%0 ", 0, 0, out, ARRAY_SIZE(out));
ok(!strcmp("yah!", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* %space */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "% % ", 0,
- 0, out, sizeof(out)/sizeof(CHAR));
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "% % ", 0, 0, out, ARRAY_SIZE(out));
ok(!strcmp(" ", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* %n yields \r\n, %r yields \r, %t yields \t */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%n%r%t", 0,
- 0, out, sizeof(out)/sizeof(CHAR));
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%n%r%t", 0, 0, out, ARRAY_SIZE(out));
ok(!strcmp("\r\n\r\t", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* line feed */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "hi\n", 0,
- 0, out, sizeof(out)/sizeof(CHAR));
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "hi\n", 0, 0, out, ARRAY_SIZE(out));
ok(!strcmp("hi\r\n", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* carriage return line feed */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "hi\r\n", 0,
- 0, out, sizeof(out)/sizeof(CHAR));
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "hi\r\n", 0, 0, out, ARRAY_SIZE(out));
ok(!strcmp("hi\r\n", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* carriage return */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "\r", 0,
- 0, out, sizeof(out)/sizeof(CHAR));
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "\r", 0, 0, out, ARRAY_SIZE(out));
ok(!strcmp("\r\n", out),"failed out=[%s]\n",out);
ok(r==2,"failed: r=%d\n",r);
/* double carriage return line feed */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "\r\r\n", 0,
- 0, out, sizeof(out)/sizeof(CHAR));
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "\r\r\n", 0, 0, out, ARRAY_SIZE(out));
ok(!strcmp("\r\n\r\n", out),"failed out=[%s]\n",out);
ok(r==4,"failed: r=%d\n",r);
/* null string as argument */
- r = doit(FORMAT_MESSAGE_FROM_STRING, "%1", 0,
- 0, out, sizeof(out)/sizeof(CHAR), NULL);
+ r = doit(FORMAT_MESSAGE_FROM_STRING, "%1", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(!strcmp("(null)", out),"failed out=[%s]\n",out);
ok(r==6,"failed: r=%d\n",r);
@@ -765,25 +692,25 @@ static void test_message_from_string(void)
/* line feed */
r = doit(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, "hi\n", 0,
- 0, out, sizeof(out)/sizeof(CHAR));
+ 0, out, ARRAY_SIZE(out));
ok(!strcmp("hi ", out), "failed out=[%s]\n",out);
ok(r==3, "failed: r=%d\n",r);
/* carriage return line feed */
r = doit(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, "hi\r\n", 0,
- 0, out, sizeof(out)/sizeof(CHAR));
+ 0, out, ARRAY_SIZE(out));
ok(!strcmp("hi ", out),"failed out=[%s]\n",out);
ok(r==3,"failed: r=%d\n",r);
/* carriage return */
r = doit(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, "\r", 0,
- 0, out, sizeof(out)/sizeof(CHAR));
+ 0, out, ARRAY_SIZE(out));
ok(!strcmp(" ", out),"failed out=[%s]\n",out);
ok(r==1,"failed: r=%d\n",r);
/* double carriage return line feed */
r = doit(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_MAX_WIDTH_MASK, "\r\r\n", 0,
- 0, out, sizeof(out)/sizeof(CHAR));
+ 0, out, ARRAY_SIZE(out));
ok(!strcmp(" ", out),"failed out=[%s]\n",out);
ok(r==2,"failed: r=%d\n",r);
}
@@ -796,18 +723,18 @@ static void test_message_ignore_inserts(void)
CHAR out[256];
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "test", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageA to return 4, got %d\n", ret);
ok(!strcmp("test", out), "Expected output string \"test\", got %s\n", out);
/* The %0 escape sequence is handled. */
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "test%0", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageA to return 4, got %d\n", ret);
ok(!strcmp("test", out), "Expected output string \"test\", got %s\n", out);
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "test%0test", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageA to return 4, got %d\n", ret);
ok(!strcmp("test", out), "Expected output string \"test\", got %s\n", out);
@@ -815,71 +742,67 @@ static void test_message_ignore_inserts(void)
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "%0test", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 0, "Expected FormatMessageA to return 0, got %d\n", ret);
ok(!memcmp(out, init_buf, sizeof(init_buf)), "Expected the output buffer to be untouched\n");
ok(GetLastError() == 0xdeadbeef, "Expected GetLastError() to return 0xdeadbeef, got %u\n", GetLastError());
/* Insert sequences are ignored. */
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "test%1%2!*.*s!%99", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 17, "Expected FormatMessageA to return 17, got %d\n", ret);
ok(!strcmp("test%1%2!*.*s!%99", out), "Expected output string \"test%%1%%2!*.*s!%%99\", got %s\n", out);
/* Only the "%n", "%r", and "%t" escape sequences are processed. */
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "%%% %.%!", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 8, "Expected FormatMessageA to return 8, got %d\n", ret);
ok(!strcmp("%%% %.%!", out), "Expected output string \"%%%%%% %%.%%!\", got %s\n", out);
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "%n%r%t", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageA to return 4, got %d\n", ret);
ok(!strcmp("\r\n\r\t", out), "Expected output string \"\\r\\n\\r\\t\", got %s\n", out);
/* CRLF characters are processed normally. */
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "hi\n", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageA to return 4, got %d\n", ret);
ok(!strcmp("hi\r\n", out), "Expected output string \"hi\\r\\n\", got %s\n", out);
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "hi\r\n", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageA to return 4, got %d\n", ret);
ok(!strcmp("hi\r\n", out), "Expected output string \"hi\\r\\n\", got %s\n", out);
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "\r", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 2, "Expected FormatMessageA to return 2, got %d\n", ret);
ok(!strcmp("\r\n", out), "Expected output string \"\\r\\n\", got %s\n", out);
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, "\r\r\n", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageA to return 4, got %d\n", ret);
ok(!strcmp("\r\n\r\n", out), "Expected output string \"\\r\\n\\r\\n\", got %s\n", out);
/* The width parameter is handled the same also. */
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS |
- FORMAT_MESSAGE_MAX_WIDTH_MASK, "hi\n", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ FORMAT_MESSAGE_MAX_WIDTH_MASK, "hi\n", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(!strcmp("hi ", out), "Expected output string \"hi \", got %s\n", out);
ok(ret == 3, "Expected FormatMessageA to return 3, got %d\n", ret);
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS |
- FORMAT_MESSAGE_MAX_WIDTH_MASK, "hi\r\n", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ FORMAT_MESSAGE_MAX_WIDTH_MASK, "hi\r\n", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 3, "Expected FormatMessageA to return 3, got %d\n", ret);
ok(!strcmp("hi ", out), "Expected output string \"hi \", got %s\n", out);
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS |
- FORMAT_MESSAGE_MAX_WIDTH_MASK, "\r", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ FORMAT_MESSAGE_MAX_WIDTH_MASK, "\r", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 1, "Expected FormatMessageA to return 1, got %d\n", ret);
ok(!strcmp(" ", out), "Expected output string \" \", got %s\n", out);
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS |
- FORMAT_MESSAGE_MAX_WIDTH_MASK, "\r\r\n", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ FORMAT_MESSAGE_MAX_WIDTH_MASK, "\r\r\n", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 2, "Expected FormatMessageA to return 2, got %d\n", ret);
ok(!strcmp(" ", out), "Expected output string \" \", got %s\n", out);
}
@@ -911,89 +834,88 @@ static void test_message_ignore_inserts_wide(void)
WCHAR out[256];
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, test, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageW to return 4, got %d\n", ret);
ok(!lstrcmpW(test, out), "Expected output string \"test\", got %s\n", wine_dbgstr_w(out));
/* The %0 escape sequence is handled. */
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_t0, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageW to return 4, got %d\n", ret);
ok(!lstrcmpW(test, out), "Expected output string \"test\", got %s\n", wine_dbgstr_w(out));
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_t0t, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageW to return 4, got %d\n", ret);
ok(!lstrcmpW(test, out), "Expected output string \"test\", got %s\n", wine_dbgstr_w(out));
/* While FormatMessageA returns 0 in this case, no last error code is set. */
SetLastError(0xdeadbeef);
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_0t, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 0, "Expected FormatMessageW to return 0, got %d\n", ret);
ok(!lstrcmpW(empty, out), "Expected the output buffer to be the empty string, got %s\n", wine_dbgstr_w(out));
ok(GetLastError() == 0xdeadbeef, "Expected GetLastError() to return 0xdeadbeef, got %u\n", GetLastError());
/* Insert sequences are ignored. */
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_t12oos99, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 17, "Expected FormatMessageW to return 17, got %d\n", ret);
ok(!lstrcmpW(fmt_t12oos99, out), "Expected output string \"test%%1%%2!*.*s!%%99\", got %s\n", wine_dbgstr_w(out));
/* Only the "%n", "%r", and "%t" escape sequences are processed. */
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_pctspacedot, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 8, "Expected FormatMessageW to return 8, got %d\n", ret);
ok(!lstrcmpW(fmt_pctspacedot, out), "Expected output string \"%%%%%% %%.%%!\", got %s\n", wine_dbgstr_w(out));
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_nrt, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageW to return 4, got %d\n", ret);
ok(!lstrcmpW(s_nrt, out), "Expected output string \"\\r\\n\\r\\t\", got %s\n", wine_dbgstr_w(out));
/* CRLF characters are processed normally. */
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_hi_lf, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageW to return 4, got %d\n", ret);
ok(!lstrcmpW(s_hi_crlf, out), "Expected output string \"hi\\r\\n\", got %s\n", wine_dbgstr_w(out));
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_hi_crlf, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageW to return 4, got %d\n", ret);
ok(!lstrcmpW(s_hi_crlf, out), "Expected output string \"hi\\r\\n\", got %s\n", wine_dbgstr_w(out));
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_cr, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 2, "Expected FormatMessageW to return 2, got %d\n", ret);
ok(!lstrcmpW(s_crlf, out), "Expected output string \"\\r\\n\", got %s\n", wine_dbgstr_w(out));
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS, fmt_crcrlf, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageW to return 4, got %d\n", ret);
ok(!lstrcmpW(s_crlfcrlf, out), "Expected output string \"\\r\\n\\r\\n\", got %s\n", wine_dbgstr_w(out));
/* The width parameter is handled the same also. */
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_hi_lf, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 3, "Expected FormatMessageW to return 3, got %d\n", ret);
ok(!lstrcmpW(s_hi_sp, out), "Expected output string \"hi \", got %s\n", wine_dbgstr_w(out));
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_hi_crlf, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 3, "Expected FormatMessageW to return 3, got %d\n", ret);
ok(!lstrcmpW(s_hi_sp, out), "Expected output string \"hi \", got %s\n", wine_dbgstr_w(out));
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS |
- FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_cr, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_cr, 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 1, "Expected FormatMessageW to return 1, got %d\n", ret);
ok(!lstrcmpW(s_sp, out), "Expected output string \" \", got %s\n", wine_dbgstr_w(out));
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_MAX_WIDTH_MASK, fmt_crcrlf, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ ARRAY_SIZE(out), NULL);
ok(ret == 2, "Expected FormatMessageW to return 2, got %d\n", ret);
ok(!lstrcmpW(s_2sp, out), "Expected output string \" \", got %s\n", wine_dbgstr_w(out));
}
@@ -1216,7 +1138,7 @@ static void test_message_insufficient_buffer(void)
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "test", 0, 0, out, sizeof(out)/sizeof(out[0]) - 1, NULL);
+ ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING, "test", 0, 0, out, ARRAY_SIZE(out) - 1, NULL);
ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret);
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected GetLastError() to return ERROR_INSUFFICIENT_BUFFER, got %u\n",
@@ -1261,7 +1183,7 @@ static void test_message_insufficient_buffer_wide(void)
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, test, 0, 0, out, sizeof(out)/sizeof(out[0]) - 1, NULL);
+ ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, test, 0, 0, out, ARRAY_SIZE(out) - 1, NULL);
ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret);
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected GetLastError() to return ERROR_INSUFFICIENT_BUFFER, got %u\n",
@@ -1487,7 +1409,7 @@ static void test_message_allocate_buffer_wide(void)
buf = (WCHAR *)0xdeadbeef;
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER,
- test, 0, 0, (WCHAR *)&buf, sizeof(test)/sizeof(WCHAR) - 1, NULL);
+ test, 0, 0, (WCHAR *)&buf, ARRAY_SIZE(test) - 1, NULL);
ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret);
ok(buf != NULL && buf != (WCHAR *)0xdeadbeef,
"Expected output buffer pointer to be valid\n");
@@ -1500,7 +1422,7 @@ static void test_message_allocate_buffer_wide(void)
buf = (WCHAR *)0xdeadbeef;
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER,
- test, 0, 0, (WCHAR *)&buf, sizeof(test)/sizeof(WCHAR), NULL);
+ test, 0, 0, (WCHAR *)&buf, ARRAY_SIZE(test), NULL);
ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret);
ok(buf != NULL && buf != (WCHAR *)0xdeadbeef,
"Expected output buffer pointer to be valid\n");
@@ -1513,7 +1435,7 @@ static void test_message_allocate_buffer_wide(void)
buf = (WCHAR *)0xdeadbeef;
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER,
- test, 0, 0, (WCHAR *)&buf, sizeof(test)/sizeof(WCHAR) + 1, NULL);
+ test, 0, 0, (WCHAR *)&buf, ARRAY_SIZE(test) + 1, NULL);
ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret);
ok(buf != NULL && buf != (WCHAR *)0xdeadbeef,
"Expected output buffer pointer to be valid\n");
@@ -1550,53 +1472,53 @@ static void test_message_from_hmodule(void)
/*Test existing messageID; as the message strings from wine's kernel32 differ from windows' kernel32 we don't compare
the strings but only test that FormatMessage doesn't return 0*/
ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE, h, 7/*=ERROR_ARENA_TRASHED*/,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, sizeof(out)/sizeof(CHAR), NULL);
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, ARRAY_SIZE(out), NULL);
ok(ret != 0, "FormatMessageA returned 0\n");
/* Test HRESULT. It's not documented but in practice _com_error::ErrorMessage relies on this. */
ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE, h, 0x80070005 /* E_ACCESSDENIED */,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, sizeof(out)/sizeof(CHAR), NULL);
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, ARRAY_SIZE(out), NULL);
ok(ret != 0, "FormatMessageA returned 0\n");
ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE, h, TRUST_E_NOSIGNATURE,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, sizeof(out)/sizeof(CHAR), NULL);
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, ARRAY_SIZE(out), NULL);
ok(ret != 0, "FormatMessageA returned 0\n");
/* Test a message string with an insertion without passing any variadic arguments. */
ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE, h, 193 /* ERROR_BAD_EXE_FORMAT */,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, sizeof(out)/sizeof(CHAR), NULL);
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, ARRAY_SIZE(out), NULL);
ok(ret == 0, "FormatMessageA returned non-zero\n");
ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE |
FORMAT_MESSAGE_ARGUMENT_ARRAY, h, 193 /* ERROR_BAD_EXE_FORMAT */,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, sizeof(out)/sizeof(CHAR), NULL);
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, ARRAY_SIZE(out), NULL);
ok(ret == 0, "FormatMessageA returned non-zero\n");
/*Test nonexistent messageID with varying language IDs Note: FormatMessageW behaves the same*/
SetLastError(0xdeadbeef);
ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE, h, 3044,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, sizeof(out)/sizeof(CHAR), NULL);
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), out, ARRAY_SIZE(out), NULL);
error = GetLastError();
ok(ret == 0, "FormatMessageA returned %u instead of 0\n", ret);
ok(error == ERROR_MR_MID_NOT_FOUND || error == ERROR_MUI_FILE_NOT_FOUND, "last error %u\n", error);
SetLastError(0xdeadbeef);
ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE, h, 3044,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), out, sizeof(out)/sizeof(CHAR), NULL);
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), out, ARRAY_SIZE(out), NULL);
error = GetLastError();
ok(ret == 0, "FormatMessageA returned %u instead of 0\n", ret);
ok(error == ERROR_MR_MID_NOT_FOUND || error == ERROR_MUI_FILE_NOT_LOADED, "last error %u\n", error);
SetLastError(0xdeadbeef);
ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE, h, 3044,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT), out, sizeof(out)/sizeof(CHAR), NULL);
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT), out, ARRAY_SIZE(out), NULL);
error = GetLastError();
ok(ret == 0, "FormatMessageA returned %u instead of 0\n", ret);
ok(error == ERROR_MR_MID_NOT_FOUND || error == ERROR_MUI_FILE_NOT_LOADED, "last error %u\n", error);
SetLastError(0xdeadbeef);
ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE, h, 3044,
- MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), out, sizeof(out)/sizeof(CHAR), NULL);
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), out, ARRAY_SIZE(out), NULL);
error = GetLastError();
ok(ret == 0, "FormatMessageA returned %u instead of 0\n", ret);
ok(error == ERROR_RESOURCE_LANG_NOT_FOUND ||
@@ -1607,7 +1529,7 @@ static void test_message_from_hmodule(void)
SetLastError(0xdeadbeef);
ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE, h, 3044,
- MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK), out, sizeof(out)/sizeof(CHAR), NULL);
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK), out, ARRAY_SIZE(out), NULL);
error = GetLastError();
ok(ret == 0, "FormatMessageA returned %u instead of 0\n", ret);
ok(error == ERROR_RESOURCE_LANG_NOT_FOUND ||
@@ -1627,7 +1549,7 @@ static void test_message_invalid_flags(void)
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- ret = FormatMessageA(0, "test", 0, 0, out, sizeof(out)/sizeof(CHAR), NULL);
+ ret = FormatMessageA(0, "test", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret);
ok(!memcmp(out, init_buf, sizeof(init_buf)),
"Expected the output buffer to be untouched\n");
@@ -1646,7 +1568,7 @@ static void test_message_invalid_flags(void)
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- ret = FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS, "test", 0, 0, out, sizeof(out)/sizeof(CHAR), NULL);
+ ret = FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS, "test", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret);
ok(!memcmp(out, init_buf, sizeof(init_buf)),
"Expected the output buffer to be untouched\n");
@@ -1656,7 +1578,7 @@ static void test_message_invalid_flags(void)
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- ret = FormatMessageA(FORMAT_MESSAGE_ARGUMENT_ARRAY, "test", 0, 0, out, sizeof(out)/sizeof(CHAR), NULL);
+ ret = FormatMessageA(FORMAT_MESSAGE_ARGUMENT_ARRAY, "test", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret);
ok(!memcmp(out, init_buf, sizeof(init_buf)),
"Expected the output buffer to be untouched\n");
@@ -1666,7 +1588,7 @@ static void test_message_invalid_flags(void)
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- ret = FormatMessageA(FORMAT_MESSAGE_MAX_WIDTH_MASK, "test", 0, 0, out, sizeof(out)/sizeof(CHAR), NULL);
+ ret = FormatMessageA(FORMAT_MESSAGE_MAX_WIDTH_MASK, "test", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 0, "Expected FormatMessageA to return 0, got %u\n", ret);
ok(!memcmp(out, init_buf, sizeof(init_buf)),
"Expected the output buffer to be untouched\n");
@@ -1680,22 +1602,21 @@ static void test_message_invalid_flags(void)
memcpy(out, init_buf, sizeof(init_buf));
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_FROM_SYSTEM,
- "test", 0, 0, out, sizeof(out)/sizeof(CHAR), NULL);
+ "test", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret);
ok(!strcmp("test", out),
"Expected the output buffer to be untouched\n");
memcpy(out, init_buf, sizeof(init_buf));
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_FROM_HMODULE,
- "test", 0, 0, out, sizeof(out)/sizeof(CHAR), NULL);
+ "test", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret);
ok(!strcmp("test", out),
"Expected the output buffer to be untouched\n");
memcpy(out, init_buf, sizeof(init_buf));
ret = FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_FROM_HMODULE |
- FORMAT_MESSAGE_FROM_SYSTEM, "test", 0, 0, out,
- sizeof(out)/sizeof(CHAR), NULL);
+ FORMAT_MESSAGE_FROM_SYSTEM, "test", 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageA to return 4, got %u\n", ret);
ok(!strcmp("test", out),
"Expected the output buffer to be untouched\n");
@@ -1712,7 +1633,7 @@ static void test_message_invalid_flags_wide(void)
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- ret = FormatMessageW(0, test, 0, 0, out, sizeof(out)/sizeof(WCHAR), NULL);
+ ret = FormatMessageW(0, test, 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 0, "Expected FormatMessageW to return 0, got %u\n", ret);
ok(!memcmp(out, init_buf, sizeof(init_buf)),
"Expected the output buffer to be untouched\n");
@@ -1731,7 +1652,7 @@ static void test_message_invalid_flags_wide(void)
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- ret = FormatMessageW(FORMAT_MESSAGE_IGNORE_INSERTS, test, 0, 0, out, sizeof(out)/sizeof(WCHAR), NULL);
+ ret = FormatMessageW(FORMAT_MESSAGE_IGNORE_INSERTS, test, 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 0, "Expected FormatMessageW to return 0, got %u\n", ret);
ok(!memcmp(out, init_buf, sizeof(init_buf)),
"Expected the output buffer to be untouched\n");
@@ -1741,7 +1662,7 @@ static void test_message_invalid_flags_wide(void)
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- ret = FormatMessageW(FORMAT_MESSAGE_ARGUMENT_ARRAY, test, 0, 0, out, sizeof(out)/sizeof(WCHAR), NULL);
+ ret = FormatMessageW(FORMAT_MESSAGE_ARGUMENT_ARRAY, test, 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 0, "Expected FormatMessageW to return 0, got %u\n", ret);
ok(!memcmp(out, init_buf, sizeof(init_buf)),
"Expected the output buffer to be untouched\n");
@@ -1751,7 +1672,7 @@ static void test_message_invalid_flags_wide(void)
SetLastError(0xdeadbeef);
memcpy(out, init_buf, sizeof(init_buf));
- ret = FormatMessageW(FORMAT_MESSAGE_MAX_WIDTH_MASK, test, 0, 0, out, sizeof(out)/sizeof(WCHAR), NULL);
+ ret = FormatMessageW(FORMAT_MESSAGE_MAX_WIDTH_MASK, test, 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 0, "Expected FormatMessageW to return 0, got %u\n", ret);
ok(!memcmp(out, init_buf, sizeof(init_buf)),
"Expected the output buffer to be untouched\n");
@@ -1765,22 +1686,21 @@ static void test_message_invalid_flags_wide(void)
memcpy(out, init_buf, sizeof(init_buf));
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_FROM_SYSTEM,
- test, 0, 0, out, sizeof(out)/sizeof(WCHAR), NULL);
+ test, 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageW to return 4, got %u\n", ret);
ok(!lstrcmpW(test, out),
"Expected the output buffer to be untouched\n");
memcpy(out, init_buf, sizeof(init_buf));
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_FROM_HMODULE,
- test, 0, 0, out, sizeof(out)/sizeof(WCHAR), NULL);
+ test, 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageW to return 4, got %u\n", ret);
ok(!lstrcmpW(test, out),
"Expected the output buffer to be untouched\n");
memcpy(out, init_buf, sizeof(init_buf));
ret = FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_FROM_HMODULE |
- FORMAT_MESSAGE_FROM_SYSTEM, test, 0, 0, out,
- sizeof(out)/sizeof(WCHAR), NULL);
+ FORMAT_MESSAGE_FROM_SYSTEM, test, 0, 0, out, ARRAY_SIZE(out), NULL);
ok(ret == 4, "Expected FormatMessageW to return 4, got %u\n", ret);
ok(!lstrcmpW(test, out),
"Expected the output buffer to be untouched\n");
@@ -1821,11 +1741,11 @@ static void test_message_from_64bit_number(void)
};
int i;
- for (i = 0; i < sizeof(unsigned_tests) / sizeof(unsigned_tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(unsigned_tests); i++)
{
- r = doitW(FORMAT_MESSAGE_FROM_STRING, I64u,
- 0, 0, outW, sizeof(outW) / sizeof(WCHAR), unsigned_tests[i].number);
- MultiByteToWideChar(CP_ACP, 0, unsigned_tests[i].expected, -1, expW, sizeof(expW) / sizeof(WCHAR));
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, I64u, 0, 0, outW, ARRAY_SIZE(outW),
+ unsigned_tests[i].number);
+ MultiByteToWideChar(CP_ACP, 0, unsigned_tests[i].expected, -1, expW, ARRAY_SIZE(expW));
todo_wine {
ok(!lstrcmpW(outW, expW),"[%d] failed, expected %s, got %s\n", i,
unsigned_tests[i].expected, wine_dbgstr_w(outW));
@@ -1840,11 +1760,11 @@ todo_wine {
}
}
- for (i = 0; i < sizeof(signed_tests) / sizeof(signed_tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(signed_tests); i++)
{
- r = doitW(FORMAT_MESSAGE_FROM_STRING, I64d,
- 0, 0, outW, sizeof(outW) / sizeof(WCHAR), signed_tests[i].number);
- MultiByteToWideChar(CP_ACP, 0, signed_tests[i].expected, -1, expW, sizeof(expW) / sizeof(WCHAR));
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, I64d, 0, 0, outW, ARRAY_SIZE(outW),
+ signed_tests[i].number);
+ MultiByteToWideChar(CP_ACP, 0, signed_tests[i].expected, -1, expW, ARRAY_SIZE(expW));
todo_wine {
ok(!lstrcmpW(outW, expW),"[%d] failed, expected %s, got %s\n", i,
signed_tests[i].expected, wine_dbgstr_w(outW));
--
2.14.4
1
0
[PATCH 1/2] kernel32/tests: Correct the buffer size passed to FormatMessageW()
by Michael Stefaniuc 06 Jun '18
by Michael Stefaniuc 06 Jun '18
06 Jun '18
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/kernel32/tests/format_msg.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/dlls/kernel32/tests/format_msg.c b/dlls/kernel32/tests/format_msg.c
index 290bce9f71..43e4d35c8a 100644
--- a/dlls/kernel32/tests/format_msg.c
+++ b/dlls/kernel32/tests/format_msg.c
@@ -289,8 +289,7 @@ static void test_message_from_string_wide(void)
ok(r==4,"failed: r=%d\n", r);
/* a single digit, left justified */
- r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1_4d, 0,
- 0, out, sizeof(out)/sizeof(CHAR), 1);
+ r = doitW(FORMAT_MESSAGE_FROM_STRING, fmt_1_4d, 0, 0, out, ARRAY_SIZE(out), 1);
ok(!lstrcmpW(s_1_4d, out), "failed out=%s\n", wine_dbgstr_w(out));
ok(r==4,"failed: r=%d\n", r);
--
2.14.4
1
0