blob: 6a6411e9eb1637f5340ddcb99506e3ef50f6d83c [file] [log] [blame]
Thomas Hellerbabddfc2006-03-08 19:56:54 +00001import sys
2import unittest
3from ctypes import *
4
5class MemFunctionsTest(unittest.TestCase):
6 def test_memmove(self):
7 # large buffers apparently increase the chance that the memory
8 # is allocated in high address space.
9 a = create_string_buffer(1000000)
Thomas Hellerd68d1312007-07-12 19:45:20 +000010 p = b"Hello, World"
Thomas Hellerbabddfc2006-03-08 19:56:54 +000011 result = memmove(a, p, len(p))
Guido van Rossum97f9d4f2007-10-24 18:41:19 +000012 self.failUnlessEqual(a.value, b"Hello, World")
Thomas Hellerbabddfc2006-03-08 19:56:54 +000013
Guido van Rossum97f9d4f2007-10-24 18:41:19 +000014 self.failUnlessEqual(string_at(result), b"Hello, World")
15 self.failUnlessEqual(string_at(result, 5), b"Hello")
16 self.failUnlessEqual(string_at(result, 16), b"Hello, World\0\0\0\0")
17 self.failUnlessEqual(string_at(result, 0), b"")
Thomas Hellerbabddfc2006-03-08 19:56:54 +000018
19 def test_memset(self):
20 a = create_string_buffer(1000000)
21 result = memset(a, ord('x'), 16)
Guido van Rossum97f9d4f2007-10-24 18:41:19 +000022 self.failUnlessEqual(a.value, b"xxxxxxxxxxxxxxxx")
Thomas Hellerbabddfc2006-03-08 19:56:54 +000023
Guido van Rossum97f9d4f2007-10-24 18:41:19 +000024 self.failUnlessEqual(string_at(result), b"xxxxxxxxxxxxxxxx")
25 self.failUnlessEqual(string_at(a), b"xxxxxxxxxxxxxxxx")
26 self.failUnlessEqual(string_at(a, 20), b"xxxxxxxxxxxxxxxx\0\0\0\0")
Thomas Hellerbabddfc2006-03-08 19:56:54 +000027
28 def test_cast(self):
29 a = (c_ubyte * 32)(*map(ord, "abcdef"))
30 self.failUnlessEqual(cast(a, c_char_p).value, "abcdef")
31 self.failUnlessEqual(cast(a, POINTER(c_byte))[:7],
32 [97, 98, 99, 100, 101, 102, 0])
Thomas Wouters47b49bf2007-08-30 22:15:33 +000033 self.failUnlessEqual(cast(a, POINTER(c_byte))[:7:],
34 [97, 98, 99, 100, 101, 102, 0])
35 self.failUnlessEqual(cast(a, POINTER(c_byte))[6:-1:-1],
36 [0, 102, 101, 100, 99, 98, 97])
37 self.failUnlessEqual(cast(a, POINTER(c_byte))[:7:2],
38 [97, 99, 101, 0])
39 self.failUnlessEqual(cast(a, POINTER(c_byte))[:7:7],
40 [97])
Thomas Hellerbabddfc2006-03-08 19:56:54 +000041
42 def test_string_at(self):
Thomas Hellerd68d1312007-07-12 19:45:20 +000043 s = string_at(b"foo bar")
Thomas Hellerbabddfc2006-03-08 19:56:54 +000044 # XXX The following may be wrong, depending on how Python
45 # manages string instances
46 self.failUnlessEqual(2, sys.getrefcount(s))
47 self.failUnless(s, "foo bar")
48
Guido van Rossum97f9d4f2007-10-24 18:41:19 +000049 self.failUnlessEqual(string_at(b"foo bar", 7), b"foo bar")
50 self.failUnlessEqual(string_at(b"foo bar", 3), b"foo")
Thomas Hellerbabddfc2006-03-08 19:56:54 +000051
52 try:
53 create_unicode_buffer
54 except NameError:
55 pass
56 else:
57 def test_wstring_at(self):
58 p = create_unicode_buffer("Hello, World")
59 a = create_unicode_buffer(1000000)
60 result = memmove(a, p, len(p) * sizeof(c_wchar))
61 self.failUnlessEqual(a.value, "Hello, World")
62
63 self.failUnlessEqual(wstring_at(a), "Hello, World")
64 self.failUnlessEqual(wstring_at(a, 5), "Hello")
65 self.failUnlessEqual(wstring_at(a, 16), "Hello, World\0\0\0\0")
Guido van Rossumd8faa362007-04-27 19:54:29 +000066 self.failUnlessEqual(wstring_at(a, 0), "")
Thomas Hellerbabddfc2006-03-08 19:56:54 +000067
68if __name__ == "__main__":
69 unittest.main()