• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1from ctypes import *
2from ctypes.test import need_symbol
3import unittest
4
5class StringBufferTestCase(unittest.TestCase):
6
7    def test_buffer(self):
8        b = create_string_buffer(32)
9        self.assertEqual(len(b), 32)
10        self.assertEqual(sizeof(b), 32 * sizeof(c_char))
11        self.assertIs(type(b[0]), bytes)
12
13        b = create_string_buffer(b"abc")
14        self.assertEqual(len(b), 4) # trailing nul char
15        self.assertEqual(sizeof(b), 4 * sizeof(c_char))
16        self.assertIs(type(b[0]), bytes)
17        self.assertEqual(b[0], b"a")
18        self.assertEqual(b[:], b"abc\0")
19        self.assertEqual(b[::], b"abc\0")
20        self.assertEqual(b[::-1], b"\0cba")
21        self.assertEqual(b[::2], b"ac")
22        self.assertEqual(b[::5], b"a")
23
24        self.assertRaises(TypeError, create_string_buffer, "abc")
25
26    def test_buffer_interface(self):
27        self.assertEqual(len(bytearray(create_string_buffer(0))), 0)
28        self.assertEqual(len(bytearray(create_string_buffer(1))), 1)
29
30    @need_symbol('c_wchar')
31    def test_unicode_buffer(self):
32        b = create_unicode_buffer(32)
33        self.assertEqual(len(b), 32)
34        self.assertEqual(sizeof(b), 32 * sizeof(c_wchar))
35        self.assertIs(type(b[0]), str)
36
37        b = create_unicode_buffer("abc")
38        self.assertEqual(len(b), 4) # trailing nul char
39        self.assertEqual(sizeof(b), 4 * sizeof(c_wchar))
40        self.assertIs(type(b[0]), str)
41        self.assertEqual(b[0], "a")
42        self.assertEqual(b[:], "abc\0")
43        self.assertEqual(b[::], "abc\0")
44        self.assertEqual(b[::-1], "\0cba")
45        self.assertEqual(b[::2], "ac")
46        self.assertEqual(b[::5], "a")
47
48        self.assertRaises(TypeError, create_unicode_buffer, b"abc")
49
50    @need_symbol('c_wchar')
51    def test_unicode_conversion(self):
52        b = create_unicode_buffer("abc")
53        self.assertEqual(len(b), 4) # trailing nul char
54        self.assertEqual(sizeof(b), 4 * sizeof(c_wchar))
55        self.assertIs(type(b[0]), str)
56        self.assertEqual(b[0], "a")
57        self.assertEqual(b[:], "abc\0")
58        self.assertEqual(b[::], "abc\0")
59        self.assertEqual(b[::-1], "\0cba")
60        self.assertEqual(b[::2], "ac")
61        self.assertEqual(b[::5], "a")
62
63    @need_symbol('c_wchar')
64    def test_create_unicode_buffer_non_bmp(self):
65        expected = 5 if sizeof(c_wchar) == 2 else 3
66        for s in '\U00010000\U00100000', '\U00010000\U0010ffff':
67            b = create_unicode_buffer(s)
68            self.assertEqual(len(b), expected)
69            self.assertEqual(b[-1], '\0')
70
71
72if __name__ == "__main__":
73    unittest.main()
74