diff genshi/template/tests/eval.py @ 902:09cc3627654c experimental-inline

Sync `experimental/inline` branch with [source:trunk@1126].
author cmlenz
date Fri, 23 Apr 2010 21:08:26 +0000
parents 1837f39efd6f
children
line wrap: on
line diff
--- a/genshi/template/tests/eval.py
+++ b/genshi/template/tests/eval.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (C) 2006-2008 Edgewall Software
+# Copyright (C) 2006-2010 Edgewall Software
 # All rights reserved.
 #
 # This software is licensed as described in the file COPYING, which
@@ -12,9 +12,11 @@
 # history and logs, available at http://genshi.edgewall.org/log/.
 
 import doctest
+import os
 import pickle
 from StringIO import StringIO
 import sys
+from tempfile import mkstemp
 import unittest
 
 from genshi.core import Markup
@@ -246,6 +248,11 @@
         expr = Expression("filter(lambda x: x > 2, items)")
         self.assertEqual([3, 4], expr.evaluate(data))
 
+    def test_lambda_tuple_arg(self):
+        data = {'items': [(1, 2), (2, 1)]}
+        expr = Expression("filter(lambda (x, y): x > y, items)")
+        self.assertEqual([(2, 1)], expr.evaluate(data))
+
     def test_list_comprehension(self):
         expr = Expression("[n for n in numbers if n < 2]")
         self.assertEqual([0, 1], expr.evaluate({'numbers': range(5)}))
@@ -258,6 +265,14 @@
         self.assertEqual([2, 3, 4, 5, 6],
                          expr.evaluate({'numbers': range(5), 'offset': 2}))
 
+        expr = Expression("[n for group in groups for n in group]")
+        self.assertEqual([0, 1, 0, 1, 2],
+                         expr.evaluate({'groups': [range(2), range(3)]}))
+
+        expr = Expression("[(a, b) for a in x for b in y]")
+        self.assertEqual([('x0', 'y0'), ('x0', 'y1'), ('x1', 'y0'), ('x1', 'y1')],
+                         expr.evaluate({'x': ['x0', 'x1'], 'y': ['y0', 'y1']}))
+
     def test_list_comprehension_with_getattr(self):
         items = [{'name': 'a', 'value': 1}, {'name': 'b', 'value': 2}]
         expr = Expression("[i.name for i in items if i.value > 1]")
@@ -280,6 +295,14 @@
         self.assertEqual([2, 3, 4, 5, 6],
                          expr.evaluate({'numbers': range(5), 'offset': 2}))
 
+        expr = Expression("list(n for group in groups for n in group)")
+        self.assertEqual([0, 1, 0, 1, 2],
+                         expr.evaluate({'groups': [range(2), range(3)]}))
+
+        expr = Expression("list((a, b) for a in x for b in y)")
+        self.assertEqual([('x0', 'y0'), ('x0', 'y1'), ('x1', 'y0'), ('x1', 'y1')],
+                         expr.evaluate({'x': ['x0', 'x1'], 'y': ['y0', 'y1']}))
+
     def test_generator_expression_with_getattr(self):
         items = [{'name': 'a', 'value': 1}, {'name': 'b', 'value': 2}]
         expr = Expression("list(i.name for i in items if i.value > 1)")
@@ -570,6 +593,21 @@
         suite.execute(data)
         self.assertEqual(['foo', 'bar'], data['x'])
 
+    def test_def_with_decorator(self):
+        suite = Suite("""
+def lower(fun):
+    return lambda: fun().lower()
+
+@lower
+def say_hi():
+    return 'Hi!'
+
+result = say_hi()
+""")
+        data = {}
+        suite.execute(data)
+        self.assertEqual('hi!', data['result'])
+
     def test_delete(self):
         suite = Suite("""foo = 42
 del foo
@@ -621,7 +659,7 @@
     def test_import_in_def(self):
         suite = Suite("""def fun():
     from itertools import ifilter
-    return ifilter(None, xrange(3))
+    return ifilter(None, range(3))
 """)
         data = Context()
         suite.execute(data)
@@ -767,6 +805,46 @@
         Suite("del d['k']").execute({'d': d})
         self.failIf('k' in d, repr(d))
 
+    if sys.version_info >= (2, 5):
+        def test_with_statement(self):
+            fd, path = mkstemp()
+            f = os.fdopen(fd, "w")
+            try:
+                f.write('foo\nbar\n')
+                f.seek(0)
+                f.close()
+
+                d = {'path': path}
+                suite = Suite("""from __future__ import with_statement
+lines = []
+with open(path) as file:
+    for line in file:
+        lines.append(line)
+""")
+                suite.execute(d)
+                self.assertEqual(['foo\n', 'bar\n'], d['lines'])
+            finally:
+                os.remove(path)
+
+        def test_yield_expression(self):
+            d = {}
+            suite = Suite("""results = []
+def counter(maximum):
+    i = 0
+    while i < maximum:
+        val = (yield i)
+        if val is not None:
+            i = val
+        else:
+            i += 1
+it = counter(5)
+results.append(it.next())
+results.append(it.send(3))
+results.append(it.next())
+""")
+            suite.execute(d)
+            self.assertEqual([0, 3, 4], d['results'])
+
 
 def suite():
     suite = unittest.TestSuite()
Copyright (C) 2012-2017 Edgewall Software