Mercurial > genshi > mirror
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): |