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