this repo has no description
at trunk 496 lines 20 kB view raw
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