Skip to content

Commit a1913d2

Browse files
committed
Add some tests for PyModule_* functions
1 parent 3f0e628 commit a1913d2

File tree

2 files changed

+165
-1
lines changed

2 files changed

+165
-1
lines changed

graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_modsupport.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@
4141
from . import CPyExtTestCase, CPyExtFunction, CPyExtFunctionOutVars, unhandled_error_compare, GRAALPYTHON
4242
__dir__ = __file__.rpartition("/")[0]
4343

44+
ModuleType = type(sys)
45+
46+
47+
class SubModuleType(ModuleType):
48+
pass
49+
4450

4551
def _reference_format_specifier_w_star(args):
4652
bytes_like = args[0]
@@ -403,7 +409,7 @@ def compile_module(self, name):
403409
va_end(va);
404410
return result;
405411
}
406-
412+
407413
static PyObject* wrap_PyArg_VaParseTupleAndKeywords_SizeT(PyObject* argTuple) {
408414
PyObject* out0 = NULL;
409415
int out1 = 0;
@@ -439,3 +445,21 @@ def compile_module(self, name):
439445
cmpfunc=unhandled_error_compare
440446
)
441447

448+
# For some reason, some 'PyModule_*' functions are in 'modsupport.h'
449+
test_PyModule_SetDocString = CPyExtFunction(
450+
lambda args: args[1],
451+
lambda: (
452+
(ModuleType("hello"), "hello doc"),
453+
(SubModuleType("subhello"), "subhello doc"),
454+
),
455+
code='''
456+
static PyObject* wrap_PyModule_SetDocString(PyObject* object, char* doc) {
457+
PyModule_SetDocString(object, (const char *)doc);
458+
return PyObject_GetAttrString(object, "__doc__");
459+
}
460+
''',
461+
resultspec="O",
462+
argspec='Os',
463+
callfunction="wrap_PyModule_SetDocString",
464+
arguments=["PyObject* object", "char* doc"],
465+
)
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
# Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
2+
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3+
#
4+
# The Universal Permissive License (UPL), Version 1.0
5+
#
6+
# Subject to the condition set forth below, permission is hereby granted to any
7+
# person obtaining a copy of this software, associated documentation and/or
8+
# data (collectively the "Software"), free of charge and under any and all
9+
# copyright rights in the Software, and any and all patent rights owned or
10+
# freely licensable by each licensor hereunder covering either (i) the
11+
# unmodified Software as contributed to or provided by such licensor, or (ii)
12+
# the Larger Works (as defined below), to deal in both
13+
#
14+
# (a) the Software, and
15+
#
16+
# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
17+
# one is included with the Software each a "Larger Work" to which the Software
18+
# is contributed by such licensors),
19+
#
20+
# without restriction, including without limitation the rights to copy, create
21+
# derivative works of, display, perform, and distribute the Software and make,
22+
# use, sell, offer for sale, import, export, have made, and have sold the
23+
# Software and the Larger Work(s), and to sublicense the foregoing rights on
24+
# either these or other terms.
25+
#
26+
# This license is subject to the following condition:
27+
#
28+
# The above copyright notice and either this complete permission notice or at a
29+
# minimum a reference to the UPL must be included in all copies or substantial
30+
# portions of the Software.
31+
#
32+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
33+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
34+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
35+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
36+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
37+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
38+
# SOFTWARE.
39+
40+
import sys
41+
from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare
42+
__dir__ = __file__.rpartition("/")[0]
43+
44+
ModuleType = type(sys)
45+
46+
47+
class SubModuleType(ModuleType):
48+
pass
49+
50+
51+
class TestPyModule(CPyExtTestCase):
52+
53+
def compile_module(self, name):
54+
type(self).mro()[1].__dict__["test_%s" % name].create_module(name)
55+
super(TestPyModule, self).compile_module(name)
56+
57+
test_PyModule_Check = CPyExtFunction(
58+
lambda args: isinstance(args[0], ModuleType),
59+
lambda: (
60+
(sys,),
61+
(ModuleType("hello"),),
62+
(SubModuleType("subhello"),),
63+
("not a module",),
64+
(3,),
65+
),
66+
resultspec="i",
67+
argspec='O',
68+
arguments=["PyObject* o"],
69+
)
70+
71+
test_PyModule_CheckExact = CPyExtFunction(
72+
lambda args: type(args[0]) is ModuleType,
73+
lambda: (
74+
(sys,),
75+
(ModuleType("hello"),),
76+
(SubModuleType("subhello"),),
77+
("not a module",),
78+
(3,),
79+
),
80+
resultspec="i",
81+
argspec='O',
82+
arguments=["PyObject* o"],
83+
)
84+
85+
test_PyModule_GetState = CPyExtFunction(
86+
lambda args: "Hello, world!",
87+
lambda: (
88+
("Hello, world!", ),
89+
),
90+
code='''
91+
typedef struct {
92+
PyObject *content;
93+
} test_module_state_t;
94+
95+
static PyModuleDef test_module_def = {
96+
PyModuleDef_HEAD_INIT,
97+
"DummyModule",
98+
"This is a dummy module.",
99+
sizeof(test_module_state_t),
100+
NULL, NULL, NULL, NULL, NULL
101+
};
102+
103+
static PyObject* wrap_PyModule_GetState(PyObject* arg) {
104+
PyObject* module = PyModule_Create(&test_module_def);
105+
test_module_state_t* module_state = (test_module_state_t*) PyModule_GetState(module);
106+
Py_INCREF(arg);
107+
module_state->content = arg;
108+
return ((test_module_state_t*) PyModule_GetState(module))->content;
109+
}
110+
''',
111+
resultspec="O",
112+
argspec="O",
113+
arguments=["PyObject* arg"],
114+
callfunction="wrap_PyModule_GetState",
115+
cmpfunc=unhandled_error_compare
116+
)
117+
118+
test_PyModule_GetName = CPyExtFunction(
119+
lambda args: args[0].__name__,
120+
lambda: (
121+
(sys,),
122+
(ModuleType("hello"),),
123+
(SubModuleType("subhello"),),
124+
),
125+
resultspec="s",
126+
argspec='O',
127+
arguments=["PyObject* object"],
128+
)
129+
130+
test_PyModule_GetNameObject = CPyExtFunction(
131+
lambda args: args[0].__name__,
132+
lambda: (
133+
(sys,),
134+
(ModuleType("hello"),),
135+
(SubModuleType("subhello"),),
136+
),
137+
resultspec="O",
138+
argspec='O',
139+
arguments=["PyObject* object"],
140+
)

0 commit comments

Comments
 (0)