11 dll = ctypes.CDLL(_ctypes_test.__file__)
12 wcslen = dll.my_wcslen
13 wcslen.argtypes = [ctypes.c_wchar_p]
16 class UnicodeTestCase(unittest.TestCase):
18 self.prev_conv_mode = ctypes.set_conversion_mode("ascii", "strict")
21 ctypes.set_conversion_mode(*self.prev_conv_mode)
23 def test_ascii_strict(self):
24 ctypes.set_conversion_mode("ascii", "strict")
25 # no conversions take place with unicode arguments
26 self.failUnlessEqual(wcslen(u"abc"), 3)
27 self.failUnlessEqual(wcslen(u"ab\u2070"), 3)
28 # string args are converted
29 self.failUnlessEqual(wcslen("abc"), 3)
30 self.failUnlessRaises(ctypes.ArgumentError, wcslen, "abä")
32 def test_ascii_replace(self):
33 ctypes.set_conversion_mode("ascii", "replace")
34 self.failUnlessEqual(wcslen(u"abc"), 3)
35 self.failUnlessEqual(wcslen(u"ab\u2070"), 3)
36 self.failUnlessEqual(wcslen("abc"), 3)
37 self.failUnlessEqual(wcslen("abä"), 3)
39 def test_ascii_ignore(self):
40 ctypes.set_conversion_mode("ascii", "ignore")
41 self.failUnlessEqual(wcslen(u"abc"), 3)
42 self.failUnlessEqual(wcslen(u"ab\u2070"), 3)
43 # ignore error mode skips non-ascii characters
44 self.failUnlessEqual(wcslen("abc"), 3)
45 self.failUnlessEqual(wcslen("äöüß"), 0)
47 def test_latin1_strict(self):
48 ctypes.set_conversion_mode("latin-1", "strict")
49 self.failUnlessEqual(wcslen(u"abc"), 3)
50 self.failUnlessEqual(wcslen(u"ab\u2070"), 3)
51 self.failUnlessEqual(wcslen("abc"), 3)
52 self.failUnlessEqual(wcslen("äöüß"), 4)
54 def test_buffers(self):
55 ctypes.set_conversion_mode("ascii", "strict")
56 buf = ctypes.create_unicode_buffer("abc")
57 self.failUnlessEqual(len(buf), 3+1)
59 ctypes.set_conversion_mode("ascii", "replace")
60 buf = ctypes.create_unicode_buffer("abäöü")
61 self.failUnlessEqual(buf[:], u"ab\uFFFD\uFFFD\uFFFD\0")
62 self.failUnlessEqual(buf[::], u"ab\uFFFD\uFFFD\uFFFD\0")
63 self.failUnlessEqual(buf[::-1], u"\0\uFFFD\uFFFD\uFFFDba")
64 self.failUnlessEqual(buf[::2], u"a\uFFFD\uFFFD")
65 self.failUnlessEqual(buf[6:5:-1], u"")
67 ctypes.set_conversion_mode("ascii", "ignore")
68 buf = ctypes.create_unicode_buffer("abäöü")
69 # is that correct? not sure. But with 'ignore', you get what you pay for..
70 self.failUnlessEqual(buf[:], u"ab\0\0\0\0")
71 self.failUnlessEqual(buf[::], u"ab\0\0\0\0")
72 self.failUnlessEqual(buf[::-1], u"\0\0\0\0ba")
73 self.failUnlessEqual(buf[::2], u"a\0\0")
74 self.failUnlessEqual(buf[6:5:-1], u"")
77 func = ctypes.CDLL(_ctypes_test.__file__)._testfunc_p_p
79 class StringTestCase(UnicodeTestCase):
81 self.prev_conv_mode = ctypes.set_conversion_mode("ascii", "strict")
82 func.argtypes = [ctypes.c_char_p]
83 func.restype = ctypes.c_char_p
86 ctypes.set_conversion_mode(*self.prev_conv_mode)
88 func.restype = ctypes.c_int
90 def test_ascii_replace(self):
91 ctypes.set_conversion_mode("ascii", "strict")
92 self.failUnlessEqual(func("abc"), "abc")
93 self.failUnlessEqual(func(u"abc"), "abc")
94 self.assertRaises(ctypes.ArgumentError, func, u"abä")
96 def test_ascii_ignore(self):
97 ctypes.set_conversion_mode("ascii", "ignore")
98 self.failUnlessEqual(func("abc"), "abc")
99 self.failUnlessEqual(func(u"abc"), "abc")
100 self.failUnlessEqual(func(u"äöüß"), "")
102 def test_ascii_replace(self):
103 ctypes.set_conversion_mode("ascii", "replace")
104 self.failUnlessEqual(func("abc"), "abc")
105 self.failUnlessEqual(func(u"abc"), "abc")
106 self.failUnlessEqual(func(u"äöüß"), "????")
108 def test_buffers(self):
109 ctypes.set_conversion_mode("ascii", "strict")
110 buf = ctypes.create_string_buffer(u"abc")
111 self.failUnlessEqual(len(buf), 3+1)
113 ctypes.set_conversion_mode("ascii", "replace")
114 buf = ctypes.create_string_buffer(u"abäöü")
115 self.failUnlessEqual(buf[:], "ab???\0")
116 self.failUnlessEqual(buf[::], "ab???\0")
117 self.failUnlessEqual(buf[::-1], "\0???ba")
118 self.failUnlessEqual(buf[::2], "a??")
119 self.failUnlessEqual(buf[6:5:-1], "")
121 ctypes.set_conversion_mode("ascii", "ignore")
122 buf = ctypes.create_string_buffer(u"abäöü")
123 # is that correct? not sure. But with 'ignore', you get what you pay for..
124 self.failUnlessEqual(buf[:], "ab\0\0\0\0")
125 self.failUnlessEqual(buf[::], "ab\0\0\0\0")
126 self.failUnlessEqual(buf[::-1], "\0\0\0\0ba")
128 if __name__ == '__main__':