1
from test.test_support import verbose, verify, TestFailed
10
m = new.module('Spam')
14
sys.modules['Spam'] = m
17
def get_more_yolks(self):
20
print 'new.classobj()'
21
C = new.classobj('Spam', (Spam.Eggs,), {'get_more_yolks': get_more_yolks})
24
print 'new.instance()'
25
c = new.instance(C, {'yolks': 3})
29
verify(o.__dict__ == {},
30
"new __dict__ should be empty")
32
o = new.instance(C, None)
33
verify(o.__dict__ == {},
34
"new __dict__ should be empty")
37
def break_yolks(self):
38
self.yolks = self.yolks - 2
39
print 'new.instancemethod()'
40
im = new.instancemethod(break_yolks, c, C)
44
verify(c.get_yolks() == 3 and c.get_more_yolks() == 6,
45
'Broken call of hand-crafted class instance')
47
verify(c.get_yolks() == 1 and c.get_more_yolks() == 4,
48
'Broken call of hand-crafted instance method')
50
# It's unclear what the semantics should be for a code object compiled at
51
# module scope, but bound and run in a function. In CPython, `c' is global
52
# (by accident?) while in Jython, `c' is local. The intent of the test
53
# clearly is to make `c' global, so let's be explicit about it.
61
ccode = compile(codestr, '<string>', 'exec')
62
# Jython doesn't have a __builtins__, so use a portable alternative
64
g = {'c': 0, '__builtins__': __builtin__}
65
# this test could be more robust
66
print 'new.function()'
67
func = new.function(ccode, g)
72
'Could not create a proper function object')
74
# test the various extended flavors of function.new
80
new.function(f.func_code, {}, "blah")
81
g2 = new.function(g.func_code, {}, "blah", (2,), g.func_closure)
83
g3 = new.function(g.func_code, {}, "blah", None, g.func_closure)
85
def test_closure(func, closure, exc):
87
new.function(func.func_code, {}, "", None, closure)
91
print "corrupt closure accepted"
93
test_closure(g, None, TypeError) # invalid closure
94
test_closure(g, (1,), TypeError) # non-cell in closure
95
test_closure(g, (1, 1), ValueError) # closure is wrong size
96
test_closure(f, g.func_closure, ValueError) # no closure needed
99
# bogus test of new.code()
100
# Note: Jython will never have new.code()
101
if hasattr(new, 'code'):
105
argcount = c.co_argcount
106
nlocals = c.co_nlocals
107
stacksize = c.co_stacksize
109
codestring = c.co_code
110
constants = c.co_consts
112
varnames = c.co_varnames
113
filename = c.co_filename
115
firstlineno = c.co_firstlineno
117
freevars = c.co_freevars
118
cellvars = c.co_cellvars
120
d = new.code(argcount, nlocals, stacksize, flags, codestring,
121
constants, names, varnames, filename, name,
122
firstlineno, lnotab, freevars, cellvars)
124
# test backwards-compatibility version with no freevars or cellvars
125
d = new.code(argcount, nlocals, stacksize, flags, codestring,
126
constants, names, varnames, filename, name,
129
try: # this used to trigger a SystemError
130
d = new.code(-argcount, nlocals, stacksize, flags, codestring,
131
constants, names, varnames, filename, name,
136
raise TestFailed, "negative co_argcount didn't trigger an exception"
138
try: # this used to trigger a SystemError
139
d = new.code(argcount, -nlocals, stacksize, flags, codestring,
140
constants, names, varnames, filename, name,
145
raise TestFailed, "negative co_nlocals didn't trigger an exception"
147
try: # this used to trigger a Py_FatalError!
148
d = new.code(argcount, nlocals, stacksize, flags, codestring,
149
constants, (5,), varnames, filename, name,
154
raise TestFailed, "non-string co_name didn't trigger an exception"
156
# new.code used to be a way to mutate a tuple...
159
d = new.code(argcount, nlocals, stacksize, flags, codestring,
160
constants, t, varnames, filename, name,
162
verify(type(t[0]) is S, "eek, tuple changed under us!")