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 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