comparison markup/tests/eval.py @ 192:cda3bdfc19ed

Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`.
author cmlenz
date Wed, 23 Aug 2006 17:49:14 +0000
parents 194025141c89
children eb5c8200f49b
comparison
equal deleted inserted replaced
191:929ef2913b87 192:cda3bdfc19ed
18 from markup.eval import Expression 18 from markup.eval import Expression
19 19
20 20
21 class ExpressionTestCase(unittest.TestCase): 21 class ExpressionTestCase(unittest.TestCase):
22 22
23 def test_name_lookup(self):
24 self.assertEqual('bar', Expression('foo').evaluate({'foo': 'bar'}))
25 self.assertEqual(id, Expression('id').evaluate({}, nocall=True))
26 self.assertEqual('bar', Expression('id').evaluate({'id': 'bar'}))
27 self.assertEqual(None, Expression('id').evaluate({'id': None},
28 nocall=True))
29
23 def test_str_literal(self): 30 def test_str_literal(self):
24 self.assertEqual('foo', Expression('"foo"').evaluate({})) 31 self.assertEqual('foo', Expression('"foo"').evaluate({}))
25 self.assertEqual('foo', Expression('"""foo"""').evaluate({})) 32 self.assertEqual('foo', Expression('"""foo"""').evaluate({}))
26 self.assertEqual('foo', Expression("'foo'").evaluate({})) 33 self.assertEqual('foo', Expression("'foo'").evaluate({}))
27 self.assertEqual('foo', Expression("'''foo'''").evaluate({})) 34 self.assertEqual('foo', Expression("'''foo'''").evaluate({}))
231 def test_list_comprehension_with_getitem(self): 238 def test_list_comprehension_with_getitem(self):
232 items = [{'name': 'a', 'value': 1}, {'name': 'b', 'value': 2}] 239 items = [{'name': 'a', 'value': 1}, {'name': 'b', 'value': 2}]
233 expr = Expression("[i['name'] for i in items if i['value'] > 1]") 240 expr = Expression("[i['name'] for i in items if i['value'] > 1]")
234 self.assertEqual(['b'], expr.evaluate({'items': items})) 241 self.assertEqual(['b'], expr.evaluate({'items': items}))
235 242
236 def test_error_position(self): 243 def test_error_call_undefined(self):
237 expr = Expression("nothing()", filename='index.html', lineno=50) 244 expr = Expression("nothing()", filename='index.html', lineno=50)
238 try: 245 try:
239 expr.evaluate({}) 246 expr.evaluate({})
240 self.fail('Expected TypeError') 247 self.fail('Expected NameError')
241 except TypeError, e: 248 except NameError, e:
242 exc_type, exc_value, exc_traceback = sys.exc_info() 249 exc_type, exc_value, exc_traceback = sys.exc_info()
243 frame = exc_traceback.tb_next 250 frame = exc_traceback.tb_next
251 frames = []
244 while frame.tb_next: 252 while frame.tb_next:
245 frame = frame.tb_next 253 frame = frame.tb_next
254 frames.append(frame)
246 self.assertEqual('<Expression "nothing()">', 255 self.assertEqual('<Expression "nothing()">',
247 frame.tb_frame.f_code.co_name) 256 frames[-3].tb_frame.f_code.co_name)
248 self.assertEqual('index.html', frame.tb_frame.f_code.co_filename) 257 self.assertEqual('index.html',
249 self.assertEqual(50, frame.tb_lineno) 258 frames[-3].tb_frame.f_code.co_filename)
259 self.assertEqual(50, frames[-3].tb_lineno)
260
261 def test_error_getattr_undefined(self):
262 expr = Expression("nothing.nil", filename='index.html', lineno=50)
263 try:
264 expr.evaluate({})
265 self.fail('Expected NameError')
266 except NameError, e:
267 exc_type, exc_value, exc_traceback = sys.exc_info()
268 frame = exc_traceback.tb_next
269 frames = []
270 while frame.tb_next:
271 frame = frame.tb_next
272 frames.append(frame)
273 self.assertEqual('<Expression "nothing.nil">',
274 frames[-3].tb_frame.f_code.co_name)
275 self.assertEqual('index.html',
276 frames[-3].tb_frame.f_code.co_filename)
277 self.assertEqual(50, frames[-3].tb_lineno)
250 278
251 279
252 def suite(): 280 def suite():
253 suite = unittest.TestSuite() 281 suite = unittest.TestSuite()
254 suite.addTest(unittest.makeSuite(ExpressionTestCase, 'test')) 282 suite.addTest(unittest.makeSuite(ExpressionTestCase, 'test'))
Copyright (C) 2012-2017 Edgewall Software