Skip to content

Commit da37120

Browse files
committed
added datetime tests
1 parent 6470233 commit da37120

File tree

1 file changed

+352
-0
lines changed

1 file changed

+352
-0
lines changed
Lines changed: 352 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,352 @@
1+
# Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
2+
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3+
#
4+
# The Universal Permissive License (UPL), Version 1.0
5+
#
6+
# Subject to the condition set forth below, permission is hereby granted to any
7+
# person obtaining a copy of this software, associated documentation and/or
8+
# data (collectively the "Software"), free of charge and under any and all
9+
# copyright rights in the Software, and any and all patent rights owned or
10+
# freely licensable by each licensor hereunder covering either (i) the
11+
# unmodified Software as contributed to or provided by such licensor, or (ii)
12+
# the Larger Works (as defined below), to deal in both
13+
#
14+
# (a) the Software, and
15+
#
16+
# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
17+
# one is included with the Software each a "Larger Work" to which the Software
18+
# is contributed by such licensors),
19+
#
20+
# without restriction, including without limitation the rights to copy, create
21+
# derivative works of, display, perform, and distribute the Software and make,
22+
# use, sell, offer for sale, import, export, have made, and have sold the
23+
# Software and the Larger Work(s), and to sublicense the foregoing rights on
24+
# either these or other terms.
25+
#
26+
# This license is subject to the following condition:
27+
#
28+
# The above copyright notice and either this complete permission notice or at a
29+
# minimum a reference to the UPL must be included in all copies or substantial
30+
# portions of the Software.
31+
#
32+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
33+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
34+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
35+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
36+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
37+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
38+
# SOFTWARE.
39+
40+
import datetime
41+
42+
from . import CPyExtType
43+
44+
__dir__ = __file__.rpartition("/")[0]
45+
46+
47+
class TestDateTime(object):
48+
49+
def test_date_type(self):
50+
TestDate = CPyExtType("TestDate",
51+
"""
52+
PyTypeObject* getDateType() {
53+
PyDateTime_IMPORT;
54+
PyTypeObject* t = PyDateTimeAPI->DateType;
55+
Py_XINCREF(t);
56+
return t;
57+
}
58+
""",
59+
tp_methods='{"getDateType", (PyCFunction)getDateType, METH_NOARGS, ""}',
60+
includes='#include "datetime.h"',
61+
)
62+
tester = TestDate()
63+
assert tester.getDateType() == datetime.date
64+
65+
def test_datetime_type(self):
66+
TestDateTime = CPyExtType("TestDateTime",
67+
"""
68+
PyTypeObject* getDateTimeType() {
69+
PyDateTime_IMPORT;
70+
PyTypeObject* t = PyDateTimeAPI->DateTimeType;
71+
Py_XINCREF(t);
72+
return t;
73+
}
74+
""",
75+
tp_methods='{"getDateTimeType", (PyCFunction)getDateTimeType, METH_NOARGS, ""}',
76+
includes='#include "datetime.h"',
77+
)
78+
tester = TestDateTime()
79+
assert tester.getDateTimeType() == datetime.datetime
80+
81+
def test_time_type(self):
82+
TestTime = CPyExtType("TestTime",
83+
"""
84+
PyTypeObject* getTimeType() {
85+
PyDateTime_IMPORT;
86+
PyTypeObject* t = PyDateTimeAPI->TimeType;
87+
Py_XINCREF(t);
88+
return t;
89+
}
90+
""",
91+
tp_methods='{"getTimeType", (PyCFunction)getTimeType, METH_NOARGS, ""}',
92+
includes='#include "datetime.h"',
93+
)
94+
tester = TestTime()
95+
assert tester.getTimeType() == datetime.time
96+
97+
def test_timedelta_type(self):
98+
TestTimeDelta = CPyExtType("TestTimeDelta",
99+
"""
100+
PyTypeObject* getTimeDeltaType() {
101+
PyDateTime_IMPORT;
102+
PyTypeObject* t = PyDateTimeAPI->DeltaType;
103+
Py_XINCREF(t);
104+
return t;
105+
}
106+
""",
107+
tp_methods='{"getTimeDeltaType", (PyCFunction)getTimeDeltaType, METH_NOARGS, ""}',
108+
includes='#include "datetime.h"',
109+
)
110+
tester = TestTimeDelta()
111+
assert tester.getTimeDeltaType() == datetime.timedelta
112+
113+
def test_tzinfo_type(self):
114+
TestTZInfo = CPyExtType("TestTZInfo",
115+
"""
116+
PyTypeObject* getTZInfoType() {
117+
PyDateTime_IMPORT;
118+
PyTypeObject* t = PyDateTimeAPI->TZInfoType;
119+
Py_XINCREF(t);
120+
return t;
121+
}
122+
""",
123+
tp_methods='{"getTZInfoType", (PyCFunction)getTZInfoType, METH_NOARGS, ""}',
124+
includes='#include "datetime.h"',
125+
)
126+
tester = TestTZInfo()
127+
assert tester.getTZInfoType() == datetime.tzinfo
128+
129+
def test_timezone(self):
130+
TestTimezone = CPyExtType("TestTimezone",
131+
"""
132+
PyObject* getTimezone() {
133+
PyDateTime_IMPORT;
134+
PyObject* t = PyDateTimeAPI->TimeZone_UTC;
135+
Py_XINCREF(t);
136+
return t;
137+
}
138+
""",
139+
tp_methods='{"getTimezone", (PyCFunction)getTimezone, METH_NOARGS, ""}',
140+
includes='#include "datetime.h"',
141+
)
142+
tester = TestTimezone()
143+
assert tester.getTimezone() == datetime.timezone.utc
144+
145+
146+
def test_date_from_date(self):
147+
TestDateFromDate = CPyExtType("TestDateFromDate",
148+
"""
149+
PyObject* getDate() {
150+
PyDateTime_IMPORT;
151+
PyObject* o = PyDateTimeAPI->Date_FromDate(1, 1, 1, PyDateTimeAPI->DateType);
152+
Py_XINCREF(o);
153+
return o;
154+
}
155+
""",
156+
tp_methods='{"getDate", (PyCFunction)getDate, METH_NOARGS, ""}',
157+
includes='#include "datetime.h"',
158+
)
159+
tester = TestDateFromDate()
160+
assert tester.getDate() == datetime.date(1, 1, 1)
161+
162+
def test_datetime_from_date_and_time(self):
163+
TestDateTimeFromDateAndTime = CPyExtType("TestDateTimeFromDateAndTime",
164+
"""
165+
PyObject* getDateTime() {
166+
PyDateTime_IMPORT;
167+
PyObject* o = PyDateTimeAPI->DateTime_FromDateAndTime(1, 1, 1, 1, 1, 1, 1, Py_None, PyDateTimeAPI->DateTimeType);
168+
Py_XINCREF(o);
169+
return o;
170+
}
171+
""",
172+
tp_methods='{"getDateTime", (PyCFunction)getDateTime, METH_NOARGS, ""}',
173+
includes='#include "datetime.h"',
174+
)
175+
tester = TestDateTimeFromDateAndTime()
176+
assert tester.getDateTime() == datetime.datetime(1, 1, 1, 1, 1, 1, 1)
177+
178+
def test_time_from_time(self):
179+
TestTimeFromTime = CPyExtType("TestTimeFromTime",
180+
"""
181+
PyObject* getTime() {
182+
PyDateTime_IMPORT;
183+
PyObject* o = PyDateTimeAPI->Time_FromTime(1, 1, 1, 1, Py_None, PyDateTimeAPI->TimeType);
184+
Py_XINCREF(o);
185+
return o;
186+
}
187+
""",
188+
tp_methods='{"getTime", (PyCFunction)getTime, METH_NOARGS, ""}',
189+
includes='#include "datetime.h"',
190+
)
191+
tester = TestTimeFromTime()
192+
tester.getTime() == datetime.time(1, 1, 1, 1)
193+
194+
def test_delta_from_delta(self):
195+
TestDeltaFromDelta = CPyExtType("TestDeltaFromDelta",
196+
"""
197+
PyObject* getDelta() {
198+
PyDateTime_IMPORT;
199+
PyObject* o = PyDateTimeAPI->Delta_FromDelta(1, 1, 1, 1, PyDateTimeAPI->DeltaType);
200+
Py_XINCREF(o);
201+
return o;
202+
}
203+
""",
204+
tp_methods='{"getDelta", (PyCFunction)getDelta, METH_NOARGS, ""}',
205+
includes='#include "datetime.h"',
206+
)
207+
tester = TestDeltaFromDelta()
208+
209+
assert tester.getDelta() == datetime.timedelta(1, 1, 1)
210+
211+
def test_timezone_from_timezone(self):
212+
TestTimezoneFromTimezone = CPyExtType("TestTimezoneFromTimezone",
213+
"""
214+
PyObject* getTZ() {
215+
PyDateTime_IMPORT;
216+
PyObject* d = PyDateTimeAPI->Delta_FromDelta(0, 0, 1, 0, PyDateTimeAPI->DeltaType);
217+
Py_XINCREF(d);
218+
PyObject* o = PyDateTimeAPI->TimeZone_FromTimeZone(d, PyUnicode_FromString("CET"));
219+
Py_XINCREF(o);
220+
return o;
221+
}
222+
""",
223+
tp_methods='{"getTZ", (PyCFunction)getTZ, METH_NOARGS, ""}',
224+
includes='#include "datetime.h"',
225+
)
226+
tester = TestTimezoneFromTimezone()
227+
assert tester.getTZ() == datetime.timezone(datetime.timedelta(0,0,1,0), "CET")
228+
229+
def test_time_from_time_and_fold(self):
230+
TestTimeFromTimeAndFold = CPyExtType("TestTimeFromTimeAndFold",
231+
"""
232+
PyObject* getTime() {
233+
PyDateTime_IMPORT;
234+
PyObject* o = PyDateTimeAPI->Time_FromTimeAndFold(1, 1, 1, 1, Py_None, 1, PyDateTimeAPI->TimeType);
235+
Py_XINCREF(o);
236+
return o;
237+
}
238+
""",
239+
tp_methods='{"getTime", (PyCFunction)getTime, METH_NOARGS, ""}',
240+
includes='#include "datetime.h"',
241+
)
242+
tester = TestTimeFromTimeAndFold()
243+
assert tester.getTime() == datetime.time(1, 1, 1, 1, None, fold=True)
244+
245+
def test_datetime_from_date_and_time_and_fold(self):
246+
TestDateTimeFromDateAndTimeAndFold = CPyExtType("TestDateTimeFromDateAndTimeAndFold",
247+
"""
248+
PyObject* getDateTime() {
249+
PyDateTime_IMPORT;
250+
PyObject* o = PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(1, 1, 1, 1, 1, 1, 1, Py_None, 1, PyDateTimeAPI->DateTimeType);
251+
Py_XINCREF(o);
252+
return o;
253+
}
254+
""",
255+
tp_methods='{"getDateTime", (PyCFunction)getDateTime, METH_NOARGS, ""}',
256+
includes='#include "datetime.h"',
257+
)
258+
tester = TestDateTimeFromDateAndTimeAndFold()
259+
assert tester.getDateTime() == datetime.datetime(1, 1, 1, 1, 1, 1, 1, None, fold=True)
260+
261+
def test_date_from_timestamp(self):
262+
TestDateFromTimestamp = CPyExtType("TestDateFromTimestamp",
263+
"""
264+
PyObject* getDate(PyObject *self, PyObject *args) {
265+
PyDateTime_IMPORT;
266+
PyObject* o = PyDateTimeAPI->Date_FromTimestamp((PyObject *)PyDateTimeAPI->DateType, args);
267+
Py_XINCREF(o);
268+
return o;
269+
}
270+
""",
271+
tp_methods='{"getDate", (PyCFunction)getDate, METH_VARARGS, ""}',
272+
includes='#include "datetime.h"',
273+
)
274+
tester = TestDateFromTimestamp()
275+
ts = datetime.datetime(1995, 4, 12).timestamp()
276+
assert tester.getDate(int(ts)) == datetime.date.fromtimestamp(int(ts))
277+
278+
def test_datetime_from_timestamp(self):
279+
TestDatetimeFromTimestamp = CPyExtType("TestDatetimeFromTimestamp",
280+
"""
281+
PyObject* getDatetime(PyObject *self, PyObject *args, PyObject *kwds) {
282+
PyDateTime_IMPORT;
283+
PyObject* o = PyDateTimeAPI->DateTime_FromTimestamp((PyObject *)PyDateTimeAPI->DateTimeType, args, kwds);
284+
Py_XINCREF(o);
285+
return o;
286+
}
287+
""",
288+
tp_methods='{"getDatetime", (PyCFunction)getDatetime, METH_VARARGS | METH_KEYWORDS, ""}',
289+
includes='#include "datetime.h"',
290+
)
291+
tester = TestDatetimeFromTimestamp()
292+
ts = datetime.datetime(1995, 4, 12).timestamp()
293+
assert tester.getDatetime(int(ts)) == datetime.datetime.fromtimestamp(int(ts))
294+
295+
def test_datetime_from_timestamp_and_tz(self):
296+
TestDatetimeFromTimestamp = CPyExtType("TestDatetimeFromTimestamp",
297+
"""
298+
PyObject* getDatetime(PyObject *self, PyObject *args, PyObject *kwds) {
299+
PyDateTime_IMPORT;
300+
PyObject* o = PyDateTimeAPI->DateTime_FromTimestamp((PyObject *)PyDateTimeAPI->DateTimeType, args, kwds);
301+
Py_XINCREF(o);
302+
return o;
303+
}
304+
""",
305+
tp_methods='{"getDatetime", (PyCFunction)getDatetime, METH_VARARGS | METH_KEYWORDS, ""}',
306+
includes='#include "datetime.h"',
307+
)
308+
tester = TestDatetimeFromTimestamp()
309+
ts = datetime.datetime(1995, 4, 12).timestamp()
310+
tz = datetime.timezone(datetime.timedelta(hours=3))
311+
assert tester.getDatetime(int(ts), tz) == datetime.datetime.fromtimestamp(int(ts), tz)
312+
313+
def test_datetime_from_timestamp_and_tz_kwd(self):
314+
TestDatetimeFromTimestamp = CPyExtType("TestDatetimeFromTimestamp",
315+
"""
316+
PyObject* getDatetime(PyObject *self, PyObject *args, PyObject *kwds) {
317+
PyDateTime_IMPORT;
318+
PyObject* o = PyDateTimeAPI->DateTime_FromTimestamp((PyObject *)PyDateTimeAPI->DateTimeType, args, kwds);
319+
Py_XINCREF(o);
320+
return o;
321+
}
322+
""",
323+
tp_methods='{"getDatetime", (PyCFunction)getDatetime, METH_VARARGS | METH_KEYWORDS, ""}',
324+
includes='#include "datetime.h"',
325+
)
326+
tester = TestDatetimeFromTimestamp()
327+
ts = datetime.datetime(1995, 4, 12).timestamp()
328+
tz = datetime.timezone(datetime.timedelta(hours=3))
329+
assert tester.getDatetime(int(ts), tz=tz) == datetime.datetime.fromtimestamp(int(ts), tz=tz)
330+
331+
def test_write_and_invoke_member(self):
332+
TestWriteAndInvokeMemeber = CPyExtType("TestWriteAndInvokeMemeber",
333+
"""
334+
PyObject* anotherDTFromDT(int y, int m, int d, PyTypeObject* t) {
335+
return PyUnicode_FromString("foo");
336+
}
337+
338+
PyObject* getDate() {
339+
PyDateTime_IMPORT;
340+
PyObject *(*temp)(int, int, int, PyTypeObject*) = PyDateTimeAPI->Date_FromDate;
341+
PyDateTimeAPI->Date_FromDate = anotherDTFromDT;
342+
PyObject* r = PyDateTimeAPI->Date_FromDate(42, 1, 1, PyDateTimeAPI->DateType);
343+
PyDateTimeAPI->Date_FromDate = temp;
344+
Py_XINCREF(r);
345+
return r;
346+
}
347+
""",
348+
tp_methods='{"getDate", (PyCFunction)getDate, METH_NOARGS, ""}',
349+
includes='#include "datetime.h"',
350+
)
351+
tester = TestWriteAndInvokeMemeber()
352+
assert tester.getDate() == "foo"

0 commit comments

Comments
 (0)