vbscript: Implement DateAdd().
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52686 Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
d50f7b02a9
commit
3693394892
|
@ -2205,10 +2205,67 @@ static HRESULT Global_GetObject(BuiltinDisp *This, VARIANT *args, unsigned args_
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT Global_DateAdd(BuiltinDisp *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
|
static HRESULT Global_DateAdd(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
|
||||||
{
|
{
|
||||||
FIXME("\n");
|
BSTR interval = NULL;
|
||||||
return E_NOTIMPL;
|
UDATE ud = {{ 0 }};
|
||||||
|
HRESULT hres;
|
||||||
|
double date;
|
||||||
|
int count;
|
||||||
|
|
||||||
|
TRACE("\n");
|
||||||
|
|
||||||
|
assert(args_cnt == 3);
|
||||||
|
|
||||||
|
if (V_VT(args) == VT_NULL || V_VT(args + 1) == VT_NULL)
|
||||||
|
return MAKE_VBSERROR(VBSE_ILLEGAL_NULL_USE);
|
||||||
|
|
||||||
|
if (V_VT(args + 2) == VT_NULL)
|
||||||
|
return return_null(res);
|
||||||
|
|
||||||
|
hres = to_string(args, &interval);
|
||||||
|
if (SUCCEEDED(hres))
|
||||||
|
hres = to_int(args + 1, &count);
|
||||||
|
if (SUCCEEDED(hres))
|
||||||
|
hres = to_system_time(args + 2, &ud.st);
|
||||||
|
if (SUCCEEDED(hres))
|
||||||
|
{
|
||||||
|
if (!wcsicmp(interval, L"yyyy"))
|
||||||
|
ud.st.wYear += count;
|
||||||
|
else if (!wcsicmp(interval, L"q"))
|
||||||
|
ud.st.wMonth += 3 * count;
|
||||||
|
else if (!wcsicmp(interval, L"m"))
|
||||||
|
ud.st.wMonth += count;
|
||||||
|
else if (!wcsicmp(interval, L"y")
|
||||||
|
|| !wcsicmp(interval, L"d")
|
||||||
|
|| !wcsicmp(interval, L"w"))
|
||||||
|
{
|
||||||
|
ud.st.wDay += count;
|
||||||
|
}
|
||||||
|
else if (!wcsicmp(interval, L"ww"))
|
||||||
|
ud.st.wDay += 7 * count;
|
||||||
|
else if (!wcsicmp(interval, L"h"))
|
||||||
|
ud.st.wHour += count;
|
||||||
|
else if (!wcsicmp(interval, L"n"))
|
||||||
|
ud.st.wMinute += count;
|
||||||
|
else if (!wcsicmp(interval, L"s"))
|
||||||
|
ud.st.wSecond += count;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WARN("Unrecognized interval %s.\n", debugstr_w(interval));
|
||||||
|
hres = MAKE_VBSERROR(VBSE_ILLEGAL_FUNC_CALL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SysFreeString(interval);
|
||||||
|
|
||||||
|
if (SUCCEEDED(hres))
|
||||||
|
hres = VarDateFromUdateEx(&ud, 0, 0, &date);
|
||||||
|
|
||||||
|
if (SUCCEEDED(hres))
|
||||||
|
hres = return_date(res, date);
|
||||||
|
|
||||||
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT Global_DateDiff(BuiltinDisp *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
|
static HRESULT Global_DateDiff(BuiltinDisp *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
|
||||||
|
|
|
@ -1988,4 +1988,52 @@ call testDateSerial(2000, 14, 2, 2001, 2, 2)
|
||||||
call testDateSerial(9999, 12, 1, 9999, 12, 1)
|
call testDateSerial(9999, 12, 1, 9999, 12, 1)
|
||||||
call testDateSerialError()
|
call testDateSerialError()
|
||||||
|
|
||||||
|
sub testDateAdd(d, interval, number, expected_date)
|
||||||
|
dim x
|
||||||
|
x = DateAdd(interval, number, d)
|
||||||
|
call ok(Year(x) = Year(expected_date), "year = " & Year(x) & " expected " & Year(expected_date))
|
||||||
|
call ok(Month(x) = Month(expected_date), "month = " & Month(x) & " expected " & Month(expected_date))
|
||||||
|
call ok(Day(x) = Day(expected_date), "day = " & Day(x) & " expected " & Day(expected_date))
|
||||||
|
call ok(getVT(x) = "VT_DATE*", "getVT = " & getVT(x))
|
||||||
|
end sub
|
||||||
|
|
||||||
|
sub testDateAddError()
|
||||||
|
on error resume next
|
||||||
|
dim x
|
||||||
|
call Err.clear()
|
||||||
|
x = DateAdd("k", 1, DateSerial(2000, 2, 1))
|
||||||
|
call ok(Err.number = 5, "Err.number = " & Err.number)
|
||||||
|
call ok(getVT(x) = "VT_EMPTY*", "getVT = " & getVT(x))
|
||||||
|
call Err.clear()
|
||||||
|
call DateAdd(null, 1, DateSerial(2000, 2, 1))
|
||||||
|
call ok(Err.number = 94, "Err.number = " & Err.number)
|
||||||
|
call Err.clear()
|
||||||
|
call DateAdd("q", null, DateSerial(2000, 2, 1))
|
||||||
|
call ok(Err.number = 94, "Err.number = " & Err.number)
|
||||||
|
call Err.clear()
|
||||||
|
x = DateAdd("q", 1, null)
|
||||||
|
call ok(getVT(x) = "VT_NULL*", "getVT = " & getVT(x))
|
||||||
|
call ok(Err.number = 0, "Err.number = " & Err.number)
|
||||||
|
end sub
|
||||||
|
|
||||||
|
call testDateAdd(DateSerial(2000, 1, 1), "yyyy", 1, DateSerial(2001, 1, 1))
|
||||||
|
call testDateAdd(DateSerial(2000, 1, 1), "yYyy", 1, DateSerial(2001, 1, 1))
|
||||||
|
call testDateAdd(DateSerial(2000, 1, 1), "q", 1, DateSerial(2000, 4, 1))
|
||||||
|
call testDateAdd(DateSerial(2000, 1, 1), "Q", 1, DateSerial(2000, 4, 1))
|
||||||
|
call testDateAdd(DateSerial(2000, 1, 1), "m", -1, DateSerial(1999, 12, 1))
|
||||||
|
call testDateAdd(DateSerial(2000, 1, 1), "M", -1, DateSerial(1999, 12, 1))
|
||||||
|
call testDateAdd(DateSerial(2000, 12, 31), "y", 1, DateSerial(2001, 1, 1))
|
||||||
|
call testDateAdd(DateSerial(2000, 12, 31), "Y", 1, DateSerial(2001, 1, 1))
|
||||||
|
call testDateAdd(DateSerial(2000, 12, 31), "d", 1, DateSerial(2001, 1, 1))
|
||||||
|
call testDateAdd(DateSerial(2000, 12, 31), "D", 1, DateSerial(2001, 1, 1))
|
||||||
|
call testDateAdd(DateSerial(2000, 12, 31), "w", 1, DateSerial(2001, 1, 1))
|
||||||
|
call testDateAdd(DateSerial(2000, 12, 31), "W", 1, DateSerial(2001, 1, 1))
|
||||||
|
call testDateAdd(DateSerial(2000, 1, 1), "y", -1, DateSerial(1999, 12, 31))
|
||||||
|
call testDateAdd(DateSerial(2000, 1, 1), "d", -1, DateSerial(1999, 12, 31))
|
||||||
|
call testDateAdd(DateSerial(2000, 1, 1), "w", -1, DateSerial(1999, 12, 31))
|
||||||
|
call testDateAdd(DateSerial(2000, 1, 1), "ww", 1, DateSerial(2000, 1, 8))
|
||||||
|
call testDateAdd(DateSerial(2000, 1, 1), "ww", -1, DateSerial(1999, 12, 25))
|
||||||
|
call testDateAdd(DateSerial(2000, 1, 1), "Ww", -1, DateSerial(1999, 12, 25))
|
||||||
|
call testDateAddError()
|
||||||
|
|
||||||
Call reportSuccess()
|
Call reportSuccess()
|
||||||
|
|
Loading…
Reference in New Issue