From: <fwi...@us...> - 2009-03-03 01:24:07
|
Revision: 6061 http://jython.svn.sourceforge.net/jython/?rev=6061&view=rev Author: fwierzbicki Date: 2009-03-03 01:24:04 +0000 (Tue, 03 Mar 2009) Log Message: ----------- Merged in tests of mapping in exec and eval written by Mehendran in Issue1815116. Thanks Mehendran! Modified Paths: -------------- trunk/jython/Lib/test/test_builtin_jy.py Modified: trunk/jython/Lib/test/test_builtin_jy.py =================================================================== --- trunk/jython/Lib/test/test_builtin_jy.py 2009-03-02 19:26:12 UTC (rev 6060) +++ trunk/jython/Lib/test/test_builtin_jy.py 2009-03-03 01:24:04 UTC (rev 6061) @@ -1,7 +1,9 @@ -1# -*- coding: utf-8 -*- -import sys -import unittest -import test.test_support +# -*- coding: utf-8 -*- +import test.test_support, unittest +from test.test_support import TESTFN, unlink + +import sys, UserDict + from codecs import BOM_UTF8 class BuiltinTest(unittest.TestCase): @@ -46,8 +48,8 @@ def test_getslice(self): class F: - def __getitem__(self,*args): return '__getitem__ '+`args` - def __getslice__(self,*args): return '__getslice__ '+`args` + def __getitem__(self,*args): return '__getitem__ '+repr(args) + def __getslice__(self,*args): return '__getslice__ '+repr(args) self.failUnless("__getslice__ (1, 1)" in F()[1:1]) class ChrTest(unittest.TestCase): @@ -157,6 +159,112 @@ exec code in ns self.assertEqual(foo, ns['a']) + def test_general_eval(self): + # Tests that general mappings can be used for the locals argument + + class M: + "Test mapping interface versus possible calls from eval()." + def __getitem__(self, key): + if key == 'a': + return 12 + raise KeyError + def keys(self): + return list('xyz') + + m = M() + g = globals() + self.assertEqual(eval('a', g, m), 12) + self.assertRaises(NameError, eval, 'b', g, m) + self.assertEqual(eval('dir()', g, m), list('xyz')) + self.assertEqual(eval('globals()', g, m), g) + self.assertEqual(eval('locals()', g, m), m) + #XXX: the following assert holds in CPython because globals must be a + # real dict. Should Jython be as strict? + #self.assertRaises(TypeError, eval, 'a', m) + class A: + "Non-mapping" + pass + m = A() + self.assertRaises(TypeError, eval, 'a', g, m) + + # Verify that dict subclasses work as well + class D(dict): + def __getitem__(self, key): + if key == 'a': + return 12 + return dict.__getitem__(self, key) + def keys(self): + return list('xyz') + + d = D() + self.assertEqual(eval('a', g, d), 12) + self.assertRaises(NameError, eval, 'b', g, d) + self.assertEqual(eval('dir()', g, d), list('xyz')) + self.assertEqual(eval('globals()', g, d), g) + self.assertEqual(eval('locals()', g, d), d) + + # Verify locals stores (used by list comps) + eval('[locals() for i in (2,3)]', g, d) + eval('[locals() for i in (2,3)]', g, UserDict.UserDict()) + + class SpreadSheet: + "Sample application showing nested, calculated lookups." + _cells = {} + def __setitem__(self, key, formula): + self._cells[key] = formula + def __getitem__(self, key): + return eval(self._cells[key], globals(), self) + + ss = SpreadSheet() + ss['a1'] = '5' + ss['a2'] = 'a1*6' + ss['a3'] = 'a2*7' + self.assertEqual(ss['a3'], 210) + + # Verify that dir() catches a non-list returned by eval + # SF bug #1004669 + class C: + def __getitem__(self, item): + raise KeyError(item) + def keys(self): + return 'a' + self.assertRaises(TypeError, eval, 'dir()', globals(), C()) + + # Done outside of the method test_z to get the correct scope + z = 0 + f = open(TESTFN, 'w') + f.write('z = z+1\n') + f.write('z = z*2\n') + f.close() + execfile(TESTFN) + + def test_execfile(self): + globals = {'a': 1, 'b': 2} + locals = {'b': 200, 'c': 300} + + class M: + "Test mapping interface versus possible calls from execfile()." + def __init__(self): + self.z = 10 + def __getitem__(self, key): + if key == 'z': + return self.z + raise KeyError + def __setitem__(self, key, value): + if key == 'z': + self.z = value + return + raise KeyError + + locals = M() + locals['z'] = 0 + execfile(TESTFN, globals, locals) + self.assertEqual(locals['z'], 2) + + self.assertRaises(TypeError, execfile) + self.assertRaises(TypeError, execfile, TESTFN, {}, ()) + unlink(TESTFN) + class ModuleNameTest(unittest.TestCase): """Tests that the module when imported has the same __name__""" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |