|
| 1 | +importunittest |
| 2 | +fromcollectionsimportUserList |
| 3 | +import_testcapi |
| 4 | + |
| 5 | + |
| 6 | +NULL=None |
| 7 | +PY_SSIZE_T_MIN=_testcapi.PY_SSIZE_T_MIN |
| 8 | +PY_SSIZE_T_MAX=_testcapi.PY_SSIZE_T_MAX |
| 9 | + |
| 10 | +PyList_Check=_testcapi.list_check |
| 11 | +PyList_CheckExact=_testcapi.list_checkexact |
| 12 | +PyList_Size=_testcapi.list_size |
| 13 | +PyList_GetItem=_testcapi.list_getitem |
| 14 | +PyList_SetItem=_testcapi.list_setitem |
| 15 | +PyList_Insert=_testcapi.list_insert |
| 16 | +PyList_Append=_testcapi.list_append |
| 17 | +PyList_Sort=_testcapi.list_sort |
| 18 | +PyList_AsTuple=_testcapi.list_astuple |
| 19 | +PyList_Reverse=_testcapi.list_reverse |
| 20 | +PyList_GetSlice=_testcapi.list_getslice |
| 21 | +PyList_SetSlice=_testcapi.list_setslice |
| 22 | + |
| 23 | + |
| 24 | +classListSubclass(list): |
| 25 | +pass |
| 26 | + |
| 27 | + |
| 28 | +classCAPITest(unittest.TestCase): |
| 29 | + |
| 30 | +deftest_list_check(self): |
| 31 | +self.assertTrue(PyList_Check([2,3,5])) |
| 32 | +# CRASHES self.assertFalse(PyList_Check(NULL)) |
| 33 | + |
| 34 | +deftest_list_checkexact(self): |
| 35 | +self.assertTrue(PyList_CheckExact([2,3,5])) |
| 36 | +# CRASHES self.assertFalse(PyList_CheckExact(NULL)) |
| 37 | + |
| 38 | +deftest_list_new(self): |
| 39 | +expected= [None,None,None] |
| 40 | + |
| 41 | +PyList_New=_testcapi.list_new |
| 42 | +lst=PyList_New(3) |
| 43 | +self.assertEqual(lst,expected) |
| 44 | +self.assertIs(type(lst),list) |
| 45 | +lst2=PyList_New(3) |
| 46 | +self.assertIsNot(lst2,lst) |
| 47 | + |
| 48 | +withself.assertRaises(SystemError): |
| 49 | +PyList_New(-1) |
| 50 | + |
| 51 | +deftest_list_size(self): |
| 52 | +self.assertEqual(PyList_Size([]),0) |
| 53 | +self.assertEqual(PyList_Size([2,3,5]),3) |
| 54 | + |
| 55 | +deftest_list_getitem(self): |
| 56 | +lst=list("abc") |
| 57 | +self.assertEqual(PyList_GetItem(lst,0),"a") |
| 58 | +self.assertEqual(PyList_GetItem(lst,1),"b") |
| 59 | +self.assertEqual(PyList_GetItem(lst,2),"c") |
| 60 | + |
| 61 | +forinvalid_indexin (PY_SSIZE_T_MIN,-1,len(lst),10,PY_SSIZE_T_MAX): |
| 62 | +withself.subTest(invalid_index=invalid_index): |
| 63 | +self.assertRaises(IndexError,PyList_GetItem,lst,invalid_index) |
| 64 | + |
| 65 | +lst2=ListSubclass(lst) |
| 66 | +self.assertEqual(PyList_GetItem(lst2,1),"b") |
| 67 | +self.assertRaises(IndexError,PyList_GetItem,lst2,len(lst2)) |
| 68 | + |
| 69 | +# CRASHES PyList_GetItem(NULL, 0) |
| 70 | + |
| 71 | +deftest_list_setitem(self): |
| 72 | +lst=list("abc") |
| 73 | +PyList_SetItem(lst,1,"X") |
| 74 | +self.assertEqual(lst, ["a","X","c"]) |
| 75 | +self.assertRaises(IndexError,PyList_SetItem,lst,3,"Y") |
| 76 | + |
| 77 | +lst2=ListSubclass(list("abc")) |
| 78 | +PyList_SetItem(lst2,1,"X") |
| 79 | +self.assertEqual(lst2, ["a","X","c"]) |
| 80 | + |
| 81 | +# CRASHES PyList_SetItem(list("abc"), 0, NULL) |
| 82 | +# CRASHES PyList_SetItem(NULL, 0, 'x') |
| 83 | + |
| 84 | +deftest_list_insert(self): |
| 85 | +lst=list("abc") |
| 86 | +PyList_Insert(lst,1,"X") |
| 87 | +self.assertEqual(lst, ["a","X","b","c"]) |
| 88 | +PyList_Insert(lst,-1,"Y") |
| 89 | +self.assertEqual(lst, ["a","X","b","Y","c"]) |
| 90 | +PyList_Insert(lst,100,"Z") |
| 91 | +self.assertEqual(lst, ["a","X","b","Y","c","Z"]) |
| 92 | +PyList_Insert(lst,-100,"0") |
| 93 | +self.assertEqual(lst, ["0","a","X","b","Y","c","Z"]) |
| 94 | + |
| 95 | +lst2=ListSubclass(list("abc")) |
| 96 | +PyList_Insert(lst2,1,"X") |
| 97 | +self.assertEqual(lst2, ["a","X","b","c"]) |
| 98 | + |
| 99 | +withself.assertRaises(SystemError): |
| 100 | +PyList_Insert(list("abc"),0,NULL) |
| 101 | + |
| 102 | +# CRASHES PyList_Insert(NULL, 0, 'x') |
| 103 | + |
| 104 | +deftest_list_append(self): |
| 105 | +lst= [] |
| 106 | +PyList_Append(lst,"a") |
| 107 | +self.assertEqual(lst, ["a"]) |
| 108 | +PyList_Append(lst,"b") |
| 109 | +self.assertEqual(lst, ["a","b"]) |
| 110 | + |
| 111 | +lst2=ListSubclass() |
| 112 | +PyList_Append(lst2,"X") |
| 113 | +self.assertEqual(lst2, ["X"]) |
| 114 | + |
| 115 | +self.assertRaises(SystemError,PyList_Append, [],NULL) |
| 116 | + |
| 117 | +# CRASHES PyList_Append(NULL, 'a') |
| 118 | + |
| 119 | +deftest_list_sort(self): |
| 120 | +lst= [4,6,7,3,1,5,9,2,0,8] |
| 121 | +PyList_Sort(lst) |
| 122 | +self.assertEqual(lst,list(range(10))) |
| 123 | + |
| 124 | +lst2=ListSubclass([4,6,7,3,1,5,9,2,0,8]) |
| 125 | +PyList_Sort(lst2) |
| 126 | +self.assertEqual(lst2,list(range(10))) |
| 127 | + |
| 128 | +withself.assertRaises(SystemError): |
| 129 | +PyList_Sort(NULL) |
| 130 | + |
| 131 | +deftest_list_astuple(self): |
| 132 | +self.assertEqual(PyList_AsTuple([]), ()) |
| 133 | +self.assertEqual(PyList_AsTuple([2,5,10]), (2,5,10)) |
| 134 | + |
| 135 | +withself.assertRaises(SystemError): |
| 136 | +PyList_AsTuple(NULL) |
| 137 | + |
| 138 | +deftest_list_reverse(self): |
| 139 | +deflist_reverse(lst): |
| 140 | +self.assertEqual(PyList_Reverse(lst),0) |
| 141 | +returnlst |
| 142 | + |
| 143 | +self.assertEqual(list_reverse([]), []) |
| 144 | +self.assertEqual(list_reverse([2,5,10]), [10,5,2]) |
| 145 | + |
| 146 | +withself.assertRaises(SystemError): |
| 147 | +PyList_Reverse(NULL) |
| 148 | + |
| 149 | +deftest_list_getslice(self): |
| 150 | +lst=list("abcdef") |
| 151 | + |
| 152 | +# empty |
| 153 | +self.assertEqual(PyList_GetSlice(lst,-100,0), []) |
| 154 | +self.assertEqual(PyList_GetSlice(lst,0,0), []) |
| 155 | +self.assertEqual(PyList_GetSlice(lst,3,0), []) |
| 156 | + |
| 157 | +# slice |
| 158 | +self.assertEqual(PyList_GetSlice(lst,1,3),list("bc")) |
| 159 | + |
| 160 | +# whole |
| 161 | +self.assertEqual(PyList_GetSlice(lst,0,len(lst)),lst) |
| 162 | +self.assertEqual(PyList_GetSlice(lst,0,100),lst) |
| 163 | +self.assertEqual(PyList_GetSlice(lst,-100,100),lst) |
| 164 | + |
| 165 | +# CRASHES PyList_GetSlice(NULL, 0, 0) |
| 166 | + |
| 167 | +deftest_list_setslice(self): |
| 168 | +defset_slice(lst,low,high,value): |
| 169 | +lst=lst.copy() |
| 170 | +self.assertEqual(PyList_SetSlice(lst,low,high,value),0) |
| 171 | +returnlst |
| 172 | + |
| 173 | +# insert items |
| 174 | +self.assertEqual(set_slice([],0,0,list("abc")),list("abc")) |
| 175 | +lst=list("abc") |
| 176 | +self.assertEqual(set_slice(lst,0,0, ["X"]),list("Xabc")) |
| 177 | +self.assertEqual(set_slice(lst,1,1,list("XY")),list("aXYbc")) |
| 178 | +self.assertEqual(set_slice(lst,len(lst),len(lst), ["X"]),list("abcX")) |
| 179 | +self.assertEqual(set_slice(lst,100,100, ["X"]),list("abcX")) |
| 180 | + |
| 181 | +# replace items |
| 182 | +lst=list("abc") |
| 183 | +self.assertEqual(set_slice(lst,-100,1,list("X")),list("Xbc")) |
| 184 | +self.assertEqual(set_slice(lst,1,2,list("X")),list("aXc")) |
| 185 | +self.assertEqual(set_slice(lst,1,3,list("XY")),list("aXY")) |
| 186 | +self.assertEqual(set_slice(lst,0,3,list("XYZ")),list("XYZ")) |
| 187 | + |
| 188 | +# delete items |
| 189 | +lst=list("abcdef") |
| 190 | +self.assertEqual(set_slice(lst,0,len(lst), []), []) |
| 191 | +self.assertEqual(set_slice(lst,-100,100, []), []) |
| 192 | +self.assertEqual(set_slice(lst,1,5, []),list("af")) |
| 193 | +self.assertEqual(set_slice(lst,3,len(lst), []),list("abc")) |
| 194 | + |
| 195 | +# delete items with NULL |
| 196 | +lst=list("abcdef") |
| 197 | +self.assertEqual(set_slice(lst,0,len(lst),NULL), []) |
| 198 | +self.assertEqual(set_slice(lst,3,len(lst),NULL),list("abc")) |
| 199 | + |
| 200 | +# CRASHES PyList_SetSlice(NULL, 0, 0, ["x"]) |
| 201 | + |
| 202 | +deftest_not_list_objects(self): |
| 203 | +forobjin ( |
| 204 | +123, |
| 205 | +UserList([2,3,5]), |
| 206 | + (2,3,5),# tuple |
| 207 | +object(), |
| 208 | + ): |
| 209 | +withself.subTest(obj=obj): |
| 210 | +self.assertFalse(PyList_Check(obj)) |
| 211 | +self.assertFalse(PyList_CheckExact(obj)) |
| 212 | +withself.assertRaises(SystemError): |
| 213 | +PyList_Size(obj) |
| 214 | +withself.assertRaises(SystemError): |
| 215 | +PyList_SetItem(obj,0,"x") |
| 216 | +withself.assertRaises(SystemError): |
| 217 | +PyList_Insert(obj,0,"x") |
| 218 | +withself.assertRaises(SystemError): |
| 219 | +PyList_Append(obj,"x") |
| 220 | +withself.assertRaises(SystemError): |
| 221 | +PyList_Sort(obj) |
| 222 | +withself.assertRaises(SystemError): |
| 223 | +PyList_AsTuple(obj) |
| 224 | +withself.assertRaises(SystemError): |
| 225 | +PyList_Reverse(obj) |
| 226 | +withself.assertRaises(SystemError): |
| 227 | +PyList_GetSlice(obj,0,1) |
| 228 | +withself.assertRaises(SystemError): |
| 229 | +PyList_SetSlice(obj,0,1, ["x"]) |
| 230 | + |
| 231 | + |
| 232 | +if__name__=="__main__": |
| 233 | +unittest.main() |