Nikolay Sivov : vbscript: Implement TimeSerial().

Alexandre Julliard julliard at winehq.org
Tue May 24 15:54:59 CDT 2022


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue May 24 08:52:07 2022 +0300

vbscript: Implement TimeSerial().

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      | 37 ++++++++++++++++++++++++++++++++++---
 dlls/vbscript/tests/api.vbs | 37 +++++++++++++++++++++++++++++++++++++
 2 files changed, 71 insertions(+), 3 deletions(-)

diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c
index 876a41a14b2..90cfd557038 100644
--- a/dlls/vbscript/global.c
+++ b/dlls/vbscript/global.c
@@ -2144,10 +2144,41 @@ static HRESULT Global_DateSerial(BuiltinDisp *This, VARIANT *args, unsigned args
     return hres;
 }
 
-static HRESULT Global_TimeSerial(BuiltinDisp *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
+static HRESULT Global_TimeSerial(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    int hour, minute, second;
+    UDATE ud = {{ 0 }};
+    HRESULT hres;
+    double date;
+
+    TRACE("\n");
+
+    assert(args_cnt == 3);
+
+    if (V_VT(args) == VT_NULL || V_VT(args + 1) == VT_NULL || V_VT(args + 2) == VT_NULL)
+        return MAKE_VBSERROR(VBSE_ILLEGAL_NULL_USE);
+
+    hres = to_int(args, &hour);
+    if (SUCCEEDED(hres))
+        hres = to_int(args + 1, &minute);
+    if (SUCCEEDED(hres))
+        hres = to_int(args + 2, &second);
+
+    if (SUCCEEDED(hres))
+    {
+        ud.st.wYear = 1899;
+        ud.st.wMonth = 12;
+        ud.st.wDay = 30;
+        ud.st.wHour = hour;
+        ud.st.wMinute = minute;
+        ud.st.wSecond = second;
+        hres = VarDateFromUdateEx(&ud, 0, 0, &date);
+    }
+
+    if (SUCCEEDED(hres))
+        hres = return_date(res, date);
+
+    return hres;
 }
 
 static HRESULT Global_InputBox(BuiltinDisp *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs
index 758013c93ef..be1d4a806c0 100644
--- a/dlls/vbscript/tests/api.vbs
+++ b/dlls/vbscript/tests/api.vbs
@@ -2165,4 +2165,41 @@ sub testMonthNameError()
 end sub
 call testMonthNameError()
 
+sub testTimeSerial(hh, mm, ss, hhexp, mmexp, ssexp, dateexp)
+    dim x
+    x = TimeSerial(hh, mm, ss)
+    call ok(Hour(x) = hhexp, "hour = " & Hour(x) & " expected " & hhexp)
+    call ok(Minute(x) = mmexp, "minute = " & Minute(x) & " expected " & mmexp)
+    call ok(Second(x) = ssexp, "second = " & Second(x) & " expected " & ssexp)
+    call ok(Year(x) = Year(dateexp), "year = " & Year(x))
+    call ok(Month(x) = Month(dateexp), "month = " & Month(x))
+    call ok(Day(x) = Day(dateexp), "day = " & Day(x))
+    call ok(getVT(x) = "VT_DATE*", "getVT = " & getVT(x))
+end sub
+
+sub testTimeSerialError()
+    on error resume next
+    dim x
+    call Err.clear()
+    x = TimeSerial(null, 1, 1)
+    call ok(Err.number = 94, "Err.number = " & Err.number)
+    call ok(getVT(x) = "VT_EMPTY*", "getVT = " & getVT(x))
+    call Err.clear()
+    call TimeSerial(10, null, 1)
+    call ok(Err.number = 94, "Err.number = " & Err.number)
+    call Err.clear()
+    call TimeSerial(10, 1, null)
+    call ok(Err.number = 94, "Err.number = " & Err.number)
+end sub
+
+call testTimeSerial(0, 0, 0, 0, 0, 0, DateSerial(1899, 12, 30))
+call testTimeSerial(10, 2, 1, 10, 2, 1, DateSerial(1899, 12, 30))
+call testTimeSerial(0, 2, 1, 0, 2, 1, DateSerial(1899, 12, 30))
+call testTimeSerial(24, 2, 1, 0, 2, 1, DateSerial(1899, 12, 31))
+call testTimeSerial(25, 2, 1, 1, 2, 1, DateSerial(1899, 12, 31))
+call testTimeSerial(50, 2, 1, 2, 2, 1, DateSerial(1900, 1, 1))
+call testTimeSerial(10, 60, 2, 11, 0, 2, DateSerial(1899, 12, 30))
+call testTimeSerial(10, 0, 60, 10, 1, 0, DateSerial(1899, 12, 30))
+call testTimeSerialError()
+
 Call reportSuccess()




More information about the wine-cvs mailing list