this repo has no description
at trunk 64 lines 1.7 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 IterExtensionApiTest = ExtensionApi; 12 13TEST_F(IterExtensionApiTest, CallIterNewReturnsIterator) { 14 PyRun_SimpleString(R"( 15class C: 16 def __init__(self): 17 self.x = -3 18 def __next__(self): 19 self.x += 2 20 return self.x 21i = C() 22)"); 23 PyObjectPtr i(mainModuleGet("i")); 24 PyObjectPtr sentinel(PyLong_FromLong(5)); 25 PyObjectPtr iterator(PyCallIter_New(i, sentinel)); 26 PyObjectPtr type(PyObject_Type(iterator)); 27 EXPECT_EQ(strcmp(_PyType_Name(reinterpret_cast<PyTypeObject*>(type.get())), 28 "callable_iterator"), 29 0); 30} 31 32TEST_F(IterExtensionApiTest, SeqIterNewWithNonSequenceRaises) { 33 ASSERT_EQ(PySeqIter_New(Py_None), nullptr); 34 ASSERT_NE(PyErr_Occurred(), nullptr); 35 EXPECT_TRUE(PyErr_ExceptionMatches(PyExc_SystemError)); 36} 37 38TEST_F(IterExtensionApiTest, SeqIterNewWithSequenceReturnsIterator) { 39 PyObjectPtr list(PyList_New(0)); 40 PyObject* seq = PySeqIter_New(list); 41 ASSERT_NE(seq, nullptr); 42 EXPECT_TRUE(PyIter_Check(seq)); 43 Py_DECREF(seq); 44} 45 46TEST_F(IterExtensionApiTest, IterCheckWithListIteratorReturnsTrue) { 47 PyRun_SimpleString("iterator = iter([1, 2, 3])"); 48 PyObjectPtr iterator(mainModuleGet("iterator")); 49 EXPECT_TRUE(PyIter_Check(iterator.get())); 50} 51 52TEST_F(IterExtensionApiTest, IterCheckWithObjectWithDunderNextReturnsTrue) { 53 PyRun_SimpleString(R"( 54class C: 55 def __next__(self): 56 pass 57iterator = C() 58)"); 59 PyObjectPtr iterator(mainModuleGet("iterator")); 60 EXPECT_TRUE(PyIter_Check(iterator.get())); 61} 62 63} // namespace testing 64} // namespace py