Commit 3ce78016 authored by Nikita Nemkin's avatar Nikita Nemkin

Tests for Py_UNICODE* string support.

parent a664239a
# mode: error # mode: error
# tag: werror, charptr, conversion, temp # tag: werror, charptr, conversion, temp, py_unicode_strings
cdef bytes c_s = b"abc" cdef bytes c_s = b"abc"
s = b"abc" s = b"abc"
...@@ -18,7 +18,28 @@ cptr = s ...@@ -18,7 +18,28 @@ cptr = s
# temp => error # temp => error
cptr = s + b"cba" cptr = s + b"cba"
cdef unicode c_u = u"abc"
u = u"abc"
cdef Py_UNICODE* cuptr
# constant => ok
cuptr = u"xyz"
# global cdef variable => ok
cuptr = c_u
# pyglobal => warning
cuptr = u
# temp => error
cuptr = u + u"cba"
_ERRORS = """ _ERRORS = """
16:8: Obtaining char* from externally modifiable global Python value 16:8: Obtaining 'char *' from externally modifiable global Python value
19:9: Obtaining char* from temporary Python value 19:9: Obtaining 'char *' from temporary Python value
34:9: Obtaining 'Py_UNICODE *' from externally modifiable global Python value
37:10: Obtaining 'Py_UNICODE *' from temporary Python value
""" """
...@@ -15,5 +15,5 @@ _ERRORS = """ ...@@ -15,5 +15,5 @@ _ERRORS = """
4:14: Only single-character string literals can be coerced into ints. 4:14: Only single-character string literals can be coerced into ints.
5:14: Only single-character string literals can be coerced into ints. 5:14: Only single-character string literals can be coerced into ints.
8:15: Only single-character string literals can be coerced into ints. 8:15: Only single-character string literals can be coerced into ints.
11:14: Unicode literals do not support coercion to C types other than Py_UNICODE or Py_UCS4. 11:14: Unicode literals do not support coercion to C types other than Py_UNICODE/Py_UCS4 (for characters) or Py_UNICODE* (for strings).
""" """
# mode: error # mode: error
# coding: ASCII # coding: ASCII
# tag: py_unicode_strings
# ok: # ok:
cdef char* c1 = "abc" cdef char* c1 = "abc"
cdef str s1 = "abc" cdef str s1 = "abc"
cdef unicode u1 = u"abc" cdef unicode u1 = u"abc"
cdef Py_UNICODE* cu1 = u1
cdef bytes b1 = b"abc" cdef bytes b1 = b"abc"
cdef char* c2 = b"abc" cdef char* c2 = b"abc"
...@@ -21,12 +23,18 @@ o4 = c1 ...@@ -21,12 +23,18 @@ o4 = c1
o5 = b1 o5 = b1
o6 = s1 o6 = s1
o7 = u1 o7 = u1
o8 = cu1
# errors: # errors:
cdef char* c_f1 = u"abc" cdef char* c_f1 = u"abc"
cdef char* c_f2 = u1 cdef char* c_f2 = u1
cdef char* c_f3 = s1 cdef char* c_f3 = s1
cdef Py_UNICODE* cu_f1 = c1
cdef Py_UNICODE* cu_f2 = b1
cdef Py_UNICODE* cu_f3 = s1
cdef Py_UNICODE* cu_f4 = b"abc"
cdef bytes b_f1 = u"abc" cdef bytes b_f1 = u"abc"
cdef bytes b_f2 = u1 cdef bytes b_f2 = u1
cdef bytes b_f3 = s1 cdef bytes b_f3 = s1
...@@ -56,31 +64,36 @@ print <unicode>c1 ...@@ -56,31 +64,36 @@ print <unicode>c1
print <unicode>c1[1:2] print <unicode>c1[1:2]
_ERRORS = u""" _ERRORS = u"""
26:20: Unicode literals do not support coercion to C types other than Py_UNICODE or Py_UCS4. 29:20: Unicode literals do not support coercion to C types other than Py_UNICODE/Py_UCS4 (for characters) or Py_UNICODE* (for strings).
27:22: Unicode objects do not support coercion to C types. 30:22: Unicode objects only support coercion to Py_UNICODE*.
28:22: 'str' objects do not support coercion to C types (use 'bytes'?). 31:22: 'str' objects do not support coercion to C types (use 'bytes'?).
30:20: Cannot convert Unicode string to 'bytes' implicitly, encoding required. 33:27: Cannot assign type 'char *' to 'Py_UNICODE *'
31:22: Cannot convert Unicode string to 'bytes' implicitly, encoding required. 34:27: Cannot convert 'bytes' object to Py_UNICODE*, use 'unicode'.
32:22: Cannot convert 'str' to 'bytes' implicitly. This is not portable. 35:27: 'str' objects do not support coercion to C types (use 'unicode'?).
36:25: Cannot convert 'bytes' object to Py_UNICODE*, use 'unicode'.
34:17: Cannot convert 'bytes' object to str implicitly. This is not portable to Py3.
35:19: Cannot convert 'bytes' object to str implicitly. This is not portable to Py3. 38:20: Cannot convert Unicode string to 'bytes' implicitly, encoding required.
36:17: Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding. 39:22: Cannot convert Unicode string to 'bytes' implicitly, encoding required.
37:19: Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding. 40:22: Cannot convert 'str' to 'bytes' implicitly. This is not portable.
39:20: str objects do not support coercion to unicode, use a unicode string literal instead (u'') 42:17: Cannot convert 'bytes' object to str implicitly. This is not portable to Py3.
40:22: str objects do not support coercion to unicode, use a unicode string literal instead (u'') 43:19: Cannot convert 'bytes' object to str implicitly. This is not portable to Py3.
41:20: Cannot convert 'bytes' object to unicode implicitly, decoding required 44:17: Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding.
42:22: Cannot convert 'bytes' object to unicode implicitly, decoding required 45:19: Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding.
43:22: Cannot convert 'char*' to unicode implicitly, decoding required
47:20: str objects do not support coercion to unicode, use a unicode string literal instead (u'')
45:19: Cannot assign type 'str object' to 'tuple object' 48:22: str objects do not support coercion to unicode, use a unicode string literal instead (u'')
46:18: Cannot assign type 'unicode object' to 'tuple object' 49:20: Cannot convert 'bytes' object to unicode implicitly, decoding required
47:18: Cannot assign type 'bytes object' to 'tuple object' 50:22: Cannot convert 'bytes' object to unicode implicitly, decoding required
51:22: Cannot convert 'char*' to unicode implicitly, decoding required
53:13: default encoding required for conversion from 'char *' to 'str object'
54:13: default encoding required for conversion from 'char *' to 'str object' 53:19: Cannot assign type 'str object' to 'tuple object'
55:17: Cannot convert 'char*' to unicode implicitly, decoding required 54:18: Cannot assign type 'unicode object' to 'tuple object'
56:17: default encoding required for conversion from 'char *' to 'unicode object' 55:18: Cannot assign type 'bytes object' to 'tuple object'
61:13: default encoding required for conversion from 'char *' to 'str object'
62:13: default encoding required for conversion from 'char *' to 'str object'
63:17: Cannot convert 'char*' to unicode implicitly, decoding required
64:17: default encoding required for conversion from 'char *' to 'unicode object'
""" """
# tag: py_unicode_strings
cimport cython
from libc.string cimport memcpy, strcpy
cdef bint Py_UNICODE_equal(const Py_UNICODE* u1, const Py_UNICODE* u2):
while u1[0] != 0 and u2[0] != 0 and u1[0] == u2[0]:
u1 += 1
u2 += 1
return u1[0] == u2[0]
ctypedef Py_UNICODE* LPWSTR
cdef unicode uobj = u'unicode\u1234'
cdef unicode uobj1 = u'u'
cdef Py_UNICODE* c_pu_str = u"unicode\u1234"
cdef Py_UNICODE c_pu_arr[42]
cdef LPWSTR c_wstr = u"unicode\u1234"
cdef Py_UNICODE* c_pu_empty = u""
cdef char* c_empty = ""
memcpy(c_pu_arr, c_pu_str, sizeof(Py_UNICODE) * (len(uobj) + 1))
def test_c_to_python():
"""
>>> test_c_to_python()
"""
assert c_pu_arr == uobj
assert c_pu_str == uobj
assert c_wstr == uobj
assert c_pu_arr[1:] == uobj[1:]
assert c_pu_str[1:] == uobj[1:]
assert c_wstr[1:] == uobj[1:]
assert c_pu_arr[:1] == uobj[:1]
assert c_pu_arr[:1] == uobj[:1]
assert c_pu_str[:1] == uobj[:1]
assert c_wstr[:1] == uobj[:1]
assert c_pu_arr[1:7] == uobj[1:7]
assert c_pu_str[1:7] == uobj[1:7]
assert c_wstr[1:7] == uobj[1:7]
assert c_pu_arr[1] == uobj[1]
assert c_pu_str[1] == uobj[1]
assert c_wstr[1] == uobj[1]
assert len(c_pu_str) == 8
assert len(c_pu_arr) == 8
assert len(c_wstr) == 8
assert sizeof(c_pu_arr) == sizeof(Py_UNICODE) * 42
assert sizeof(c_pu_str) == sizeof(void*)
assert u'unicode'
assert not u''
assert c_pu_str
assert c_pu_empty
def test_python_to_c():
"""
>>> test_python_to_c()
"""
cdef unicode u
assert Py_UNICODE_equal(c_pu_arr, uobj)
assert Py_UNICODE_equal(c_pu_str, uobj)
assert Py_UNICODE_equal(c_pu_str, <LPWSTR>uobj)
u = uobj[1:]
assert Py_UNICODE_equal(c_pu_str + 1, u)
assert Py_UNICODE_equal(c_wstr + 1, u)
u = uobj[:1]
assert Py_UNICODE_equal(<Py_UNICODE*>u"u", u)
u = uobj[1:7]
assert Py_UNICODE_equal(<Py_UNICODE*>u"nicode", u)
u = uobj[1]
assert Py_UNICODE_equal(<Py_UNICODE*>u"n", u)
assert len(u"abc\0") == 4
assert len(<Py_UNICODE*>u"abc\0") == 3
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment