Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cython
Commits
3ce78016
Commit
3ce78016
authored
Mar 03, 2013
by
Nikita Nemkin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Tests for Py_UNICODE* string support.
parent
a664239a
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
149 additions
and
31 deletions
+149
-31
tests/errors/charptr_from_temp.pyx
tests/errors/charptr_from_temp.pyx
+24
-3
tests/errors/e_strcoerce.pyx
tests/errors/e_strcoerce.pyx
+1
-1
tests/errors/string_assignments.pyx
tests/errors/string_assignments.pyx
+40
-27
tests/run/py_unicode_strings.pyx
tests/run/py_unicode_strings.pyx
+84
-0
No files found.
tests/errors/charptr_from_temp.pyx
View file @
3ce78016
# mode: error
# tag: werror, charptr, conversion, temp
# tag: werror, charptr, conversion, temp
, py_unicode_strings
cdef
bytes
c_s
=
b"abc"
s
=
b"abc"
...
...
@@ -18,7 +18,28 @@ cptr = s
# temp => error
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
=
"""
16:8: Obtaining char* from externally modifiable global Python value
19:9: Obtaining char* from temporary Python value
16:8: Obtaining 'char *' from externally modifiable global 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
"""
tests/errors/e_strcoerce.pyx
View file @
3ce78016
...
...
@@ -15,5 +15,5 @@ _ERRORS = """
4: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.
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)
.
"""
tests/errors/string_assignments.pyx
View file @
3ce78016
# mode: error
# coding: ASCII
# tag: py_unicode_strings
# ok:
cdef
char
*
c1
=
"abc"
cdef
str
s1
=
"abc"
cdef
unicode
u1
=
u"abc"
cdef
Py_UNICODE
*
cu1
=
u1
cdef
bytes
b1
=
b"abc"
cdef
char
*
c2
=
b"abc"
...
...
@@ -21,12 +23,18 @@ o4 = c1
o5
=
b1
o6
=
s1
o7
=
u1
o8
=
cu1
# errors:
cdef
char
*
c_f1
=
u"abc"
cdef
char
*
c_f2
=
u1
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_f2
=
u1
cdef
bytes
b_f3
=
s1
...
...
@@ -56,31 +64,36 @@ print <unicode>c1
print
<
unicode
>
c1
[
1
:
2
]
_ERRORS
=
u"""
26:20: Unicode literals do not support coercion to C types other than Py_UNICODE or Py_UCS4.
27:22: Unicode objects do not support coercion to C types.
28:22: 'str' objects do not support coercion to C types (use 'bytes'?).
30:20: Cannot convert Unicode string to 'bytes' implicitly, encoding required.
31:22: Cannot convert Unicode string to 'bytes' implicitly, encoding required.
32:22: Cannot convert 'str' to 'bytes' implicitly. This is not portable.
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.
36:17: Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding.
37:19: Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding.
39:20: str objects do not support coercion to unicode, use a unicode string literal instead (u'')
40:22: str objects do not support coercion to unicode, use a unicode string literal instead (u'')
41:20: Cannot convert 'bytes' object to unicode implicitly, decoding required
42:22: Cannot convert 'bytes' object to unicode implicitly, decoding required
43:22: Cannot convert 'char*' to unicode implicitly, decoding required
45:19: Cannot assign type 'str object' to 'tuple object'
46:18: Cannot assign type 'unicode object' to 'tuple object'
47:18: Cannot assign type 'bytes object' to 'tuple object'
53:13: default encoding required for conversion from 'char *' to 'str object'
54:13: default encoding required for conversion from 'char *' to 'str object'
55:17: Cannot convert 'char*' to unicode implicitly, decoding required
56:17: default encoding required for conversion from 'char *' to 'unicode object'
29:20: Unicode literals do not support coercion to C types other than Py_UNICODE/Py_UCS4 (for characters) or Py_UNICODE* (for strings).
30:22: Unicode objects only support coercion to Py_UNICODE*.
31:22: 'str' objects do not support coercion to C types (use 'bytes'?).
33:27: Cannot assign type 'char *' to 'Py_UNICODE *'
34:27: Cannot convert 'bytes' object to Py_UNICODE*, use 'unicode'.
35:27: 'str' objects do not support coercion to C types (use 'unicode'?).
36:25: Cannot convert 'bytes' object to Py_UNICODE*, use 'unicode'.
38:20: Cannot convert Unicode string to 'bytes' implicitly, encoding required.
39:22: Cannot convert Unicode string to 'bytes' implicitly, encoding required.
40:22: Cannot convert 'str' to 'bytes' implicitly. This is not portable.
42:17: Cannot convert 'bytes' object to str implicitly. This is not portable to Py3.
43:19: Cannot convert 'bytes' object to str implicitly. This is not portable to Py3.
44:17: Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding.
45:19: Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding.
47:20: str objects do not support coercion to unicode, use a unicode string literal instead (u'')
48:22: str objects do not support coercion to unicode, use a unicode string literal instead (u'')
49:20: Cannot convert 'bytes' object to unicode implicitly, decoding required
50:22: Cannot convert 'bytes' object to unicode implicitly, decoding required
51:22: Cannot convert 'char*' to unicode implicitly, decoding required
53:19: Cannot assign type 'str object' to 'tuple object'
54:18: Cannot assign type 'unicode object' to 'tuple 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'
"""
tests/run/py_unicode_strings.pyx
0 → 100644
View file @
3ce78016
# 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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment