summaryrefslogtreecommitdiff
path: root/src/zope/tales/tests/test_tales.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/zope/tales/tests/test_tales.py')
-rw-r--r--src/zope/tales/tests/test_tales.py183
1 files changed, 183 insertions, 0 deletions
diff --git a/src/zope/tales/tests/test_tales.py b/src/zope/tales/tests/test_tales.py
new file mode 100644
index 0000000..31fbda1
--- /dev/null
+++ b/src/zope/tales/tests/test_tales.py
@@ -0,0 +1,183 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""TALES Tests
+
+$Id$
+"""
+import unittest
+
+from zope.tales import tales
+from zope.tales.tests.simpleexpr import SimpleExpr
+from zope.testing.doctestunit import DocTestSuite
+
+
+class TALESTests(unittest.TestCase):
+
+ def testIterator0(self):
+ # Test sample Iterator class
+ context = Harness(self)
+ it = tales.Iterator('name', (), context)
+ self.assert_( not it.next(), "Empty iterator")
+ context._complete_()
+
+ def testIterator1(self):
+ # Test sample Iterator class
+ context = Harness(self)
+ it = tales.Iterator('name', (1,), context)
+ context._assert_('setLocal', 'name', 1)
+ self.assert_( it.next() and not it.next(), "Single-element iterator")
+ context._complete_()
+
+ def testIterator2(self):
+ # Test sample Iterator class
+ context = Harness(self)
+ it = tales.Iterator('text', 'text', context)
+ for c in 'text':
+ context._assert_('setLocal', 'text', c)
+ for c in 'text':
+ self.assert_(it.next(), "Multi-element iterator")
+ self.assert_( not it.next(), "Multi-element iterator")
+ context._complete_()
+
+ def testRegisterType(self):
+ # Test expression type registration
+ e = tales.ExpressionEngine()
+ e.registerType('simple', SimpleExpr)
+ self.assert_( e.getTypes()['simple'] == SimpleExpr)
+
+ def testRegisterTypeUnique(self):
+ # Test expression type registration uniqueness
+ e = tales.ExpressionEngine()
+ e.registerType('simple', SimpleExpr)
+ try:
+ e.registerType('simple', SimpleExpr)
+ except tales.RegistrationError:
+ pass
+ else:
+ self.assert_( 0, "Duplicate registration accepted.")
+
+ def testRegisterTypeNameConstraints(self):
+ # Test constraints on expression type names
+ e = tales.ExpressionEngine()
+ for name in '1A', 'A!', 'AB ':
+ try:
+ e.registerType(name, SimpleExpr)
+ except tales.RegistrationError:
+ pass
+ else:
+ self.assert_( 0, 'Invalid type name "%s" accepted.' % name)
+
+ def testCompile(self):
+ # Test expression compilation
+ e = tales.ExpressionEngine()
+ e.registerType('simple', SimpleExpr)
+ ce = e.compile('simple:x')
+ self.assert_( ce(None) == ('simple', 'x'), (
+ 'Improperly compiled expression %s.' % `ce`))
+
+ def testGetContext(self):
+ # Test Context creation
+ tales.ExpressionEngine().getContext()
+ tales.ExpressionEngine().getContext(v=1)
+ tales.ExpressionEngine().getContext(x=1, y=2)
+
+ def getContext(self, **kws):
+ e = tales.ExpressionEngine()
+ e.registerType('simple', SimpleExpr)
+ return apply(e.getContext, (), kws)
+
+ def testContext0(self):
+ # Test use of Context
+ se = self.getContext().evaluate('simple:x')
+ self.assert_( se == ('simple', 'x'), (
+ 'Improperly evaluated expression %s.' % `se`))
+
+ def testVariables(self):
+ # Test variables
+ ctxt = self.getContext()
+ ctxt.beginScope()
+ ctxt.setLocal('v1', 1)
+ ctxt.setLocal('v2', 2)
+
+ c = ctxt.vars
+ self.assert_( c['v1'] == 1, 'Variable "v1"')
+
+ ctxt.beginScope()
+ ctxt.setLocal('v1', 3)
+ ctxt.setGlobal('g', 1)
+
+ c = ctxt.vars
+ self.assert_( c['v1'] == 3, 'Inner scope')
+ self.assert_( c['v2'] == 2, 'Outer scope')
+ self.assert_( c['g'] == 1, 'Global')
+
+ ctxt.endScope()
+
+ c = ctxt.vars
+ self.assert_( c['v1'] == 1, "Uncovered local")
+ self.assert_( c['g'] == 1, "Global from inner scope")
+
+ ctxt.endScope()
+
+
+class Harness(object):
+ def __init__(self, testcase):
+ self._callstack = []
+ self._testcase = testcase
+
+ def _assert_(self, name, *args, **kwargs):
+ self._callstack.append((name, args, kwargs))
+
+ def _complete_(self):
+ self._testcase.assert_(len(self._callstack) == 0,
+ "Harness methods called")
+
+ def __getattr__(self, name):
+ return HarnessMethod(self, name)
+
+class HarnessMethod(object):
+
+ def __init__(self, harness, name):
+ self._harness = harness
+ self._name = name
+
+ def __call__(self, *args, **kwargs):
+ name = self._name
+ self = self._harness
+
+ cs = self._callstack
+ self._testcase.assert_(
+ len(cs),
+ 'Unexpected harness method call "%s".' % name
+ )
+ self._testcase.assert_(
+ cs[0][0] == name,
+ 'Harness method name "%s" called, "%s" expected.' %
+ (name, cs[0][0])
+ )
+
+ name, aargs, akwargs = self._callstack.pop(0)
+ self._testcase.assert_(aargs == args, "Harness method arguments")
+ self._testcase.assert_(akwargs == kwargs,
+ "Harness method keyword args")
+
+
+def test_suite():
+ suite = unittest.makeSuite(TALESTests)
+ suite.addTest(DocTestSuite("zope.tales.tales"))
+ return suite
+
+
+if __name__ == '__main__':
+ unittest.TextTestRunner().run(test_suite())