/* * Very basic unit test for locale functions * Test run on win2K (French) * * Copyright (c) 2002 YASAR Mehmet * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "wine/test.h" #include "winbase.h" #include "winerror.h" #include "winnls.h" #define eq(received, expected, label, type) \ ok((received) == (expected), "%s: got " type " instead of " type, (label),(received),(expected)) #define BUFFER_SIZE 50 /* Buffer used by callback function */ char GlobalBuffer[BUFFER_SIZE]; /* TODO : * Unicode versions * EnumTimeFormatsA * EnumDateFormatsA * LCMapStringA * GetUserDefaultLangID * ... */ void TestGetLocaleInfoA() { int ret, cmp; LCID lcid; char buffer[BUFFER_SIZE], Expected[BUFFER_SIZE]; strcpy(Expected, "Monday"); lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT ); ok (lcid == 0x409, "wrong LCID calculated"); strcpy(Expected, "xxxxx"); memset( buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); ret = GetLocaleInfoA(lcid, LOCALE_SDAYNAME1, buffer, 0); cmp = strncmp (buffer, Expected, strlen(Expected)); ok (cmp == 0, "GetLocaleInfoA got %s instead of %s", buffer, Expected); eq (ret, strlen("Monday") + 1, "GetLocaleInfoA with len=0", "%d"); strcpy(Expected, "Monxx"); memset( buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); ret = GetLocaleInfoA(lcid, LOCALE_SDAYNAME1, buffer, 3); cmp = strncmp (buffer, Expected, strlen(Expected)); ok (cmp == 0, "GetLocaleInfoA got %s instead of %s", buffer, Expected); eq (ret, 0, "GetLocaleInfoA with len = 3", "%d"); strcpy(Expected, "Monday"); memset( buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); ret = GetLocaleInfoA(lcid, LOCALE_SDAYNAME1, buffer, 10); /* We check also presence of '\0' */ cmp = strncmp (buffer, Expected, strlen(Expected) + 1); ok (cmp == 0, "GetLocaleInfoA got %s instead of %s", buffer, Expected); eq (ret, strlen(Expected)+1, "GetLocaleInfoA with len = 10", "%d" ); /* We check the whole buffer with strncmp */ memset( Expected, 'x', sizeof (Expected)/sizeof(Expected[0]) ); strcpy(Expected, "Monday"); memset( buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); ret = GetLocaleInfoA(lcid, LOCALE_SDAYNAME1, buffer, BUFFER_SIZE); cmp = strncmp (buffer, Expected, BUFFER_SIZE); ok (cmp == 0, "GetLocaleInfoA got %s instead of %s", buffer, Expected); eq (ret, strlen(Expected)+1, "GetLocaleInfoA with len = 10", "%d" ); } void TestGetTimeFormatA() { int ret, error, cmp; SYSTEMTIME curtime; char buffer[BUFFER_SIZE], format[BUFFER_SIZE], Expected[BUFFER_SIZE]; LCID lcid; lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT ); strcpy(format, "tt HH':'mm'@'ss"); todo_wine { /* fill curtime with dummy data */ memset(&curtime, 2, sizeof(SYSTEMTIME)); ret = GetTimeFormatA(lcid, TIME_FORCE24HOURFORMAT, &curtime, format, buffer, sizeof(buffer)); error = GetLastError (); ok (ret == 0, "GetTimeFormat should fail on dummy data"); eq (error, ERROR_INVALID_PARAMETER, "GetTimeFormat GetLastError()", "%d"); } strcpy(Expected, "AM 08:56@13"); curtime.wHour = 8; curtime.wMinute = 56; curtime.wSecond = 13; curtime.wMilliseconds = 22; ret = GetTimeFormatA(lcid, TIME_FORCE24HOURFORMAT, &curtime, format, buffer, sizeof(buffer)); cmp = strncmp (Expected, buffer, strlen(Expected)+1); ok (cmp == 0, "GetTimeFormat got %s instead of %s", buffer, Expected); eq (ret, strlen(Expected)+1, "GetTimeFormat", "%d"); /* test with too small buffers */ memset(buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); strcpy(Expected, "xxxx"); ret = GetTimeFormatA(lcid, TIME_FORCE24HOURFORMAT, &curtime, format, buffer, 0); cmp = strncmp (Expected, buffer, 4); ok (cmp == 0, "GetTimeFormat with len=0 got %s instead of %s", buffer, Expected); todo_wine { eq (ret, 12, "GetTimeFormat with len=0", "%d"); } memset(buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); strcpy(Expected, "AMxx"); ret = GetTimeFormatA(lcid, TIME_FORCE24HOURFORMAT, &curtime, format, buffer, 2); cmp = strncmp (Expected, buffer, 4); todo_wine { ok (cmp == 0, "GetTimeFormat with len=2 got %s instead of %s", buffer, Expected); } eq (ret, 0, "GetTimeFormat with len=2", "%d"); } void TestGetDateFormatA() { int ret, error, cmp; SYSTEMTIME curtime; char buffer[BUFFER_SIZE], format[BUFFER_SIZE], Expected[BUFFER_SIZE]; LCID lcid; lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT ); strcpy(format, "ddd',' MMM dd yy"); todo_wine { /* fill curtime with dummy data */ memset(&curtime, 2, sizeof(SYSTEMTIME)); memset(buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); ret = GetDateFormatA(lcid, 0, &curtime, format, buffer, sizeof(buffer)); error = GetLastError (); ok (ret== 0, "GetDateFormat should fail on dummy data"); eq (error, ERROR_INVALID_PARAMETER, "GetDateFormat", "%d"); } strcpy(Expected, "Sat, May 04 02"); memset(buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); curtime.wYear = 2002; curtime.wMonth = 5; curtime.wDay = 4; curtime.wDayOfWeek = 3; ret = GetDateFormatA(lcid, 0, &curtime, format, buffer, sizeof(buffer)); cmp = strncmp (Expected, buffer, strlen(Expected)+1); todo_wine { ok (cmp == 0, "GetDateFormat got %s instead of %s", buffer, Expected); } eq (ret, strlen(Expected)+1, "GetDateFormat", "%d"); /* test format with "'" */ memset(buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); strcpy(format, "ddd',' MMM dd ''''yy"); strcpy(Expected, "Sat, May 04 '02"); ret = GetDateFormatA(lcid, 0, &curtime, format, buffer, sizeof(buffer)); cmp = strncmp (Expected, buffer, strlen(Expected)+1); todo_wine { ok (cmp == 0, "GetDateFormat got %s instead of %s", buffer, Expected); } eq (ret, (strlen(Expected)+1), "GetDateFormat", "%d"); /* test with too small buffers */ memset(buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); strcpy(Expected, "xxxx"); ret = GetDateFormatA(lcid, 0, &curtime, format, buffer, 0); cmp = strncmp (Expected, buffer, 4); ok (cmp == 0, "GetDateFormat got %s instead of %s", buffer, Expected); todo_wine { eq (ret, 16, "GetDateFormat with len=0", "%d"); } memset(buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); strcpy(Expected, "Saxx"); ret = GetDateFormatA(lcid, 0, &curtime, format, buffer, 2); cmp = strncmp (Expected, buffer, 4); todo_wine { ok (cmp == 0, "GetDateFormat got %s instead of %s", buffer, Expected); } eq (ret, 0, "GetDateFormat with len=2", "%d"); } void TestGetCurrencyFormat() { int ret, error, cmp; char buffer[BUFFER_SIZE], Expected[BUFFER_SIZE], format[BUFFER_SIZE]; LCID lcid; lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT ); #if 0 lcid = MAKELCID(MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), SORT_DEFAULT ); #endif memset( buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); ret = GetCurrencyFormatA(lcid, 0, "23,65", NULL, buffer, sizeof(buffer)); error = GetLastError (); cmp = strncmp ("xxxx", buffer, 4); ok (cmp == 0, "GetCurrencyFormat should fail with ','"); eq (ret, 0, "GetCurrencyFormat with ','", "%d"); eq (error, ERROR_INVALID_PARAMETER, "GetCurrencyFormat", "%d"); memset(Expected, 'x', sizeof (Expected)/sizeof(Expected[0]) ); strcpy (Expected, "$23.53"); strcpy (format, "23.53"); memset( buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); ret = GetCurrencyFormatA(lcid, 0, format, NULL, buffer, 0); cmp = strncmp ("xxx", buffer, 3); ok (cmp == 0, "GetCurrencyFormat with 0 buffer size"); eq (ret, strlen(Expected)+1, "GetCurrencyFormat with len=0", "%d"); memset( buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); ret = GetCurrencyFormatA(lcid, 0, format, NULL, buffer, 2); cmp = strncmp ("$2xx", buffer, 4); ok (cmp == 0, "GetCurrencyFormat got %s instead of %s", buffer, Expected); eq (ret, 0, "GetCurrencyFormat with len=2", "%d"); /* We check the whole buffer with strncmp */ memset( buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); ret = GetCurrencyFormatA(lcid, 0, format, NULL, buffer, sizeof(buffer)); cmp = strncmp (Expected, buffer, BUFFER_SIZE); ok (cmp == 0, "GetCurrencyFormat got %s instead of %s", buffer, Expected); eq (ret, strlen(Expected)+1, "GetCurrencyFormat","%d"); } void TestGetNumberFormat() { int ret, error, cmp; char buffer[BUFFER_SIZE], Expected[BUFFER_SIZE], input[BUFFER_SIZE]; LCID lcid; lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT ); memset( buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); ret = GetNumberFormatA(lcid, 0, "23,65", NULL, buffer, sizeof(buffer)); error = GetLastError (); cmp = strncmp ("xxx", buffer, 3); ok (cmp == 0, "GetCurrencyFormat"); ok (ret == 0, "GetNumberFormat should return 0"); eq (error, ERROR_INVALID_PARAMETER, "GetNumberFormat", "%d"); strcpy(input, "2353"); strcpy(Expected, "2,353.00"); memset( buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); ret = GetNumberFormatA(lcid, 0, input, NULL, buffer, 0); cmp = strncmp ("xxx", buffer, 3); ok (cmp == 0, "GetNumberFormat with len=0 got %s instead of %s", buffer, "xxx"); eq (ret, strlen(Expected)+1, "GetNumberFormat", "%d"); strcpy(Expected, "2,xx"); memset( buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); ret = GetNumberFormatA(lcid, 0, input, NULL, buffer, 2); cmp = strncmp (Expected, buffer, 4); ok (cmp == 0, "GetNumberFormat with len=2 got %s instead of %s", buffer, Expected); eq (ret, 0, "GetNumberFormat", "%d"); /* We check the whole buffer with strncmp */ memset(Expected, 'x', sizeof (Expected)/sizeof(Expected[0]) ); strcpy(Expected, "2,353.00"); memset( buffer, 'x', sizeof (buffer)/sizeof(buffer[0]) ); ret = GetNumberFormatA(lcid, 0, input, NULL, buffer, sizeof(buffer)); cmp = strncmp (Expected, buffer, BUFFER_SIZE); ok (cmp == 0, "GetNumberFormat got %s instead of %s", buffer, Expected); eq (ret, strlen(Expected)+1, "GetNumberFormat", "%d"); } /* Callback function used by TestEnumTimeFormats */ BOOL CALLBACK EnumTimeFormatsProc(char * lpTimeFormatString) { trace("%s\n", lpTimeFormatString); strcpy(GlobalBuffer, lpTimeFormatString); #if 0 return TRUE; #endif return FALSE; } void TestEnumTimeFormats() { int ret; LCID lcid; char Expected[BUFFER_SIZE]; lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT ); memset( GlobalBuffer, 'x', sizeof (GlobalBuffer)/sizeof(GlobalBuffer[0]) ); strcpy(Expected, "h:mm:ss tt"); ret = EnumTimeFormatsA(EnumTimeFormatsProc, lcid, 0); eq (ret, 1, "EnumTimeFormats should return 1", "%d"); ok (strncmp (GlobalBuffer, Expected, strlen(Expected)) == 0, "EnumTimeFormats failed"); ok (ret == 1, "EnumTimeFormats should return 1"); } void TestCompareStringA() { int ret; LCID lcid; char buffer1[BUFFER_SIZE], buffer2[BUFFER_SIZE]; lcid = MAKELCID(MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), SORT_DEFAULT ); strcpy(buffer1, "Salut"); strcpy(buffer2, "Salute"); ret = CompareStringA(lcid, NORM_IGNORECASE, buffer1, -1, buffer2, -1); ok (ret== 1, "CompareStringA (st1=%s str2=%s) expected result=1", buffer1, buffer2); strcpy(buffer1, "Salut"); strcpy(buffer2, "saLuT"); ret = CompareStringA(lcid, NORM_IGNORECASE, buffer1, -1, buffer2, -1); ok (ret== 2, "CompareStringA (st1=%s str2=%s) expected result=2", buffer1, buffer2); strcpy(buffer1, "Salut"); strcpy(buffer2, "hola"); ret = CompareStringA(lcid, NORM_IGNORECASE, buffer1, -1, buffer2, -1); ok (ret== 3, "CompareStringA (st1=%s str2=%s) expected result=3", buffer1, buffer2); strcpy(buffer1, "héhé"); strcpy(buffer2, "hèhè"); ret = CompareStringA(lcid, NORM_IGNORECASE, buffer1, -1, buffer2, -1); ok (ret== 1, "CompareStringA (st1=%s str2=%s) expected result=1", buffer1, buffer2); lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT ); strcpy(buffer1, "héhé"); strcpy(buffer2, "hèhè"); ret = CompareStringA(lcid, NORM_IGNORECASE, buffer1, -1, buffer2, -1); ok (ret== 1, "CompareStringA (st1=%s str2=%s) expected result=1", buffer1, buffer2); ret = CompareStringA(lcid, NORM_IGNORECASE, buffer1, -1, buffer2, 0); ok (ret== 3, "CompareStringA (st1=%s str2=%s) expected result=3", buffer1, buffer2); } START_TEST(locale) { #if 0 TestEnumTimeFormats(); #endif TestGetLocaleInfoA(); TestGetTimeFormatA(); TestGetDateFormatA(); TestGetNumberFormat(); TestGetCurrencyFormat(); TestCompareStringA(); }