Nikolay Sivov : vbscript: Implement DateSerial().

Alexandre Julliard julliard at winehq.org
Mon May 16 15:37:58 CDT 2022


Module: wine
Branch: master
Commit: bae687ec6bbcd5bee5ac753cb4a3fb7f15406233
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=bae687ec6bbcd5bee5ac753cb4a3fb7f15406233

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun May 15 16:56:51 2022 +0300

vbscript: Implement DateSerial().

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/vbscript/global.c      | 31 ++++++++++++++++++++++++++++---
 dlls/vbscript/tests/api.vbs | 30 ++++++++++++++++++++++++++++++
 2 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c
index ab06db87624..18da8e4991f 100644
--- a/dlls/vbscript/global.c
+++ b/dlls/vbscript/global.c
@@ -2044,10 +2044,35 @@ static HRESULT Global_TimeValue(BuiltinDisp *This, VARIANT *arg, unsigned args_c
     return E_NOTIMPL;
 }
 
-static HRESULT Global_DateSerial(BuiltinDisp *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
+static HRESULT Global_DateSerial(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    int year, month, day;
+    UDATE ud = {{ 0 }};
+    HRESULT hres;
+    double date;
+
+    TRACE("\n");
+
+    assert(args_cnt == 3);
+
+    hres = to_int(args, &year);
+    if (SUCCEEDED(hres))
+        hres = to_int(args + 1, &month);
+    if (SUCCEEDED(hres))
+        hres = to_int(args + 2, &day);
+
+    if (SUCCEEDED(hres))
+    {
+        ud.st.wYear = year;
+        ud.st.wMonth = month;
+        ud.st.wDay = day;
+        hres = VarDateFromUdateEx(&ud, 0, 0, &date);
+    }
+
+    if (SUCCEEDED(hres))
+        hres = return_date(res, date);
+
+    return hres;
 }
 
 static HRESULT Global_TimeSerial(BuiltinDisp *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs
index 20798a0aacd..3bc64d74193 100644
--- a/dlls/vbscript/tests/api.vbs
+++ b/dlls/vbscript/tests/api.vbs
@@ -1958,4 +1958,34 @@ sub testErrRaise()
 end sub
 call testErrRaise()
 
+sub testDateSerial(yy, mm, dd, yyexp, mmexp, ddexp)
+    dim x
+    x = DateSerial(yy, mm, dd)
+    call ok(Year(x) = yyexp, "year = " & Year(x) & " expected " & yyexp)
+    call ok(Month(x) = mmexp, "month = " & Month(x) & " expected " & mmexp)
+    call ok(Day(x) = ddexp, "day = " & Day(x) & " expected " & ddexp)
+    call ok(Hour(x) = 0, "hour = " & Hour(x))
+    call ok(Minute(x) = 0, "minute = " & Minute(x))
+    call ok(Second(x) = 0, "second = " & Second(x))
+    call ok(getVT(x) = "VT_DATE*", "getVT = " & getVT(x))
+end sub
+
+sub testDateSerialError()
+    on error resume next
+    call Err.clear()
+    call DateSerial(10000, 1, 1)
+    call ok(Err.number = 5, "Err.number = " & Err.number)
+    call Err.clear()
+    call DateSerial(-10000, 1, 1)
+    call ok(Err.number = 5, "Err.number = " & Err.number)
+end sub
+
+call testDateSerial(100, 2, 1, 100, 2, 1)
+call testDateSerial(0, 2, 1, 2000, 2, 1)
+call testDateSerial(50, 2, 1, 1950, 2, 1)
+call testDateSerial(99, 2, 1, 1999, 2, 1)
+call testDateSerial(2000, 14, 2, 2001, 2, 2)
+call testDateSerial(9999, 12, 1, 9999, 12, 1)
+call testDateSerialError()
+
 Call reportSuccess()




More information about the wine-cvs mailing list