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
8namespace py {
9namespace testing {
10
11using CodeExtensionApiTest = ExtensionApi;
12
13TEST_F(CodeExtensionApiTest, ConstantKeyWithNoneReturnsNoneSelf) {
14 PyObjectPtr none(borrow(Py_None));
15 PyObjectPtr result(_PyCode_ConstantKey(none));
16 EXPECT_EQ(result, none);
17}
18
19TEST_F(CodeExtensionApiTest, ConstantKeyWithEllipsisReturnsSelf) {
20 PyObjectPtr result(_PyCode_ConstantKey(Py_Ellipsis));
21 EXPECT_EQ(result, Py_Ellipsis);
22}
23
24TEST_F(CodeExtensionApiTest, ConstantKeyWithIntReturnsSelf) {
25 PyObjectPtr obj(PyLong_FromLong(5));
26 PyObjectPtr result(_PyCode_ConstantKey(obj));
27 EXPECT_EQ(result, obj);
28}
29
30TEST_F(CodeExtensionApiTest, ConstantKeyWithTrueReturnsTwoTuple) {
31 PyObjectPtr result(_PyCode_ConstantKey(Py_True));
32 ASSERT_NE(result, nullptr);
33 ASSERT_TRUE(PyTuple_Check(result));
34 ASSERT_EQ(PyTuple_Size(result), 2);
35 EXPECT_EQ(PyTuple_GetItem(result, 0),
36 reinterpret_cast<PyObject*>(&PyBool_Type));
37 EXPECT_EQ(PyTuple_GetItem(result, 1), Py_True);
38}
39
40TEST_F(CodeExtensionApiTest, ConstantKeyWithFalseReturnsTwoTuple) {
41 PyObjectPtr result(_PyCode_ConstantKey(Py_False));
42 ASSERT_NE(result, nullptr);
43 ASSERT_TRUE(PyTuple_Check(result));
44 ASSERT_EQ(PyTuple_Size(result), 2);
45 EXPECT_EQ(PyTuple_GetItem(result, 0),
46 reinterpret_cast<PyObject*>(Py_TYPE(Py_False)));
47 EXPECT_EQ(PyTuple_GetItem(result, 1), Py_False);
48}
49
50TEST_F(CodeExtensionApiTest, ConstantKeyWithBytesReturnsTwoTuple) {
51 PyObjectPtr obj(PyBytes_FromString("hello"));
52 PyObjectPtr result(_PyCode_ConstantKey(obj));
53 ASSERT_NE(result, nullptr);
54 ASSERT_TRUE(PyTuple_Check(result));
55 ASSERT_EQ(PyTuple_Size(result), 2);
56 EXPECT_EQ(PyTuple_GetItem(result, 0),
57 reinterpret_cast<PyObject*>(Py_TYPE(obj)));
58 EXPECT_EQ(PyTuple_GetItem(result, 1), obj);
59}
60
61TEST_F(CodeExtensionApiTest, ConstantKeyWithStrReturnsSelf) {
62 PyObjectPtr obj(PyUnicode_FromString("hello"));
63 PyObjectPtr result(_PyCode_ConstantKey(obj));
64 EXPECT_EQ(result, obj);
65}
66
67TEST_F(CodeExtensionApiTest, ConstantKeyWithCodeReturnsSelf) {
68 PyObjectPtr empty_tuple(PyTuple_New(0));
69 PyObjectPtr empty_bytes(PyBytes_FromString(""));
70 PyObjectPtr empty_str(PyUnicode_FromString(""));
71 PyObjectPtr obj(reinterpret_cast<PyObject*>(PyCode_New(
72 0, 0, 0, 0, 0, empty_bytes, empty_tuple, empty_tuple, empty_tuple,
73 empty_tuple, empty_tuple, empty_str, empty_str, 0, empty_bytes)));
74 PyObjectPtr result(_PyCode_ConstantKey(obj));
75 EXPECT_EQ(result, obj);
76}
77
78TEST_F(CodeExtensionApiTest, ConstantKeyWithFloatReturnsTwoTuple) {
79 PyObjectPtr obj(PyFloat_FromDouble(1.0));
80 PyObjectPtr result(_PyCode_ConstantKey(obj));
81 ASSERT_NE(result, nullptr);
82 ASSERT_TRUE(PyTuple_Check(result));
83 ASSERT_EQ(PyTuple_Size(result), 2);
84 EXPECT_EQ(PyTuple_GetItem(result, 0),
85 reinterpret_cast<PyObject*>(Py_TYPE(obj)));
86 EXPECT_EQ(PyTuple_GetItem(result, 1), obj);
87}
88
89TEST_F(CodeExtensionApiTest,
90 ConstantKeyWithFloatNegativeZeroReturnsThreeTuple) {
91 PyObjectPtr obj(PyFloat_FromDouble(-0.0));
92 PyObjectPtr result(_PyCode_ConstantKey(obj));
93 ASSERT_NE(result, nullptr);
94 ASSERT_TRUE(PyTuple_Check(result));
95 ASSERT_EQ(PyTuple_Size(result), 3);
96 EXPECT_EQ(PyTuple_GetItem(result, 0),
97 reinterpret_cast<PyObject*>(Py_TYPE(obj)));
98 EXPECT_EQ(PyTuple_GetItem(result, 1), obj);
99 EXPECT_EQ(PyTuple_GetItem(result, 2), Py_None);
100}
101
102TEST_F(CodeExtensionApiTest,
103 ConstantKeyWithComplexBothNegativeZeroReturnsThreeTuple) {
104 PyObjectPtr obj(PyComplex_FromDoubles(-0.0, -0.0));
105 PyObjectPtr result(_PyCode_ConstantKey(obj));
106 ASSERT_NE(result, nullptr);
107 ASSERT_TRUE(PyTuple_Check(result));
108 ASSERT_EQ(PyTuple_Size(result), 3);
109 EXPECT_EQ(PyTuple_GetItem(result, 0),
110 reinterpret_cast<PyObject*>(Py_TYPE(obj)));
111 EXPECT_EQ(PyTuple_GetItem(result, 1), obj);
112 EXPECT_EQ(PyTuple_GetItem(result, 2), Py_True);
113}
114
115TEST_F(CodeExtensionApiTest,
116 ConstantKeyWithComplexImagNegativeZeroReturnsThreeTuple) {
117 PyObjectPtr obj(PyComplex_FromDoubles(1.0, -0.0));
118 PyObjectPtr result(_PyCode_ConstantKey(obj));
119 ASSERT_NE(result, nullptr);
120 ASSERT_TRUE(PyTuple_Check(result));
121 ASSERT_EQ(PyTuple_Size(result), 3);
122 EXPECT_EQ(PyTuple_GetItem(result, 0),
123 reinterpret_cast<PyObject*>(Py_TYPE(obj)));
124 EXPECT_EQ(PyTuple_GetItem(result, 1), obj);
125 EXPECT_EQ(PyTuple_GetItem(result, 2), Py_False);
126}
127
128TEST_F(CodeExtensionApiTest,
129 ConstantKeyWithComplexRealNegativeZeroReturnsThreeTuple) {
130 PyObjectPtr obj(PyComplex_FromDoubles(-0.0, 1.0));
131 PyObjectPtr result(_PyCode_ConstantKey(obj));
132 ASSERT_NE(result, nullptr);
133 ASSERT_TRUE(PyTuple_Check(result));
134 ASSERT_EQ(PyTuple_Size(result), 3);
135 EXPECT_EQ(PyTuple_GetItem(result, 0),
136 reinterpret_cast<PyObject*>(Py_TYPE(obj)));
137 EXPECT_EQ(PyTuple_GetItem(result, 1), obj);
138 EXPECT_EQ(PyTuple_GetItem(result, 2), Py_None);
139}
140
141TEST_F(CodeExtensionApiTest,
142 ConstantKeyWithComplexNeitherNegativeZeroReturnsTwoTuple) {
143 PyObjectPtr obj(PyComplex_FromDoubles(1.0, 1.0));
144 PyObjectPtr result(_PyCode_ConstantKey(obj));
145 ASSERT_NE(result, nullptr);
146 ASSERT_TRUE(PyTuple_Check(result));
147 ASSERT_EQ(PyTuple_Size(result), 2);
148 EXPECT_EQ(PyTuple_GetItem(result, 0),
149 reinterpret_cast<PyObject*>(Py_TYPE(obj)));
150 EXPECT_EQ(PyTuple_GetItem(result, 1), obj);
151}
152
153TEST_F(CodeExtensionApiTest, ConstantKeyWithTupleReturnsTwoTuple) {
154 PyObjectPtr val0(PyLong_FromLong(0));
155 Py_INCREF(val0);
156 PyObjectPtr val1(PyLong_FromLong(1));
157 Py_INCREF(val1);
158 PyObjectPtr val2(PyLong_FromLong(2));
159 Py_INCREF(val2);
160 PyObjectPtr obj(PyTuple_New(3));
161 PyTuple_SetItem(obj, 0, val0);
162 PyTuple_SetItem(obj, 1, val1);
163 PyTuple_SetItem(obj, 2, val2);
164 PyObjectPtr result(_PyCode_ConstantKey(obj));
165 ASSERT_NE(result, nullptr);
166 ASSERT_TRUE(PyTuple_Check(result));
167 ASSERT_EQ(PyTuple_Size(result), 2);
168 EXPECT_EQ(PyTuple_GetItem(result, 1), obj);
169 PyObjectPtr new_tuple(borrow(PyTuple_GetItem(result, 0)));
170 EXPECT_EQ(PyTuple_Size(new_tuple), PyTuple_Size(obj));
171 EXPECT_EQ(PyTuple_GetItem(new_tuple, 0), val0);
172 EXPECT_EQ(PyTuple_GetItem(new_tuple, 1), val1);
173 EXPECT_EQ(PyTuple_GetItem(new_tuple, 2), val2);
174}
175
176TEST_F(CodeExtensionApiTest, ConstantKeyWithEmptyTupleReturnsTwoTuple) {
177 PyObjectPtr obj(PyTuple_New(0));
178 PyObjectPtr result(_PyCode_ConstantKey(obj));
179 ASSERT_NE(result, nullptr);
180 ASSERT_TRUE(PyTuple_Check(result));
181 ASSERT_EQ(PyTuple_Size(result), 2);
182 EXPECT_EQ(PyTuple_GetItem(result, 1), obj);
183 PyObjectPtr new_tuple(borrow(PyTuple_GetItem(result, 0)));
184 EXPECT_EQ(PyTuple_Size(new_tuple), 0);
185}
186
187TEST_F(CodeExtensionApiTest, ConstantKeyWithFrozenSetReturnsTwoTuple) {
188 PyObjectPtr zero(PyLong_FromLong(0));
189 PyObjectPtr one(PyLong_FromLong(1));
190 PyObjectPtr two(PyLong_FromLong(2));
191 PyObjectPtr iterable(PyTuple_Pack(3, zero.get(), one.get(), two.get()));
192 PyObjectPtr obj(PyFrozenSet_New(iterable));
193 PyObjectPtr result(_PyCode_ConstantKey(obj));
194 ASSERT_NE(result, nullptr);
195 ASSERT_TRUE(PyTuple_Check(result));
196 ASSERT_EQ(PyTuple_Size(result), 2);
197 EXPECT_EQ(PyTuple_GetItem(result, 1), obj);
198 PyObjectPtr new_frozenset(borrow(PyTuple_GetItem(result, 0)));
199 ASSERT_TRUE(PyFrozenSet_Check(new_frozenset));
200 EXPECT_EQ(PySet_Size(new_frozenset), PySet_Size(obj));
201}
202
203TEST_F(CodeExtensionApiTest, ConstantKeyWithOtherObjectReturnsTwoTupleWithId) {
204 PyObjectPtr obj(PyList_New(0));
205 PyObjectPtr result(_PyCode_ConstantKey(obj));
206 ASSERT_NE(result, nullptr);
207 ASSERT_TRUE(PyTuple_Check(result));
208 ASSERT_EQ(PyTuple_Size(result), 2);
209 PyObjectPtr obj_id(borrow(PyTuple_GetItem(result, 0)));
210 ASSERT_TRUE(PyLong_Check(obj_id));
211 EXPECT_EQ(PyLong_AsVoidPtr(obj_id), obj.get());
212 EXPECT_EQ(PyTuple_GetItem(result, 1), obj);
213}
214
215TEST_F(CodeExtensionApiTest, GetNumFreeReturnsNumberOfFreevars) {
216 PyObjectPtr freevars(PyTuple_New(3));
217 PyTuple_SetItem(freevars, 0, PyUnicode_FromString("foo"));
218 PyTuple_SetItem(freevars, 1, PyUnicode_FromString("bar"));
219 PyTuple_SetItem(freevars, 2, PyUnicode_FromString("baz"));
220 PyObjectPtr empty_tuple(PyTuple_New(0));
221 PyObjectPtr empty_bytes(PyBytes_FromString(""));
222 PyObjectPtr empty_str(PyUnicode_FromString(""));
223 PyCodeObject* code = PyCode_New(
224 0, 0, 0, 0, 0, empty_bytes, empty_tuple, empty_tuple, empty_tuple,
225 freevars, empty_tuple, empty_str, empty_str, 0, empty_bytes);
226 EXPECT_EQ(PyErr_Occurred(), nullptr);
227 ASSERT_NE(code, nullptr);
228 EXPECT_EQ(PyCode_GetNumFree(code), 3);
229 Py_DECREF(code);
230}
231
232TEST_F(CodeExtensionApiTest, NewEmptyReturnsCodeObject) {
233 PyCodeObject* code = PyCode_NewEmpty("my filename", "my funcname", 123);
234 EXPECT_EQ(PyErr_Occurred(), nullptr);
235 ASSERT_NE(code, nullptr);
236 EXPECT_TRUE(PyCode_Check(code));
237 EXPECT_EQ(PyCode_GetNumFree(code), 0);
238 Py_DECREF(code);
239}
240
241TEST_F(CodeExtensionApiTest, NewWithValidArgsReturnsCodeObject) {
242 int argcount = 3;
243 int kwargcount = 0;
244 int nlocals = 3;
245 PyObjectPtr varnames(PyTuple_New(argcount + kwargcount));
246 PyTuple_SetItem(varnames, 0, PyUnicode_FromString("foo"));
247 PyTuple_SetItem(varnames, 1, PyUnicode_FromString("bar"));
248 PyTuple_SetItem(varnames, 2, PyUnicode_FromString("baz"));
249 PyObjectPtr cellvars(PyTuple_New(2));
250 PyTuple_SetItem(cellvars, 0, PyUnicode_FromString("foobar"));
251 PyTuple_SetItem(cellvars, 1, PyUnicode_FromString("foobaz"));
252 PyObjectPtr empty_tuple(PyTuple_New(0));
253 PyObjectPtr empty_bytes(PyBytes_FromString(""));
254 PyObjectPtr empty_str(PyUnicode_FromString(""));
255 PyObjectPtr result(reinterpret_cast<PyObject*>(
256 PyCode_New(argcount, kwargcount, nlocals, 0, 0, empty_bytes, empty_tuple,
257 empty_tuple, varnames, empty_tuple, cellvars, empty_str,
258 empty_str, 0, empty_bytes)));
259 EXPECT_EQ(PyErr_Occurred(), nullptr);
260 ASSERT_NE(result, nullptr);
261 EXPECT_TRUE(PyCode_Check(result));
262}
263
264TEST_F(CodeExtensionApiTest, NewWithNegativeArgcountRaisesSystemError) {
265 PyObjectPtr tuple(PyTuple_New(0));
266 PyObjectPtr str(PyUnicode_FromString("foobar"));
267 PyObjectPtr bytes(PyBytes_FromString("foobar"));
268 EXPECT_EQ(PyCode_New(-1, 0, 0, 0, 0, bytes, tuple, tuple, tuple, tuple, tuple,
269 str, str, 0, bytes),
270 nullptr);
271 ASSERT_NE(PyErr_Occurred(), nullptr);
272 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
273}
274
275TEST_F(CodeExtensionApiTest, NewWithNegativeKwonlyargcountRaisesSystemError) {
276 PyObjectPtr tuple(PyTuple_New(0));
277 PyObjectPtr str(PyUnicode_FromString("foobar"));
278 PyObjectPtr bytes(PyBytes_FromString("foobar"));
279 EXPECT_EQ(PyCode_New(0, -1, 0, 0, 0, bytes, tuple, tuple, tuple, tuple, tuple,
280 str, str, 0, bytes),
281 nullptr);
282 ASSERT_NE(PyErr_Occurred(), nullptr);
283 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
284}
285
286TEST_F(CodeExtensionApiTest, NewWithNegativeNlocalsRaisesSystemError) {
287 PyObjectPtr tuple(PyTuple_New(0));
288 PyObjectPtr str(PyUnicode_FromString("foobar"));
289 PyObjectPtr bytes(PyBytes_FromString("foobar"));
290 EXPECT_EQ(PyCode_New(0, 0, -1, 0, 0, bytes, tuple, tuple, tuple, tuple, tuple,
291 str, str, 0, bytes),
292 nullptr);
293 ASSERT_NE(PyErr_Occurred(), nullptr);
294 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
295}
296
297TEST_F(CodeExtensionApiTest, NewWithNullCodeRaisesSystemError) {
298 PyObjectPtr tuple(PyTuple_New(0));
299 PyObjectPtr str(PyUnicode_FromString("foobar"));
300 PyObjectPtr bytes(PyBytes_FromString("foobar"));
301 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, nullptr, tuple, tuple, tuple, tuple,
302 tuple, str, str, 0, bytes),
303 nullptr);
304 ASSERT_NE(PyErr_Occurred(), nullptr);
305 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
306}
307
308TEST_F(CodeExtensionApiTest, NewWithNonBufferCodeRaisesSystemError) {
309 PyObjectPtr tuple(PyTuple_New(0));
310 PyObjectPtr str(PyUnicode_FromString("foobar"));
311 PyObjectPtr bytes(PyBytes_FromString("foobar"));
312 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, Py_None, tuple, tuple, tuple, tuple,
313 tuple, str, str, 0, bytes),
314 nullptr);
315 ASSERT_NE(PyErr_Occurred(), nullptr);
316 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
317}
318
319TEST_F(CodeExtensionApiTest, NewWithNullConstsRaisesSystemError) {
320 PyObjectPtr tuple(PyTuple_New(0));
321 PyObjectPtr str(PyUnicode_FromString("foobar"));
322 PyObjectPtr bytes(PyBytes_FromString("foobar"));
323 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, nullptr, tuple, tuple, tuple,
324 tuple, str, str, 0, bytes),
325 nullptr);
326 ASSERT_NE(PyErr_Occurred(), nullptr);
327 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
328}
329
330TEST_F(CodeExtensionApiTest, NewWithNonTupleConstsRaisesSystemError) {
331 PyObjectPtr tuple(PyTuple_New(0));
332 PyObjectPtr str(PyUnicode_FromString("foobar"));
333 PyObjectPtr bytes(PyBytes_FromString("foobar"));
334 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, Py_None, tuple, tuple, tuple,
335 tuple, str, str, 0, bytes),
336 nullptr);
337 ASSERT_NE(PyErr_Occurred(), nullptr);
338 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
339}
340
341TEST_F(CodeExtensionApiTest, NewWithNullNamesRaisesSystemError) {
342 PyObjectPtr tuple(PyTuple_New(0));
343 PyObjectPtr str(PyUnicode_FromString("foobar"));
344 PyObjectPtr bytes(PyBytes_FromString("foobar"));
345 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, tuple, nullptr, tuple, tuple,
346 tuple, str, str, 0, bytes),
347 nullptr);
348 ASSERT_NE(PyErr_Occurred(), nullptr);
349 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
350}
351
352TEST_F(CodeExtensionApiTest, NewWithNonTupleNamesRaisesSystemError) {
353 PyObjectPtr tuple(PyTuple_New(0));
354 PyObjectPtr str(PyUnicode_FromString("foobar"));
355 PyObjectPtr bytes(PyBytes_FromString("foobar"));
356 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, tuple, Py_None, tuple, tuple,
357 tuple, str, str, 0, bytes),
358 nullptr);
359 ASSERT_NE(PyErr_Occurred(), nullptr);
360 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
361}
362
363TEST_F(CodeExtensionApiTest, NewWithNullVarnamesRaisesSystemError) {
364 PyObjectPtr tuple(PyTuple_New(0));
365 PyObjectPtr str(PyUnicode_FromString("foobar"));
366 PyObjectPtr bytes(PyBytes_FromString("foobar"));
367 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, tuple, tuple, nullptr, tuple,
368 tuple, str, str, 0, bytes),
369 nullptr);
370 ASSERT_NE(PyErr_Occurred(), nullptr);
371 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
372}
373
374TEST_F(CodeExtensionApiTest, NewWithNonTupleVarnamesRaisesSystemError) {
375 PyObjectPtr tuple(PyTuple_New(0));
376 PyObjectPtr str(PyUnicode_FromString("foobar"));
377 PyObjectPtr bytes(PyBytes_FromString("foobar"));
378 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, tuple, tuple, Py_None, tuple,
379 tuple, str, str, 0, bytes),
380 nullptr);
381 ASSERT_NE(PyErr_Occurred(), nullptr);
382 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
383}
384
385TEST_F(CodeExtensionApiTest, NewWithNullFreevarsRaisesSystemError) {
386 PyObjectPtr tuple(PyTuple_New(0));
387 PyObjectPtr str(PyUnicode_FromString("foobar"));
388 PyObjectPtr bytes(PyBytes_FromString("foobar"));
389 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, tuple, tuple, tuple, nullptr,
390 tuple, str, str, 0, bytes),
391 nullptr);
392 ASSERT_NE(PyErr_Occurred(), nullptr);
393 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
394}
395
396TEST_F(CodeExtensionApiTest, NewWithNonTupleFreevarsRaisesSystemError) {
397 PyObjectPtr tuple(PyTuple_New(0));
398 PyObjectPtr str(PyUnicode_FromString("foobar"));
399 PyObjectPtr bytes(PyBytes_FromString("foobar"));
400 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, tuple, tuple, tuple, Py_None,
401 tuple, str, str, 0, bytes),
402 nullptr);
403 ASSERT_NE(PyErr_Occurred(), nullptr);
404 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
405}
406
407TEST_F(CodeExtensionApiTest, NewWithNullCellvarsRaisesSystemError) {
408 PyObjectPtr tuple(PyTuple_New(0));
409 PyObjectPtr str(PyUnicode_FromString("foobar"));
410 PyObjectPtr bytes(PyBytes_FromString("foobar"));
411 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, tuple, tuple, tuple, tuple,
412 nullptr, str, str, 0, bytes),
413 nullptr);
414 ASSERT_NE(PyErr_Occurred(), nullptr);
415 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
416}
417
418TEST_F(CodeExtensionApiTest, NewWithNonTupleCellvarsRaisesSystemError) {
419 PyObjectPtr tuple(PyTuple_New(0));
420 PyObjectPtr str(PyUnicode_FromString("foobar"));
421 PyObjectPtr bytes(PyBytes_FromString("foobar"));
422 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, tuple, tuple, tuple, tuple,
423 Py_None, str, str, 0, bytes),
424 nullptr);
425 ASSERT_NE(PyErr_Occurred(), nullptr);
426 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
427}
428
429TEST_F(CodeExtensionApiTest, NewWithNullFilenameRaisesSystemError) {
430 PyObjectPtr tuple(PyTuple_New(0));
431 PyObjectPtr str(PyUnicode_FromString("foobar"));
432 PyObjectPtr bytes(PyBytes_FromString("foobar"));
433 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, tuple, tuple, tuple, tuple, tuple,
434 nullptr, str, 0, bytes),
435 nullptr);
436 ASSERT_NE(PyErr_Occurred(), nullptr);
437 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
438}
439
440TEST_F(CodeExtensionApiTest, NewWithNonStrFilenameRaisesSystemError) {
441 PyObjectPtr tuple(PyTuple_New(0));
442 PyObjectPtr str(PyUnicode_FromString("foobar"));
443 PyObjectPtr bytes(PyBytes_FromString("foobar"));
444 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, tuple, tuple, tuple, tuple, tuple,
445 Py_None, str, 0, bytes),
446 nullptr);
447 ASSERT_NE(PyErr_Occurred(), nullptr);
448 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
449}
450
451TEST_F(CodeExtensionApiTest, NewWithNullNameRaisesSystemError) {
452 PyObjectPtr tuple(PyTuple_New(0));
453 PyObjectPtr str(PyUnicode_FromString("foobar"));
454 PyObjectPtr bytes(PyBytes_FromString("foobar"));
455 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, tuple, tuple, tuple, tuple, tuple,
456 str, nullptr, 0, bytes),
457 nullptr);
458 ASSERT_NE(PyErr_Occurred(), nullptr);
459 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
460}
461
462TEST_F(CodeExtensionApiTest, NewWithNonStrNameRaisesSystemError) {
463 PyObjectPtr tuple(PyTuple_New(0));
464 PyObjectPtr str(PyUnicode_FromString("foobar"));
465 PyObjectPtr bytes(PyBytes_FromString("foobar"));
466 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, tuple, tuple, tuple, tuple, tuple,
467 str, Py_None, 0, bytes),
468 nullptr);
469 ASSERT_NE(PyErr_Occurred(), nullptr);
470 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
471}
472
473TEST_F(CodeExtensionApiTest, NewWithNullLnotabRaisesSystemError) {
474 PyObjectPtr tuple(PyTuple_New(0));
475 PyObjectPtr str(PyUnicode_FromString("foobar"));
476 PyObjectPtr bytes(PyBytes_FromString("foobar"));
477 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, tuple, tuple, tuple, tuple, tuple,
478 str, str, 0, nullptr),
479 nullptr);
480 ASSERT_NE(PyErr_Occurred(), nullptr);
481 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
482}
483
484TEST_F(CodeExtensionApiTest, NewWithNonBytesLnotabRaisesSystemError) {
485 PyObjectPtr tuple(PyTuple_New(0));
486 PyObjectPtr str(PyUnicode_FromString("foobar"));
487 PyObjectPtr bytes(PyBytes_FromString("foobar"));
488 EXPECT_EQ(PyCode_New(0, 0, 0, 0, 0, bytes, tuple, tuple, tuple, tuple, tuple,
489 str, str, 0, Py_None),
490 nullptr);
491 ASSERT_NE(PyErr_Occurred(), nullptr);
492 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError));
493}
494
495} // namespace testing
496} // namespace py