1import unittest 2from ctypes import * 3from ctypes.test import need_symbol 4 5class StringArrayTestCase(unittest.TestCase): 6 def test(self): 7 BUF = c_char * 4 8 9 buf = BUF(b"a", b"b", b"c") 10 self.assertEqual(buf.value, b"abc") 11 self.assertEqual(buf.raw, b"abc\000") 12 13 buf.value = b"ABCD" 14 self.assertEqual(buf.value, b"ABCD") 15 self.assertEqual(buf.raw, b"ABCD") 16 17 buf.value = b"x" 18 self.assertEqual(buf.value, b"x") 19 self.assertEqual(buf.raw, b"x\000CD") 20 21 buf[1] = b"Z" 22 self.assertEqual(buf.value, b"xZCD") 23 self.assertEqual(buf.raw, b"xZCD") 24 25 self.assertRaises(ValueError, setattr, buf, "value", b"aaaaaaaa") 26 self.assertRaises(TypeError, setattr, buf, "value", 42) 27 28 def test_c_buffer_value(self): 29 buf = c_buffer(32) 30 31 buf.value = b"Hello, World" 32 self.assertEqual(buf.value, b"Hello, World") 33 34 self.assertRaises(TypeError, setattr, buf, "value", memoryview(b"Hello, World")) 35 self.assertRaises(TypeError, setattr, buf, "value", memoryview(b"abc")) 36 self.assertRaises(ValueError, setattr, buf, "raw", memoryview(b"x" * 100)) 37 38 def test_c_buffer_raw(self): 39 buf = c_buffer(32) 40 41 buf.raw = memoryview(b"Hello, World") 42 self.assertEqual(buf.value, b"Hello, World") 43 self.assertRaises(TypeError, setattr, buf, "value", memoryview(b"abc")) 44 self.assertRaises(ValueError, setattr, buf, "raw", memoryview(b"x" * 100)) 45 46 def test_param_1(self): 47 BUF = c_char * 4 48 buf = BUF() 49## print c_char_p.from_param(buf) 50 51 def test_param_2(self): 52 BUF = c_char * 4 53 buf = BUF() 54## print BUF.from_param(c_char_p("python")) 55## print BUF.from_param(BUF(*"pyth")) 56 57 def test_del_segfault(self): 58 BUF = c_char * 4 59 buf = BUF() 60 with self.assertRaises(AttributeError): 61 del buf.raw 62 63 64@need_symbol('c_wchar') 65class WStringArrayTestCase(unittest.TestCase): 66 def test(self): 67 BUF = c_wchar * 4 68 69 buf = BUF("a", "b", "c") 70 self.assertEqual(buf.value, "abc") 71 72 buf.value = "ABCD" 73 self.assertEqual(buf.value, "ABCD") 74 75 buf.value = "x" 76 self.assertEqual(buf.value, "x") 77 78 buf[1] = "Z" 79 self.assertEqual(buf.value, "xZCD") 80 81 @unittest.skipIf(sizeof(c_wchar) < 4, 82 "sizeof(wchar_t) is smaller than 4 bytes") 83 def test_nonbmp(self): 84 u = chr(0x10ffff) 85 w = c_wchar(u) 86 self.assertEqual(w.value, u) 87 88 89@need_symbol('c_wchar') 90class WStringTestCase(unittest.TestCase): 91 def test_wchar(self): 92 c_wchar("x") 93 repr(byref(c_wchar("x"))) 94 c_wchar("x") 95 96 97 @unittest.skip('test disabled') 98 def test_basic_wstrings(self): 99 cs = c_wstring("abcdef") 100 101 # XXX This behaviour is about to change: 102 # len returns the size of the internal buffer in bytes. 103 # This includes the terminating NUL character. 104 self.assertEqual(sizeof(cs), 14) 105 106 # The value property is the string up to the first terminating NUL. 107 self.assertEqual(cs.value, "abcdef") 108 self.assertEqual(c_wstring("abc\000def").value, "abc") 109 110 self.assertEqual(c_wstring("abc\000def").value, "abc") 111 112 # The raw property is the total buffer contents: 113 self.assertEqual(cs.raw, "abcdef\000") 114 self.assertEqual(c_wstring("abc\000def").raw, "abc\000def\000") 115 116 # We can change the value: 117 cs.value = "ab" 118 self.assertEqual(cs.value, "ab") 119 self.assertEqual(cs.raw, "ab\000\000\000\000\000") 120 121 self.assertRaises(TypeError, c_wstring, "123") 122 self.assertRaises(ValueError, c_wstring, 0) 123 124 @unittest.skip('test disabled') 125 def test_toolong(self): 126 cs = c_wstring("abcdef") 127 # Much too long string: 128 self.assertRaises(ValueError, setattr, cs, "value", "123456789012345") 129 130 # One char too long values: 131 self.assertRaises(ValueError, setattr, cs, "value", "1234567") 132 133 134def run_test(rep, msg, func, arg): 135 items = range(rep) 136 from time import perf_counter as clock 137 start = clock() 138 for i in items: 139 func(arg); func(arg); func(arg); func(arg); func(arg) 140 stop = clock() 141 print("%20s: %.2f us" % (msg, ((stop-start)*1e6/5/rep))) 142 143 144if __name__ == '__main__': 145 unittest.main() 146