Home | History | Annotate | Download | only in test
      1 import unittest
      2 from ctypes import *
      3 from test import test_support
      4 
      5 class StringArrayTestCase(unittest.TestCase):
      6     def test(self):
      7         BUF = c_char * 4
      8 
      9         buf = BUF("a", "b", "c")
     10         self.assertEqual(buf.value, "abc")
     11         self.assertEqual(buf.raw, "abc\000")
     12 
     13         buf.value = "ABCD"
     14         self.assertEqual(buf.value, "ABCD")
     15         self.assertEqual(buf.raw, "ABCD")
     16 
     17         buf.value = "x"
     18         self.assertEqual(buf.value, "x")
     19         self.assertEqual(buf.raw, "x\000CD")
     20 
     21         buf[1] = "Z"
     22         self.assertEqual(buf.value, "xZCD")
     23         self.assertEqual(buf.raw, "xZCD")
     24 
     25         self.assertRaises(ValueError, setattr, buf, "value", "aaaaaaaa")
     26         self.assertRaises(TypeError, setattr, buf, "value", 42)
     27 
     28     def test_c_buffer_value(self, memoryview=memoryview):
     29         buf = c_buffer(32)
     30 
     31         buf.value = "Hello, World"
     32         self.assertEqual(buf.value, "Hello, World")
     33 
     34         self.assertRaises(TypeError, setattr, buf, "value", memoryview("Hello, World"))
     35         self.assertRaises(TypeError, setattr, buf, "value", memoryview("abc"))
     36         self.assertRaises(ValueError, setattr, buf, "raw", memoryview("x" * 100))
     37 
     38     def test_c_buffer_raw(self, memoryview=memoryview):
     39         buf = c_buffer(32)
     40 
     41         buf.raw = memoryview("Hello, World")
     42         self.assertEqual(buf.value, "Hello, World")
     43         self.assertRaises(TypeError, setattr, buf, "value", memoryview("abc"))
     44         self.assertRaises(ValueError, setattr, buf, "raw", memoryview("x" * 100))
     45 
     46     def test_c_buffer_deprecated(self):
     47         # Compatibility with 2.x
     48         with test_support.check_py3k_warnings():
     49             self.test_c_buffer_value(buffer)
     50             self.test_c_buffer_raw(buffer)
     51 
     52     def test_param_1(self):
     53         BUF = c_char * 4
     54         buf = BUF()
     55 ##        print c_char_p.from_param(buf)
     56 
     57     def test_param_2(self):
     58         BUF = c_char * 4
     59         buf = BUF()
     60 ##        print BUF.from_param(c_char_p("python"))
     61 ##        print BUF.from_param(BUF(*"pyth"))
     62 
     63 try:
     64     c_wchar
     65 except NameError:
     66     pass
     67 else:
     68     class WStringArrayTestCase(unittest.TestCase):
     69         def test(self):
     70             BUF = c_wchar * 4
     71 
     72             buf = BUF(u"a", u"b", u"c")
     73             self.assertEqual(buf.value, u"abc")
     74 
     75             buf.value = u"ABCD"
     76             self.assertEqual(buf.value, u"ABCD")
     77 
     78             buf.value = u"x"
     79             self.assertEqual(buf.value, u"x")
     80 
     81             buf[1] = u"Z"
     82             self.assertEqual(buf.value, u"xZCD")
     83 
     84 class StringTestCase(unittest.TestCase):
     85     def XX_test_basic_strings(self):
     86         cs = c_string("abcdef")
     87 
     88         # Cannot call len on a c_string any longer
     89         self.assertRaises(TypeError, len, cs)
     90         self.assertEqual(sizeof(cs), 7)
     91 
     92         # The value property is the string up to the first terminating NUL.
     93         self.assertEqual(cs.value, "abcdef")
     94         self.assertEqual(c_string("abc\000def").value, "abc")
     95 
     96         # The raw property is the total buffer contents:
     97         self.assertEqual(cs.raw, "abcdef\000")
     98         self.assertEqual(c_string("abc\000def").raw, "abc\000def\000")
     99 
    100         # We can change the value:
    101         cs.value = "ab"
    102         self.assertEqual(cs.value, "ab")
    103         self.assertEqual(cs.raw, "ab\000\000\000\000\000")
    104 
    105         cs.raw = "XY"
    106         self.assertEqual(cs.value, "XY")
    107         self.assertEqual(cs.raw, "XY\000\000\000\000\000")
    108 
    109         self.assertRaises(TypeError, c_string, u"123")
    110 
    111     def XX_test_sized_strings(self):
    112 
    113         # New in releases later than 0.4.0:
    114         self.assertRaises(TypeError, c_string, None)
    115 
    116         # New in releases later than 0.4.0:
    117         # c_string(number) returns an empty string of size number
    118         self.assertTrue(len(c_string(32).raw) == 32)
    119         self.assertRaises(ValueError, c_string, -1)
    120         self.assertRaises(ValueError, c_string, 0)
    121 
    122         # These tests fail, because it is no longer initialized
    123 ##        self.assertTrue(c_string(2).value == "")
    124 ##        self.assertTrue(c_string(2).raw == "\000\000")
    125         self.assertTrue(c_string(2).raw[-1] == "\000")
    126         self.assertTrue(len(c_string(2).raw) == 2)
    127 
    128     def XX_test_initialized_strings(self):
    129 
    130         self.assertTrue(c_string("ab", 4).raw[:2] == "ab")
    131         self.assertTrue(c_string("ab", 4).raw[:2:] == "ab")
    132         self.assertTrue(c_string("ab", 4).raw[:2:-1] == "ba")
    133         self.assertTrue(c_string("ab", 4).raw[:2:2] == "a")
    134         self.assertTrue(c_string("ab", 4).raw[-1] == "\000")
    135         self.assertTrue(c_string("ab", 2).raw == "a\000")
    136 
    137     def XX_test_toolong(self):
    138         cs = c_string("abcdef")
    139         # Much too long string:
    140         self.assertRaises(ValueError, setattr, cs, "value", "123456789012345")
    141 
    142         # One char too long values:
    143         self.assertRaises(ValueError, setattr, cs, "value", "1234567")
    144 
    145 ##    def test_perf(self):
    146 ##        check_perf()
    147 
    148 try:
    149     c_wchar
    150 except NameError:
    151     pass
    152 else:
    153     class WStringTestCase(unittest.TestCase):
    154         def test_wchar(self):
    155             c_wchar(u"x")
    156             repr(byref(c_wchar(u"x")))
    157             c_wchar("x")
    158 
    159 
    160         def X_test_basic_wstrings(self):
    161             cs = c_wstring(u"abcdef")
    162 
    163             # XXX This behaviour is about to change:
    164             # len returns the size of the internal buffer in bytes.
    165             # This includes the terminating NUL character.
    166             self.assertTrue(sizeof(cs) == 14)
    167 
    168             # The value property is the string up to the first terminating NUL.
    169             self.assertTrue(cs.value == u"abcdef")
    170             self.assertTrue(c_wstring(u"abc\000def").value == u"abc")
    171 
    172             self.assertTrue(c_wstring(u"abc\000def").value == u"abc")
    173 
    174             # The raw property is the total buffer contents:
    175             self.assertTrue(cs.raw == u"abcdef\000")
    176             self.assertTrue(c_wstring(u"abc\000def").raw == u"abc\000def\000")
    177 
    178             # We can change the value:
    179             cs.value = u"ab"
    180             self.assertTrue(cs.value == u"ab")
    181             self.assertTrue(cs.raw == u"ab\000\000\000\000\000")
    182 
    183             self.assertRaises(TypeError, c_wstring, "123")
    184             self.assertRaises(ValueError, c_wstring, 0)
    185 
    186         def X_test_toolong(self):
    187             cs = c_wstring(u"abcdef")
    188             # Much too long string:
    189             self.assertRaises(ValueError, setattr, cs, "value", u"123456789012345")
    190 
    191             # One char too long values:
    192             self.assertRaises(ValueError, setattr, cs, "value", u"1234567")
    193 
    194 
    195 def run_test(rep, msg, func, arg):
    196     items = range(rep)
    197     from time import clock
    198     start = clock()
    199     for i in items:
    200         func(arg); func(arg); func(arg); func(arg); func(arg)
    201     stop = clock()
    202     print "%20s: %.2f us" % (msg, ((stop-start)*1e6/5/rep))
    203 
    204 def check_perf():
    205     # Construct 5 objects
    206 
    207     REP = 200000
    208 
    209     run_test(REP, "c_string(None)", c_string, None)
    210     run_test(REP, "c_string('abc')", c_string, 'abc')
    211 
    212 # Python 2.3 -OO, win2k, P4 700 MHz:
    213 #
    214 #      c_string(None): 1.75 us
    215 #     c_string('abc'): 2.74 us
    216 
    217 # Python 2.2 -OO, win2k, P4 700 MHz:
    218 #
    219 #      c_string(None): 2.95 us
    220 #     c_string('abc'): 3.67 us
    221 
    222 
    223 if __name__ == '__main__':
    224 ##    check_perf()
    225     unittest.main()
    226