oleaut32: Implement VarWeekdayName + tests.
This commit is contained in:
parent
914e78aeb5
commit
90d8741d23
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue