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