14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom ctypes import *
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport _ctypes_test
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass SlicesTestCase(unittest.TestCase):
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_getslice_cint(self):
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a = (c_int * 100)(*xrange(1100, 1200))
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = range(1100, 1200)
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[0:2], b[0:2])
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[0:2:], b[0:2:])
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(a), len(b))
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[5:7], b[5:7])
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[5:7:], b[5:7:])
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[-1], b[-1])
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[:], b[:])
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[::], b[::])
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[10::-1], b[10::-1])
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[30:20:-1], b[30:20:-1])
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[:12:6], b[:12:6])
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[2:6:4], b[2:6:4])
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a[0:5] = range(5, 10)
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[0:5], range(5, 10))
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[0:5:], range(5, 10))
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[4::-1], range(9, 4, -1))
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_setslice_cint(self):
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a = (c_int * 100)(*xrange(1100, 1200))
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = range(1100, 1200)
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a[32:47] = range(32, 47)
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[32:47], range(32, 47))
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a[32:47] = range(132, 147)
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[32:47:], range(132, 147))
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a[46:31:-1] = range(232, 247)
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[32:47:1], range(246, 231, -1))
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a[32:47] = range(1132, 1147)
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[:], b)
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a[32:47:7] = range(3)
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b[32:47:7] = range(3)
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[:], b)
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a[33::-3] = range(12)
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b[33::-3] = range(12)
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[:], b)
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from operator import setslice, setitem
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # TypeError: int expected instead of str instance
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, setslice, a, 0, 5, "abcde")
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, setitem, a, slice(0, 5), "abcde")
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # TypeError: int expected instead of str instance
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, setslice, a, 0, 5, ["a", "b", "c", "d", "e"])
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, setitem, a, slice(0, 5),
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          ["a", "b", "c", "d", "e"])
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # TypeError: int expected instead of float instance
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, setslice, a, 0, 5, [1, 2, 3, 4, 3.14])
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, setitem, a, slice(0, 5),
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          [1, 2, 3, 4, 3.14])
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ValueError: Can only assign sequence of same size
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, setslice, a, 0, 5, range(32))
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, setitem, a, slice(0, 5), range(32))
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_char_ptr(self):
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s = "abcdefghijklmnopqrstuvwxyz"
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dll = CDLL(_ctypes_test.__file__)
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dll.my_strdup.restype = POINTER(c_char)
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dll.my_free.restype = None
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = dll.my_strdup(s)
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(res[:len(s)], s)
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(res[:3], s[:3])
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(res[:len(s):], s)
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(res[len(s)-1:-1:-1], s[::-1])
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(res[len(s)-1:5:-7], s[:5:-7])
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(res[0:-1:-1], s[0::-1])
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import operator
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, operator.getitem,
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          res, slice(None, None, None))
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, operator.getitem,
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          res, slice(0, None, None))
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, operator.getitem,
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          res, slice(None, 5, -1))
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, operator.getitem,
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          res, slice(-5, None, None))
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, operator.setslice,
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          res, 0, 5, u"abcde")
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, operator.setitem,
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          res, slice(0, 5), u"abcde")
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dll.my_free(res)
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dll.my_strdup.restype = POINTER(c_byte)
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = dll.my_strdup(s)
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(res[:len(s)], range(ord("a"), ord("z")+1))
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(res[:len(s):], range(ord("a"), ord("z")+1))
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dll.my_free(res)
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_char_ptr_with_free(self):
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dll = CDLL(_ctypes_test.__file__)
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s = "abcdefghijklmnopqrstuvwxyz"
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class allocated_c_char_p(c_char_p):
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dll.my_free.restype = None
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def errcheck(result, func, args):
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            retval = result.value
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            dll.my_free(result)
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return retval
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dll.my_strdup.restype = allocated_c_char_p
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dll.my_strdup.errcheck = errcheck
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            res = dll.my_strdup(s)
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(res, s)
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            del dll.my_strdup.errcheck
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_char_array(self):
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s = "abcdefghijklmnopqrstuvwxyz\0"
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        p = (c_char * 27)(*s)
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(p[:], s)
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(p[::], s)
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(p[::-1], s[::-1])
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(p[5::-2], s[5::-2])
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(p[2:5:-3], s[2:5:-3])
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c_wchar
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    except NameError:
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pass
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def test_wchar_ptr(self):
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            s = u"abcdefghijklmnopqrstuvwxyz\0"
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            dll = CDLL(_ctypes_test.__file__)
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            dll.my_wcsdup.restype = POINTER(c_wchar)
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            dll.my_wcsdup.argtypes = POINTER(c_wchar),
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            dll.my_free.restype = None
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            res = dll.my_wcsdup(s)
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(res[:len(s)], s)
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(res[:len(s):], s)
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(res[len(s)-1:-1:-1], s[::-1])
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(res[len(s)-1:5:-7], s[:5:-7])
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            import operator
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(TypeError, operator.setslice,
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                              res, 0, 5, u"abcde")
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(TypeError, operator.setitem,
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                              res, slice(0, 5), u"abcde")
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            dll.my_free(res)
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if sizeof(c_wchar) == sizeof(c_short):
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                dll.my_wcsdup.restype = POINTER(c_short)
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            elif sizeof(c_wchar) == sizeof(c_int):
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                dll.my_wcsdup.restype = POINTER(c_int)
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            elif sizeof(c_wchar) == sizeof(c_long):
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                dll.my_wcsdup.restype = POINTER(c_long)
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            res = dll.my_wcsdup(s)
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            tmpl = range(ord("a"), ord("z")+1)
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(res[:len(s)-1], tmpl)
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(res[:len(s)-1:], tmpl)
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(res[len(s)-2:-1:-1], tmpl[::-1])
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(res[len(s)-2:5:-7], tmpl[:5:-7])
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            dll.my_free(res)
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao################################################################
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__":
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    unittest.main()
179