diff 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
line wrap: on
line diff
--- a/genshi/template/tests/eval.py
+++ b/genshi/template/tests/eval.py
@@ -16,7 +16,7 @@
 import unittest
 
 from genshi.core import Markup
-from genshi.template.eval import Expression, Suite, Undefined
+from genshi.template.eval import Expression, Suite, UndefinedError
 
 
 class ExpressionTestCase(unittest.TestCase):
@@ -40,8 +40,6 @@
     def test_builtins(self):
         expr = Expression('Markup')
         self.assertEqual(expr.evaluate({}), Markup)
-        expr = Expression('Undefined')
-        self.assertEqual(expr.evaluate({}), Undefined)
 
     def test_str_literal(self):
         self.assertEqual('foo', Expression('"foo"').evaluate({}))
@@ -323,80 +321,68 @@
 
     def test_error_access_undefined(self):
         expr = Expression("nothing", filename='index.html', lineno=50)
-        self.assertEqual(Undefined, type(expr.evaluate({})))
-
-    def test_error_call_undefined(self):
-        expr = Expression("nothing()", filename='index.html', lineno=50)
         try:
             expr.evaluate({})
-            self.fail('Expected NameError')
-        except NameError, e:
-            exc_type, exc_value, exc_traceback = sys.exc_info()
-            frame = exc_traceback.tb_next
-            frames = []
-            while frame.tb_next:
-                frame = frame.tb_next
-                frames.append(frame)
-            self.assertEqual('Variable "nothing" is not defined', str(e))
-            self.assertEqual("<Expression 'nothing()'>",
-                             frames[-3].tb_frame.f_code.co_name)
-            self.assertEqual('index.html',
-                             frames[-3].tb_frame.f_code.co_filename)
-            self.assertEqual(50, frames[-3].tb_lineno)
-
-    def test_error_getattr_undefined(self):
-        expr = Expression("nothing.nil", filename='index.html', lineno=50)
-        try:
-            expr.evaluate({})
-            self.fail('Expected NameError')
-        except NameError, e:
+            self.fail('Expected UndefinedError')
+        except UndefinedError, e:
             exc_type, exc_value, exc_traceback = sys.exc_info()
             frame = exc_traceback.tb_next
             frames = []
             while frame.tb_next:
                 frame = frame.tb_next
                 frames.append(frame)
-            self.assertEqual('Variable "nothing" is not defined', str(e))
-            self.assertEqual("<Expression 'nothing.nil'>",
-                             frames[-3].tb_frame.f_code.co_name)
+            self.assertEqual('"nothing" not defined', str(e))
+            self.assertEqual("<Expression 'nothing'>",
+                             frames[-2].tb_frame.f_code.co_name)
             self.assertEqual('index.html',
-                             frames[-3].tb_frame.f_code.co_filename)
-            self.assertEqual(50, frames[-3].tb_lineno)
+                             frames[-2].tb_frame.f_code.co_filename)
+            self.assertEqual(50, frames[-2].tb_lineno)
 
-    def test_error_getitem_undefined(self):
-        expr = Expression("nothing[0]", filename='index.html', lineno=50)
+    def test_error_getattr_undefined(self):
+        class Something(object):
+            def __repr__(self):
+                return '<Something>'
+        expr = Expression('something.nil', filename='index.html', lineno=50)
         try:
-            expr.evaluate({})
-            self.fail('Expected NameError')
-        except NameError, e:
+            expr.evaluate({'something': Something()})
+            self.fail('Expected UndefinedError')
+        except UndefinedError, e:
             exc_type, exc_value, exc_traceback = sys.exc_info()
             frame = exc_traceback.tb_next
             frames = []
             while frame.tb_next:
                 frame = frame.tb_next
                 frames.append(frame)
-            self.assertEqual('Variable "nothing" is not defined', str(e))
-            self.assertEqual("<Expression 'nothing[0]'>",
-                             frames[-3].tb_frame.f_code.co_name)
+            self.assertEqual('Something (<Something>) has no member named "nil"',
+                             str(e))
+            self.assertEqual("<Expression 'something.nil'>",
+                             frames[-2].tb_frame.f_code.co_name)
             self.assertEqual('index.html',
-                             frames[-3].tb_frame.f_code.co_filename)
-            self.assertEqual(50, frames[-3].tb_lineno)
+                             frames[-2].tb_frame.f_code.co_filename)
+            self.assertEqual(50, frames[-2].tb_lineno)
 
-    def test_error_getattr_nested_undefined(self):
-        expr = Expression("nothing.nil", filename='index.html', lineno=50)
-        val = expr.evaluate({'nothing': object()})
-        assert isinstance(val, Undefined)
-        self.assertEqual("nil", val._name)
-
-    def test_error_getitem_nested_undefined_string(self):
-        expr = Expression("nothing['bla']", filename='index.html', lineno=50)
-        val = expr.evaluate({'nothing': object()})
-        assert isinstance(val, Undefined)
-        self.assertEqual("bla", val._name)
-
-    def test_error_getitem_nested_undefined_int(self):
-        expr = Expression("nothing[0]", filename='index.html', lineno=50)
-        self.assertRaises(TypeError, expr.evaluate, {'nothing': object()})
+    def test_error_getitem_undefined_string(self):
+        class Something(object):
+            def __repr__(self):
+                return '<Something>'
+        expr = Expression('something["nil"]', filename='index.html', lineno=50)
+        try:
+            expr.evaluate({'something': Something()})
+            self.fail('Expected UndefinedError')
+        except UndefinedError, e:
+            exc_type, exc_value, exc_traceback = sys.exc_info()
+            frame = exc_traceback.tb_next
+            frames = []
+            while frame.tb_next:
+                frame = frame.tb_next
+                frames.append(frame)
+            self.assertEqual('Something (<Something>) has no member named "nil"',
+                             str(e))
+            self.assertEqual('''<Expression 'something["nil"]'>''',
+                             frames[-2].tb_frame.f_code.co_name)
+            self.assertEqual('index.html',
+                             frames[-2].tb_frame.f_code.co_filename)
+            self.assertEqual(50, frames[-2].tb_lineno)
 
 
 class SuiteTestCase(unittest.TestCase):
Copyright (C) 2012-2017 Edgewall Software