oleaut32: Implement VarWeekdayName + tests.

This commit is contained in:
Alexandru Balut 2007-12-02 17:17:27 +01:00 committed by Alexandre Julliard
parent 914e78aeb5
commit 90d8741d23
3 changed files with 174 additions and 1 deletions

View File

@ -124,7 +124,7 @@
125 stdcall VarBoolFromStr(wstr long long ptr)
126 stdcall VarBoolFromDisp(ptr long ptr)
127 stdcall VarFormatCurrency(ptr long long long long long ptr)
128 stub VarWeekdayName # stdcall (long long long long ptr)
128 stdcall VarWeekdayName(long long long long ptr)
129 stdcall VarMonthName(long long long ptr)
130 stdcall VarUI1FromI2(long ptr)
131 stdcall VarUI1FromI4(long ptr)

View File

@ -42,6 +42,7 @@ static HMODULE hOleaut32;
static HRESULT (WINAPI *pVarFormatNumber)(LPVARIANT,int,int,int,int,ULONG,BSTR*);
static HRESULT (WINAPI *pVarFormat)(LPVARIANT,LPOLESTR,int,int,ULONG,BSTR*);
static HRESULT (WINAPI *pVarWeekdayName)(int,int,int,ULONG,BSTR*);
/* Have I8/UI8 data type? */
#define HAVE_OLEAUT32_I8 HAVE_FUNC(VarI8FromI1)
@ -392,10 +393,112 @@ static void test_VarFormat(void)
VARFMT(VT_BOOL,V_BOOL,VARIANT_TRUE,"",E_INVALIDARG,"");
}
static const char *szVarWdnFail = \
"VarWeekdayName (%d, %d, %d, %d, %x): returned %8x, expected %8x\n";
#define VARWDN(iWeekday, fAbbrev, iFirstDay, dwFlags, ret, buff, out, freeOut) \
do { \
hres = pVarWeekdayName(iWeekday, fAbbrev, iFirstDay, dwFlags, &out); \
if (SUCCEEDED(hres)) { \
WideCharToMultiByte(CP_ACP, 0, out, -1, buff, sizeof(buff), 0, 0); \
if (freeOut) SysFreeString(out); \
} else { \
buff[0] = '\0'; \
} \
ok(hres == ret, \
szVarWdnFail, \
iWeekday, fAbbrev, iFirstDay, dwFlags, &out, hres, ret \
); \
} while(0)
#define VARWDN_F(iWeekday, fAbbrev, iFirstDay, dwFlags, ret) \
VARWDN(iWeekday, fAbbrev, iFirstDay, dwFlags, ret, buff, out, 1)
#define VARWDN_O(iWeekday, fAbbrev, iFirstDay, dwFlags) \
VARWDN(iWeekday, fAbbrev, iFirstDay, dwFlags, S_OK, buff, out, 0)
static void test_VarWeekdayName(void)
{
char buff[256];
BSTR out = NULL;
HRESULT hres;
int iWeekday, fAbbrev, iFirstDay;
BSTR dayNames[7][2]; /* Monday-Sunday, full/abbr */
DWORD defaultFirstDay;
int firstDay;
int day;
int size;
DWORD localeValue;
CHECKPTR(VarWeekdayName);
/* Initialize days' names */
for (day = 0; day <= 6; ++day)
{
for (fAbbrev = 0; fAbbrev <= 1; ++fAbbrev)
{
localeValue = fAbbrev ? LOCALE_SABBREVDAYNAME1 : LOCALE_SDAYNAME1;
localeValue += day;
size = GetLocaleInfoW(LOCALE_USER_DEFAULT, localeValue, NULL, 0);
dayNames[day][fAbbrev] = SysAllocStringLen(NULL, size - 1);
GetLocaleInfoW(LOCALE_USER_DEFAULT, localeValue,
dayNames[day][fAbbrev], size);
}
}
/* Get the user's first day of week. 0=Monday, .. */
GetLocaleInfoW(
LOCALE_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK | LOCALE_RETURN_NUMBER,
(LPWSTR)&defaultFirstDay, sizeof(defaultFirstDay) / sizeof(WCHAR));
/* Check invalid arguments */
VARWDN_F(0, 0, 4, 0, E_INVALIDARG);
VARWDN_F(8, 0, 4, 0, E_INVALIDARG);
VARWDN_F(4, 0, -1, 0, E_INVALIDARG);
VARWDN_F(4, 0, 8, 0, E_INVALIDARG);
hres = pVarWeekdayName(1, 0, 0, 0, NULL);
ok(E_INVALIDARG == hres,
"Null pointer: expected E_INVALIDARG, got 0x%08x\n", hres);
/* Check all combinations */
for (iWeekday = 1; iWeekday <= 7; ++iWeekday)
{
for (fAbbrev = 0; fAbbrev <= 1; ++fAbbrev)
{
/* 0 = Default, 1 = Sunday, 2 = Monday, .. */
for (iFirstDay = 0; iFirstDay <= 7; ++iFirstDay)
{
VARWDN_O(iWeekday, fAbbrev, iFirstDay, 0);
if (iFirstDay == 0)
firstDay = defaultFirstDay;
else
/* Translate from 0=Sunday to 0=Monday in the modulo 7 space */
firstDay = iFirstDay - 2;
day = (7 + iWeekday - 1 + firstDay) % 7;
ok(VARCMP_EQ == VarBstrCmp(out, dayNames[day][fAbbrev],
LOCALE_USER_DEFAULT, 0),
"VarWeekdayName(%d,%d,%d): got wrong dayname: '%s'\n",
iWeekday, fAbbrev, iFirstDay, buff);
SysFreeString(out);
}
}
}
/* Cleanup */
for (day = 0; day <= 6; ++day)
{
for (fAbbrev = 0; fAbbrev <= 1; ++fAbbrev)
{
SysFreeString(dayNames[day][fAbbrev]);
}
}
}
START_TEST(varformat)
{
hOleaut32 = GetModuleHandleA("oleaut32.dll");
test_VarFormatNumber();
test_VarFormat();
test_VarWeekdayName();
}

View File

@ -2498,3 +2498,73 @@ HRESULT WINAPI VarMonthName(INT iMonth, INT fAbbrev, ULONG dwFlags, BSTR *pbstrO
}
return S_OK;
}
/**********************************************************************
* VarWeekdayName [OLEAUT32.129]
*
* Print the specified weekday as localized name.
*
* PARAMS
* iWeekday [I] day of week, 1..7, 1="the first day of the week"
* fAbbrev [I] 0 - full name, !0 - abbreviated name
* iFirstDay [I] first day of week,
* 0=system default, 1=Sunday, 2=Monday, .. (contrary to MSDN)
* dwFlags [I] flag stuff. only VAR_CALENDAR_HIJRI possible.
* pbstrOut [O] Destination for weekday name.
*
* RETURNS
* Success: S_OK, pbstrOut contains the name.
* Failure: E_INVALIDARG, if any parameter is invalid.
* E_OUTOFMEMORY, if enough memory cannot be allocated.
*/
HRESULT WINAPI VarWeekdayName(INT iWeekday, INT fAbbrev, INT iFirstDay,
ULONG dwFlags, BSTR *pbstrOut)
{
DWORD localeValue;
INT size;
/* Windows XP oleaut32.dll doesn't allow iWekday==0, contrary to MSDN */
if (iWeekday < 1 || iWeekday > 7)
return E_INVALIDARG;
if (iFirstDay < 0 || iFirstDay > 7)
return E_INVALIDARG;
if (!pbstrOut)
return E_INVALIDARG;
if (dwFlags)
FIXME("Does not support dwFlags 0x%x, ignoring.\n", dwFlags);
/* If we have to use the default firstDay, find which one it is */
if (iFirstDay == 0) {
DWORD firstDay;
localeValue = LOCALE_RETURN_NUMBER | LOCALE_IFIRSTDAYOFWEEK;
size = GetLocaleInfoW(LOCALE_USER_DEFAULT, localeValue,
(LPWSTR)&firstDay, sizeof(firstDay) / sizeof(WCHAR));
if (!size) {
ERR("GetLocaleInfo 0x%x failed.\n", localeValue);
return HRESULT_FROM_WIN32(GetLastError());
}
iFirstDay = firstDay + 2;
}
/* Determine what we need to return */
localeValue = fAbbrev ? LOCALE_SABBREVDAYNAME1 : LOCALE_SDAYNAME1;
localeValue += (7 + iWeekday - 1 + iFirstDay - 2) % 7;
/* Determine the size of the data, allocate memory and retrieve the data */
size = GetLocaleInfoW(LOCALE_USER_DEFAULT, localeValue, NULL, 0);
if (!size) {
ERR("GetLocaleInfo 0x%x failed.\n", localeValue);
return HRESULT_FROM_WIN32(GetLastError());
}
*pbstrOut = SysAllocStringLen(NULL, size - 1);
if (!*pbstrOut)
return E_OUTOFMEMORY;
size = GetLocaleInfoW(LOCALE_USER_DEFAULT, localeValue, *pbstrOut, size);
if (!size) {
ERR("GetLocaleInfo 0x%x failed in 2nd stage?!\n", localeValue);
SysFreeString(*pbstrOut);
return HRESULT_FROM_WIN32(GetLastError());
}
return S_OK;
}