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