[pypy-svn] r50531 - pypy/branch/applevel-ctypes2/pypy/lib/app_test/ctypes

fijal at codespeak.net fijal at codespeak.net
Sat Jan 12 15:45:17 CET 2008


Author: fijal
Date: Sat Jan 12 15:45:17 2008
New Revision: 50531

Added:
   pypy/branch/applevel-ctypes2/pypy/lib/app_test/ctypes/test_sizes.py   (contents, props changed)
   pypy/branch/applevel-ctypes2/pypy/lib/app_test/ctypes/test_strings.py   (contents, props changed)
Modified:
   pypy/branch/applevel-ctypes2/pypy/lib/app_test/ctypes/test_pointers.py
Log:
Port and add some tests


Modified: pypy/branch/applevel-ctypes2/pypy/lib/app_test/ctypes/test_pointers.py
==============================================================================
--- pypy/branch/applevel-ctypes2/pypy/lib/app_test/ctypes/test_pointers.py	(original)
+++ pypy/branch/applevel-ctypes2/pypy/lib/app_test/ctypes/test_pointers.py	Sat Jan 12 15:45:17 2008
@@ -105,6 +105,7 @@
             py.test.raises(TypeError, delitem, p, 0)
 
     def test_from_address(self):
+        py.test.skip("It cannot work")
         from array import array
         a = array('i', [100, 200, 300, 400, 500])
         addr = a.buffer_info()[0]

Added: pypy/branch/applevel-ctypes2/pypy/lib/app_test/ctypes/test_sizes.py
==============================================================================
--- (empty file)
+++ pypy/branch/applevel-ctypes2/pypy/lib/app_test/ctypes/test_sizes.py	Sat Jan 12 15:45:17 2008
@@ -0,0 +1,23 @@
+# Test specifically-sized containers.
+
+from ctypes import *
+
+class TestSizes:
+    def test_8(self):
+        assert 1 == sizeof(c_int8)
+        assert 1 == sizeof(c_uint8)
+
+    def test_16(self):
+        assert 2 == sizeof(c_int16)
+        assert 2 == sizeof(c_uint16)
+
+    def test_32(self):
+        assert 4 == sizeof(c_int32)
+        assert 4 == sizeof(c_uint32)
+
+    def test_64(self):
+        assert 8 == sizeof(c_int64)
+        assert 8 == sizeof(c_uint64)
+
+    def test_size_t(self):
+        assert sizeof(c_void_p) == sizeof(c_size_t)

Added: pypy/branch/applevel-ctypes2/pypy/lib/app_test/ctypes/test_strings.py
==============================================================================
--- (empty file)
+++ pypy/branch/applevel-ctypes2/pypy/lib/app_test/ctypes/test_strings.py	Sat Jan 12 15:45:17 2008
@@ -0,0 +1,214 @@
+
+import py
+from ctypes import *
+
+class TestStringArray:
+    def test_one(self):
+        BUF = c_char * 4
+
+        buf = BUF("a", "b", "c")
+        assert buf.value == "abc"
+        assert buf.raw == "abc\000"
+
+        buf.value = "ABCD"
+        assert buf.value == "ABCD"
+        assert buf.raw == "ABCD"
+
+        buf.value = "x"
+        assert buf.value == "x"
+        assert buf.raw == "x\000CD"
+
+        buf[1] = "Z"
+        assert buf.value == "xZCD"
+        assert buf.raw == "xZCD"
+
+        py.test.raises(ValueError, setattr, buf, "value", "aaaaaaaa")
+        py.test.raises(TypeError, setattr, buf, "value", 42)
+
+    def test_c_buffer_value(self):
+        buf = c_buffer(32)
+
+        buf.value = "Hello, World"
+        assert buf.value, "Hello == World"
+
+        py.test.raises(TypeError, setattr, buf, "value", buffer("Hello, World"))
+        py.test.raises(TypeError, setattr, buf, "value", buffer("abc"))
+        py.test.raises(ValueError, setattr, buf, "raw", buffer("x" * 100))
+
+    def test_c_buffer_raw(self):
+        buf = c_buffer(32)
+
+        buf.raw = buffer("Hello, World")
+        assert buf.value, "Hello == World"
+        py.test.raises(TypeError, setattr, buf, "value", buffer("abc"))
+        py.test.raises(ValueError, setattr, buf, "raw", buffer("x" * 100))
+
+    def test_param_1(self):
+        BUF = c_char * 4
+        buf = BUF()
+##        print c_char_p.from_param(buf)
+
+    def test_param_2(self):
+        BUF = c_char * 4
+        buf = BUF()
+##        print BUF.from_param(c_char_p("python"))
+##        print BUF.from_param(BUF(*"pyth"))
+
+try:
+    c_wchar
+except NameError:
+    pass
+else:
+    class TestWString:
+        def test(self):
+            BUF = c_wchar * 4
+
+            buf = BUF(u"a", u"b", u"c")
+            assert buf.value == u"abc"
+
+            buf.value = u"ABCD"
+            assert buf.value == u"ABCD"
+
+            buf.value = u"x"
+            assert buf.value == u"x"
+
+            buf[1] = u"Z"
+            assert buf.value == u"xZCD"
+
+class TestString:
+    def XX_test_basic_strings(self):
+        cs = c_string("abcdef")
+
+        # Cannot call len on a c_string any longer
+        py.test.raises(TypeError, len, cs)
+        assert sizeof(cs) == 7
+
+        # The value property is the string up to the first terminating NUL.
+        assert cs.value == "abcdef"
+        assert c_string("abc\000def").value == "abc"
+
+        # The raw property is the total buffer contents:
+        assert cs.raw == "abcdef\000"
+        assert c_string("abc\000def").raw == "abc\000def\000"
+
+        # We can change the value:
+        cs.value = "ab"
+        assert cs.value == "ab"
+        assert cs.raw == "ab\000\000\000\000\000"
+
+        cs.raw = "XY"
+        assert cs.value == "XY"
+        assert cs.raw == "XY\000\000\000\000\000"
+
+        py.test.raises(TypeError, c_string, u"123")
+
+    def XX_test_sized_strings(self):
+
+        # New in releases later than 0.4.0:
+        py.test.raises(TypeError, c_string, None)
+
+        # New in releases later than 0.4.0:
+        # c_string(number) returns an empty string of size number
+        assert len(c_string(32).raw) == 32
+        py.test.raises(ValueError, c_string, -1)
+        py.test.raises(ValueError, c_string, 0)
+
+        # These tests fail, because it is no longer initialized
+##        self.failUnless(c_string(2).value == "")
+##        self.failUnless(c_string(2).raw == "\000\000")
+        self.failUnless(c_string(2).raw[-1] == "\000")
+        self.failUnless(len(c_string(2).raw) == 2)
+
+    def XX_test_initialized_strings(self):
+
+        assert c_string("ab", 4).raw[:2] == "ab"
+        assert c_string("ab", 4).raw[-1] == "\000"
+        assert c_string("ab", 2).raw == "a\000"
+
+    def XX_test_toolong(self):
+        cs = c_string("abcdef")
+        # Much too long string:
+        py.test.raises(ValueError, setattr, cs, "value", "123456789012345")
+
+        # One char too long values:
+        py.test.raises(ValueError, setattr, cs, "value", "1234567")
+
+##    def test_perf(self):
+##        check_perf()
+
+try:
+    c_wchar
+except NameError:
+    pass
+else:
+    class TestWString2:
+        def test_wchar(self):
+            c_wchar(u"x")
+            repr(byref(c_wchar(u"x")))
+            c_wchar("x")
+
+
+        def X_test_basic_wstrings(self):
+            cs = c_wstring(u"abcdef")
+
+            # XXX This behaviour is about to change:
+            # len returns the size of the internal buffer in bytes.
+            # This includes the terminating NUL character.
+            self.failUnless(sizeof(cs) == 14)
+
+            # The value property is the string up to the first terminating NUL.
+            self.failUnless(cs.value == u"abcdef")
+            self.failUnless(c_wstring(u"abc\000def").value == u"abc")
+
+            self.failUnless(c_wstring(u"abc\000def").value == u"abc")
+
+            # The raw property is the total buffer contents:
+            self.failUnless(cs.raw == u"abcdef\000")
+            self.failUnless(c_wstring(u"abc\000def").raw == u"abc\000def\000")
+
+            # We can change the value:
+            cs.value = u"ab"
+            self.failUnless(cs.value == u"ab")
+            self.failUnless(cs.raw == u"ab\000\000\000\000\000")
+
+            py.test.raises(TypeError, c_wstring, "123")
+            py.test.raises(ValueError, c_wstring, 0)
+
+        def X_test_toolong(self):
+            cs = c_wstring(u"abcdef")
+            # Much too long string:
+            py.test.raises(ValueError, setattr, cs, "value", u"123456789012345")
+
+            # One char too long values:
+            py.test.raises(ValueError, setattr, cs, "value", u"1234567")
+
+
+def run_test(rep, msg, func, arg):
+    items = range(rep)
+    from time import clock
+    start = clock()
+    for i in items:
+        func(arg); func(arg); func(arg); func(arg); func(arg)
+    stop = clock()
+    print "%20s: %.2f us" % (msg, ((stop-start)*1e6/5/rep))
+
+def check_perf():
+    # Construct 5 objects
+
+    REP = 200000
+
+    run_test(REP, "c_string(None)", c_string, None)
+    run_test(REP, "c_string('abc')", c_string, 'abc')
+
+# Python 2.3 -OO, win2k, P4 700 MHz:
+#
+#      c_string(None): 1.75 us
+#     c_string('abc'): 2.74 us
+
+# Python 2.2 -OO, win2k, P4 700 MHz:
+#
+#      c_string(None): 2.95 us
+#     c_string('abc'): 3.67 us
+
+
+##    check_perf()



More information about the Pypy-commit mailing list