1import sys
2import unittest
3from ctypes import *
4
5class MemFunctionsTest(unittest.TestCase):
6##    def test_overflow(self):
7##        # string_at and wstring_at must use the Python calling
8##        # convention (which acquires the GIL and checks the Python
9##        # error flag).  Provoke an error and catch it; see also issue
10##        # #3554: <http://bugs.python.org/issue3554>
11##        self.assertRaises((OverflowError, MemoryError, SystemError),
12##                          lambda: wstring_at(u"foo", sys.maxint - 1))
13##        self.assertRaises((OverflowError, MemoryError, SystemError),
14##                          lambda: string_at("foo", sys.maxint - 1))
15
16    def test_memmove(self):
17        # large buffers apparently increase the chance that the memory
18        # is allocated in high address space.
19        a = create_string_buffer(1000000)
20        p = "Hello, World"
21        result = memmove(a, p, len(p))
22        self.assertEqual(a.value, "Hello, World")
23
24        self.assertEqual(string_at(result), "Hello, World")
25        self.assertEqual(string_at(result, 5), "Hello")
26        self.assertEqual(string_at(result, 16), "Hello, World\0\0\0\0")
27        self.assertEqual(string_at(result, 0), "")
28
29    def test_memset(self):
30        a = create_string_buffer(1000000)
31        result = memset(a, ord('x'), 16)
32        self.assertEqual(a.value, "xxxxxxxxxxxxxxxx")
33
34        self.assertEqual(string_at(result), "xxxxxxxxxxxxxxxx")
35        self.assertEqual(string_at(a), "xxxxxxxxxxxxxxxx")
36        self.assertEqual(string_at(a, 20), "xxxxxxxxxxxxxxxx\0\0\0\0")
37
38    def test_cast(self):
39        a = (c_ubyte * 32)(*map(ord, "abcdef"))
40        self.assertEqual(cast(a, c_char_p).value, "abcdef")
41        self.assertEqual(cast(a, POINTER(c_byte))[:7],
42                             [97, 98, 99, 100, 101, 102, 0])
43        self.assertEqual(cast(a, POINTER(c_byte))[:7:],
44                             [97, 98, 99, 100, 101, 102, 0])
45        self.assertEqual(cast(a, POINTER(c_byte))[6:-1:-1],
46                             [0, 102, 101, 100, 99, 98, 97])
47        self.assertEqual(cast(a, POINTER(c_byte))[:7:2],
48                             [97, 99, 101, 0])
49        self.assertEqual(cast(a, POINTER(c_byte))[:7:7],
50                             [97])
51
52    def test_string_at(self):
53        s = string_at("foo bar")
54        # XXX The following may be wrong, depending on how Python
55        # manages string instances
56        self.assertEqual(2, sys.getrefcount(s))
57        self.assertTrue(s, "foo bar")
58
59        self.assertEqual(string_at("foo bar", 8), "foo bar\0")
60        self.assertEqual(string_at("foo bar", 3), "foo")
61
62    try:
63        create_unicode_buffer
64    except NameError:
65        pass
66    else:
67        def test_wstring_at(self):
68            p = create_unicode_buffer("Hello, World")
69            a = create_unicode_buffer(1000000)
70            result = memmove(a, p, len(p) * sizeof(c_wchar))
71            self.assertEqual(a.value, "Hello, World")
72
73            self.assertEqual(wstring_at(a), "Hello, World")
74            self.assertEqual(wstring_at(a, 5), "Hello")
75            self.assertEqual(wstring_at(a, 16), "Hello, World\0\0\0\0")
76            self.assertEqual(wstring_at(a, 0), "")
77
78if __name__ == "__main__":
79    unittest.main()
80