/Lib/ctypes/test/test_unicode.py

http://unladen-swallow.googlecode.com/ · Python · 129 lines · 102 code · 21 blank · 6 comment · 4 complexity · 99952a19259e2f2600486529ba1241f0 MD5 · raw file

  1. # coding: latin-1
  2. import unittest
  3. import ctypes
  4. try:
  5. ctypes.c_wchar
  6. except AttributeError:
  7. pass
  8. else:
  9. import _ctypes_test
  10. dll = ctypes.CDLL(_ctypes_test.__file__)
  11. wcslen = dll.my_wcslen
  12. wcslen.argtypes = [ctypes.c_wchar_p]
  13. class UnicodeTestCase(unittest.TestCase):
  14. def setUp(self):
  15. self.prev_conv_mode = ctypes.set_conversion_mode("ascii", "strict")
  16. def tearDown(self):
  17. ctypes.set_conversion_mode(*self.prev_conv_mode)
  18. def test_ascii_strict(self):
  19. ctypes.set_conversion_mode("ascii", "strict")
  20. # no conversions take place with unicode arguments
  21. self.failUnlessEqual(wcslen(u"abc"), 3)
  22. self.failUnlessEqual(wcslen(u"ab\u2070"), 3)
  23. # string args are converted
  24. self.failUnlessEqual(wcslen("abc"), 3)
  25. self.failUnlessRaises(ctypes.ArgumentError, wcslen, "abä")
  26. def test_ascii_replace(self):
  27. ctypes.set_conversion_mode("ascii", "replace")
  28. self.failUnlessEqual(wcslen(u"abc"), 3)
  29. self.failUnlessEqual(wcslen(u"ab\u2070"), 3)
  30. self.failUnlessEqual(wcslen("abc"), 3)
  31. self.failUnlessEqual(wcslen("abä"), 3)
  32. def test_ascii_ignore(self):
  33. ctypes.set_conversion_mode("ascii", "ignore")
  34. self.failUnlessEqual(wcslen(u"abc"), 3)
  35. self.failUnlessEqual(wcslen(u"ab\u2070"), 3)
  36. # ignore error mode skips non-ascii characters
  37. self.failUnlessEqual(wcslen("abc"), 3)
  38. self.failUnlessEqual(wcslen("äöüß"), 0)
  39. def test_latin1_strict(self):
  40. ctypes.set_conversion_mode("latin-1", "strict")
  41. self.failUnlessEqual(wcslen(u"abc"), 3)
  42. self.failUnlessEqual(wcslen(u"ab\u2070"), 3)
  43. self.failUnlessEqual(wcslen("abc"), 3)
  44. self.failUnlessEqual(wcslen("äöüß"), 4)
  45. def test_buffers(self):
  46. ctypes.set_conversion_mode("ascii", "strict")
  47. buf = ctypes.create_unicode_buffer("abc")
  48. self.failUnlessEqual(len(buf), 3+1)
  49. ctypes.set_conversion_mode("ascii", "replace")
  50. buf = ctypes.create_unicode_buffer("abäöü")
  51. self.failUnlessEqual(buf[:], u"ab\uFFFD\uFFFD\uFFFD\0")
  52. self.failUnlessEqual(buf[::], u"ab\uFFFD\uFFFD\uFFFD\0")
  53. self.failUnlessEqual(buf[::-1], u"\0\uFFFD\uFFFD\uFFFDba")
  54. self.failUnlessEqual(buf[::2], u"a\uFFFD\uFFFD")
  55. self.failUnlessEqual(buf[6:5:-1], u"")
  56. ctypes.set_conversion_mode("ascii", "ignore")
  57. buf = ctypes.create_unicode_buffer("abäöü")
  58. # is that correct? not sure. But with 'ignore', you get what you pay for..
  59. self.failUnlessEqual(buf[:], u"ab\0\0\0\0")
  60. self.failUnlessEqual(buf[::], u"ab\0\0\0\0")
  61. self.failUnlessEqual(buf[::-1], u"\0\0\0\0ba")
  62. self.failUnlessEqual(buf[::2], u"a\0\0")
  63. self.failUnlessEqual(buf[6:5:-1], u"")
  64. import _ctypes_test
  65. func = ctypes.CDLL(_ctypes_test.__file__)._testfunc_p_p
  66. class StringTestCase(UnicodeTestCase):
  67. def setUp(self):
  68. self.prev_conv_mode = ctypes.set_conversion_mode("ascii", "strict")
  69. func.argtypes = [ctypes.c_char_p]
  70. func.restype = ctypes.c_char_p
  71. def tearDown(self):
  72. ctypes.set_conversion_mode(*self.prev_conv_mode)
  73. func.argtypes = None
  74. func.restype = ctypes.c_int
  75. def test_ascii_replace(self):
  76. ctypes.set_conversion_mode("ascii", "strict")
  77. self.failUnlessEqual(func("abc"), "abc")
  78. self.failUnlessEqual(func(u"abc"), "abc")
  79. self.assertRaises(ctypes.ArgumentError, func, u"abä")
  80. def test_ascii_ignore(self):
  81. ctypes.set_conversion_mode("ascii", "ignore")
  82. self.failUnlessEqual(func("abc"), "abc")
  83. self.failUnlessEqual(func(u"abc"), "abc")
  84. self.failUnlessEqual(func(u"äöüß"), "")
  85. def test_ascii_replace(self):
  86. ctypes.set_conversion_mode("ascii", "replace")
  87. self.failUnlessEqual(func("abc"), "abc")
  88. self.failUnlessEqual(func(u"abc"), "abc")
  89. self.failUnlessEqual(func(u"äöüß"), "????")
  90. def test_buffers(self):
  91. ctypes.set_conversion_mode("ascii", "strict")
  92. buf = ctypes.create_string_buffer(u"abc")
  93. self.failUnlessEqual(len(buf), 3+1)
  94. ctypes.set_conversion_mode("ascii", "replace")
  95. buf = ctypes.create_string_buffer(u"abäöü")
  96. self.failUnlessEqual(buf[:], "ab???\0")
  97. self.failUnlessEqual(buf[::], "ab???\0")
  98. self.failUnlessEqual(buf[::-1], "\0???ba")
  99. self.failUnlessEqual(buf[::2], "a??")
  100. self.failUnlessEqual(buf[6:5:-1], "")
  101. ctypes.set_conversion_mode("ascii", "ignore")
  102. buf = ctypes.create_string_buffer(u"abäöü")
  103. # is that correct? not sure. But with 'ignore', you get what you pay for..
  104. self.failUnlessEqual(buf[:], "ab\0\0\0\0")
  105. self.failUnlessEqual(buf[::], "ab\0\0\0\0")
  106. self.failUnlessEqual(buf[::-1], "\0\0\0\0ba")
  107. if __name__ == '__main__':
  108. unittest.main()