this repo has no description
1// Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
2#include "Python.h"
3#include "gtest/gtest.h"
4
5#include "capi-fixture.h"
6#include "capi-testing.h"
7#include "datetime.h"
8
9namespace py {
10namespace testing {
11
12using DateTimeExtensionApiTest = ExtensionApi;
13
14TEST_F(DateTimeExtensionApiTest, PyDateTimeAPIReturnsStructIfFound) {
15 ASSERT_EQ(PyDateTimeAPI, nullptr);
16 PyDateTime_IMPORT;
17 ASSERT_NE(PyDateTimeAPI, nullptr);
18}
19
20TEST_F(DateTimeExtensionApiTest, PyDateTimeCheckWithDateTimeObjectReturnsTrue) {
21 PyRun_SimpleString(R"(
22import datetime
23instance = datetime.datetime(1, 2, 3)
24)");
25 PyObjectPtr instance(mainModuleGet("instance"));
26 ASSERT_NE(instance, nullptr);
27 PyDateTime_IMPORT;
28 EXPECT_TRUE(PyDateTime_Check(instance));
29}
30
31TEST_F(DateTimeExtensionApiTest,
32 PyDateTimeCheckWithDateTimeSubclassReturnsTrue) {
33 PyRun_SimpleString(R"(
34import datetime
35class C(datetime.datetime):
36 pass
37instance = C(1, 2, 3)
38)");
39 PyObjectPtr instance(mainModuleGet("instance"));
40 ASSERT_NE(instance, nullptr);
41 PyDateTime_IMPORT;
42 EXPECT_TRUE(PyDateTime_Check(instance));
43}
44
45TEST_F(DateTimeExtensionApiTest, PyDateTimeCheckWithNonDateTimeReturnsFalse) {
46 PyObjectPtr instance(PyLong_FromLong(100));
47 ASSERT_NE(instance, nullptr);
48 PyDateTime_IMPORT;
49 EXPECT_FALSE(PyDateTime_Check(instance));
50}
51
52TEST_F(DateTimeExtensionApiTest,
53 PyDateTimeFromDateAndTimeReturnsDateTimeObject) {
54 PyDateTime_IMPORT;
55 PyObjectPtr result(PyDateTime_FromDateAndTime(1, 2, 3, 4, 5, 6, 10));
56 ASSERT_NE(result, nullptr);
57 EXPECT_TRUE(PyDateTime_Check(result));
58}
59
60TEST_F(DateTimeExtensionApiTest, PyDateCheckWithDateObjectReturnsTrue) {
61 PyRun_SimpleString(R"(
62import datetime
63instance = datetime.date(1, 2, 3)
64)");
65 PyObjectPtr instance(mainModuleGet("instance"));
66 ASSERT_NE(instance, nullptr);
67 PyDateTime_IMPORT;
68 EXPECT_TRUE(PyDate_Check(instance));
69}
70
71TEST_F(DateTimeExtensionApiTest, PyDateCheckWithDateSubclassReturnsTrue) {
72 PyRun_SimpleString(R"(
73import datetime
74class C(datetime.date):
75 pass
76instance = C(1, 2, 3)
77)");
78 PyObjectPtr instance(mainModuleGet("instance"));
79 ASSERT_NE(instance, nullptr);
80 PyDateTime_IMPORT;
81 EXPECT_TRUE(PyDate_Check(instance));
82}
83
84TEST_F(DateTimeExtensionApiTest, PyDateCheckWithNonDateReturnsFalse) {
85 PyObjectPtr instance(PyLong_FromLong(100));
86 ASSERT_NE(instance, nullptr);
87 PyDateTime_IMPORT;
88 EXPECT_FALSE(PyDate_Check(instance));
89}
90
91TEST_F(DateTimeExtensionApiTest, PyDateFromDateReturnsDateObject) {
92 PyDateTime_IMPORT;
93 PyObjectPtr result(PyDate_FromDate(1, 2, 3));
94 ASSERT_NE(result, nullptr);
95 EXPECT_TRUE(PyDate_Check(result));
96}
97
98TEST_F(DateTimeExtensionApiTest, PyDeltaCheckWithDeltaObjectReturnsTrue) {
99 PyRun_SimpleString(R"(
100import datetime
101instance = datetime.date(1, 2, 3) - datetime.date(1, 2, 3)
102)");
103 PyObjectPtr instance(mainModuleGet("instance"));
104 ASSERT_NE(instance, nullptr);
105 PyDateTime_IMPORT;
106 EXPECT_TRUE(PyDelta_Check(instance));
107}
108
109TEST_F(DateTimeExtensionApiTest, PyDeltaCheckWithDeltaSubclassReturnsTrue) {
110 PyRun_SimpleString(R"(
111import datetime
112class C(datetime.timedelta):
113 pass
114instance = C(1, 2, 3)
115)");
116 PyObjectPtr instance(mainModuleGet("instance"));
117 ASSERT_NE(instance, nullptr);
118 PyDateTime_IMPORT;
119 EXPECT_TRUE(PyDelta_Check(instance));
120}
121
122TEST_F(DateTimeExtensionApiTest, PyDeltaCheckWithNonDeltaReturnsFalse) {
123 PyObjectPtr instance(PyLong_FromLong(100));
124 ASSERT_NE(instance, nullptr);
125 PyDateTime_IMPORT;
126 EXPECT_FALSE(PyDelta_Check(instance));
127}
128
129TEST_F(DateTimeExtensionApiTest, PyDeltaFromDSUReturnsObject) {
130 PyDateTime_IMPORT;
131 PyObjectPtr result(PyDelta_FromDSU(1, 2, 500));
132 ASSERT_NE(result, nullptr);
133 EXPECT_TRUE(PyDelta_Check(result));
134}
135
136TEST_F(DateTimeExtensionApiTest, PyDateTimeGETsEveryUnitOfTime) {
137 PyRun_SimpleString(R"(
138import datetime
139instance = datetime.datetime(1990, 2, 3, 4, 5, 6, 10000)
140)");
141 PyObject* instance = mainModuleGet("instance");
142 ASSERT_NE(instance, nullptr);
143 PyDateTime_IMPORT;
144 EXPECT_EQ(PyDateTime_GET_YEAR(instance), 1990);
145 EXPECT_EQ(PyDateTime_GET_MONTH(instance), 2);
146 EXPECT_EQ(PyDateTime_GET_DAY(instance), 3);
147 EXPECT_EQ(PyDateTime_DATE_GET_HOUR(instance), 4);
148 EXPECT_EQ(PyDateTime_DATE_GET_MINUTE(instance), 5);
149 EXPECT_EQ(PyDateTime_DATE_GET_SECOND(instance), 6);
150 EXPECT_EQ(PyDateTime_DATE_GET_MICROSECOND(instance), 10000);
151 Py_DECREF(instance);
152}
153
154TEST_F(DateTimeExtensionApiTest, PyDateTimeTimeGETsEveryUnitOfTime) {
155 PyRun_SimpleString(R"(
156import datetime
157instance = datetime.time(1, 40, 50, 999)
158)");
159 PyObject* instance = mainModuleGet("instance");
160 ASSERT_NE(instance, nullptr);
161 PyDateTime_IMPORT;
162 EXPECT_EQ(PyDateTime_TIME_GET_HOUR(instance), 1);
163 EXPECT_EQ(PyDateTime_TIME_GET_MINUTE(instance), 40);
164 EXPECT_EQ(PyDateTime_TIME_GET_SECOND(instance), 50);
165 EXPECT_EQ(PyDateTime_TIME_GET_MICROSECOND(instance), 999);
166 Py_DECREF(instance);
167}
168
169TEST_F(DateTimeExtensionApiTest, PyDeltaGETsEveryUnitOfTime) {
170 PyRun_SimpleString(R"(
171import datetime
172instance = datetime.timedelta(1, 2, 3)
173)");
174 PyObject* instance = mainModuleGet("instance");
175 ASSERT_NE(instance, nullptr);
176 PyDateTime_IMPORT;
177 EXPECT_EQ(PyDateTime_DELTA_GET_DAYS(instance), 1);
178 EXPECT_EQ(PyDateTime_DELTA_GET_SECONDS(instance), 2);
179 EXPECT_EQ(PyDateTime_DELTA_GET_MICROSECONDS(instance), 3);
180 Py_DECREF(instance);
181}
182
183TEST_F(DateTimeExtensionApiTest, PyTimeCheckWithTimeObjectReturnsTrue) {
184 PyRun_SimpleString(R"(
185import datetime
186instance = datetime.time(1, 2, 3)
187)");
188 PyObjectPtr instance(mainModuleGet("instance"));
189 ASSERT_NE(instance, nullptr);
190 PyDateTime_IMPORT;
191 EXPECT_TRUE(PyTime_Check(instance));
192}
193
194} // namespace testing
195} // namespace py