comparison genshi/template/tests/eval.py @ 418:c478a6fa9e77 trunk

Make expression error handling more strict. Closes #88.
author cmlenz
date Fri, 16 Mar 2007 08:58:54 +0000
parents 4675d5cf6c67
children dcba5b97b420
comparison
equal deleted inserted replaced
417:359451249ce0 418:c478a6fa9e77
14 import doctest 14 import doctest
15 import sys 15 import sys
16 import unittest 16 import unittest
17 17
18 from genshi.core import Markup 18 from genshi.core import Markup
19 from genshi.template.eval import Expression, Suite, Undefined 19 from genshi.template.eval import Expression, Suite, UndefinedError
20 20
21 21
22 class ExpressionTestCase(unittest.TestCase): 22 class ExpressionTestCase(unittest.TestCase):
23 23
24 def test_eq(self): 24 def test_eq(self):
38 self.assertEqual(None, Expression('id').evaluate({'id': None})) 38 self.assertEqual(None, Expression('id').evaluate({'id': None}))
39 39
40 def test_builtins(self): 40 def test_builtins(self):
41 expr = Expression('Markup') 41 expr = Expression('Markup')
42 self.assertEqual(expr.evaluate({}), Markup) 42 self.assertEqual(expr.evaluate({}), Markup)
43 expr = Expression('Undefined')
44 self.assertEqual(expr.evaluate({}), Undefined)
45 43
46 def test_str_literal(self): 44 def test_str_literal(self):
47 self.assertEqual('foo', Expression('"foo"').evaluate({})) 45 self.assertEqual('foo', Expression('"foo"').evaluate({}))
48 self.assertEqual('foo', Expression('"""foo"""').evaluate({})) 46 self.assertEqual('foo', Expression('"""foo"""').evaluate({}))
49 self.assertEqual('foo', Expression("'foo'").evaluate({})) 47 self.assertEqual('foo', Expression("'foo'").evaluate({}))
321 expr = Expression("numbers[:-1]") 319 expr = Expression("numbers[:-1]")
322 self.assertEqual([0, 1, 2, 3], expr.evaluate({'numbers': range(5)})) 320 self.assertEqual([0, 1, 2, 3], expr.evaluate({'numbers': range(5)}))
323 321
324 def test_error_access_undefined(self): 322 def test_error_access_undefined(self):
325 expr = Expression("nothing", filename='index.html', lineno=50) 323 expr = Expression("nothing", filename='index.html', lineno=50)
326 self.assertEqual(Undefined, type(expr.evaluate({})))
327
328 def test_error_call_undefined(self):
329 expr = Expression("nothing()", filename='index.html', lineno=50)
330 try: 324 try:
331 expr.evaluate({}) 325 expr.evaluate({})
332 self.fail('Expected NameError') 326 self.fail('Expected UndefinedError')
333 except NameError, e: 327 except UndefinedError, e:
334 exc_type, exc_value, exc_traceback = sys.exc_info() 328 exc_type, exc_value, exc_traceback = sys.exc_info()
335 frame = exc_traceback.tb_next 329 frame = exc_traceback.tb_next
336 frames = [] 330 frames = []
337 while frame.tb_next: 331 while frame.tb_next:
338 frame = frame.tb_next 332 frame = frame.tb_next
339 frames.append(frame) 333 frames.append(frame)
340 self.assertEqual('Variable "nothing" is not defined', str(e)) 334 self.assertEqual('"nothing" not defined', str(e))
341 self.assertEqual("<Expression 'nothing()'>", 335 self.assertEqual("<Expression 'nothing'>",
342 frames[-3].tb_frame.f_code.co_name) 336 frames[-2].tb_frame.f_code.co_name)
343 self.assertEqual('index.html', 337 self.assertEqual('index.html',
344 frames[-3].tb_frame.f_code.co_filename) 338 frames[-2].tb_frame.f_code.co_filename)
345 self.assertEqual(50, frames[-3].tb_lineno) 339 self.assertEqual(50, frames[-2].tb_lineno)
346 340
347 def test_error_getattr_undefined(self): 341 def test_error_getattr_undefined(self):
348 expr = Expression("nothing.nil", filename='index.html', lineno=50) 342 class Something(object):
343 def __repr__(self):
344 return '<Something>'
345 expr = Expression('something.nil', filename='index.html', lineno=50)
349 try: 346 try:
350 expr.evaluate({}) 347 expr.evaluate({'something': Something()})
351 self.fail('Expected NameError') 348 self.fail('Expected UndefinedError')
352 except NameError, e: 349 except UndefinedError, e:
353 exc_type, exc_value, exc_traceback = sys.exc_info() 350 exc_type, exc_value, exc_traceback = sys.exc_info()
354 frame = exc_traceback.tb_next 351 frame = exc_traceback.tb_next
355 frames = [] 352 frames = []
356 while frame.tb_next: 353 while frame.tb_next:
357 frame = frame.tb_next 354 frame = frame.tb_next
358 frames.append(frame) 355 frames.append(frame)
359 self.assertEqual('Variable "nothing" is not defined', str(e)) 356 self.assertEqual('Something (<Something>) has no member named "nil"',
360 self.assertEqual("<Expression 'nothing.nil'>", 357 str(e))
361 frames[-3].tb_frame.f_code.co_name) 358 self.assertEqual("<Expression 'something.nil'>",
359 frames[-2].tb_frame.f_code.co_name)
362 self.assertEqual('index.html', 360 self.assertEqual('index.html',
363 frames[-3].tb_frame.f_code.co_filename) 361 frames[-2].tb_frame.f_code.co_filename)
364 self.assertEqual(50, frames[-3].tb_lineno) 362 self.assertEqual(50, frames[-2].tb_lineno)
365 363
366 def test_error_getitem_undefined(self): 364 def test_error_getitem_undefined_string(self):
367 expr = Expression("nothing[0]", filename='index.html', lineno=50) 365 class Something(object):
366 def __repr__(self):
367 return '<Something>'
368 expr = Expression('something["nil"]', filename='index.html', lineno=50)
368 try: 369 try:
369 expr.evaluate({}) 370 expr.evaluate({'something': Something()})
370 self.fail('Expected NameError') 371 self.fail('Expected UndefinedError')
371 except NameError, e: 372 except UndefinedError, e:
372 exc_type, exc_value, exc_traceback = sys.exc_info() 373 exc_type, exc_value, exc_traceback = sys.exc_info()
373 frame = exc_traceback.tb_next 374 frame = exc_traceback.tb_next
374 frames = [] 375 frames = []
375 while frame.tb_next: 376 while frame.tb_next:
376 frame = frame.tb_next 377 frame = frame.tb_next
377 frames.append(frame) 378 frames.append(frame)
378 self.assertEqual('Variable "nothing" is not defined', str(e)) 379 self.assertEqual('Something (<Something>) has no member named "nil"',
379 self.assertEqual("<Expression 'nothing[0]'>", 380 str(e))
380 frames[-3].tb_frame.f_code.co_name) 381 self.assertEqual('''<Expression 'something["nil"]'>''',
382 frames[-2].tb_frame.f_code.co_name)
381 self.assertEqual('index.html', 383 self.assertEqual('index.html',
382 frames[-3].tb_frame.f_code.co_filename) 384 frames[-2].tb_frame.f_code.co_filename)
383 self.assertEqual(50, frames[-3].tb_lineno) 385 self.assertEqual(50, frames[-2].tb_lineno)
384
385 def test_error_getattr_nested_undefined(self):
386 expr = Expression("nothing.nil", filename='index.html', lineno=50)
387 val = expr.evaluate({'nothing': object()})
388 assert isinstance(val, Undefined)
389 self.assertEqual("nil", val._name)
390
391 def test_error_getitem_nested_undefined_string(self):
392 expr = Expression("nothing['bla']", filename='index.html', lineno=50)
393 val = expr.evaluate({'nothing': object()})
394 assert isinstance(val, Undefined)
395 self.assertEqual("bla", val._name)
396
397 def test_error_getitem_nested_undefined_int(self):
398 expr = Expression("nothing[0]", filename='index.html', lineno=50)
399 self.assertRaises(TypeError, expr.evaluate, {'nothing': object()})
400 386
401 387
402 class SuiteTestCase(unittest.TestCase): 388 class SuiteTestCase(unittest.TestCase):
403 389
404 def test_assign(self): 390 def test_assign(self):
Copyright (C) 2012-2017 Edgewall Software