Home | History | Annotate | Download | only in test
      1 import unittest
      2 from ctypes import *
      3 from ctypes.test import need_symbol
      4 
      5 import _ctypes_test
      6 
      7 class SlicesTestCase(unittest.TestCase):
      8     def test_getslice_cint(self):
      9         a = (c_int * 100)(*xrange(1100, 1200))
     10         b = range(1100, 1200)
     11         self.assertEqual(a[0:2], b[0:2])
     12         self.assertEqual(a[0:2:], b[0:2:])
     13         self.assertEqual(len(a), len(b))
     14         self.assertEqual(a[5:7], b[5:7])
     15         self.assertEqual(a[5:7:], b[5:7:])
     16         self.assertEqual(a[-1], b[-1])
     17         self.assertEqual(a[:], b[:])
     18         self.assertEqual(a[::], b[::])
     19         self.assertEqual(a[10::-1], b[10::-1])
     20         self.assertEqual(a[30:20:-1], b[30:20:-1])
     21         self.assertEqual(a[:12:6], b[:12:6])
     22         self.assertEqual(a[2:6:4], b[2:6:4])
     23 
     24         a[0:5] = range(5, 10)
     25         self.assertEqual(a[0:5], range(5, 10))
     26         self.assertEqual(a[0:5:], range(5, 10))
     27         self.assertEqual(a[4::-1], range(9, 4, -1))
     28 
     29     def test_setslice_cint(self):
     30         a = (c_int * 100)(*xrange(1100, 1200))
     31         b = range(1100, 1200)
     32 
     33         a[32:47] = range(32, 47)
     34         self.assertEqual(a[32:47], range(32, 47))
     35         a[32:47] = range(132, 147)
     36         self.assertEqual(a[32:47:], range(132, 147))
     37         a[46:31:-1] = range(232, 247)
     38         self.assertEqual(a[32:47:1], range(246, 231, -1))
     39 
     40         a[32:47] = range(1132, 1147)
     41         self.assertEqual(a[:], b)
     42         a[32:47:7] = range(3)
     43         b[32:47:7] = range(3)
     44         self.assertEqual(a[:], b)
     45         a[33::-3] = range(12)
     46         b[33::-3] = range(12)
     47         self.assertEqual(a[:], b)
     48 
     49         from operator import setslice, setitem
     50 
     51         # TypeError: int expected instead of str instance
     52         self.assertRaises(TypeError, setslice, a, 0, 5, "abcde")
     53         self.assertRaises(TypeError, setitem, a, slice(0, 5), "abcde")
     54         # TypeError: int expected instead of str instance
     55         self.assertRaises(TypeError, setslice, a, 0, 5, ["a", "b", "c", "d", "e"])
     56         self.assertRaises(TypeError, setitem, a, slice(0, 5),
     57                           ["a", "b", "c", "d", "e"])
     58         # TypeError: int expected instead of float instance
     59         self.assertRaises(TypeError, setslice, a, 0, 5, [1, 2, 3, 4, 3.14])
     60         self.assertRaises(TypeError, setitem, a, slice(0, 5),
     61                           [1, 2, 3, 4, 3.14])
     62         # ValueError: Can only assign sequence of same size
     63         self.assertRaises(ValueError, setslice, a, 0, 5, range(32))
     64         self.assertRaises(ValueError, setitem, a, slice(0, 5), range(32))
     65 
     66     def test_char_ptr(self):
     67         s = "abcdefghijklmnopqrstuvwxyz"
     68 
     69         dll = CDLL(_ctypes_test.__file__)
     70         dll.my_strdup.restype = POINTER(c_char)
     71         dll.my_free.restype = None
     72         res = dll.my_strdup(s)
     73         self.assertEqual(res[:len(s)], s)
     74         self.assertEqual(res[:3], s[:3])
     75         self.assertEqual(res[:len(s):], s)
     76         self.assertEqual(res[len(s)-1:-1:-1], s[::-1])
     77         self.assertEqual(res[len(s)-1:5:-7], s[:5:-7])
     78         self.assertEqual(res[0:-1:-1], s[0::-1])
     79 
     80         import operator
     81         self.assertRaises(ValueError, operator.getitem,
     82                           res, slice(None, None, None))
     83         self.assertRaises(ValueError, operator.getitem,
     84                           res, slice(0, None, None))
     85         self.assertRaises(ValueError, operator.getitem,
     86                           res, slice(None, 5, -1))
     87         self.assertRaises(ValueError, operator.getitem,
     88                           res, slice(-5, None, None))
     89 
     90         self.assertRaises(TypeError, operator.setslice,
     91                           res, 0, 5, u"abcde")
     92         self.assertRaises(TypeError, operator.setitem,
     93                           res, slice(0, 5), u"abcde")
     94         dll.my_free(res)
     95 
     96         dll.my_strdup.restype = POINTER(c_byte)
     97         res = dll.my_strdup(s)
     98         self.assertEqual(res[:len(s)], range(ord("a"), ord("z")+1))
     99         self.assertEqual(res[:len(s):], range(ord("a"), ord("z")+1))
    100         dll.my_free(res)
    101 
    102     def test_char_ptr_with_free(self):
    103         dll = CDLL(_ctypes_test.__file__)
    104         s = "abcdefghijklmnopqrstuvwxyz"
    105 
    106         class allocated_c_char_p(c_char_p):
    107             pass
    108 
    109         dll.my_free.restype = None
    110         def errcheck(result, func, args):
    111             retval = result.value
    112             dll.my_free(result)
    113             return retval
    114 
    115         dll.my_strdup.restype = allocated_c_char_p
    116         dll.my_strdup.errcheck = errcheck
    117         try:
    118             res = dll.my_strdup(s)
    119             self.assertEqual(res, s)
    120         finally:
    121             del dll.my_strdup.errcheck
    122 
    123 
    124     def test_char_array(self):
    125         s = "abcdefghijklmnopqrstuvwxyz\0"
    126 
    127         p = (c_char * 27)(*s)
    128         self.assertEqual(p[:], s)
    129         self.assertEqual(p[::], s)
    130         self.assertEqual(p[::-1], s[::-1])
    131         self.assertEqual(p[5::-2], s[5::-2])
    132         self.assertEqual(p[2:5:-3], s[2:5:-3])
    133 
    134 
    135     @need_symbol('c_wchar')
    136     def test_wchar_ptr(self):
    137         s = u"abcdefghijklmnopqrstuvwxyz\0"
    138 
    139         dll = CDLL(_ctypes_test.__file__)
    140         dll.my_wcsdup.restype = POINTER(c_wchar)
    141         dll.my_wcsdup.argtypes = POINTER(c_wchar),
    142         dll.my_free.restype = None
    143         res = dll.my_wcsdup(s)
    144         self.assertEqual(res[:len(s)], s)
    145         self.assertEqual(res[:len(s):], s)
    146         self.assertEqual(res[len(s)-1:-1:-1], s[::-1])
    147         self.assertEqual(res[len(s)-1:5:-7], s[:5:-7])
    148 
    149         import operator
    150         self.assertRaises(TypeError, operator.setslice,
    151                           res, 0, 5, u"abcde")
    152         self.assertRaises(TypeError, operator.setitem,
    153                           res, slice(0, 5), u"abcde")
    154         dll.my_free(res)
    155 
    156         if sizeof(c_wchar) == sizeof(c_short):
    157             dll.my_wcsdup.restype = POINTER(c_short)
    158         elif sizeof(c_wchar) == sizeof(c_int):
    159             dll.my_wcsdup.restype = POINTER(c_int)
    160         elif sizeof(c_wchar) == sizeof(c_long):
    161             dll.my_wcsdup.restype = POINTER(c_long)
    162         else:
    163             self.skipTest('Pointers to c_wchar are not supported')
    164         res = dll.my_wcsdup(s)
    165         tmpl = range(ord("a"), ord("z")+1)
    166         self.assertEqual(res[:len(s)-1], tmpl)
    167         self.assertEqual(res[:len(s)-1:], tmpl)
    168         self.assertEqual(res[len(s)-2:-1:-1], tmpl[::-1])
    169         self.assertEqual(res[len(s)-2:5:-7], tmpl[:5:-7])
    170         dll.my_free(res)
    171 
    172 ################################################################
    173 
    174 if __name__ == "__main__":
    175     unittest.main()
    176