[PATCH 1/4] kernel32: Add more tests for time zone info
Dmitry Timoshkov
dmitry at codeweavers.com
Sun Jul 29 07:58:58 CDT 2007
>From 08121c31717d4a9286eabaad747709b9f02012fe Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry at codeweavers.com>
Date: Sun, 29 Jul 2007 21:26:20 +0900
Subject: [PATCH 1/4] kernel32: Add more tests for time zone info
---
dlls/kernel32/tests/time.c | 138 ++++++++++++++++++++++++++++++++++++++-----
1 files changed, 122 insertions(+), 16 deletions(-)
diff --git a/dlls/kernel32/tests/time.c b/dlls/kernel32/tests/time.c
index 5f4c5b4..128213c 100644
--- a/dlls/kernel32/tests/time.c
+++ b/dlls/kernel32/tests/time.c
@@ -2,6 +2,7 @@
* Unit test suite for time functions
*
* Copyright 2004 Uwe Bonnes
+ * Copyright 2007 Dmitry Timoshkov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -21,6 +22,9 @@
#include "wine/test.h"
#include "winbase.h"
+static BOOL (WINAPI *pTzSpecificLocalTimeToSystemTime)(LPTIME_ZONE_INFORMATION, LPSYSTEMTIME, LPSYSTEMTIME);
+static BOOL (WINAPI *pSystemTimeToTzSpecificLocalTime)(LPTIME_ZONE_INFORMATION, LPSYSTEMTIME, LPSYSTEMTIME);
+
#define SECSPERMIN 60
#define SECSPERDAY 86400
/* 1601 to 1970 is 369 years plus 89 leap days */
@@ -181,12 +185,86 @@ static void test_invalid_arg(void)
ok( !SystemTimeToFileTime(&st, &ft), "bad minute\n");
}
+
+static LONGLONG system_time_to_minutes(const SYSTEMTIME *st)
+{
+ BOOL ret;
+ FILETIME ft;
+ LONGLONG minutes;
+
+ SetLastError(0xdeadbeef);
+ ret = SystemTimeToFileTime(st, &ft);
+ ok(ret, "SystemTimeToFileTime error %u\n", GetLastError());
+
+ minutes = ((LONGLONG)ft.dwHighDateTime << 32) + ft.dwLowDateTime;
+ minutes /= (LONGLONG)600000000; /* convert to minutes */
+ return minutes;
+}
+
+static LONG get_tz_bias(const TIME_ZONE_INFORMATION *tzinfo, DWORD tz_id)
+{
+ switch (tz_id)
+ {
+ case TIME_ZONE_ID_DAYLIGHT:
+ return tzinfo->DaylightBias;
+
+ case TIME_ZONE_ID_STANDARD:
+ return tzinfo->StandardBias;
+
+ default:
+ trace("unknown time zone id %d\n", tz_id);
+ /* fall through */
+ case TIME_ZONE_ID_UNKNOWN:
+ return 0;
+ }
+}
static void test_GetTimeZoneInformation(void)
{
TIME_ZONE_INFORMATION tzinfo, tzinfo1;
- DWORD res = GetTimeZoneInformation(&tzinfo);
- ok(res != TIME_ZONE_ID_INVALID, "GetTimeZoneInformation failed\n");
+ BOOL res;
+ DWORD tz_id;
+ SYSTEMTIME st, current, utc, local;
+ FILETIME l_ft, s_ft;
+ LONGLONG l_time, s_time;
+ LONG diff;
+
+ GetSystemTime(&st);
+ s_time = system_time_to_minutes(&st);
+
+ SetLastError(0xdeadbeef);
+ res = SystemTimeToFileTime(&st, &s_ft);
+ ok(res, "SystemTimeToFileTime error %u\n", GetLastError());
+ SetLastError(0xdeadbeef);
+ res = FileTimeToLocalFileTime(&s_ft, &l_ft);
+ ok(res, "FileTimeToLocalFileTime error %u\n", GetLastError());
+ SetLastError(0xdeadbeef);
+ res = FileTimeToSystemTime(&l_ft, &local);
+ ok(res, "FileTimeToSystemTime error %u\n", GetLastError());
+ l_time = system_time_to_minutes(&local);
+
+ tz_id = GetTimeZoneInformation(&tzinfo);
+ ok(tz_id != TIME_ZONE_ID_INVALID, "GetTimeZoneInformation failed\n");
+
+ trace("bias %d\n", tzinfo.Bias);
+ trace("standard (d/m/y): %u/%02u/%04u day of week %u %u:%02u:%02u.%03u bias %d\n",
+ tzinfo.StandardDate.wDay, tzinfo.StandardDate.wMonth,
+ tzinfo.StandardDate.wYear, tzinfo.StandardDate.wDayOfWeek,
+ tzinfo.StandardDate.wHour, tzinfo.StandardDate.wMinute,
+ tzinfo.StandardDate.wSecond, tzinfo.StandardDate.wMilliseconds,
+ tzinfo.StandardBias);
+ trace("daylight (d/m/y): %u/%02u/%04u day of week %u %u:%02u:%02u.%03u bias %d\n",
+ tzinfo.DaylightDate.wDay, tzinfo.DaylightDate.wMonth,
+ tzinfo.DaylightDate.wYear, tzinfo.DaylightDate.wDayOfWeek,
+ tzinfo.DaylightDate.wHour, tzinfo.DaylightDate.wMinute,
+ tzinfo.DaylightDate.wSecond, tzinfo.DaylightDate.wMilliseconds,
+ tzinfo.DaylightBias);
+
+ diff = (LONG)(s_time - l_time);
+ ok(diff == tzinfo.Bias + get_tz_bias(&tzinfo, tz_id),
+ "system/local diff %d != tz bias %d\n",
+ diff, tzinfo.Bias + get_tz_bias(&tzinfo, tz_id));
+
ok(SetEnvironmentVariableA("TZ","GMT0") != 0,
"SetEnvironmentVariableA failed\n");
res = GetTimeZoneInformation(&tzinfo1);
@@ -198,7 +276,37 @@ static void test_GetTimeZoneInformation(void)
"Bias influenced by TZ variable\n");
ok(SetEnvironmentVariableA("TZ",NULL) != 0,
"SetEnvironmentVariableA failed\n");
-
+
+ diff = get_tz_bias(&tzinfo, tz_id);
+
+ utc = st;
+ SetLastError(0xdeadbeef);
+ res = pSystemTimeToTzSpecificLocalTime(&tzinfo, &utc, ¤t);
+ ok(res, "SystemTimeToTzSpecificLocalTime error %u\n", GetLastError());
+ s_time = system_time_to_minutes(¤t);
+
+ tzinfo.StandardBias -= 123;
+ tzinfo.DaylightBias += 456;
+
+ res = pSystemTimeToTzSpecificLocalTime(&tzinfo, &utc, &local);
+ ok(res, "SystemTimeToTzSpecificLocalTime error %u\n", GetLastError());
+ l_time = system_time_to_minutes(&local);
+ ok(l_time - s_time == diff - get_tz_bias(&tzinfo, tz_id), "got %d, expected %d\n",
+ (LONG)(l_time - s_time), diff - get_tz_bias(&tzinfo, tz_id));
+
+ /* pretend that there is no transition dates */
+ tzinfo.DaylightDate.wDay = 0;
+ tzinfo.DaylightDate.wMonth = 0;
+ tzinfo.DaylightDate.wYear = 0;
+ tzinfo.StandardDate.wDay = 0;
+ tzinfo.StandardDate.wMonth = 0;
+ tzinfo.StandardDate.wYear = 0;
+
+ res = pSystemTimeToTzSpecificLocalTime(&tzinfo, &utc, &local);
+ ok(res, "SystemTimeToTzSpecificLocalTime error %u\n", GetLastError());
+ l_time = system_time_to_minutes(&local);
+ ok(l_time - s_time == diff, "got %d, expected %d\n",
+ (LONG)(l_time - s_time), diff);
}
static void test_FileTimeToSystemTime(void)
@@ -275,12 +383,6 @@ static void test_FileTimeToLocalFileTime(void)
"SetEnvironmentVariableA failed\n");
}
-
-/* test TzSpecificLocalTimeToSystemTime and SystemTimeToTzSpecificLocalTime
- * these are in winXP and later */
-typedef HANDLE (WINAPI *fnTzSpecificLocalTimeToSystemTime)( LPTIME_ZONE_INFORMATION, LPSYSTEMTIME, LPSYSTEMTIME);
-typedef HANDLE (WINAPI *fnSystemTimeToTzSpecificLocalTime)( LPTIME_ZONE_INFORMATION, LPSYSTEMTIME, LPSYSTEMTIME);
-
typedef struct {
int nr; /* test case number for easier lookup */
TIME_ZONE_INFORMATION *ptz; /* ptr to timezone */
@@ -290,17 +392,16 @@ typedef struct {
static void test_TzSpecificLocalTimeToSystemTime(void)
{
- HMODULE hKernel = GetModuleHandle("kernel32");
- fnTzSpecificLocalTimeToSystemTime pTzSpecificLocalTimeToSystemTime;
- fnSystemTimeToTzSpecificLocalTime pSystemTimeToTzSpecificLocalTime = NULL;
TIME_ZONE_INFORMATION tzE, tzW, tzS;
SYSTEMTIME result;
int i, j, year;
- pTzSpecificLocalTimeToSystemTime = (fnTzSpecificLocalTimeToSystemTime) GetProcAddress( hKernel, "TzSpecificLocalTimeToSystemTime");
- if(pTzSpecificLocalTimeToSystemTime)
- pSystemTimeToTzSpecificLocalTime = (fnTzSpecificLocalTimeToSystemTime) GetProcAddress( hKernel, "SystemTimeToTzSpecificLocalTime");
- if( !pSystemTimeToTzSpecificLocalTime)
+
+ if (!pTzSpecificLocalTimeToSystemTime || !pSystemTimeToTzSpecificLocalTime)
+ {
+ skip("TzSpecificLocalTimeToSystemTime or SystemTimeToTzSpecificLocalTime not present\n");
return;
+ }
+
ZeroMemory( &tzE, sizeof(tzE));
ZeroMemory( &tzW, sizeof(tzW));
ZeroMemory( &tzS, sizeof(tzS));
@@ -473,6 +574,10 @@ static void test_TzSpecificLocalTimeToSystemTime(void)
START_TEST(time)
{
+ HMODULE hKernel = GetModuleHandle("kernel32");
+ pTzSpecificLocalTimeToSystemTime = (void *)GetProcAddress(hKernel, "TzSpecificLocalTimeToSystemTime");
+ pSystemTimeToTzSpecificLocalTime = (void *)GetProcAddress( hKernel, "SystemTimeToTzSpecificLocalTime");
+
test_conversions();
test_invalid_arg();
test_GetTimeZoneInformation();
@@ -480,3 +585,4 @@ START_TEST(time)
test_FileTimeToLocalFileTime();
test_TzSpecificLocalTimeToSystemTime();
}
+
--
1.5.2.3
More information about the wine-patches
mailing list