PageRenderTime 56ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/Languages/IronPython/Tests/test_function.py

http://github.com/IronLanguages/main
Python | 1409 lines | 1353 code | 37 blank | 19 comment | 27 complexity | 8d1da236f8b1091452a8e609dbcbc6b9 MD5 | raw file
Possible License(s): CPL-1.0, BSD-3-Clause, ISC, GPL-2.0, MPL-2.0-no-copyleft-exception
  1. ######################################################################################
  2. #
  3. # Copyright (c) Microsoft Corporation. All rights reserved.
  4. #
  5. # This source code is subject to terms and conditions of the Apache License, Version 2.0. A
  6. # copy of the license can be found in the License.html file at the root of this distribution. If
  7. # you cannot locate the Apache License, Version 2.0, please send an email to
  8. # ironpy@microsoft.com. By using this source code in any fashion, you are agreeing to be bound
  9. # by the terms of the Apache License, Version 2.0.
  10. #
  11. # You must not remove this notice, or any other, from this software.
  12. #
  13. #
  14. #####################################################################################
  15. from iptest.assert_util import *
  16. from types import FunctionType
  17. def x(a,b,c):
  18. z = 8
  19. if a < b:
  20. return c
  21. elif c < 5 :
  22. return a + b
  23. else:
  24. return z
  25. Assert(x(1,2,10) == 10)
  26. Assert(x(2,1,4) == 3)
  27. Assert(x(1,1,10) == 8)
  28. def f():
  29. pass
  30. f.a = 10
  31. Assert(f.a == 10)
  32. AreEqual(f.__module__, __name__)
  33. def g():
  34. g.a = 20
  35. g()
  36. Assert(g.a == 20)
  37. def foo(): pass
  38. AreEqual(foo.func_code.co_filename.lower().endswith('test_function.py'), True)
  39. AreEqual(foo.func_code.co_firstlineno, 50) # if you added lines to the top of this file you need to update this number.
  40. # Cannot inherit from a function
  41. def CreateSubType(t):
  42. class SubType(t): pass
  43. return SubType
  44. if not is_silverlight:
  45. AssertErrorWithMatch(TypeError, ".*\n?.* is not an acceptable base type", CreateSubType, type(foo))
  46. else:
  47. try:
  48. CreateSubType(type(foo))
  49. except TypeError, e:
  50. Assert(e.message.find("is not an acceptable base type") != -1)
  51. def a(*args): return args
  52. def b(*args): return a(*args)
  53. AreEqual(b(1,2,3), (1,2,3))
  54. # some coverage for Function3 code
  55. def xwd(a=0,b=1,c=3):
  56. z = 8
  57. if a < b:
  58. return c
  59. elif c < 5 :
  60. return a + b
  61. else:
  62. return z
  63. AreEqual(x,x)
  64. AreEqual(xwd(), 3)
  65. AssertError(TypeError, (lambda:x()))
  66. AreEqual(xwd(2), 3)
  67. AssertError(TypeError, (lambda:x(1)))
  68. AreEqual(xwd(0,5), 3)
  69. AssertError(TypeError, (lambda:x(0,5)))
  70. AreEqual( (x == "not-a-Function3"), False)
  71. def y(a,b,c,d):
  72. return a+b+c+d
  73. def ywd(a=0, b=1, c=2, d=3):
  74. return a+b+c+d
  75. AreEqual(y, y)
  76. AreEqual(ywd(), 6)
  77. AssertError(TypeError, y)
  78. AreEqual(ywd(4), 10)
  79. AssertError(TypeError, y, 4)
  80. AreEqual(ywd(4,5), 14)
  81. AssertError(TypeError, y, 4, 5)
  82. AreEqual(ywd(4,5,6), 18)
  83. AssertError(TypeError, y, 4,5,6)
  84. AreEqual( (y == "not-a-Function4"), False)
  85. def foo(): "hello world"
  86. AreEqual(foo.__doc__, 'hello world')
  87. ############# coverage #############
  88. # function5
  89. def f1(a=1, b=2, c=3, d=4, e=5): return a * b * c * d * e
  90. def f2(a, b=2, c=3, d=4, e=5): return a * b * c * d * e
  91. def f3(a, b, c=3, d=4, e=5): return a * b * c * d * e
  92. def f4(a, b, c, d=4, e=5): return a * b * c * d * e
  93. def f5(a, b, c, d, e=5): return a * b * c * d * e
  94. def f6(a, b, c, d, e): return a * b * c * d * e
  95. for f in (f1, f2, f3, f4, f5, f6):
  96. AssertError(TypeError, f, 1, 1, 1, 1, 1, 1) # 6 args
  97. AreEqual(f(10,11,12,13,14), 10 * 11 * 12 * 13 * 14) # 5 args
  98. for f in (f1, f2, f3, f4, f5):
  99. AreEqual(f(10,11,12,13), 10 * 11 * 12 * 13 * 5) # 4 args
  100. for f in (f6,):
  101. AssertError(TypeError, f, 1, 1, 1, 1)
  102. for f in (f1, f2, f3, f4):
  103. AreEqual(f(10,11,12), 10 * 11 * 12 * 4 * 5) # 3 args
  104. for f in (f5, f6):
  105. AssertError(TypeError, f, 1, 1, 1)
  106. for f in (f1, f2, f3):
  107. AreEqual(f(10,11), 10 * 11 * 3 * 4 * 5) # 2 args
  108. for f in (f4, f5, f6):
  109. AssertError(TypeError, f, 1, 1)
  110. for f in (f1, f2):
  111. AreEqual(f(10), 10 * 2 * 3 * 4 * 5) # 1 args
  112. for f in (f3, f4, f5, f6):
  113. AssertError(TypeError, f, 1)
  114. for f in (f1,):
  115. AreEqual(f(), 1 * 2 * 3 * 4 * 5) # no args
  116. for f in (f2, f3, f4, f5, f6):
  117. AssertError(TypeError, f)
  118. # method
  119. class C1:
  120. def f0(self): return 0
  121. def f1(self, a): return 1
  122. def f2(self, a, b): return 2
  123. def f3(self, a, b, c): return 3
  124. def f4(self, a, b, c, d): return 4
  125. def f5(self, a, b, c, d, e): return 5
  126. def f6(self, a, b, c, d, e, f): return 6
  127. def f7(self, a, b, c, d, e, f, g): return 7
  128. class C2: pass
  129. c1, c2 = C1(), C2()
  130. line = ""
  131. for i in range(8):
  132. args = ",".join(['1'] * i)
  133. line += "AreEqual(c1.f%d(%s), %d)\n" % (i, args, i)
  134. line += "AreEqual(C1.f%d(c1,%s), %d)\n" % (i, args, i)
  135. #line += "try: C1.f%d(%s) \nexcept TypeError: pass \nelse: raise AssertionError\n" % (i, args)
  136. #line += "try: C1.f%d(c2, %s) \nexcept TypeError: pass \nelse: raise AssertionError\n" % (i, args)
  137. #print line
  138. exec line
  139. def SetAttrOfInstanceMethod():
  140. C1.f0.attr = 1
  141. AssertError(AttributeError, SetAttrOfInstanceMethod)
  142. C1.f0.im_func.attr = 1
  143. AreEqual(C1.f0.attr, 1)
  144. AreEqual(dir(C1.f0).__contains__("attr"), True)
  145. AreEqual(C1.f0.__module__, __name__)
  146. ######################################################################################
  147. from iptest.assert_util import *
  148. def f(x=0, y=10, z=20, *args, **kws):
  149. return (x, y, z), args, kws
  150. Assert(f(10, l=20) == ((10, 10, 20), (), {'l': 20}))
  151. Assert(f(1, *(2,), **{'z':20}) == ((1, 2, 20), (), {}))
  152. Assert(f(*[1,2,3]) == ((1, 2, 3), (), {}))
  153. def a(*args, **kws): return args, kws
  154. def b(*args, **kws):
  155. return a(*args, **kws)
  156. Assert(b(1,2,3, x=10, y=20) == ((1, 2, 3), {'y': 20, 'x': 10}))
  157. def b(*args, **kws):
  158. return a(**kws)
  159. Assert(b(1,2,3, x=10, y=20) == ((), {'y': 20, 'x': 10}))
  160. try:
  161. b(**[])
  162. Assert(False)
  163. except TypeError:
  164. pass
  165. def f(x, *args):
  166. return (x, args)
  167. AreEqual(f(1, *[2]), (1, (2,)))
  168. AreEqual(f(7, *(i for i in range(3))), (7, (0, 1, 2,)))
  169. AreEqual(f(9, *range(11, 13)), (9, (11, 12)))
  170. #verify we can call sorted w/ keyword args
  171. import operator
  172. inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
  173. getcount = operator.itemgetter(1)
  174. sorted_inventory = sorted(inventory, key=getcount)
  175. # verify proper handling of keyword args for python functions
  176. def kwfunc(a,b,c): pass
  177. try:
  178. kwfunc(10, 20, b=30)
  179. Assert(False)
  180. except TypeError:
  181. pass
  182. try:
  183. kwfunc(10, None, b=30)
  184. Assert(False)
  185. except TypeError:
  186. pass
  187. try:
  188. kwfunc(10, None, 40, b=30)
  189. Assert(False)
  190. except TypeError:
  191. pass
  192. if is_cli or is_silverlight:
  193. import System
  194. # Test Hashtable and Dictionary on desktop, and just Dictionary in Silverlight
  195. # (Hashtable is not available)
  196. htlist = [System.Collections.Generic.Dictionary[System.Object, System.Object]()]
  197. if not is_silverlight:
  198. if is_netstandard:
  199. import clr
  200. clr.AddReference("System.Collections.NonGeneric")
  201. htlist += [System.Collections.Hashtable()]
  202. for ht in htlist:
  203. def foo(**kwargs):
  204. return kwargs['key']
  205. ht['key'] = 'xyz'
  206. AreEqual(foo(**ht), 'xyz')
  207. def foo(a,b):
  208. return a-b
  209. AreEqual(foo(b=1, *(2,)), 1)
  210. # kw-args passed to init through method instance
  211. class foo:
  212. def __init__(self, group=None, target=None):
  213. AreEqual(group, None)
  214. AreEqual(target,'baz')
  215. a = foo(target='baz')
  216. foo.__init__(a, target='baz')
  217. # call a params method w/ no params
  218. if is_cli or is_silverlight:
  219. import clr
  220. AreEqual('abc\ndef'.Split()[0], 'abc')
  221. AreEqual('abc\ndef'.Split()[1], 'def')
  222. x = 'a bc def'.Split()
  223. AreEqual(x[0], 'a')
  224. AreEqual(x[1], 'bc')
  225. AreEqual(x[2], '')
  226. AreEqual(x[3], '')
  227. AreEqual(x[4], 'def')
  228. # calling Double.ToString(...) should work - Double is
  229. # an OpsExtensibleType and doesn't define __str__ on this
  230. # overload
  231. AreEqual(System.Double.ToString(1.0, 'f'), '1.00')
  232. ######################################################################################
  233. # Incorrect number of arguments
  234. def f(a): pass
  235. AssertErrorWithMessage(TypeError, "f() takes exactly 1 argument (0 given)", f)
  236. AssertErrorWithMessage(TypeError, "f() takes exactly 1 argument (3 given)", f, 1, 2, 3)
  237. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", f, dummy=2)
  238. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", f, dummy=2)
  239. #AssertError calls f(*args), which generates a different AST than f(1,2,3)
  240. AssertErrorWithMessage(TypeError, "f() takes exactly 1 argument (0 given)", lambda:f())
  241. AssertErrorWithMessage(TypeError, "f() takes exactly 1 argument (3 given)", lambda:f(1, 2, 3))
  242. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", lambda:f(dummy=2))
  243. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", lambda:f(1, dummy=2))
  244. def f(a,b,c,d,e,f,g,h,i,j): pass
  245. AssertErrorWithMessage(TypeError, "f() takes exactly 10 arguments (0 given)", f)
  246. AssertErrorWithMessage(TypeError, "f() takes exactly 10 arguments (3 given)", f, 1, 2, 3)
  247. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", f, dummy=2)
  248. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", f, dummy=2)
  249. AssertErrorWithMessage(TypeError, "f() takes exactly 10 arguments (0 given)", lambda:f())
  250. AssertErrorWithMessage(TypeError, "f() takes exactly 10 arguments (3 given)", lambda:f(1, 2, 3))
  251. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", lambda:f(dummy=2))
  252. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", lambda:f(1, dummy=2))
  253. def f(a, b=2): pass
  254. AssertErrorWithMessage(TypeError, "f() takes at least 1 argument (0 given)", f)
  255. AssertErrorWithMessage(TypeError, "f() takes at most 2 arguments (3 given)", f, 1, 2, 3)
  256. if is_cpython: #CPython bug 9326
  257. AssertErrorWithMessage(TypeError, "f() takes at least 1 argument (1 given)", f, b=2)
  258. else:
  259. AssertErrorWithMessage(TypeError, "f() takes at least 1 non-keyword argument (0 given)", f, b=2)
  260. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", f, dummy=3)
  261. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", f, b=2, dummy=3)
  262. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", f, 1, dummy=3)
  263. AssertErrorWithMessage(TypeError, "f() takes at least 1 argument (0 given)", lambda:f())
  264. AssertErrorWithMessage(TypeError, "f() takes at most 2 arguments (3 given)", lambda:f(1, 2, 3))
  265. if is_cpython: #CPython bug 9326
  266. AssertErrorWithMessage(TypeError, "f() takes at least 1 argument (1 given)", lambda:f(b=2))
  267. else:
  268. AssertErrorWithMessage(TypeError, "f() takes at least 1 non-keyword argument (0 given)", lambda:f(b=2))
  269. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", lambda:f(dummy=3))
  270. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", lambda:f(b=2, dummy=3))
  271. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", lambda:f(1, dummy=3))
  272. def f(a, *argList): pass
  273. AssertErrorWithMessage(TypeError, "f() takes at least 1 argument (0 given)", f)
  274. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", f, dummy=2)
  275. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", f, 1, dummy=2)
  276. AssertErrorWithMessage(TypeError, "f() takes at least 1 argument (0 given)", lambda:f())
  277. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", lambda:f(dummy=2))
  278. AssertErrorWithMessage(TypeError, "f() got an unexpected keyword argument 'dummy'", lambda:f(1, dummy=2))
  279. def f(a, **keywordDict): pass
  280. AssertErrorWithMessage(TypeError, "f() takes exactly 1 argument (0 given)", f)
  281. AssertErrorWithMessage(TypeError, "f() takes exactly 1 argument (3 given)", f, 1, 2, 3)
  282. if is_cpython: #CPython bug 9326
  283. AssertErrorWithMessage(TypeError, "f() takes exactly 1 argument (0 given)", f, dummy=2)
  284. AssertErrorWithMessage(TypeError, "f() takes exactly 1 argument (0 given)", f, dummy=2, dummy2=3)
  285. else:
  286. AssertErrorWithMessage(TypeError, "f() takes exactly 1 non-keyword argument (0 given)", f, dummy=2)
  287. AssertErrorWithMessage(TypeError, "f() takes exactly 1 non-keyword argument (0 given)", f, dummy=2, dummy2=3)
  288. AssertErrorWithMessage(TypeError, "f() takes exactly 1 argument (0 given)", lambda:f())
  289. AssertErrorWithMessage(TypeError, "f() takes exactly 1 argument (3 given)", lambda:f(1, 2, 3))
  290. if is_cpython: #CPython bug 9326
  291. AssertErrorWithMessage(TypeError, "f() takes exactly 1 argument (0 given)", lambda:f(dummy=2))
  292. AssertErrorWithMessage(TypeError, "f() takes exactly 1 argument (0 given)", lambda:f(dummy=2, dummy2=3))
  293. else:
  294. AssertErrorWithMessage(TypeError, "f() takes exactly 1 non-keyword argument (0 given)", lambda:f(dummy=2))
  295. AssertErrorWithMessage(TypeError, "f() takes exactly 1 non-keyword argument (0 given)", lambda:f(dummy=2, dummy2=3))
  296. AssertErrorWithMessages(TypeError, "abs() takes exactly 1 argument (0 given)",
  297. "abs() takes exactly one argument (0 given)", abs)
  298. AssertErrorWithMessages(TypeError, "abs() takes exactly 1 argument (3 given)",
  299. "abs() takes exactly one argument (3 given)", abs, 1, 2, 3)
  300. AssertErrorWithMessages(TypeError, "abs() got an unexpected keyword argument 'dummy'",
  301. "abs() takes no keyword arguments", abs, dummy=2)
  302. AssertErrorWithMessages(TypeError, "abs() takes exactly 1 argument (2 given)",
  303. "abs() takes no keyword arguments", abs, 1, dummy=2)
  304. AssertErrorWithMessages(TypeError, "abs() takes exactly 1 argument (0 given)",
  305. "abs() takes exactly one argument (0 given)", lambda:abs())
  306. AssertErrorWithMessages(TypeError, "abs() takes exactly 1 argument (3 given)",
  307. "abs() takes exactly one argument (3 given)", lambda:abs(1, 2, 3))
  308. AssertErrorWithMessages(TypeError, "abs() got an unexpected keyword argument 'dummy'",
  309. "abs() takes no keyword arguments", lambda:abs(dummy=2))
  310. AssertErrorWithMessages(TypeError, "abs() takes exactly 1 argument (2 given)",
  311. "abs() takes no keyword arguments", lambda:abs(1, dummy=2))
  312. # list([m]) has one default argument (built-in type)
  313. #AssertErrorWithMessage(TypeError, "list() takes at most 1 argument (2 given)", list, 1, 2)
  314. #AssertErrorWithMessage(TypeError, "'dummy' is an invalid keyword argument for this function", apply, list, [], dict({"dummy":2}))
  315. #======== BUG 697 ===========
  316. #AssertErrorWithMessage(TypeError, "'dummy' is an invalid keyword argument for this function", apply, list, [1], dict({"dummy":2}))
  317. # complex([x,y]) has two default argument (OpsReflectedType type)
  318. #AssertErrorWithMessage(TypeError, "complex() takes at most 2 arguments (3 given)", complex, 1, 2, 3)
  319. #AssertErrorWithMessage(TypeError, "'dummy' is an invalid keyword argument for this function", apply, complex, [], dict({"dummy":2}))
  320. #AssertErrorWithMessage(TypeError, "'dummy' is an invalid keyword argument for this function", apply, complex, [1], dict({"dummy":2}))
  321. # bool([x]) has one default argument (OpsReflectedType and valuetype type)
  322. #AssertErrorWithMessage(TypeError, "bool() takes at most 1 argument (2 given)", bool, 1, 2)
  323. #AssertErrorWithMessage(TypeError, "'dummy' is an invalid keyword argument for this function", apply, bool, [], dict({"dummy":2}))
  324. #AssertErrorWithMessage(TypeError, "'dummy' is an invalid keyword argument for this function", apply, bool, [1], dict({"dummy":2}))
  325. class UserClass(object): pass
  326. AssertErrorWithMessage(TypeError, "object.__new__() takes no parameters", UserClass, 1)
  327. AssertErrorWithMessage(TypeError, "object.__new__() takes no parameters", apply, UserClass, [], dict({"dummy":2}))
  328. class OldStyleClass: pass
  329. AssertErrorWithMessage(TypeError, "this constructor takes no arguments", OldStyleClass, 1)
  330. AssertErrorWithMessage(TypeError, "this constructor takes no arguments", apply, OldStyleClass, [], dict({"dummy":2}))
  331. ###############################################################################################
  332. # accepts / returns runtype type checking tests
  333. if is_cli or is_silverlight:
  334. import clr
  335. @clr.accepts(object)
  336. def foo(x):
  337. return x
  338. AreEqual(foo('abc'), 'abc')
  339. AreEqual(foo(2), 2)
  340. AreEqual(foo(2L), 2L)
  341. AreEqual(foo(2.0), 2.0)
  342. AreEqual(foo(True), True)
  343. @clr.accepts(str)
  344. def foo(x):
  345. return x
  346. AreEqual(foo('abc'), 'abc')
  347. AssertError(AssertionError, foo, 2)
  348. AssertError(AssertionError, foo, 2L)
  349. AssertError(AssertionError, foo, 2.0)
  350. AssertError(AssertionError, foo, True)
  351. @clr.accepts(str, bool)
  352. def foo(x, y):
  353. return x, y
  354. AreEqual(foo('abc', True), ('abc', True))
  355. AssertError(AssertionError, foo, ('abc',2))
  356. AssertError(AssertionError, foo, ('abc',2L))
  357. AssertError(AssertionError, foo, ('abc',2.0))
  358. class bar:
  359. @clr.accepts(clr.Self(), str)
  360. def foo(self, x):
  361. return x
  362. a = bar()
  363. AreEqual(a.foo('xyz'), 'xyz')
  364. AssertError(AssertionError, a.foo, 2)
  365. AssertError(AssertionError, a.foo, 2L)
  366. AssertError(AssertionError, a.foo, 2.0)
  367. AssertError(AssertionError, a.foo, True)
  368. @clr.returns(str)
  369. def foo(x):
  370. return x
  371. AreEqual(foo('abc'), 'abc')
  372. AssertError(AssertionError, foo, 2)
  373. AssertError(AssertionError, foo, 2L)
  374. AssertError(AssertionError, foo, 2.0)
  375. AssertError(AssertionError, foo, True)
  376. @clr.accepts(bool)
  377. @clr.returns(str)
  378. def foo(x):
  379. if x: return str(x)
  380. else: return 0
  381. AreEqual(foo(True), 'True')
  382. AssertError(AssertionError, foo, 2)
  383. AssertError(AssertionError, foo, 2)
  384. AssertError(AssertionError, foo, False)
  385. @clr.returns(None)
  386. def foo(): pass
  387. AreEqual(foo(), None)
  388. try:
  389. buffer()
  390. except TypeError, e:
  391. # make sure we get the right type name when calling w/ wrong # of args
  392. AreEqual(str(e)[:8], 'buffer()')
  393. #try:
  394. # list(1,2,3)
  395. #except TypeError, e:
  396. # make sure we get the right type name when calling w/ wrong # of args
  397. # AreEqual(str(e)[:6], 'list()')
  398. # oldinstance
  399. class foo:
  400. def bar(self): pass
  401. def bar1(self, xyz): pass
  402. class foo2: pass
  403. class foo3(object): pass
  404. AssertError(TypeError, foo.bar)
  405. AssertError(TypeError, foo.bar1, None, None)
  406. AssertError(TypeError, foo.bar1, None, 'abc')
  407. AssertError(TypeError, foo.bar1, 'xyz', 'abc')
  408. AssertError(TypeError, foo.bar, foo2())
  409. AssertError(TypeError, foo.bar, foo3())
  410. # usertype
  411. class foo(object):
  412. def bar(self): pass
  413. def bar1(self, xyz): pass
  414. AssertError(TypeError, foo.bar)
  415. AssertError(TypeError, foo.bar1, None, None)
  416. AssertError(TypeError, foo.bar1, None, 'abc')
  417. AssertError(TypeError, foo.bar1, 'xyz', 'abc')
  418. AssertError(TypeError, foo.bar, foo2())
  419. AssertError(TypeError, foo.bar, foo3())
  420. # access a method w/ caller context w/ an args parameter.
  421. def foo(*args):
  422. return hasattr(*args)
  423. AreEqual(foo('', 'index'), True)
  424. # dispatch to a ReflectOptimized method
  425. if is_cli:
  426. from iptest.console_util import IronPythonInstance
  427. from System import Environment
  428. from sys import executable
  429. wkdir = testpath.public_testdir
  430. if "-X:LightweightScopes" in Environment.GetCommandLineArgs():
  431. ipi = IronPythonInstance(executable, wkdir, "-X:LightweightScopes", "-X:BasicConsole")
  432. else:
  433. ipi = IronPythonInstance(executable, wkdir, "-X:BasicConsole")
  434. if (ipi.Start()):
  435. result = ipi.ExecuteLine("from iptest.assert_util import *")
  436. result = ipi.ExecuteLine("load_iron_python_test()")
  437. result = ipi.ExecuteLine("from IronPythonTest import DefaultParams")
  438. response = ipi.ExecuteLine("DefaultParams.FuncWithDefaults(1100, z=82)")
  439. AreEqual(response, '1184')
  440. ipi.End()
  441. p = ((1, 2),)
  442. AreEqual(zip(*(p * 10)), [(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), (2, 2, 2, 2, 2, 2, 2, 2, 2, 2)])
  443. AreEqual(zip(*(p * 10)), [(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), (2, 2, 2, 2, 2, 2, 2, 2, 2, 2)])
  444. class A(object): pass
  445. class B(A): pass
  446. #unbound super
  447. for x in [super(B), super(B,None)]:
  448. AreEqual(x.__thisclass__, B)
  449. AreEqual(x.__self__, None)
  450. AreEqual(x.__self_class__, None)
  451. # super w/ both types
  452. x = super(B,B)
  453. AreEqual(x.__thisclass__,B)
  454. AreEqual(x.__self_class__, B)
  455. AreEqual(x.__self__, B)
  456. # super w/ type and instance
  457. b = B()
  458. x = super(B, b)
  459. AreEqual(x.__thisclass__,B)
  460. AreEqual(x.__self_class__, B)
  461. AreEqual(x.__self__, b)
  462. # super w/ mixed types
  463. x = super(A,B)
  464. AreEqual(x.__thisclass__,A)
  465. AreEqual(x.__self_class__, B)
  466. AreEqual(x.__self__, B)
  467. # invalid super cases
  468. try:
  469. x = super(B, 'abc')
  470. AssertUnreachable()
  471. except TypeError:
  472. pass
  473. try:
  474. super(B,A)
  475. AssertUnreachable()
  476. except TypeError:
  477. pass
  478. class A(object):
  479. def __init__(self, name):
  480. self.__name__ = name
  481. def meth(self):
  482. return self.__name__
  483. classmeth = classmethod(meth)
  484. class B(A): pass
  485. b = B('derived')
  486. AreEqual(super(B,b).__thisclass__.__name__, 'B')
  487. AreEqual(super(B,b).__self__.__name__, 'derived')
  488. AreEqual(super(B,b).__self_class__.__name__, 'B')
  489. AreEqual(super(B,b).classmeth(), 'B')
  490. # descriptor supper
  491. class A(object):
  492. def meth(self): return 'A'
  493. class B(A):
  494. def meth(self):
  495. return 'B' + self.__super.meth()
  496. B._B__super = super(B)
  497. b = B()
  498. AreEqual(b.meth(), 'BA')
  499. #################################
  500. # class method calls - class method should get
  501. # correct meta class.
  502. class D(object):
  503. @classmethod
  504. def classmeth(cls): pass
  505. AreEqual(D.classmeth.im_class, type)
  506. class MetaType(type): pass
  507. class D(object):
  508. __metaclass__ = MetaType
  509. @classmethod
  510. def classmeth(cls): pass
  511. AreEqual(D.classmeth.im_class, MetaType)
  512. #####################################################################################
  513. from iptest.assert_util import *
  514. if is_cli or is_silverlight:
  515. from _collections import *
  516. else:
  517. from collections import *
  518. global init
  519. def Assert(val):
  520. if val == False:
  521. raise TypeError, "assertion failed"
  522. def runTest(testCase):
  523. global typeMatch
  524. global init
  525. class foo(testCase.subtype):
  526. def __new__(cls, param):
  527. ret = testCase.subtype.__new__(cls, param)
  528. Assert(ret == testCase.newEq)
  529. Assert((ret != testCase.newEq) != True)
  530. return ret
  531. def __init__(self, param):
  532. testCase.subtype.__init__(self, param)
  533. Assert(self == testCase.initEq)
  534. Assert((self != testCase.initEq) != True)
  535. a = foo(testCase.param)
  536. Assert((type(a) == foo) == testCase.match)
  537. class TestCase(object):
  538. __slots__ = ['subtype', 'newEq', 'initEq', 'match', 'param']
  539. def __init__(self, subtype, newEq, initEq, match, param):
  540. self.match = match
  541. self.subtype = subtype
  542. self.newEq = newEq
  543. self.initEq = initEq
  544. self.param = param
  545. cases = [TestCase(int, 2, 2, True, 2),
  546. TestCase(list, [], [2,3,4], True, (2,3,4)),
  547. TestCase(deque, deque(), deque((2,3,4)), True, (2,3,4)),
  548. TestCase(set, set(), set((2,3,4)), True, (2,3,4)),
  549. TestCase(frozenset, frozenset((2,3,4)), frozenset((2,3,4)), True, (2,3,4)),
  550. TestCase(tuple, (2,3,4), (2,3,4), True, (2,3,4)),
  551. TestCase(str, 'abc', 'abc', True, 'abc'),
  552. TestCase(float, 2.3, 2.3, True, 2.3),
  553. TestCase(type, type(object), type(object), False, object),
  554. TestCase(long, 10000000000L, 10000000000L, True, 10000000000L),
  555. #TestCase(complex, complex(2.0, 0), complex(2.0, 0), True, 2.0), # complex is currently a struct w/ no extensibel, we fail here
  556. # TestCase(file, 'abc', True), # ???
  557. ]
  558. for case in cases:
  559. runTest(case)
  560. # verify we can call the base init directly
  561. if is_cli and not is_netstandard and not is_posix: # no System.Windows.Forms in netstandard
  562. import clr
  563. clr.AddReferenceByPartialName('System.Windows.Forms')
  564. from System.Windows.Forms import *
  565. class MyForm(Form):
  566. def __init__(self, title):
  567. Form.__init__(self)
  568. self.Text = title
  569. a = MyForm('abc')
  570. AreEqual(a.Text, 'abc')
  571. #TestCase(bool, True, True), # not an acceptable base type
  572. def test_func_flags():
  573. def foo0(): pass
  574. def foo1(*args): pass
  575. def foo2(**args): pass
  576. def foo3(*args, **kwargs): pass
  577. def foo4(a): pass
  578. def foo5(a, *args): pass
  579. def foo6(a, **args): pass
  580. def foo7(a, *args, **kwargs): pass
  581. def foo8(a,b,c,d,e,f): pass
  582. def foo9(a,b): pass
  583. AreEqual(foo0.func_code.co_flags & 12, 0)
  584. AreEqual(foo1.func_code.co_flags & 12, 4)
  585. AreEqual(foo2.func_code.co_flags & 12, 8)
  586. AreEqual(foo3.func_code.co_flags & 12, 12)
  587. AreEqual(foo4.func_code.co_flags & 12, 0)
  588. AreEqual(foo5.func_code.co_flags & 12, 4)
  589. AreEqual(foo6.func_code.co_flags & 12, 8)
  590. AreEqual(foo7.func_code.co_flags & 12, 12)
  591. AreEqual(foo8.func_code.co_flags & 12, 0)
  592. AreEqual(foo9.func_code.co_flags & 12, 0)
  593. AreEqual(foo0.func_code.co_argcount, 0)
  594. AreEqual(foo1.func_code.co_argcount, 0)
  595. AreEqual(foo2.func_code.co_argcount, 0)
  596. AreEqual(foo3.func_code.co_argcount, 0)
  597. AreEqual(foo4.func_code.co_argcount, 1)
  598. AreEqual(foo5.func_code.co_argcount, 1)
  599. AreEqual(foo6.func_code.co_argcount, 1)
  600. AreEqual(foo7.func_code.co_argcount, 1)
  601. AreEqual(foo8.func_code.co_argcount, 6)
  602. AreEqual(foo9.func_code.co_argcount, 2)
  603. def test_big_calls():
  604. # check various function call sizes and boundaries
  605. sizes = [3, 4, 5, 7, 8, 9, 13, 15, 16, 17, 23, 24, 25, 31, 32, 33, 47, 48, 49, 63, 64, 65, 127, 128, 129, 254, 255, 256, 257, 258, 511, 512, 513]
  606. # mono has a limitation of < 1023
  607. if not is_mono:
  608. sizes.extend([1023, 1024, 1025, 2047, 2048, 2049])
  609. for size in sizes:
  610. # w/o defaults
  611. exec 'def f(' + ','.join(['a' + str(i) for i in range(size)]) + '): return ' + ','.join(['a' + str(i) for i in range(size)])
  612. # w/ defaults
  613. exec 'def g(' + ','.join(['a' + str(i) + '=' + str(i) for i in range(size)]) + '): return ' + ','.join(['a' + str(i) for i in range(size)])
  614. if (size <= 255 or is_cli) and not is_netstandard or size <= 13: # PlatformNotSupportedException when > 13
  615. # CPython allows function definitions > 255, but not calls w/ > 255 params.
  616. exec 'a = f(' + ', '.join([str(x) for x in xrange(size)]) + ')'
  617. AreEqual(a, tuple(xrange(size)))
  618. exec 'a = g()'
  619. AreEqual(a, tuple(xrange(size)))
  620. exec 'a = g(' + ', '.join([str(x) for x in xrange(size)]) + ')'
  621. AreEqual(a, tuple(xrange(size)))
  622. exec 'a = f(*(' + ', '.join([str(x) for x in xrange(size)]) + '))'
  623. AreEqual(a, tuple(xrange(size)))
  624. def test_compile():
  625. x = compile("print 2/3", "<string>", "exec", 8192)
  626. Assert((x.co_flags & 8192) == 8192)
  627. x = compile("2/3", "<string>", "eval", 8192)
  628. AreEqual(eval(x), 2.0 / 3.0)
  629. names = [ "", ".", "1", "\n", " ", "@", "%^",
  630. "a", "A", "Abc", "aBC", "filename.py",
  631. "longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong",
  632. """
  633. stuff
  634. more stuff
  635. last stuff
  636. """
  637. ]
  638. for name in names:
  639. AreEqual(compile("print 2/3", name, "exec", 8192).co_filename,
  640. name)
  641. def test_filename():
  642. c = compile("x = 2", "test", "exec")
  643. AreEqual(c.co_filename, 'test')
  644. def test_name():
  645. def f(): pass
  646. f.__name__ = 'g'
  647. AreEqual(f.__name__, 'g')
  648. Assert(repr(f).startswith('<function g'))
  649. f.func_name = 'x'
  650. AreEqual(f.__name__, 'x')
  651. Assert(repr(f).startswith('<function x'))
  652. def test_argcount():
  653. def foo0(): pass
  654. def foo1(*args): pass
  655. def foo2(**args): pass
  656. def foo3(*args, **kwargs): pass
  657. def foo4(a): pass
  658. def foo5(a, *args): pass
  659. def foo6(a, **args): pass
  660. def foo7(a, *args, **kwargs): pass
  661. def foo8(a,b,c,d,e,f): pass
  662. def foo9(a,b): pass
  663. AreEqual(foo0.func_code.co_argcount, 0)
  664. AreEqual(foo1.func_code.co_argcount, 0)
  665. AreEqual(foo2.func_code.co_argcount, 0)
  666. AreEqual(foo3.func_code.co_argcount, 0)
  667. AreEqual(foo4.func_code.co_argcount, 1)
  668. AreEqual(foo5.func_code.co_argcount, 1)
  669. AreEqual(foo6.func_code.co_argcount, 1)
  670. AreEqual(foo7.func_code.co_argcount, 1)
  671. AreEqual(foo8.func_code.co_argcount, 6)
  672. AreEqual(foo9.func_code.co_argcount, 2)
  673. def test_defaults():
  674. defaults = [None, object, int, [], 3.14, [3.14], (None,), "a string"]
  675. for default in defaults:
  676. def helperFunc(): pass
  677. AreEqual(helperFunc.func_defaults, None)
  678. AreEqual(helperFunc.func_defaults, None)
  679. def helperFunc1(a): pass
  680. AreEqual(helperFunc1.func_defaults, None)
  681. AreEqual(helperFunc1.func_defaults, None)
  682. def helperFunc2(a=default): pass
  683. AreEqual(helperFunc2.func_defaults, (default,))
  684. helperFunc2(a=7)
  685. AreEqual(helperFunc2.func_defaults, (default,))
  686. def helperFunc3(a, b=default, c=[42]): c.append(b)
  687. AreEqual(helperFunc3.func_defaults, (default, [42]))
  688. helperFunc3("stuff")
  689. AreEqual(helperFunc3.func_defaults, (default, [42, default]))
  690. def test_splat_defaults():
  691. def g(a, b, x=None):
  692. return a, b, x
  693. def f(x, *args):
  694. return g(x, *args)
  695. AreEqual(f(1, *(2,)), (1,2,None))
  696. def test_argument_eval_order():
  697. """Check order of evaluation of function arguments"""
  698. x = [1]
  699. def noop(a, b, c):
  700. pass
  701. noop(x.append(2), x.append(3), x.append(4))
  702. AreEqual(x, [1,2,3,4])
  703. def test_method_attr_access():
  704. class foo(object):
  705. def f(self): pass
  706. abc = 3
  707. method = type(foo.f)
  708. AreEqual(method(foo, 'abc').abc, 3)
  709. @skip("interpreted") # we don't have FuncEnv's in interpret modes so this always returns None
  710. def test_function_closure_negative():
  711. def f(): pass
  712. for assignment_val in [None, 1, "a string"]:
  713. try:
  714. f.func_closure = assignment_val
  715. AssertUnreachable("func_closure is a read-only attribute of functions")
  716. except TypeError, e:
  717. pass
  718. def test_paramless_function_call_error():
  719. def f(): pass
  720. try:
  721. f(*(1, ))
  722. AssertUnreachable()
  723. except TypeError: pass
  724. try:
  725. f(**{'abc':'def'})
  726. AssertUnreachable()
  727. except TypeError: pass
  728. def test_function_closure():
  729. def f(): pass
  730. AreEqual(f.func_closure, None)
  731. def f():
  732. def g(): pass
  733. return g
  734. AreEqual(f().func_closure, None)
  735. def f():
  736. x = 4
  737. def g(): return x
  738. return g
  739. AreEqual(sorted([x.cell_contents for x in f().func_closure]), [4])
  740. def f():
  741. x = 4
  742. def g():
  743. y = 5
  744. def h(): return x,y
  745. return h
  746. return g()
  747. AreEqual(sorted([x.cell_contents for x in f().func_closure]), [4, 5])
  748. # don't use z
  749. def f():
  750. x = 4
  751. def g():
  752. y = 5
  753. z = 7
  754. def h(): return x,y
  755. return h
  756. return g()
  757. AreEqual(sorted([x.cell_contents for x in f().func_closure]), [4, 5])
  758. def f():
  759. x = 4
  760. def g():
  761. y = 5
  762. z = 7
  763. def h(): return x,y,z
  764. return h
  765. return g()
  766. AreEqual(sorted([x.cell_contents for x in f().func_closure]), [4, 5, 7])
  767. def f():
  768. x = 4
  769. a = 9
  770. def g():
  771. y = 5
  772. z = 7
  773. def h(): return x,y
  774. return h
  775. return g()
  776. AreEqual(sorted([x.cell_contents for x in f().func_closure]), [4, 5])
  777. # closure cells are not recreated
  778. callRes = f()
  779. a = sorted([id(x) for x in callRes.func_closure])
  780. b = sorted([id(x) for x in callRes.func_closure])
  781. AreEqual(a, b)
  782. def f():
  783. x = 4
  784. a = 9
  785. def g():
  786. y = 5
  787. z = 7
  788. def h(): return x,y,a,z
  789. return h
  790. return g()
  791. AreEqual(sorted([x.cell_contents for x in f().func_closure]), [4, 5, 7, 9])
  792. AssertError(TypeError, hash, f().func_closure[0])
  793. def f():
  794. x = 5
  795. def g():
  796. return x
  797. return g
  798. def h():
  799. x = 5
  800. def g():
  801. return x
  802. return g
  803. def j():
  804. x = 6
  805. def g():
  806. return x
  807. return g
  808. AreEqual(f().func_closure[0], h().func_closure[0])
  809. Assert(f().func_closure[0] != j().func_closure[0])
  810. # <cell at 45: int object at 44>
  811. Assert(repr(f().func_closure[0]).startswith('<cell at '))
  812. Assert(repr(f().func_closure[0]).find(': int object at ') != -1)
  813. def test_func_code():
  814. def foo(): pass
  815. def assign(): foo.func_code = None
  816. AssertError(TypeError, assign)
  817. def def_func_doc():
  818. foo.func_doc = 'abc'
  819. AreEqual(foo.__doc__, 'abc')
  820. foo.__doc__ = 'def'
  821. AreEqual(foo.func_doc, 'def')
  822. foo.func_doc = None
  823. AreEqual(foo.__doc__, None)
  824. AreEqual(foo.func_doc, None)
  825. def test_func_defaults():
  826. def f(a, b): return (a, b)
  827. f.func_defaults = (1,2)
  828. AreEqual(f(), (1,2))
  829. f.func_defaults = (1,2,3,4)
  830. AreEqual(f(), (3,4))
  831. f.func_defaults = None
  832. AssertError(TypeError, f)
  833. f.func_defaults = (1,2)
  834. AreEqual(f.func_defaults, (1,2))
  835. del f.func_defaults
  836. AreEqual(f.func_defaults, None)
  837. del f.func_defaults
  838. AreEqual(f.func_defaults, None)
  839. def func_with_many_args(one, two, three, four, five, six, seven, eight, nine, ten, eleven=None, twelve=None, thirteen=None, fourteen=None, fifteen=None, sixteen=None, seventeen=None, eighteen=None, nineteen=None):
  840. print 'hello'
  841. func_with_many_args(None, None, None, None, None, None, None, None, None, None)
  842. def test_func_dict():
  843. def f(): pass
  844. f.abc = 123
  845. AreEqual(f.func_dict, {'abc': 123})
  846. f.func_dict = {'def': 'def'}
  847. AreEqual(hasattr(f, 'def'), True)
  848. AreEqual(getattr(f, 'def'), 'def')
  849. f.func_dict = {}
  850. AreEqual(hasattr(f, 'abc'), False)
  851. AreEqual(hasattr(f, 'def'), False)
  852. AssertError(TypeError, lambda : delattr(f, 'func_dict'))
  853. AssertError(TypeError, lambda : delattr(f, '__dict__'))
  854. def test_method():
  855. class C:
  856. def method(self): pass
  857. method = type(C.method)(id, None, 'abc')
  858. AreEqual(method.im_class, 'abc')
  859. class myobj:
  860. def __init__(self, val):
  861. self.val = val
  862. self.called = []
  863. def __hash__(self):
  864. self.called.append('hash')
  865. return hash(self.val)
  866. def __eq__(self, other):
  867. self.called.append('eq')
  868. return self.val == other.val
  869. def __call__(*args): pass
  870. func1, func2 = myobj(2), myobj(2)
  871. inst1, inst2 = myobj(3), myobj(3)
  872. method = type(C().method)
  873. m1 = method(func1, inst1)
  874. m2 = method(func2, inst2)
  875. AreEqual(m1, m2)
  876. Assert('eq' in func1.called)
  877. Assert('eq' in inst1.called)
  878. hash(m1)
  879. Assert('hash' in func1.called)
  880. Assert('hash' in inst1.called)
  881. def test_function_type():
  882. def f1(): pass
  883. def f2(a): pass
  884. def f3(a, b, c): pass
  885. def f4(*a, **b): pass
  886. def decorator(f): return f
  887. @decorator
  888. def f5(a): pass
  889. for x in [ f2, f3, f4, f5]:
  890. AreEqual(type(f1), type(x))
  891. def test_name_mangled_params():
  892. def f1(__a): pass
  893. def f2(__a): return __a
  894. def f3(a, __a): return __a
  895. def f4(_a, __a): return _a + __a
  896. f1("12")
  897. AreEqual(f2("hello"), "hello")
  898. AreEqual(f3("a","b"), "b")
  899. AreEqual(f4("a","b"), "ab")
  900. def test_splat_none():
  901. def f(*args): pass
  902. def g(**kwargs): pass
  903. def h(*args, **kwargs): pass
  904. #CodePlex 20250
  905. AssertErrorWithMessage(TypeError, "f() argument after * must be a sequence, not NoneType",
  906. lambda : f(*None))
  907. AssertErrorWithMessage(TypeError, "g() argument after ** must be a mapping, not NoneType",
  908. lambda : g(**None))
  909. AssertErrorWithMessage(TypeError, "h() argument after ** must be a mapping, not NoneType",
  910. lambda : h(*None, **None))
  911. def test_exec_funccode():
  912. # can't exec a func code w/ parameters
  913. def f(a, b, c): print a, b, c
  914. AssertError(TypeError, lambda : eval(f.func_code))
  915. # can exec *args/**args
  916. def f(*args): pass
  917. exec f.func_code in {}, {}
  918. def f(*args, **kwargs): pass
  919. exec f.func_code in {}, {}
  920. # can't exec function which closes over vars
  921. def f():
  922. x = 2
  923. def g():
  924. print x
  925. return g.func_code
  926. AssertError(TypeError, lambda : eval(f()))
  927. def test_exec_funccode_filename():
  928. import sys
  929. mod = type(sys)('fake_mod_name')
  930. mod.__file__ = 'some file'
  931. exec "def x(): pass" in mod.__dict__
  932. AreEqual(mod.x.func_code.co_filename, '<string>')
  933. # defined globally because unqualified exec isn't allowed in
  934. # a nested function.
  935. def unqualified_exec():
  936. print x
  937. exec ""
  938. def test_func_code_variables():
  939. def CompareCodeVars(code, varnames, names, freevars, cellvars):
  940. AreEqual(code.co_varnames, varnames)
  941. AreEqual(code.co_names, names)
  942. AreEqual(code.co_freevars, freevars)
  943. AreEqual(code.co_cellvars, cellvars)
  944. # simple local
  945. def f():
  946. a = 2
  947. CompareCodeVars(f.func_code, ('a', ), (), (), ())
  948. # closed over var
  949. def f():
  950. a = 2
  951. def g():
  952. print a
  953. return g
  954. CompareCodeVars(f.func_code, ('g', ), (), (), ('a', ))
  955. CompareCodeVars(f().func_code, (), (), ('a', ), ())
  956. # tuple parameters
  957. def f((a, b)): pass
  958. CompareCodeVars(f.func_code, ('.0', 'a', 'b'), (), (), ())
  959. def f((a, b), (c, d)): pass
  960. CompareCodeVars(f.func_code, ('.0', '.1', 'a', 'b', 'c', 'd'), (), (), ())
  961. # explicitly marked global
  962. def f():
  963. global a
  964. a = 2
  965. CompareCodeVars(f.func_code, (), ('a', ), (), ())
  966. # implicit global
  967. def f():
  968. print some_global
  969. CompareCodeVars(f.func_code, (), ('some_global', ), (), ())
  970. # global that's been "closed over"
  971. def f():
  972. global a
  973. a = 2
  974. def g():
  975. print a
  976. return g
  977. CompareCodeVars(f.func_code, ('g', ), ('a', ), (), ())
  978. CompareCodeVars(f().func_code, (), ('a', ), (), ())
  979. # multi-depth closure
  980. def f():
  981. a = 2
  982. def g():
  983. x = a
  984. def h():
  985. y = a
  986. return h
  987. return g
  988. CompareCodeVars(f.func_code, ('g', ), (), (), ('a', ))
  989. CompareCodeVars(f().func_code, ('x', 'h'), (), ('a', ), ())
  990. CompareCodeVars(f()().func_code, ('y', ), (), ('a', ), ())
  991. # multi-depth closure 2
  992. def f():
  993. a = 2
  994. def g():
  995. def h():
  996. y = a
  997. return h
  998. return g
  999. CompareCodeVars(f.func_code, ('g', ), (), (), ('a', ))
  1000. CompareCodeVars(f().func_code, ('h', ), (), ('a', ), ())
  1001. CompareCodeVars(f()().func_code, ('y', ), (), ('a', ), ())
  1002. # closed over parameter
  1003. def f(a):
  1004. def g():
  1005. return a
  1006. return g
  1007. CompareCodeVars(f.func_code, ('a', 'g'), (), (), ('a', ))
  1008. CompareCodeVars(f(42).func_code, (), (), ('a', ), ())
  1009. AreEqual(unqualified_exec.func_code.co_names, ('x', ))
  1010. def test_delattr():
  1011. def f(): pass
  1012. f.abc = 42
  1013. del f.abc
  1014. def g(): f.abc
  1015. AssertError(AttributeError, g)
  1016. def copyfunc(f, name):
  1017. return FunctionType(f.func_code, f.func_globals, name, f.func_defaults, f.func_closure)
  1018. def test_cp35180():
  1019. def foo():
  1020. return 13
  1021. def bar():
  1022. return 42
  1023. dpf = copyfunc(foo, "dpf")
  1024. AreEqual(dpf(), 13)
  1025. foo.func_code = bar.func_code
  1026. AreEqual(foo(), 42)
  1027. AreEqual(dpf(), 13)
  1028. AreEqual(foo.__module__, '__main__')
  1029. AreEqual(dpf.__module__, '__main__')
  1030. def substitute_globals(f, name, globals):
  1031. return FunctionType(f.func_code, globals, name, f.func_defaults, f.func_closure)
  1032. global_variable = 13
  1033. def test_cp34932():
  1034. def get_global_variable():
  1035. return global_variable
  1036. def set_global_variable(v):
  1037. global global_variable
  1038. global_variable = v
  1039. alt_globals = {'global_variable' : 66 }
  1040. get_global_variable_x = substitute_globals(get_global_variable, "get_global_variable_x", alt_globals)
  1041. set_global_variable_x = substitute_globals(set_global_variable, "set_global_variable_x", alt_globals)
  1042. AreEqual(get_global_variable(), 13)
  1043. AreEqual(get_global_variable_x(), 66)
  1044. AreEqual(get_global_variable(), 13)
  1045. set_global_variable_x(7)
  1046. AreEqual(get_global_variable_x(), 7)
  1047. AreEqual(get_global_variable(), 13)
  1048. AreEqual(get_global_variable_x.__module__, None)
  1049. AreEqual(set_global_variable_x.__module__, None)
  1050. get_global_variable_y = substitute_globals(get_global_variable, "get_global_variable_x", globals())
  1051. AreEqual(get_global_variable_y(), 13)
  1052. AreEqual(get_global_variable_y.__module__, '__main__')
  1053. def test_issue1351():
  1054. class X(object):
  1055. def __init__(self, res):
  1056. self.called = []
  1057. self.res = res
  1058. def __eq__(self, other):
  1059. self.called.append('eq')
  1060. return self.res
  1061. def foo(self):
  1062. pass
  1063. a = X(True)
  1064. b = X(False)
  1065. AreEqual(a.foo, a.foo)
  1066. AssertDoesNotContain(a.called, 'eq')
  1067. AreEqual(a.foo, b.foo)
  1068. AssertContains(a.called, 'eq')
  1069. AreEqual(b.foo, b.foo)
  1070. AssertDoesNotContain(b.called, 'eq')
  1071. AreNotEqual(b.foo, a.foo)
  1072. AssertContains(b.called, 'eq')
  1073. def create_fn_with_closure():
  1074. x=13
  1075. def f():
  1076. return x
  1077. return f
  1078. def test_function_type():
  1079. fn_with_closure = create_fn_with_closure()
  1080. def fn_no_closure():
  1081. pass
  1082. AssertError(NotImplementedError, copyfunc, fn_with_closure, "new_fn_name")
  1083. AssertError(NotImplementedError, FunctionType, fn_with_closure.func_code,
  1084. fn_with_closure.func_globals, "name", fn_with_closure.func_defaults)
  1085. AssertError(NotImplementedError, FunctionType, fn_with_closure.func_code,
  1086. fn_with_closure.func_globals, "name", fn_with_closure.func_defaults,
  1087. fn_with_closure.func_closure)
  1088. AssertError(NotImplementedError, FunctionType, fn_no_closure.func_code,
  1089. fn_no_closure.func_globals, "name", fn_no_closure.func_defaults,
  1090. fn_with_closure.func_closure)
  1091. run_test(__name__)