root/livinglogic.python.xist/test/test_ul4.py @ 4533:35aca9b50120

Revision 4533:35aca9b50120, 65.9 KB (checked in by Walter Doerwald <walter@…>, 8 years ago)

Replace ll.xist.xsc.AttrProcInst? with ll.xist.xsc.AttrElement?.

This makes it possible to have a useful output for the new element outside of
attributes.

Make ll.xist.ns.ul4.attr_if an AttrElement? subclass.

Remove ll.xist.ns.ul4.attr_ifnn.

Line 
1#! /usr/bin/env/python
2# -*- coding: utf-8 -*-
3
4## Copyright 2009-2011 by LivingLogic AG, Bayreuth/Germany
5## Copyright 2009-2011 by Walter Dörwald
6##
7## All Rights Reserved
8##
9## See ll/__init__.py for the license
10
11
12from __future__ import division
13
14import sys, os, re, datetime, StringIO, json, contextlib, tempfile, collections, shutil, subprocess, pkg_resources
15
16import py.test
17
18from ll import ul4c, color, misc
19from ll.xist.ns import html, ul4
20
21
22class PseudoDict(collections.Mapping):
23    def __init__(self, dict):
24        self.dict = dict
25
26    def __getitem__(self, key):
27        return self.dict[key]
28
29    def __iter__(self):
30        return iter(self.dict)
31
32    def __len__(self):
33        return len(self.dict)
34
35
36class PseudoList(collections.Sequence):
37    def __init__(self, list):
38        self.list = list
39
40    def __getitem__(self, index):
41        return self.list[index]
42
43    def __len__(self):
44        return len(self.list)
45
46
47class Render(object):
48    def __init__(self, __, **variables):
49        self.source = __
50        self.variables = variables
51        f = sys._getframe(1)
52        self.filename = f.f_code.co_filename
53        self.lineno = f.f_lineno
54
55    def __repr__(self):
56        return "{0.__class__.__name__}({0.source!r}, {0.variables!r})".format(self)
57
58
59class RenderPython(Render):
60    def renders(self):
61        template = ul4c.Template(self.source)
62        print "Testing Python template:".format(self.filename, self.lineno)
63        print template.pythonsource()
64        return template.renders(**self.variables)
65
66
67class RenderPythonDumpS(Render):
68    def renders(self):
69        template = ul4c.Template(self.source)
70        template = ul4c.Template.loads(template.dumps()) # Recreate the template from the binary dump
71        print "Testing Python template loaded from string ({}, line {}):".format(self.filename, self.lineno)
72        print template.pythonsource()
73        return template.renders(**self.variables)
74
75
76class RenderPythonDump(Render):
77    def renders(self):
78        template = ul4c.Template(self.source)
79        stream = StringIO.StringIO()
80        template.dump(stream)
81        stream.seek(0)
82        template = ul4c.Template.load(stream) # Recreate the template from the stream
83        print "Testing Python template loaded from stream ({}, line {}):".format(self.filename, self.lineno)
84        print template.pythonsource()
85        return template.renders(**self.variables)
86
87
88class RenderJS(Render):
89    def renders(self):
90        # Check the Javascript version (this requires an installed ``d8`` shell from V8 (http://code.google.com/p/v8/))
91        template = ul4c.Template(self.source)
92        js = template.jssource()
93        js = u"template = {};\ndata = {};\nprint(template.renders(data));\n".format(js, ul4c._json(self.variables))
94        print "Testing Javascript code compiled by Python ({}, line {}):".format(self.filename, self.lineno)
95        print js.encode("utf-8")
96        with tempfile.NamedTemporaryFile(mode="wb", suffix=".js") as f:
97            f.write(js.encode("utf-8"))
98            f.flush()
99            result = os.popen("d8 {} {}".format(pkg_resources.resource_filename("ll.xist", "data/"), f.name), "rb").read()
100        result = result.decode("utf-8")[:-1] # Drop the "\n"
101        # Check if we have an exception
102        if result.endswith("^"):
103            raise RuntimeError(result.splitlines()[0])
104        return result
105
106
107class RenderJava(Render):
108    maincodetemplate = u"""
109    public class UL4Test
110    {
111        @SuppressWarnings("unchecked")
112        public static void main(String[] args) throws java.io.IOException, java.io.UnsupportedEncodingException
113        {
114            %(source)s
115        }
116    }
117    """
118
119    def findexception(self, output):
120        lines = output.splitlines()
121        msg = None
122        for line in lines:
123            prefix1 = 'Exception in thread "main"'
124            prefix2 = "Caused by:"
125            if line.startswith(prefix1):
126                msg = line[len(prefix1):].strip()
127            elif line.startswith(prefix2):
128                msg = line[len(prefix2):].strip()
129            else:
130                continue
131            if msg == "Traceback (most recent call last):": # This is a Jython exception, the message is in the last line
132                msg = lines[-1]
133                break
134        if msg is not None:
135            print >>sys.stderr, output
136            raise RuntimeError(msg)
137
138    def formatsource(self, string):
139        """
140        Reindents the Java source.
141        """
142        indent = 0
143        newlines = []
144        for line in string.strip().splitlines(False):
145            line = line.strip()
146            if line == "}":
147                indent -= 1
148            if line:
149                newlines.append(indent*"\t" + line + "\n")
150            if line == "{":
151                indent += 1
152        return "".join(newlines)
153
154    def runsource(self, source):
155        """
156        Compile the Java source :var:`source`, run it and return the output
157        """
158        tempdir = tempfile.mkdtemp()
159        try:
160            source = self.maincodetemplate % dict(source=source)
161            source = self.formatsource(source)
162            print source.encode("utf-8")
163            with open(os.path.join(tempdir, "UL4Test.java"), "wb") as f:
164                f.write(source.encode("utf-8"))
165            os.system("cd {}; javac -encoding utf-8 UL4Test.java".format(tempdir))
166            pipe = subprocess.Popen("cd {}; java UL4Test".format(tempdir), stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
167            (stdout, stderr) = pipe.communicate()
168        finally:
169            shutil.rmtree(tempdir)
170        # Check if we have an exception
171        self.findexception(stdout)
172        self.findexception(stderr)
173        if stderr:
174            print >>sys.stderr, stderr
175        return stdout.decode("utf-8")
176
177
178class RenderJavaSourceCompiledByPython(RenderJava):
179    codetemplate = u"""
180    com.livinglogic.ul4.Template template = new com.livinglogic.ul4.JSPTemplate()
181    {
182        public String getName()
183        {
184            return "unnamed";
185        }
186        public void render(java.io.Writer out, java.util.Map<String, Object> variables) throws java.io.IOException
187        {
188            %(template)s
189        }
190    };
191    java.util.Map<String, Object> variables = %(variables)s;
192    String output = template.renders(variables);
193    // We can't use ``System.out.print`` here, because this gives us no control over the encoding
194    // Use ``System.out.write`` to make sure the output is in UTF-8
195    byte[] outputBytes = output.getBytes("utf-8");
196    System.out.write(outputBytes, 0, outputBytes.length);
197    """
198
199    def renders(self):
200        # Check the Java version
201        print "Testing Java code ({}, line {}):".format(self.filename, self.lineno)
202        template = ul4c.Template(self.source)
203        java = template.javasource(indent=4)
204        java = self.codetemplate % dict(variables=misc.javaexpr(self.variables), template=java)
205        return self.runsource(java)
206
207
208class RenderJavaLoadByJava(RenderJava):
209    codetemplate = u"""
210    com.livinglogic.ul4.InterpretedTemplate template = com.livinglogic.ul4.InterpretedTemplate.load(%(dump)s);
211    java.util.Map<String, Object> variables = %(variables)s;
212    String output = template.renders(variables);
213    // We can't use ``System.out.print`` here, because this gives us no control over the encoding
214    // Use ``System.out.write`` to make sure the output is in UTF-8
215    byte[] outputBytes = output.getBytes("utf-8");
216    System.out.write(outputBytes, 0, outputBytes.length);
217    """
218
219    def renders(self):
220        # Check the Java version
221        print "Testing Java InterpretedTemplate (interpreted mode, compiled by Python) ({}, line {}):".format(self.filename, self.lineno)
222        template = ul4c.Template(self.source)
223        dump = template.dumps()
224        java = self.codetemplate % dict(variables=misc.javaexpr(self.variables), dump=misc.javaexpr(dump))
225        return self.runsource(java)
226
227
228class RenderJavaSourceCompiledByJava(RenderJava):
229    codetemplate = u"""
230    com.livinglogic.ul4.InterpretedTemplate template = com.livinglogic.ul4.Compiler.compile(%(source)s);
231    System.err.println("Generate Java code:");
232    System.err.println(template.javaSource());
233    com.livinglogic.ul4.JSPTemplate compiledTemplate = template.compileToJava();
234    java.util.Map<String, Object> variables = %(variables)s;
235    String output = compiledTemplate.renders(variables);
236    // We can't use ``System.out.print`` here, because this gives us no control over the encoding
237    // Use ``System.out.write`` to make sure the output is in UTF-8
238    byte[] outputBytes = output.getBytes("utf-8");
239    System.out.write(outputBytes, 0, outputBytes.length);
240    """
241
242    def renders(self):
243        # Check the Java version
244        print "Testing Java InterpretedTemplate (compiled mode, compiled by Java) ({}, line {}):".format(self.filename, self.lineno)
245        java = self.codetemplate % dict(source=misc.javaexpr(self.source), variables=misc.javaexpr(self.variables))
246        return self.runsource(java)
247
248
249all_python_renderers = (RenderPython, RenderPythonDumpS, RenderPythonDump)
250# FIXME: The following really takes a long time to run:
251#all_renderers = (RenderPython, RenderPythonDumpS, RenderPythonDump, RenderJS, RenderJavaSourceCompiledByPython, RenderJavaLoadByJava, RenderJavaSourceCompiledByJava)
252all_renderers = all_python_renderers
253
254
255def eq(expected, render):
256    got = render.renders() # Put this on an extra line, so that py.test executes it only once
257    assert expected == got
258
259
260def evaleq(expected, render):
261    got = eval(render.renders())
262    assert expected == got
263
264
265def contains(expected, render):
266    got = render.renders()
267    assert got in expected
268
269
270def le(expected, render):
271    got = render.renders()
272    assert expected <= got
273
274
275def raises(msg, render):
276    # Check that executing ``render`` raises an exception that matches a regexp
277    try:
278        render.renders()
279    except Exception, exc:
280        assert re.search(msg, "{0.__class__.__module__}.{0.__class__.__name__}: {0}".format(exc)) is not None
281    else:
282        py.test.fail("failed to raise exception")
283
284
285@py.test.mark.ul4
286def test_text():
287    for r in all_renderers:
288        yield eq, u'gurk', r(u'gurk')
289        yield eq, u'g\xfcrk', r(u'g\xfcrk')
290
291
292@py.test.mark.ul4
293def test_none():
294    for r in all_renderers:
295        yield eq, '', r(u'<?print None?>')
296        yield eq, 'no', r(u'<?if None?>yes<?else?>no<?end if?>')
297
298
299@py.test.mark.ul4
300def test_false():
301    for r in all_renderers:
302        yield eq, 'False', r(u'<?print False?>')
303        yield eq, 'no', r(u'<?if False?>yes<?else?>no<?end if?>')
304
305
306@py.test.mark.ul4
307def test_true():
308    for r in all_renderers:
309        yield eq, 'True', r(u'<?print True?>')
310        yield eq, 'yes', r(u'<?if True?>yes<?else?>no<?end if?>')
311
312
313@py.test.mark.ul4
314def test_int():
315    for r in all_renderers:
316        yield eq, '0', r(u'<?print 0?>')
317        yield eq, '42', r(u'<?print 42?>')
318        yield eq, '-42', r(u'<?print -42?>')
319        yield eq, '255', r(u'<?print 0xff?>')
320        yield eq, '255', r(u'<?print 0Xff?>')
321        yield eq, '-255', r(u'<?print -0xff?>')
322        yield eq, '-255', r(u'<?print -0Xff?>')
323        yield eq, '63', r(u'<?print 0o77?>')
324        yield eq, '63', r(u'<?print 0O77?>')
325        yield eq, '-63', r(u'<?print -0o77?>')
326        yield eq, '-63', r(u'<?print -0O77?>')
327        yield eq, '7', r(u'<?print 0b111?>')
328        yield eq, '7', r(u'<?print 0B111?>')
329        yield eq, '-7', r(u'<?print -0b111?>')
330        yield eq, '-7', r(u'<?print -0B111?>')
331
332        yield eq, 'no', r(u'<?if 0?>yes<?else?>no<?end if?>')
333        yield eq, 'yes', r(u'<?if 1?>yes<?else?>no<?end if?>')
334        yield eq, 'yes', r(u'<?if -1?>yes<?else?>no<?end if?>')
335
336
337@py.test.mark.ul4
338def test_float():
339    for r in all_renderers:
340        # str() output might differ slightly between Python and JS, so eval the output again for tests
341        yield evaleq, 0.0, r(u'<?print 0.?>')
342        yield evaleq, 42.0, r(u'<?print 42.?>')
343        yield evaleq, -42.0, r(u'<?print -42.?>')
344        yield evaleq, -42.5, r(u'<?print -42.5?>')
345        yield evaleq, 1e42, r(u'<?print 1E42?>')
346        yield evaleq, 1e42, r(u'<?print 1e42?>')
347        yield evaleq, -1e42, r(u'<?print -1E42?>')
348        yield evaleq, -1e42, r(u'<?print -1e42?>')
349
350        yield eq, 'no', r(u'<?if 0.?>yes<?else?>no<?end if?>')
351        yield eq, 'yes', r(u'<?if 1.?>yes<?else?>no<?end if?>')
352        yield eq, 'yes', r(u'<?if -1.?>yes<?else?>no<?end if?>')
353
354
355@py.test.mark.ul4
356def test_string():
357    for r in all_renderers:
358        yield raises, "Unterminated string", r(u'<?print "?>')
359        yield eq, 'foo', r(u'<?print "foo"?>')
360        yield eq, '\n', r(u'<?print "\\n"?>')
361        yield eq, '\r', r(u'<?print "\\r"?>')
362        yield eq, '\t', r(u'<?print "\\t"?>')
363        yield eq, '\f', r(u'<?print "\\f"?>')
364        yield eq, '\b', r(u'<?print "\\b"?>')
365        yield eq, '\a', r(u'<?print "\\a"?>')
366        yield eq, '\x1b', r(u'<?print "\\e"?>')
367        yield eq, '\x00', r(u'<?print "\\x00"?>')
368        yield eq, '"', r(u'<?print "\\""?>')
369        yield eq, "'", r(u'<?print "\\\'"?>')
370        yield eq, u'\u20ac', r(u'<?print "\u20ac"?>')
371        yield eq, u'\xff', r(u'<?print "\\xff"?>')
372        yield eq, u'\u20ac', r(u'''<?print "\\u20ac"?>''')
373        yield eq, "a\nb", r(u'<?print "a\nb"?>')
374        for c in u"\x00\x80\u0100\u3042\n\r\t\f\b\a\e\"":
375            yield eq, c, r(u'<?print obj?>', obj=c) # This tests :func:`misc.javaexpr` for Java and :func:`ul4c._json` for JS
376
377        # Test literal control characters
378        yield eq, u'gu\n\r\trk', r(u"<?print 'gu\n\r\trk'?>")
379        yield eq, u'gu\n\r\t\\rk', r(ur"<?print 'gu\n\r\t\\rk'?>")
380
381        yield eq, 'no', r(u'<?if ""?>yes<?else?>no<?end if?>')
382        yield eq, 'yes', r(u'<?if "foo"?>yes<?else?>no<?end if?>')
383
384
385@py.test.mark.ul4
386def test_date():
387    for r in all_renderers:
388        yield eq, '2000-02-29', r(u'<?print @2000-02-29T.isoformat()?>')
389        yield eq, '2000-02-29T12:34:00', r(u'<?print @2000-02-29T12:34.isoformat()?>')
390        yield eq, '2000-02-29T12:34:56', r(u'<?print @2000-02-29T12:34:56.isoformat()?>')
391        yield eq, '2000-02-29T12:34:56.987000', r(u'<?print @2000-02-29T12:34:56.987000.isoformat()?>') # JS and Java only supports milliseconds
392        yield eq, 'yes', r(u'<?if @2000-02-29T12:34:56.987654?>yes<?else?>no<?end if?>')
393
394
395@py.test.mark.ul4
396def test_color():
397    for r in all_renderers:
398        yield eq, '255,255,255,255', r(u'<?code c = #fff?><?print c[0]?>,<?print c[1]?>,<?print c[2]?>,<?print c[3]?>')
399        yield eq, '255,255,255,255', r(u'<?code c = #ffffff?><?print c[0]?>,<?print c[1]?>,<?print c[2]?>,<?print c[3]?>')
400        yield eq, '18,52,86,255', r(u'<?code c = #123456?><?print c[0]?>,<?print c[1]?>,<?print c[2]?>,<?print c[3]?>')
401        yield eq, '17,34,51,68', r(u'<?code c = #1234?><?print c[0]?>,<?print c[1]?>,<?print c[2]?>,<?print c[3]?>')
402        yield eq, '18,52,86,120', r(u'<?code c = #12345678?><?print c[0]?>,<?print c[1]?>,<?print c[2]?>,<?print c[3]?>')
403        yield eq, 'yes', r(u'<?if #fff?>yes<?else?>no<?end if?>')
404
405
406@py.test.mark.ul4
407def test_list():
408    for r in all_renderers:
409        yield eq, '', r(u'<?for item in []?><?print item?>;<?end for?>')
410        yield eq, '1;', r(u'<?for item in [1]?><?print item?>;<?end for?>')
411        yield eq, '1;', r(u'<?for item in [1,]?><?print item?>;<?end for?>')
412        yield eq, '1;2;', r(u'<?for item in [1, 2]?><?print item?>;<?end for?>')
413        yield eq, '1;2;', r(u'<?for item in [1, 2,]?><?print item?>;<?end for?>')
414        yield eq, 'no', r(u'<?if []?>yes<?else?>no<?end if?>')
415        yield eq, 'yes', r(u'<?if [1]?>yes<?else?>no<?end if?>')
416
417
418@py.test.mark.ul4
419def test_dict():
420    for r in all_renderers:
421        yield eq, '', r(u'<?for (key, value) in {}.items()?><?print key?>:<?print value?>\n<?end for?>')
422        yield eq, '1:2\n', r(u'<?for (key, value) in {1:2}.items()?><?print key?>:<?print value?>\n<?end for?>')
423        yield eq, '1:2\n', r(u'<?for (key, value) in {1:2,}.items()?><?print key?>:<?print value?>\n<?end for?>')
424        # With duplicate keys, later ones simply overwrite earlier ones
425        yield eq, '1:3\n', r(u'<?for (key, value) in {1:2, 1: 3}.items()?><?print key?>:<?print value?>\n<?end for?>')
426        # Test **
427        yield eq, '1:2\n', r(u'<?for (key, value) in {**{1:2}}.items()?><?print key?>:<?print value?>\n<?end for?>')
428        yield eq, '1:4\n', r(u'<?for (key, value) in {1:1, **{1:2}, 1:3, **{1:4}}.items()?><?print key?>:<?print value?>\n<?end for?>')
429        yield eq, 'no', r(u'<?if {}?>yes<?else?>no<?end if?>')
430        yield eq, 'yes', r(u'<?if {1:2}?>yes<?else?>no<?end if?>')
431
432
433@py.test.mark.ul4
434def test_code_storevar():
435    for r in all_renderers:
436        yield eq, '42', r(u'<?code x = 42?><?print x?>')
437        yield eq, 'xyzzy', r(u'<?code x = "xyzzy"?><?print x?>')
438
439
440@py.test.mark.ul4
441def test_code_addvar():
442    for r in all_renderers:
443        for x in (17, 17., False, True):
444            for y in (23, 23., False, True):
445                yield evaleq, x + y, r(u'<?code x = {}?><?code x += {}?><?print x?>'.format(x, y))
446        yield eq, 'xyzzy', r(u'<?code x = "xyz"?><?code x += "zy"?><?print x?>')
447
448
449@py.test.mark.ul4
450def test_code_subvar():
451    for r in all_renderers:
452        for x in (17, 17., False, True):
453            for y in (23, 23., False, True):
454                yield evaleq, x - y, r(u'<?code x = {}?><?code x -= {}?><?print x?>'.format(x, y))
455
456
457@py.test.mark.ul4
458def test_code_mulvar():
459    for r in all_renderers:
460        for x in (17, 17., False, True):
461            for y in (23, 23., False, True):
462                yield evaleq, x * y, r(u'<?code x = {}?><?code x *= {}?><?print x?>'.format(x, y))
463        for x in (17, False, True):
464            y = "xyzzy"
465            yield eq, x * y, r(u'<?code x = {}?><?code x *= {!r}?><?print x?>'.format(x, y))
466        yield eq, 17*"xyzzy", r(u'<?code x = "xyzzy"?><?code x *= 17?><?print x?>')
467
468
469@py.test.mark.ul4
470def test_code_floordivvar():
471    for r in all_renderers:
472        for x in (5, -5, 5.0, -5.0, 4, -4, 4.0, -4.0, False, True):
473            for y in (2, -2, 2.0, -2.0, True):
474                yield evaleq, x // y, r(u'<?code x = {}?><?code x //= {}?><?print x?>'.format(x, y))
475
476
477@py.test.mark.ul4
478def test_code_truedivvar():
479    for r in all_renderers:
480        for x in (5, -5, 5.0, -5.0, 4, -4, 4.0, -4.0, False, True):
481            for y in (2, -2, 2.0, -2.0, True):
482                yield evaleq, x / y, r(u'<?code x = {}?><?code x /= {}?><?print x?>'.format(x, y))
483
484
485@py.test.mark.ul4
486def test_code_modvar():
487    for r in all_renderers:
488        for x in (1729, 1729.0, -1729, -1729.0, False, True):
489            for y in (23, 23., -23, -23.0, True):
490                yield evaleq, x % y, r(u'<?code x = {}?><?code x %= {}?><?print x?>'.format(x, y))
491
492
493@py.test.mark.ul4
494def test_code_delvar():
495    for r in all_renderers:
496        yield raises, "(KeyError|not found)", r(u'<?code x = 1729?><?code del x?><?print x?>')
497
498
499@py.test.mark.ul4
500def test_for_string():
501    for r in all_renderers:
502        yield eq, '', r(u'<?for c in data?>(<?print c?>)<?end for?>', data="")
503        yield eq, '(g)(u)(r)(k)', r(u'<?for c in data?>(<?print c?>)<?end for?>', data="gurk")
504
505
506@py.test.mark.ul4
507def test_for_list():
508    for r in all_renderers:
509        yield eq, '', r(u'<?for c in data?>(<?print c?>)<?end for?>', data="")
510        yield eq, '(g)(u)(r)(k)', r(u'<?for c in data?>(<?print c?>)<?end for?>', data=["g", "u", "r", "k"])
511
512
513@py.test.mark.ul4
514def test_for_dict():
515    for r in all_renderers:
516        yield eq, '', r(u'<?for c in data?>(<?print c?>)<?end for?>', data={})
517        yield eq, '(a)(b)(c)', r(u'<?for c in sorted(data)?>(<?print c?>)<?end for?>', data=dict(a=1, b=2, c=3))
518
519
520@py.test.mark.ul4
521def test_for_nested():
522    for r in all_renderers:
523        yield eq, '[(1)(2)][(3)(4)]', r(u'<?for list in data?>[<?for n in list?>(<?print n?>)<?end for?>]<?end for?>', data=[[1, 2], [3, 4]])
524
525
526@py.test.mark.ul4
527def test_for_unpacking():
528    data = [
529        ("spam", "eggs", 17),
530        ("gurk", "hurz", 23),
531        ("hinz", "kunz", 42)
532    ]
533
534    for r in all_renderers:
535        yield eq, '(spam)(gurk)(hinz)', r(u'<?for (a,) in data?>(<?print a?>)<?end for?>', data=data)
536        yield eq, '(spam,eggs)(gurk,hurz)(hinz,kunz)', r(u'<?for (a, b) in data?>(<?print a?>,<?print b?>)<?end for?>', data=data)
537        yield eq, '(spam,eggs,17)(gurk,hurz,23)(hinz,kunz,42)', r(u'<?for (a, b, c) in data?>(<?print a?>,<?print b?>,<?print c?>)<?end for?>', data=data)
538
539
540@py.test.mark.ul4
541def test_break():
542    for r in all_renderers:
543        yield eq, '1, 2, ', r(u'<?for i in [1,2,3]?><?print i?>, <?if i==2?><?break?><?end if?><?end for?>')
544
545
546@py.test.mark.ul4
547def test_break_nested():
548    for r in all_renderers:
549        yield eq, '1, 1, 2, 1, 2, 3, ', r(u'<?for i in [1,2,3,4]?><?for j in [1,2,3,4]?><?print j?>, <?if j>=i?><?break?><?end if?><?end for?><?if i>=3?><?break?><?end if?><?end for?>')
550
551
552@py.test.mark.ul4
553def test_continue():
554    for r in all_renderers:
555        yield eq, '1, 3, ', r(u'<?for i in [1,2,3]?><?if i==2?><?continue?><?end if?><?print i?>, <?end for?>')
556
557
558@py.test.mark.ul4
559def test_continue_nested():
560    for r in all_renderers:
561        yield eq, '1, 3, \n1, 3, \n', r(u'<?for i in [1,2,3]?><?if i==2?><?continue?><?end if?><?for j in [1,2,3]?><?if j==2?><?continue?><?end if?><?print j?>, <?end for?>\n<?end for?>')
562
563
564@py.test.mark.ul4
565def test_if():
566    for r in all_renderers:
567        yield eq, '42', r(u'<?if data?><?print data?><?end if?>', data=42)
568
569
570@py.test.mark.ul4
571def test_else():
572    for r in all_renderers:
573        yield eq, '42', r(u'<?if data?><?print data?><?else?>no<?end if?>', data=42)
574        yield eq, 'no', r(u'<?if data?><?print data?><?else?>no<?end if?>', data=0)
575
576
577@py.test.mark.ul4
578def test_block_errors():
579    yield raises, "in u?.<.for x in data.>..*block unclosed", RenderPython(u'<?for x in data?>')
580    yield raises, "endif doesn't match any if", RenderPython(u'<?for x in data?><?end if?>')
581    yield raises, "not in any block", RenderPython(u'<?end?>')
582    yield raises, "not in any block", RenderPython(u'<?end for?>')
583    yield raises, "not in any block", RenderPython(u'<?end if?>')
584    yield raises, "else doesn't match any if", RenderPython(u'<?else?>')
585    yield raises, "in u?.<.if data.>..*block unclosed", RenderPython(u'<?if data?>')
586    yield raises, "in u?.<.if data.>..*block unclosed", RenderPython(u'<?if data?><?else?>')
587    yield raises, "duplicate else", RenderPython(u'<?if data?><?else?><?else?>')
588    yield raises, "else already seen in elif", RenderPython(u'<?if data?><?else?><?elif data?>')
589    yield raises, "else already seen in elif", RenderPython(u'<?if data?><?elif data?><?elif data?><?else?><?elif data?>')
590
591
592@py.test.mark.ul4
593def test_empty():
594    yield raises, "expression required", RenderPython(u'<?print?>')
595    yield raises, "expression required", RenderPython(u'<?if?>')
596    yield raises, "expression required", RenderPython(u'<<?if x?><?elif?><?end if?>')
597    yield raises, "loop expression required", RenderPython(u'<?for?>')
598    yield raises, "statement required", RenderPython(u'<?code?>')
599    yield raises, "render statement required", RenderPython(u'<?render?>')
600
601
602@py.test.mark.ul4
603def test_add():
604    values = (17, 23, 1., -1.)
605    for r in all_renderers:
606        for x in values:
607            for y in values:
608                yield evaleq, x + y, r(u'<?print x + y?>', x=x, y=y) # Using ``evaleq`` avoids problem with the nonexistant int/float distinction in JS
609        yield eq, 'foobar', r(u'<?code x="foo"?><?code y="bar"?><?print x+y?>')
610        yield eq, '(f)(o)(o)(b)(a)(r)', r(u'<?for i in data.foo+data.bar?>(<?print i?>)<?end for?>', data=dict(foo="foo", bar="bar"))
611
612
613@py.test.mark.ul4
614def test_sub():
615    values = (17, 23, 1., -1.)
616    for r in all_renderers:
617        for x in values:
618            for y in values:
619                yield evaleq, x - y, r(u'<?print x - y?>', x=x, y=y)
620
621
622@py.test.mark.ul4
623def test_mul():
624    values = (17, 23, 1., -1.)
625    for r in all_renderers:
626        for x in values:
627            for y in values:
628                yield evaleq, x * y, r(u'<?print x * y?>', x=x, y=y)
629        yield eq, 17*"foo", r(u'<?print 17*"foo"?>')
630        yield eq, 17*"foo", r(u'<?code x=17?><?code y="foo"?><?print x*y?>')
631        yield eq, "foo"*17, r(u'<?code x="foo"?><?code y=17?><?print x*y?>')
632        yield eq, "foo"*17, r(u'<?print "foo"*17?>')
633        yield eq, "(foo)(bar)(foo)(bar)(foo)(bar)", r(u'<?for i in 3*data?>(<?print i?>)<?end for?>', data=["foo", "bar"])
634
635
636@py.test.mark.ul4
637def test_truediv():
638    for r in all_renderers:
639        yield eq, "0.5", r(u'<?print 1/2?>')
640        yield eq, "0.5", r(u'<?code x=1?><?code y=2?><?print x/y?>')
641
642
643@py.test.mark.ul4
644def test_floordiv():
645    for r in all_renderers:
646        yield eq, "0", r(u'<?print 1//2?>')
647        yield eq, "0", r(u'<?code x=1?><?code y=2?><?print x//y?>')
648
649
650@py.test.mark.ul4
651def test_mod():
652    values = (17, 23, 17., 23.)
653    for r in all_renderers:
654        for x in values:
655            for y in values:
656                yield evaleq, x % y, r(u'<?print {} % {}?>'.format(x, y))
657                yield evaleq, x % y, r(u'<?print x % y?>', x=x, y=y)
658
659
660@py.test.mark.ul4
661def test_eq():
662    values = (17, 23, 17., 23.)
663    for r in all_renderers:
664        for x in values:
665            for y in values:
666                yield eq, str(x == y), r(u'<?print {} == {}?>'.format(x, y))
667                yield eq, str(x == y), r(u'<?print x == y?>', x=x, y=y)
668
669
670@py.test.mark.ul4
671def test_ne():
672    values = (17, 23, 17., 23.)
673    for r in all_renderers:
674        for x in values:
675            for y in values:
676                yield eq, str(x != y), r(u'<?print {} != {}?>'.format(x, y))
677                yield eq, str(x != y), r(u'<?print x != y?>', x=x, y=y)
678
679
680@py.test.mark.ul4
681def test_lt():
682    values = (17, 23, 17., 23.)
683    for r in all_renderers:
684        for x in values:
685            for y in values:
686                yield eq, str(x < y), r(u'<?print {} < {}?>'.format(x, y))
687                yield eq, str(x < y), r(u'<?print x < y?>', x=x, y=y)
688
689
690@py.test.mark.ul4
691def test_le():
692    values = (17, 23, 17., 23.)
693    for r in all_renderers:
694        for x in values:
695            for y in values:
696                yield eq, str(x <= y), r(u'<?print {} <= {}?>'.format(x, y))
697                yield eq, str(x <= y), r(u'<?print x <= y?>', x=x, y=y)
698
699
700@py.test.mark.ul4
701def test_gt():
702    values = (17, 23, 17., 23.)
703    for r in all_renderers:
704        for x in values:
705            for y in values:
706                yield eq, str(x > y), r(u'<?print {} > {}?>'.format(x, y))
707                yield eq, str(x > y), r(u'<?print x > y?>', x=x, y=y)
708
709
710@py.test.mark.ul4
711def test_ge():
712    values = (17, 23, 17., 23.)
713    for r in all_renderers:
714        for x in values:
715            for y in values:
716                yield eq, str(x >= y), r(u'<?print {} >= {}?>'.format(x, y))
717                yield eq, str(x >= y), r(u'<?print x >= y?>', x=x, y=y)
718
719
720@py.test.mark.ul4
721def test_contains():
722    code = u'<?print x in y?>'
723
724    for r in all_renderers:
725        yield eq, "True", r(code, x=2, y=[1, 2, 3])
726        yield eq, "False", r(code, x=4, y=[1, 2, 3])
727        yield eq, "True", r(code, x="ur", y="gurk")
728        yield eq, "False", r(code, x="un", y="gurk")
729        yield eq, "True", r(code, x="a", y={"a": 1, "b": 2})
730        yield eq, "False", r(code, x="c", y={"a": 1, "b": 2})
731        yield eq, "True", r(code, x=0xff, y=color.Color(0x00, 0x80, 0xff, 0x42))
732        yield eq, "False", r(code, x=0x23, y=color.Color(0x00, 0x80, 0xff, 0x42))
733
734
735@py.test.mark.ul4
736def test_notcontains():
737    code = u'<?print x not in y?>'
738
739    for r in all_renderers:
740        yield eq, "False", r(code, x=2, y=[1, 2, 3])
741        yield eq, "True", r(code, x=4, y=[1, 2, 3])
742        yield eq, "False", r(code, x="ur", y="gurk")
743        yield eq, "True", r(code, x="un", y="gurk")
744        yield eq, "False", r(code, x="a", y={"a": 1, "b": 2})
745        yield eq, "True", r(code, x="c", y={"a": 1, "b": 2})
746        yield eq, "False", r(code, x=0xff, y=color.Color(0x00, 0x80, 0xff, 0x42))
747        yield eq, "True", r(code, x=0x23, y=color.Color(0x00, 0x80, 0xff, 0x42))
748
749
750@py.test.mark.ul4
751def test_and():
752    for r in all_renderers:
753        yield eq, "False", r(u'<?print x and y?>', x=False, y=False)
754        yield eq, "False", r(u'<?print x and y?>', x=False, y=True)
755        yield eq, "0", r(u'<?print x and y?>', x=0, y=True)
756
757
758@py.test.mark.ul4
759def test_or():
760    for r in all_renderers:
761        yield eq, "False", r(u'<?print x or y?>', x=False, y=False)
762        yield eq, "True", r(u'<?print x or y?>', x=False, y=True)
763        yield eq, "42", r(u'<?print x or y?>', x=42, y=True)
764
765
766@py.test.mark.ul4
767def test_not():
768    for r in all_renderers:
769        yield eq, "True", r(u'<?print not x?>', x=False)
770        yield eq, "False", r(u'<?print not x?>', x=42)
771
772
773@py.test.mark.ul4
774def test_getitem():
775    for r in all_renderers:
776        yield eq, "u", r(u"<?print 'gurk'[1]?>")
777        yield eq, "u", r(u"<?print x[1]?>", x="gurk")
778        yield eq, "u", r(u"<?print 'gurk'[-3]?>")
779        yield eq, "u", r(u"<?print x[-3]?>", x="gurk")
780        yield raises, "IndexError", r(u"<?print 'gurk'[4]?>")
781        yield raises, "index (4 )?out of range", r(u"<?print x[4]?>", x="gurk")
782        yield raises, "IndexError", r(u"<?print 'gurk'[-5]?>")
783        yield raises, "index (-5 )?out of range", r(u"<?print x[-5]?>", x="gurk")
784
785
786@py.test.mark.ul4
787def test_getslice12():
788    for r in all_renderers:
789        yield eq, "ur", r(u"<?print 'gurk'[1:3]?>")
790        yield eq, "ur", r(u"<?print x[1:3]?>", x="gurk")
791        yield eq, "ur", r(u"<?print 'gurk'[-3:-1]?>")
792        yield eq, "ur", r(u"<?print x[-3:-1]?>", x="gurk")
793        yield eq, "", r(u"<?print 'gurk'[4:10]?>")
794        yield eq, "", r(u"<?print x[4:10]?>", x="gurk")
795        yield eq, "", r(u"<?print 'gurk'[-10:-5]?>")
796        yield eq, "", r(u"<?print x[-10:-5]?>", x="gurk")
797
798
799@py.test.mark.ul4
800def test_getslice1():
801    for r in all_renderers:
802        yield eq, "urk", r(u"<?print 'gurk'[1:]?>")
803        yield eq, "urk", r(u"<?print x[1:]?>", x="gurk")
804        yield eq, "urk", r(u"<?print 'gurk'[-3:]?>")
805        yield eq, "urk", r(u"<?print x[-3:]?>", x="gurk")
806        yield eq, "", r(u"<?print 'gurk'[4:]?>")
807        yield eq, "", r(u"<?print x[4:]?>", x="gurk")
808        yield eq, "gurk", r(u"<?print 'gurk'[-10:]?>")
809        yield eq, "gurk", r(u"<?print x[-10:]?>", x="gurk")
810
811
812@py.test.mark.ul4
813def test_getslice2():
814    for r in all_renderers:
815        yield eq, "gur", r(u"<?print 'gurk'[:3]?>")
816        yield eq, "gur", r(u"<?print x[:3]?>", x="gurk")
817        yield eq, "gur", r(u"<?print 'gurk'[:-1]?>")
818        yield eq, "gur", r(u"<?print x[:-1]?>", x="gurk")
819        yield eq, "gurk", r(u"<?print 'gurk'[:10]?>")
820        yield eq, "gurk", r(u"<?print x[:10]?>", x="gurk")
821        yield eq, "", r(u"<?print 'gurk'[:-5]?>")
822        yield eq, "", r(u"<?print x[:-5]?>", x="gurk")
823
824
825@py.test.mark.ul4
826def test_nested():
827    sc = u"4"
828    sv = u"x"
829    n = 4
830    # when using 10 compiling the variable will run out of registers
831    # when using 8 Java will output "An irrecoverable stack overflow has occurred"
832    depth = 7
833    for i in xrange(depth):
834        sc = u"({})+({})".format(sc, sc)
835        sv = u"({})+({})".format(sv, sv)
836        n = n + n
837
838    for r in all_renderers:
839        yield eq, str(n), r(u'<?print {}?>'.format(sc))
840        yield eq, str(n), r(u'<?code x=4?><?print {}?>'.format(sv))
841
842
843@py.test.mark.ul4
844def test_precedence():
845    for r in all_renderers:
846        yield eq, "14", r(u'<?print 2+3*4?>')
847        yield eq, "20", r(u'<?print (2+3)*4?>')
848        yield eq, "10", r(u'<?print -2+-3*-4?>')
849        yield eq, "14", r(u'<?print --2+--3*--4?>')
850        yield eq, "14", r(u'<?print (-(-2))+(-((-3)*-(-4)))?>')
851        yield eq, "42", r(u'<?print 2*data.value?>', data=dict(value=21))
852        yield eq, "42", r(u'<?print data.value[0]?>', data=dict(value=[42]))
853        yield eq, "42", r(u'<?print data[0].value?>', data=[dict(value=42)])
854        yield eq, "42", r(u'<?print data[0][0][0]?>', data=[[[42]]])
855        yield eq, "42", r(u'<?print data.value.value[0]?>', data=dict(value=dict(value=[42])))
856        yield eq, "42", r(u'<?print data.value.value[0].value.value[0]?>', data=dict(value=dict(value=[dict(value=dict(value=[42]))])))
857
858
859@py.test.mark.ul4
860def test_bracket():
861    sc = u"4"
862    sv = u"x"
863    for i in xrange(10):
864        sc = u"({})".format(sc)
865        sv = u"({})".format(sv)
866
867    for r in all_renderers:
868        yield eq, "4", r(u'<?print {}?>'.format(sc))
869        yield eq, "4", r(u'<?code x=4?><?print {}?>'.format(sv))
870
871
872@py.test.mark.ul4
873def test_function_now():
874    now = unicode(datetime.datetime.now())
875
876    for r in all_renderers:
877        yield raises, "now.*unknown", r(u"<?print now(1)?>")
878        yield raises, "now.*unknown", r(u"<?print now(1, 2)?>")
879        yield le, now, r(u"<?print now()?>")
880
881
882@py.test.mark.ul4
883def test_function_utcnow():
884    utcnow = unicode(datetime.datetime.utcnow())
885
886    for r in all_renderers:
887        yield raises, "utcnow.*unknown", r(u"<?print utcnow(1)?>")
888        yield raises, "utcnow.*unknown", r(u"<?print utcnow(1, 2)?>")
889        utcnowfromtemplate = r(u"<?print utcnow()?>")
890        # JS and Java only have milliseconds precision, but this shouldn't lead to problems here, as rendering the template takes longer than a millisecond
891        yield le, utcnow, utcnowfromtemplate
892
893
894@py.test.mark.ul4
895def test_function_vars():
896    code = u"<?if var in vars()?>yes<?else?>no<?end if?>"
897
898    for r in all_renderers:
899        yield raises, "vars.*unknown", r("<?print vars(1)?>")
900        yield raises, "vars.*unknown", r("<?print vars(1, 2)?>")
901        yield eq, "yes", r(code, var="spam", spam="eggs")
902        yield eq, "no", r(code, var="nospam", spam="eggs")
903
904
905@py.test.mark.ul4
906def test_function_random():
907    for r in all_renderers:
908        yield raises, "random.*unknown", r("<?print random(1)?>")
909        yield raises, "random.*unknown", r("<?print random(1, 2)?>")
910        yield eq, "ok", r(u"<?code r = random()?><?if r>=0 and r<1?>ok<?else?>fail<?end if?>")
911
912
913@py.test.mark.ul4
914def test_function_randrange():
915    for r in all_renderers:
916        yield raises, "randrange.*unknown", r("<?print randrange()?>")
917        yield eq, "ok", r(u"<?code r = randrange(4)?><?if r>=0 and r<4?>ok<?else?>fail<?end if?>")
918        yield eq, "ok", r(u"<?code r = randrange(17, 23)?><?if r>=17 and r<23?>ok<?else?>fail<?end if?>")
919        yield eq, "ok", r(u"<?code r = randrange(17, 23, 2)?><?if r>=17 and r<23 and r%2?>ok<?else?>fail<?end if?>")
920
921
922@py.test.mark.ul4
923def test_function_randchoice():
924    for r in all_renderers:
925        yield raises, "randchoice.*unknown", r("<?print randchoice()?>")
926        yield eq, "ok", r(u"<?code r = randchoice('abc')?><?if r in 'abc'?>ok<?else?>fail<?end if?>")
927        yield eq, "ok", r(u"<?code s = [17, 23, 42]?><?code r = randchoice(s)?><?if r in s?>ok<?else?>fail<?end if?>")
928        yield eq, "ok", r(u"<?code s = #12345678?><?code sl = [0x12, 0x34, 0x56, 0x78]?><?code r = randchoice(s)?><?if r in sl?>ok<?else?>fail<?end if?>")
929
930
931@py.test.mark.ul4
932def test_function_xmlescape():
933    for r in all_renderers:
934        yield raises, "xmlescape.*unknown", r(u"<?print xmlescape()?>")
935        yield raises, "xmlescape.*unknown", r(u"<?print xmlescape(1, 2)?>")
936        yield eq, "&lt;&lt;&gt;&gt;&amp;&#39;&quot;gurk", r(u"<?print xmlescape(data)?>", data='<<>>&\'"gurk')
937
938
939@py.test.mark.ul4
940def test_function_csv():
941    for r in all_renderers:
942        yield raises, "csv.*unknown", r(u"<?print csv()?>")
943        yield raises, "csv.*unknown", r(u"<?print csv(1, 2)?>")
944        yield eq, "", r(u"<?print csv(data)?>", data=None)
945        yield eq, "False", r(u"<?print csv(data)?>", data=False)
946        yield eq, "True", r(u"<?print csv(data)?>", data=True)
947        yield eq, "42", r(u"<?print csv(data)?>", data=42)
948        # no check for float
949        yield eq, "abc", r(u"<?print csv(data)?>", data="abc")
950        yield eq, '"a,b,c"', r(u"<?print csv(data)?>", data="a,b,c")
951        yield eq, '"a""b""c"', r(u"<?print csv(data)?>", data='a"b"c')
952        yield eq, '"a\nb\nc"', r(u"<?print csv(data)?>", data="a\nb\nc")
953
954
955@py.test.mark.ul4
956def test_function_json():
957    for r in all_renderers:
958        yield raises, "json.*unknown", r(u"<?print json()?>")
959        yield raises, "json.*unknown", r(u"<?print json(1, 2)?>")
960        yield eq, "null", r(u"<?print json(data)?>", data=None)
961        yield eq, "false", r(u"<?print json(data)?>", data=False)
962        yield eq, "true", r(u"<?print json(data)?>", data=True)
963        yield eq, "42", r(u"<?print json(data)?>", data=42)
964        # no check for float
965        yield eq, '"abc"', r(u"<?print json(data)?>", data="abc")
966        yield eq, '[1, 2, 3]', r(u"<?print json(data)?>", data=[1, 2, 3])
967        yield eq, '[1, 2, 3]', r(u"<?print json(data)?>", data=PseudoList([1, 2, 3]))
968        yield eq, '{"one": 1}', r(u"<?print json(data)?>", data={"one": 1})
969        yield eq, '{"one": 1}', r(u"<?print json(data)?>", data=PseudoDict({"one": 1}))
970
971
972@py.test.mark.ul4
973def test_function_str():
974    code = u"<?print str(data)?>"
975    for r in all_renderers:
976        yield raises, "str.*unknown", r(u"<?print str()?>")
977        yield raises, "str.*unknown", r(u"<?print str(1, 2)?>")
978        yield eq, "", r(code, data=None)
979        yield eq, "True", r(code, data=True)
980        yield eq, "False", r(code, data=False)
981        yield eq, "42", r(code, data=42)
982        yield eq, "4.2", r(code, data=4.2)
983        yield eq, "foo", r(code, data="foo")
984        yield eq, "2011-02-09", r(code, data=datetime.date(2011, 2, 9))
985        yield eq, "2011-02-09 12:34:56", r(code, data=datetime.datetime(2011, 2, 9, 12, 34, 56))
986        yield eq, "2011-02-09 12:34:56.987000", r(code, data=datetime.datetime(2011, 2, 9, 12, 34, 56, 987000))
987
988
989@py.test.mark.ul4
990def test_function_int():
991    for r in all_renderers:
992        yield raises, "int.*unknown", RenderPython(u"<?print int()?>")
993        yield raises, "int.*unknown", RenderPython(u"<?print int(1, 2, 3)?>")
994        yield raises, "int\\(\\) argument must be a string or a number|int\\(null\\) not supported", RenderPython(u"<?print int(data)?>", data=None)
995        yield raises, "invalid literal for int|NumberFormatException", RenderPython(u"<?print int(data)?>", data="foo")
996        yield eq, "1", r(u"<?print int(data)?>", data=True)
997        yield eq, "0", r(u"<?print int(data)?>", data=False)
998        yield eq, "42", r(u"<?print int(data)?>", data=42)
999        yield eq, "4", r(u"<?print int(data)?>", data=4.2)
1000        yield eq, "42", r(u"<?print int(data)?>", data="42")
1001        yield eq, "66", r(u"<?print int(data, 16)?>", data="42")
1002
1003
1004@py.test.mark.ul4
1005def test_function_float():
1006    code = u"<?print float(data)?>"
1007
1008    for r in all_renderers:
1009        yield raises, "float.*unknown", r(u"<?print float()?>")
1010        yield raises, "float.*unknown", r(u"<?print float(1, 2, 3)?>")
1011        yield raises, "float\\(\\) argument must be a string or a number|float\\(null\\) not supported", r(code, data=None)
1012        yield eq, "4.2", r(code, data=4.2)
1013        if r is not RenderJS:
1014            yield eq, "1.0", r(code, data=True)
1015            yield eq, "0.0", r(code, data=False)
1016            yield eq, "42.0", r(code, data=42)
1017            yield eq, "42.0", r(code, data="42")
1018        else:
1019            yield evaleq, 1.0, r(code, data=True)
1020            yield evaleq, 0.0, r(code, data=False)
1021            yield evaleq, 42.0, r(code, data=42)
1022            yield evaleq, 42.0, r(code, data="42")
1023
1024
1025@py.test.mark.ul4
1026def test_function_len():
1027    code = u"<?print len(data)?>"
1028    for r in all_renderers:
1029        yield raises, "len.*unknown", r(u"<?print len()?>")
1030        yield raises, "len.*unknown", r(u"<?print len(1, 2)?>")
1031        yield raises, "has no len\\(\\)|len\\(.*\\) not supported", r(code, data=None)
1032        yield raises, "has no len\\(\\)|len\\(.*\\) not supported", r(code, data=True)
1033        yield raises, "has no len\\(\\)|len\\(.*\\) not supported", r(code, data=False)
1034        yield raises, "has no len\\(\\)|len\\(.*\\) not supported", r(code, data=42)
1035        yield raises, "has no len\\(\\)|len\\(.*\\) not supported", r(code, data=4.2)
1036        yield eq, "42", r(code, data=42*"?")
1037        yield eq, "42", r(code, data=42*[None])
1038        yield eq, "42", r(code, data=dict.fromkeys(xrange(42)))
1039
1040
1041@py.test.mark.ul4
1042def test_function_enumerate():
1043    code = u"<?for (i, value) in enumerate(data)?><?print i?>:<?print value?>\n<?end for?>"
1044    for r in all_renderers:
1045        yield raises, "enumerate.*unknown", r(u"<?print enumerate()?>")
1046        yield raises, "enumerate.*unknown", r(u"<?print enumerate(1, 2)?>")
1047        yield raises, "is not iterable|iter\\(.*\\) not supported", r(code, data=None)
1048        yield raises, "is not iterable|iter\\(.*\\) not supported", r(code, data=True)
1049        yield raises, "is not iterable|iter\\(.*\\) not supported", r(code, data=False)
1050        yield raises, "is not iterable|iter\\(.*\\) not supported", r(code, data=42)
1051        yield raises, "is not iterable|iter\\(.*\\) not supported", r(code, data=4.2)
1052        yield eq, "0:f\n1:o\n2:o\n", r(code, data="foo")
1053        yield eq, "0:foo\n1:bar\n", r(code, data=["foo", "bar"])
1054        yield eq, "0:foo\n", r(code, data=dict(foo=True))
1055
1056
1057@py.test.mark.ul4
1058def test_function_isnone():
1059    code = u"<?print isnone(data)?>"
1060    for r in all_renderers:
1061        yield raises, "isnone.*unknown", r(u"<?print isnone()?>")
1062        yield raises, "isnone.*unknown", r(u"<?print isnone(1, 2)?>")
1063        yield eq, "True", r(code, data=None)
1064        yield eq, "False", r(code, data=True)
1065        yield eq, "False", r(code, data=False)
1066        yield eq, "False", r(code, data=42)
1067        yield eq, "False", r(code, data=4.2)
1068        yield eq, "False", r(code, data="foo")
1069        yield eq, "False", r(code, data=datetime.datetime.now())
1070        yield eq, "False", r(code, data=())
1071        yield eq, "False", r(code, data=[])
1072        yield eq, "False", r(code, data={})
1073        yield eq, "False", r(code, data=ul4c.Template(u""))
1074        yield eq, "False", r(code, data=color.red)
1075
1076
1077@py.test.mark.ul4
1078def test_function_isbool():
1079    code = u"<?print isbool(data)?>"
1080
1081    for r in all_renderers:
1082        yield raises, "isbool.*unknown", r(u"<?print isbool()?>")
1083        yield raises, "isbool.*unknown", r(u"<?print isbool(1, 2)?>")
1084        yield eq, "False", r(code, data=None)
1085        yield eq, "True", r(code, data=True)
1086        yield eq, "True", r(code, data=False)
1087        yield eq, "False", r(code, data=42)
1088        yield eq, "False", r(code, data=4.2)
1089        yield eq, "False", r(code, data="foo")
1090        yield eq, "False", r(code, data=datetime.datetime.now())
1091        yield eq, "False", r(code, data=())
1092        yield eq, "False", r(code, data=[])
1093        yield eq, "False", r(code, data={})
1094        yield eq, "False", r(code, data=ul4c.Template(u""))
1095        yield eq, "False", r(code, data=color.red)
1096
1097
1098@py.test.mark.ul4
1099def test_function_isint():
1100    code = u"<?print isint(data)?>"
1101
1102    for r in all_renderers:
1103        yield raises, "isint.*unknown", r(u"<?print isint()?>")
1104        yield raises, "isint.*unknown", r(u"<?print isint(1, 2)?>")
1105        yield eq, "False", r(code, data=None)
1106        yield eq, "False", r(code, data=True)
1107        yield eq, "False", r(code, data=False)
1108        yield eq, "True", r(code, data=42)
1109        yield eq, "False", r(code, data=4.2)
1110        yield eq, "False", r(code, data="foo")
1111        yield eq, "False", r(code, data=datetime.datetime.now())
1112        yield eq, "False", r(code, data=())
1113        yield eq, "False", r(code, data=[])
1114        yield eq, "False", r(code, data={})
1115        yield eq, "False", r(code, data=ul4c.Template(u""))
1116        yield eq, "False", r(code, data=color.red)
1117
1118
1119@py.test.mark.ul4
1120def test_function_isfloat():
1121    code = u"<?print isfloat(data)?>"
1122
1123    for r in all_renderers:
1124        yield raises, "isfloat.*unknown", r(u"<?print isfloat()?>")
1125        yield raises, "isfloat.*unknown", r(u"<?print isfloat(1, 2)?>")
1126        yield eq, "False", r(code, data=None)
1127        yield eq, "False", r(code, data=True)
1128        yield eq, "False", r(code, data=False)
1129        yield eq, "False", r(code, data=42)
1130        yield eq, "True", r(code, data=4.2)
1131        yield eq, "False", r(code, data="foo")
1132        yield eq, "False", r(code, data=datetime.datetime.now())
1133        yield eq, "False", r(code, data=())
1134        yield eq, "False", r(code, data=[])
1135        yield eq, "False", r(code, data={})
1136        yield eq, "False", r(code, data=ul4c.Template(u""))
1137        yield eq, "False", r(code, data=color.red)
1138
1139
1140@py.test.mark.ul4
1141def test_function_isstr():
1142    code = u"<?print isstr(data)?>"
1143
1144    for r in all_renderers:
1145        yield raises, "isstr.*unknown", r(u"<?print isstr()?>")
1146        yield raises, "isstr.*unknown", r(u"<?print isstr(1, 2)?>")
1147        yield eq, "False", r(code, data=None)
1148        yield eq, "False", r(code, data=True)
1149        yield eq, "False", r(code, data=False)
1150        yield eq, "False", r(code, data=42)
1151        yield eq, "False", r(code, data=4.2)
1152        yield eq, "True", r(code, data="foo")
1153        yield eq, "False", r(code, data=datetime.datetime.now())
1154        yield eq, "False", r(code, data=())
1155        yield eq, "False", r(code, data=[])
1156        yield eq, "False", r(code, data={})
1157        yield eq, "False", r(code, data=ul4c.Template(u""))
1158        yield eq, "False", r(code, data=color.red)
1159
1160
1161@py.test.mark.ul4
1162def test_function_isdate():
1163    code = u"<?print isdate(data)?>"
1164
1165    for r in all_renderers:
1166        yield raises, "isdate.*unknown", r(u"<?print isdate()?>")
1167        yield raises, "isdate.*unknown", r(u"<?print isdate(1, 2)?>")
1168        yield eq, "False", r(code, data=None)
1169        yield eq, "False", r(code, data=True)
1170        yield eq, "False", r(code, data=False)
1171        yield eq, "False", r(code, data=42)
1172        yield eq, "False", r(code, data=4.2)
1173        yield eq, "False", r(code, data="foo")
1174        yield eq, "True", r(code, data=datetime.datetime.now())
1175        yield eq, "False", r(code, data=())
1176        yield eq, "False", r(code, data=[])
1177        yield eq, "False", r(code, data={})
1178        yield eq, "False", r(code, data=ul4c.Template(u""))
1179        yield eq, "False", r(code, data=color.red)
1180
1181
1182@py.test.mark.ul4
1183def test_function_islist():
1184    code = u"<?print islist(data)?>"
1185
1186    for r in all_renderers:
1187        yield raises, "islist.*unknown", r(u"<?print islist()?>")
1188        yield raises, "islist.*unknown", r(u"<?print islist(1, 2)?>")
1189        yield eq, "False", r(code, data=None)
1190        yield eq, "False", r(code, data=True)
1191        yield eq, "False", r(code, data=False)
1192        yield eq, "False", r(code, data=42)
1193        yield eq, "False", r(code, data=4.2)
1194        yield eq, "False", r(code, data="foo")
1195        yield eq, "False", r(code, data=datetime.datetime.now())
1196        yield eq, "True", r(code, data=())
1197        yield eq, "True", r(code, data=[])
1198        yield eq, "True", r(code, data=PseudoList([]))
1199        yield eq, "False", r(code, data={})
1200        yield eq, "False", r(code, data=ul4c.Template(u""))
1201        yield eq, "False", r(code, data=color.red)
1202
1203
1204@py.test.mark.ul4
1205def test_function_isdict():
1206    code = u"<?print isdict(data)?>"
1207
1208    for r in all_renderers:
1209        yield raises, "isdict.*unknown", r(u"<?print isdict()?>")
1210        yield raises, "isdict.*unknown", r(u"<?print isdict(1, 2)?>")
1211        yield eq, "False", r(code, data=None)
1212        yield eq, "False", r(code, data=True)
1213        yield eq, "False", r(code, data=False)
1214        yield eq, "False", r(code, data=42)
1215        yield eq, "False", r(code, data=4.2)
1216        yield eq, "False", r(code, data="foo")
1217        yield eq, "False", r(code, data=datetime.datetime.now())
1218        yield eq, "False", r(code, data=())
1219        yield eq, "False", r(code, data=[])
1220        yield eq, "True", r(code, data={})
1221        yield eq, "True", r(code, data=PseudoDict({}))
1222        yield eq, "False", r(code, data=ul4c.Template(u""))
1223        yield eq, "False", r(code, data=color.red)
1224
1225
1226@py.test.mark.ul4
1227def test_function_istemplate():
1228    code = u"<?print istemplate(data)?>"
1229
1230    for r in all_renderers:
1231        yield raises, "istemplate.*unknown", r(u"<?print istemplate()?>")
1232        yield raises, "istemplate.*unknown", r(u"<?print istemplate(1, 2)?>")
1233        yield eq, "False", r(code, data=None)
1234        yield eq, "False", r(code, data=True)
1235        yield eq, "False", r(code, data=False)
1236        yield eq, "False", r(code, data=42)
1237        yield eq, "False", r(code, data=4.2)
1238        yield eq, "False", r(code, data="foo")
1239        yield eq, "False", r(code, data=datetime.datetime.now())
1240        yield eq, "False", r(code, data=())
1241        yield eq, "False", r(code, data=[])
1242        yield eq, "False", r(code, data={})
1243        yield eq, "True", r(code, data=ul4c.Template(u""))
1244        yield eq, "False", r(code, data=color.red)
1245
1246
1247@py.test.mark.ul4
1248def test_function_iscolor():
1249    code = u"<?print iscolor(data)?>"
1250
1251    for r in all_renderers:
1252        yield raises, "iscolor.*unknown", r(u"<?print iscolor()?>")
1253        yield raises, "iscolor.*unknown", r(u"<?print iscolor(1, 2)?>")
1254        yield eq, "False", r(code, data=None)
1255        yield eq, "False", r(code, data=True)
1256        yield eq, "False", r(code, data=False)
1257        yield eq, "False", r(code, data=42)
1258        yield eq, "False", r(code, data=4.2)
1259        yield eq, "False", r(code, data="foo")
1260        yield eq, "False", r(code, data=datetime.datetime.now())
1261        yield eq, "False", r(code, data=())
1262        yield eq, "False", r(code, data=[])
1263        yield eq, "False", r(code, data={})
1264        yield eq, "False", r(code, data=ul4c.Template(u""))
1265        yield eq, "True", r(code, data=color.red)
1266
1267
1268@py.test.mark.ul4
1269def test_function_get():
1270    for r in all_renderers:
1271        yield raises, "get.*unknown", r(u"<?print get()?>")
1272        yield eq, "", r(u"<?print get('x')?>")
1273        yield eq, "42", r(u"<?print get('x')?>", x=42)
1274        yield eq, "17", r(u"<?print get('x', 17)?>")
1275        yield eq, "42", r(u"<?print get('x', 17)?>", x=42)
1276
1277
1278@py.test.mark.ul4
1279def test_function_repr():
1280    code = u"<?print repr(data)?>"
1281
1282    for r in all_renderers:
1283        yield raises, "repr.*unknown", r(u"<?print repr()?>")
1284        yield raises, "repr.*unknown", r(u"<?print repr(1, 2)?>")
1285        yield eq, "None", r(code, data=None)
1286        yield eq, "True", r(code, data=True)
1287        yield eq, "False", r(code, data=False)
1288        yield eq, "42", r(code, data=42)
1289        yield evaleq, 42.5, r(code, data=42.5)
1290        yield contains, ('"foo"', "'foo'"), r(code, data="foo")
1291        yield evaleq, [1, 2, 3], r(code, data=[1, 2, 3])
1292        if r is not RenderJS:
1293            yield evaleq, [1, 2, 3], r(code, data=(1, 2, 3))
1294        yield evaleq, {"a": 1, "b": 2}, r(code, data={"a": 1, "b": 2})
1295        yield eq, "@2011-02-07T12:34:56.123000", r(code, data=datetime.datetime(2011, 2, 7, 12, 34, 56, 123000))
1296        yield eq, "@2011-02-07T12:34:56", r(code, data=datetime.datetime(2011, 2, 7, 12, 34, 56))
1297        yield eq, "@2011-02-07T", r(code, data=datetime.datetime(2011, 2, 7))
1298        yield eq, "@2011-02-07T", r(code, data=datetime.date(2011, 2, 7))
1299
1300
1301@py.test.mark.ul4
1302def test_method_format():
1303    t = datetime.datetime(2011, 2, 6, 12, 34, 56, 987000)
1304    code = u"<?print format(data, format)?>"
1305    for r in all_renderers:
1306        yield eq, "2011", r(code, format="%Y", data=t)
1307        yield eq, "02", r(code, format="%m", data=t)
1308        yield eq, "06", r(code, format="%d", data=t)
1309        yield eq, "12", r(code, format="%H", data=t)
1310        yield eq, "34", r(code, format="%M", data=t)
1311        yield eq, "56", r(code, format="%S", data=t)
1312        yield eq, "987000", r(code, format="%f", data=t)
1313        yield contains, ("Sun", "So"), r(code, format="%a", data=t)
1314        yield contains, ("Sunday", "Sonntag"), r(code, format="%A", data=t)
1315        yield eq, "Feb", r(code, format="%b", data=t)
1316        yield contains, ("February", "Februar"), r(code, format="%B", data=t)
1317        yield eq, "12", r(code, format="%I", data=t)
1318        yield eq, "037", r(code, format="%j", data=t)
1319        yield eq, "PM", r(code, format="%p", data=t)
1320        yield eq, "06", r(code, format="%U", data=t)
1321        yield eq, "0", r(code, format="%w", data=t)
1322        yield eq, "05", r(code, format="%W", data=t)
1323        yield eq, "11", r(code, format="%y", data=t)
1324        yield contains, ("Sun Feb  6 12:34:56 2011", "So Feb  6 12:34:56 2011"), r(code, format="%c", data=t)
1325        yield eq, "02/06/11", r(code, format="%x", data=t)
1326        yield eq, "12:34:56", r(code, format="%X", data=t)
1327        yield eq, "%", r(code, format="%%", data=t)
1328
1329
1330@py.test.mark.ul4
1331def test_function_chr():
1332    code = u"<?print chr(data)?>"
1333
1334    for r in all_renderers:
1335        yield raises, "chr.*unknown", r(u"<?print chr()?>")
1336        yield raises, "chr.*unknown", r(u"<?print chr(1, 2)?>")
1337        yield eq, "\x00", r(code, data=0)
1338        yield eq, "a", r(code, data=ord("a"))
1339        yield eq, u"\u20ac", r(code, data=0x20ac)
1340
1341
1342@py.test.mark.ul4
1343def test_function_ord():
1344    code = u"<?print ord(data)?>"
1345
1346    for r in all_renderers:
1347        yield raises, "ord.*unknown", r(u"<?print ord()?>")
1348        yield raises, "ord.*unknown", r(u"<?print ord(1, 2)?>")
1349        yield eq, "0", r(code, data="\x00")
1350        yield eq, str(ord("a")), r(code, data="a")
1351        yield eq, str(0x20ac), r(code, data=u"\u20ac")
1352
1353
1354@py.test.mark.ul4
1355def test_function_hex():
1356    code = u"<?print hex(data)?>"
1357
1358    for r in all_renderers:
1359        yield raises, "hex.*unknown", r(u"<?print hex()?>")
1360        yield raises, "hex.*unknown", r(u"<?print hex(1, 2)?>")
1361        yield eq, "0x0", r(code, data=0)
1362        yield eq, "0xff", r(code, data=0xff)
1363        yield eq, "0xffff", r(code, data=0xffff)
1364        yield eq, "-0xffff", r(code, data=-0xffff)
1365
1366
1367@py.test.mark.ul4
1368def test_function_oct():
1369    code = u"<?print oct(data)?>"
1370
1371    for r in all_renderers:
1372        yield raises, "oct.*unknown", r(u"<?print oct()?>")
1373        yield raises, "oct.*unknown", r(u"<?print oct(1, 2)?>")
1374        yield eq, "0o0", r(code, data=0)
1375        yield eq, "0o77", r(code, data=077)
1376        yield eq, "0o7777", r(code, data=07777)
1377        yield eq, "-0o7777", r(code, data=-07777)
1378
1379
1380@py.test.mark.ul4
1381def test_function_bin():
1382    code = u"<?print bin(data)?>"
1383
1384    for r in all_renderers:
1385        yield raises, "bin.*unknown", r(u"<?print bin()?>")
1386        yield raises, "bin.*unknown", r(u"<?print bin(1, 2)?>")
1387        yield eq, "0b0", r(code, data=0)
1388        yield eq, "0b11", r(code, data=3)
1389        yield eq, "-0b1111", r(code, data=-15)
1390
1391
1392@py.test.mark.ul4
1393def test_function_abs():
1394    code = u"<?print abs(data)?>"
1395
1396    for r in all_renderers:
1397        yield raises, "abs.*unknown", r(u"<?print abs()?>")
1398        yield raises, "abs.*unknown", r(u"<?print abs(1, 2)?>")
1399        yield eq, "0", r(code, data=0)
1400        yield eq, "42", r(code, data=42)
1401        yield eq, "42", r(code, data=-42)
1402
1403
1404@py.test.mark.ul4
1405def test_function_sorted():
1406    code = u"<?for i in sorted(data)?><?print i?><?end for?>"
1407
1408    for r in all_renderers:
1409        yield raises, "sorted.*unknown", r(u"<?print sorted()?>")
1410        yield raises, "sorted.*unknown", r(u"<?print sorted(1, 2)?>")
1411        yield eq, "gkru", r(code, data="gurk")
1412        yield eq, "24679", r(code, data="92746")
1413        yield eq, "012", r(code, data={0: "zero", 1: "one", 2: "two"})
1414
1415
1416@py.test.mark.ul4
1417def test_function_range():
1418    code1 = u"<?for i in range(data)?><?print i?><?end for?>"
1419    code2 = u"<?for i in range(data[0], data[1])?><?print i?><?end for?>"
1420    code3 = u"<?for i in range(data[0], data[1], data[2])?><?print i?><?end for?>"
1421
1422    for r in all_renderers:
1423        yield raises, "range.*unknown", r(u"<?print range()?>")
1424        yield eq, "", r(code1, data=-10)
1425        yield eq, "", r(code1, data=0)
1426        yield eq, "0", r(code1, data=1)
1427        yield eq, "01234", r(code1, data=5)
1428        yield eq, "", r(code2, data=[0, -10])
1429        yield eq, "", r(code2, data=[0, 0])
1430        yield eq, "01234", r(code2, data=[0, 5])
1431        yield eq, "-5-4-3-2-101234", r(code2, data=[-5, 5])
1432        yield eq, "", r(code3, data=[0, -10, 1])
1433        yield eq, "", r(code3, data=[0, 0, 1])
1434        yield eq, "02468", r(code3, data=[0, 10, 2])
1435        yield eq, "", r(code3, data=[0, 10, -2])
1436        yield eq, "108642", r(code3, data=[10, 0, -2])
1437        yield eq, "", r(code3, data=[10, 0, 2])
1438
1439
1440@py.test.mark.ul4
1441def test_function_zip():
1442    code2 = u"<?for (ix, iy) in zip(x, y)?><?print ix?>-<?print iy?>;<?end for?>"
1443    code3 = u"<?for (ix, iy, iz) in zip(x, y, z)?><?print ix?>-<?print iy?>+<?print iz?>;<?end for?>"
1444
1445    for r in all_renderers:
1446        yield raises, "zip.*unknown", r(u"<?print zip(1)?>")
1447        yield eq, "", r(code2, x=[], y=[])
1448        yield eq, "1-3;2-4;", r(code2, x=[1, 2], y=[3, 4])
1449        yield eq, "1-4;2-5;", r(code2, x=[1, 2, 3], y=[4, 5])
1450        yield eq, "", r(code3, x=[], y=[], z=[])
1451        yield eq, "1-3+5;2-4+6;", r(code3, x=[1, 2], y=[3, 4], z=[5, 6])
1452        yield eq, "1-4+6;", r(code3, x=[1, 2, 3], y=[4, 5], z=[6])
1453
1454
1455@py.test.mark.ul4
1456def test_function_type():
1457    code = u"<?print type(x)?>"
1458
1459    for r in all_renderers:
1460        yield raises, "type.*unknown", r(u"<?print type()?>")
1461        yield raises, "type.*unknown", r(u"<?print type(1, 2)?>")
1462        yield eq, "none", r(code, x=None)
1463        yield eq, "bool", r(code, x=False)
1464        yield eq, "bool", r(code, x=True)
1465        yield eq, "int", r(code, x=42)
1466        yield eq, "int", r(code, x=42L)
1467        yield eq, "float", r(code, x=4.2)
1468        yield eq, "str", r(code, x="foo")
1469        yield eq, "str", r(code, x=u"foo")
1470        yield eq, "date", r(code, x=datetime.datetime.now())
1471        yield eq, "date", r(code, x=datetime.date.today())
1472        yield eq, "list", r(code, x=(1, 2))
1473        yield eq, "list", r(code, x=[1, 2])
1474        yield eq, "list", r(code, x=PseudoList([1, 2]))
1475        yield eq, "dict", r(code, x={1: 2})
1476        yield eq, "dict", r(code, x=PseudoDict({1: 2}))
1477        yield eq, "template", r(code, x=ul4c.Template(""))
1478        yield eq, "color", r(code, x=color.red)
1479
1480
1481@py.test.mark.ul4
1482def test_function_reversed():
1483    code = u"<?for i in reversed(x)?>(<?print i?>)<?end for?>"
1484
1485    for r in all_renderers:
1486        yield raises, "reversed.*unknown", r(u"<?print reversed()?>")
1487        yield raises, "reversed.*unknown", r(u"<?print reversed(1, 2)?>")
1488        yield eq, "(3)(2)(1)", r(code, x="123")
1489        yield eq, "(3)(2)(1)", r(code, x=[1, 2, 3])
1490        yield eq, "(3)(2)(1)", r(code, x=(1, 2, 3))
1491
1492
1493@py.test.mark.ul4
1494def test_function_rgb():
1495    for r in all_renderers:
1496        yield eq, "#369", r("<?print repr(rgb(0.2, 0.4, 0.6))?>")
1497        yield eq, "#369c", r("<?print repr(rgb(0.2, 0.4, 0.6, 0.8))?>")
1498
1499
1500@py.test.mark.ul4
1501def test_function_hls():
1502    for r in all_renderers:
1503        yield eq, "#fff", r("<?print repr(hls(0, 1, 0))?>")
1504        yield eq, "#fff0", r("<?print repr(hls(0, 1, 0, 0))?>")
1505
1506
1507@py.test.mark.ul4
1508def test_function_hsv():
1509    for r in all_renderers:
1510        yield eq, "#fff", r("<?print repr(hsv(0, 0, 1))?>")
1511        yield eq, "#fff0", r("<?print repr(hsv(0, 0, 1, 0))?>")
1512
1513
1514@py.test.mark.ul4
1515def test_method_upper():
1516    for r in all_renderers:
1517        yield eq, "GURK", r(u"<?print 'gurk'.upper()?>")
1518
1519
1520@py.test.mark.ul4
1521def test_method_lower():
1522    for r in all_renderers:
1523        yield eq, "gurk", r(u"<?print 'GURK'.lower()?>")
1524
1525
1526@py.test.mark.ul4
1527def test_method_capitalize():
1528    for r in all_renderers:
1529        yield eq, "Gurk", r(u"<?print 'gURK'.capitalize()?>")
1530
1531
1532@py.test.mark.ul4
1533def test_method_startswith():
1534    for r in all_renderers:
1535        yield eq, "True", r(u"<?print 'gurkhurz'.startswith('gurk')?>")
1536        yield eq, "False", r(u"<?print 'gurkhurz'.startswith('hurz')?>")
1537
1538
1539@py.test.mark.ul4
1540def test_method_endswith():
1541    for r in all_renderers:
1542        yield eq, "True", r(u"<?print 'gurkhurz'.endswith('hurz')?>")
1543        yield eq, "False", r(u"<?print 'gurkhurz'.endswith('gurk')?>")
1544
1545
1546@py.test.mark.ul4
1547def test_method_strip():
1548    for r in all_renderers:
1549        yield eq, "gurk", r(r"<?print obj.strip()?>", obj=' \t\r\ngurk \t\r\n')
1550        yield eq, "gurk", r(r"<?print obj.strip('xyz')?>", obj='xyzzygurkxyzzy')
1551
1552
1553@py.test.mark.ul4
1554def test_method_lstrip():
1555    for r in all_renderers:
1556        yield eq, "gurk \t\r\n", r("<?print obj.lstrip()?>", obj=" \t\r\ngurk \t\r\n")
1557        yield eq, "gurkxyzzy", r("<?print obj.lstrip(arg)?>", obj="xyzzygurkxyzzy", arg="xyz")
1558
1559
1560@py.test.mark.ul4
1561def test_method_rstrip():
1562    for r in all_renderers:
1563        yield eq, " \t\r\ngurk", r("<?print obj.rstrip()?>", obj=" \t\r\ngurk \t\r\n")
1564        yield eq, "xyzzygurk", r("<?print obj.rstrip(arg)?>", obj="xyzzygurkxyzzy", arg="xyz")
1565
1566
1567@py.test.mark.ul4
1568def test_method_split():
1569    for r in all_renderers:
1570        yield eq, "(f)(o)(o)", r(u"<?for item in obj.split()?>(<?print item?>)<?end for?>", obj=" \t\r\nf \t\r\no \t\r\no \t\r\n")
1571        yield eq, "(f)(o \t\r\no \t\r\n)", r(u"<?for item in obj.split(None, 1)?>(<?print item?>)<?end for?>", obj=" \t\r\nf \t\r\no \t\r\no \t\r\n")
1572        yield eq, "()(f)(o)(o)()", r(u"<?for item in obj.split(arg)?>(<?print item?>)<?end for?>", obj="xxfxxoxxoxx", arg="xx")
1573        yield eq, "()(f)(oxxoxx)", r(u"<?for item in obj.split(arg, 2)?>(<?print item?>)<?end for?>", obj="xxfxxoxxoxx", arg="xx")
1574
1575
1576@py.test.mark.ul4
1577def test_method_rsplit():
1578    for r in all_renderers:
1579        yield eq, "(f)(o)(o)", r(u"<?for item in obj.rsplit()?>(<?print item?>)<?end for?>", obj=" \t\r\nf \t\r\no \t\r\no \t\r\n")
1580        yield eq, "( \t\r\nf \t\r\no)(o)", r(u"<?for item in obj.rsplit(None, 1)?>(<?print item?>)<?end for?>", obj=" \t\r\nf \t\r\no \t\r\no \t\r\n")
1581        yield eq, "()(f)(o)(o)()", r(u"<?for item in obj.rsplit(arg)?>(<?print item?>)<?end for?>", obj="xxfxxoxxoxx", arg="xx")
1582        yield eq, "(xxfxxo)(o)()", r(u"<?for item in obj.rsplit(arg, 2)?>(<?print item?>)<?end for?>", obj="xxfxxoxxoxx", arg="xx")
1583
1584
1585@py.test.mark.ul4
1586def test_method_replace():
1587    for r in all_renderers:
1588        yield eq, 'goork', r(ur"<?print 'gurk'.replace('u', 'oo')?>")
1589
1590
1591@py.test.mark.ul4
1592def test_method_render():
1593    for r in all_renderers:
1594        t = ul4c.Template(u'(<?print data?>)')
1595        yield eq, '(GURK)', r(u"<?print t.render(data='gurk').upper()?>", t=t)
1596        yield eq, '(GURK)', r(u"<?print t.render(**{'data': 'gurk'}).upper()?>", t=t)
1597
1598        t = ul4c.Template(u'(gurk)')
1599        yield eq, '(GURK)', r(u"<?print t.render().upper()?>", t=t)
1600
1601
1602@py.test.mark.ul4
1603def test_method_isoformat():
1604    t = datetime.datetime(2010, 02, 22, 12, 34, 56)
1605    for r in all_renderers:
1606        yield eq, 'Mon, 22 Feb 2010 12:34:56 GMT', r(ur"<?print data.mimeformat()?>", data=t)
1607
1608
1609@py.test.mark.ul4
1610def test_method_get():
1611    for r in all_renderers:
1612        yield eq, "42", r(u"<?print {}.get('foo', 42)?>")
1613        yield eq, "17", r(u"<?print {'foo': 17}.get('foo', 42)?>")
1614        yield eq, "", r(u"<?print {}.get('foo')?>")
1615        yield eq, "17", r(u"<?print {'foo': 17}.get('foo')?>")
1616
1617
1618@py.test.mark.ul4
1619def test_method_r_g_b_a():
1620    for r in all_renderers:
1621        yield eq, '0x11', r(u'<?code c = #123?><?print hex(c.r())?>')
1622        yield eq, '0x22', r(u'<?code c = #123?><?print hex(c.g())?>')
1623        yield eq, '0x33', r(u'<?code c = #123?><?print hex(c.b())?>')
1624        yield eq, '0xff', r(u'<?code c = #123?><?print hex(c.a())?>')
1625
1626
1627@py.test.mark.ul4
1628def test_method_hls():
1629    for r in all_renderers:
1630        yield eq, '0', r(u'<?code c = #fff?><?print int(c.hls()[0])?>')
1631        yield eq, '1', r(u'<?code c = #fff?><?print int(c.hls()[1])?>')
1632        yield eq, '0', r(u'<?code c = #fff?><?print int(c.hls()[2])?>')
1633
1634
1635@py.test.mark.ul4
1636def test_method_hlsa():
1637    for r in all_renderers:
1638        yield eq, '0', r(u'<?code c = #fff?><?print int(c.hlsa()[0])?>')
1639        yield eq, '1', r(u'<?code c = #fff?><?print int(c.hlsa()[1])?>')
1640        yield eq, '0', r(u'<?code c = #fff?><?print int(c.hlsa()[2])?>')
1641        yield eq, '1', r(u'<?code c = #fff?><?print int(c.hlsa()[3])?>')
1642
1643
1644@py.test.mark.ul4
1645def test_method_hsv():
1646    for r in all_renderers:
1647        yield eq, '0', r(u'<?code c = #fff?><?print int(c.hsv()[0])?>')
1648        yield eq, '0', r(u'<?code c = #fff?><?print int(c.hsv()[1])?>')
1649        yield eq, '1', r(u'<?code c = #fff?><?print int(c.hsv()[2])?>')
1650
1651
1652@py.test.mark.ul4
1653def test_method_hsva():
1654    for r in all_renderers:
1655        yield eq, '0', r(u'<?code c = #fff?><?print int(c.hsva()[0])?>')
1656        yield eq, '0', r(u'<?code c = #fff?><?print int(c.hsva()[1])?>')
1657        yield eq, '1', r(u'<?code c = #fff?><?print int(c.hsva()[2])?>')
1658        yield eq, '1', r(u'<?code c = #fff?><?print int(c.hsva()[3])?>')
1659
1660
1661@py.test.mark.ul4
1662def test_method_lum():
1663    for r in all_renderers:
1664        yield eq, 'True', r(u'<?print #fff.lum() == 1?>')
1665
1666
1667@py.test.mark.ul4
1668def test_method_withlum():
1669    for r in all_renderers:
1670        yield eq, '#fff', r(u'<?print #000.withlum(1)?>')
1671
1672
1673@py.test.mark.ul4
1674def test_method_witha():
1675    for r in all_renderers:
1676        yield eq, '#0063a82a', r(u'<?print repr(#0063a8.witha(42))?>')
1677
1678
1679@py.test.mark.ul4
1680def test_method_join():
1681    for r in all_renderers:
1682        yield eq, '1,2,3,4', r(u'<?print ",".join("1234")?>')
1683        yield eq, '1,2,3,4', r(u'<?print ",".join([1, 2, 3, 4])?>')
1684
1685
1686@py.test.mark.ul4
1687def test_method_find():
1688    for r in all_renderers:
1689        yield eq, '-1', r(u'<?print s.find("ks")?>', s="gurkgurk")
1690        yield eq, '2', r(u'<?print s.find("rk")?>', s="gurkgurk")
1691        yield eq, '2', r(u'<?print s.find("rk", 2)?>', s="gurkgurk")
1692        yield eq, '2', r(u'<?print s.find("rk", 2, 4)?>', s="gurkgurk")
1693        yield eq, '6', r(u'<?print s.find("rk", 4, 8)?>', s="gurkgurk")
1694        yield eq, '-1', r(u'<?print s.find("rk", 2, 3)?>', s="gurkgurk")
1695        yield eq, '-1', r(u'<?print s.find("rk", 7)?>', s="gurkgurk")
1696
1697
1698@py.test.mark.ul4
1699def test_method_rfind():
1700    for r in all_renderers:
1701        yield eq, '-1', r(u'<?print s.rfind("ks")?>', s="gurkgurk")
1702        yield eq, '6', r(u'<?print s.rfind("rk")?>', s="gurkgurk")
1703        yield eq, '6', r(u'<?print s.rfind("rk", 2)?>', s="gurkgurk")
1704        yield eq, '2', r(u'<?print s.rfind("rk", 2, 4)?>', s="gurkgurk")
1705        yield eq, '6', r(u'<?print s.rfind("rk", 4, 8)?>', s="gurkgurk")
1706        yield eq, '-1', r(u'<?print s.rfind("rk", 2, 3)?>', s="gurkgurk")
1707        yield eq, '-1', r(u'<?print s.rfind("rk", 7)?>', s="gurkgurk")
1708
1709
1710@py.test.mark.ul4
1711def test_method_day():
1712    for r in all_renderers:
1713        yield eq, '12', r(u'<?print @2010-05-12T.day()?>')
1714        yield eq, '12', r(u'<?print d.day()?>', d=datetime.date(2010, 5, 12))
1715
1716
1717@py.test.mark.ul4
1718def test_method_month():
1719    for r in all_renderers:
1720        yield eq, '5', r(u'<?print @2010-05-12T.month()?>')
1721        yield eq, '5', r(u'<?print d.month()?>', d=datetime.date(2010, 5, 12))
1722
1723
1724@py.test.mark.ul4
1725def test_method_year():
1726    for r in all_renderers:
1727        yield eq, '5', r(u'<?print @2010-05-12T.month()?>')
1728        yield eq, '5', r(u'<?print d.month()?>', d=datetime.date(2010, 5, 12))
1729
1730
1731@py.test.mark.ul4
1732def test_method_hour():
1733    for r in all_renderers:
1734        yield eq, '16', r(u'<?print @2010-05-12T16:47:56.hour()?>')
1735        yield eq, '16', r(u'<?print d.hour()?>', d=datetime.datetime(2010, 5, 12, 16, 47, 56))
1736
1737
1738@py.test.mark.ul4
1739def test_method_minute():
1740    for r in all_renderers:
1741        yield eq, '47', r(u'<?print @2010-05-12T16:47:56.minute()?>')
1742        yield eq, '47', r(u'<?print d.minute()?>', d=datetime.datetime(2010, 5, 12, 16, 47, 56))
1743
1744
1745@py.test.mark.ul4
1746def test_method_second():
1747    for r in all_renderers:
1748        yield eq, '56', r(u'<?print @2010-05-12T16:47:56.second()?>')
1749        yield eq, '56', r(u'<?print d.second()?>', d=datetime.datetime(2010, 5, 12, 16, 47, 56))
1750
1751
1752@py.test.mark.ul4
1753def test_method_microsecond():
1754    for r in all_renderers:
1755        yield eq, '123000', r(u'<?print @2010-05-12T16:47:56.123000.microsecond()?>')
1756        yield eq, '123000', r(u'<?print d.microsecond()?>', d=datetime.datetime(2010, 5, 12, 16, 47, 56, 123000))
1757
1758
1759@py.test.mark.ul4
1760def test_method_weekday():
1761    for r in all_renderers:
1762        yield eq, '2', r(u'<?print @2010-05-12T.weekday()?>')
1763        yield eq, '2', r(u'<?print d.weekday()?>', d=datetime.date(2010, 5, 12))
1764
1765
1766@py.test.mark.ul4
1767def test_method_yearday():
1768    for r in all_renderers:
1769        yield eq, '1', r(u'<?print @2010-01-01T.yearday()?>')
1770        yield eq, '366', r(u'<?print @2008-12-31T.yearday()?>')
1771        yield eq, '365', r(u'<?print @2010-12-31T.yearday()?>')
1772        yield eq, '132', r(u'<?print @2010-05-12T.yearday()?>')
1773        yield eq, '132', r(u'<?print @2010-05-12T16:47:56.yearday()?>')
1774        yield eq, '132', r(u'<?print d.yearday()?>', d=datetime.date(2010, 5, 12))
1775        yield eq, '132', r(u'<?print d.yearday()?>', d=datetime.datetime(2010, 5, 12, 16, 47, 56))
1776
1777
1778@py.test.mark.ul4
1779def test_render():
1780    t = ul4c.Template(u'<?print prefix?><?print data?><?print suffix?>')
1781    for r in all_renderers:
1782        yield eq, '(f)(o)(o)', r(u'<?for c in data?><?render t(data=c, prefix="(", suffix=")")?><?end for?>', t=t, data='foo')
1783        yield eq, '(f)(o)(o)', r(u'<?for c in data?><?render t(data=c, **{"prefix": "(", "suffix": ")"})?><?end for?>', t=t, data='foo')
1784
1785
1786@py.test.mark.ul4
1787def test_render_var():
1788    t = ul4c.Template(u'<?code x += 1?><?print x?>')
1789    for r in all_renderers:
1790        yield eq, '42,43,42', r(u'<?print x?>,<?render t(x=x)?>,<?print x?>', t=t, x=42)
1791
1792
1793@py.test.mark.ul4
1794def test_def():
1795    for r in all_renderers:
1796        yield eq, 'foo', r(u'<?def lower?><?print x.lower()?><?end def?><?print lower.render(x="FOO")?>')
1797
1798
1799@py.test.mark.ul4
1800def test_parse():
1801    for r in all_renderers:
1802        yield eq, '42', r(u'<?print data.Noner?>', data=dict(Noner=42))
1803
1804
1805@py.test.mark.ul4
1806def test_nested_exceptions():
1807    tmpl1 = ul4c.Template(u"<?print 2*x?>")
1808    tmpl2 = ul4c.Template(u"<?render tmpl1(x=x)?>")
1809    tmpl3 = ul4c.Template(u"<?render tmpl2(tmpl1=tmpl1, x=x)?>")
1810
1811    for r in all_python_renderers:
1812        msg = "render tmpl3.*render tmpl2.*render tmpl1.*print 2.*TypeError.*unsupported operand type|.* \\* .* not supported"
1813        yield raises, msg, r(u"<?render tmpl3(tmpl1=tmpl1, tmpl2=tmpl2, x=x)?>", tmpl1=tmpl1, tmpl2=tmpl2, tmpl3=tmpl3, x=None)
1814
1815
1816@py.test.mark.ul4
1817def test_note():
1818    for r in all_renderers:
1819        yield eq, "foo", r(u"f<?note This is?>o<?note a comment?>o")
1820
1821
1822@py.test.mark.ul4
1823def test_templateattributes():
1824    s = "<?print x?>"
1825    t = ul4c.Template(s)
1826
1827    for r in all_python_renderers:
1828        yield eq, "<?", r(u"<?print template.startdelim?>", template=t)
1829        yield eq, "?>", r(u"<?print template.enddelim?>", template=t)
1830        yield eq, s, r(u"<?print template.source?>", template=t)
1831        yield eq, "2", r(u"<?print len(template.opcodes)?>", template=t)
1832        yield eq, "loadvar", r(u"<?print template.opcodes[0].code?>", template=t)
1833        yield eq, "0", r(u"<?print template.opcodes[0].r1?>", template=t)
1834        yield eq, "", r(u"<?print template.opcodes[0].r2?>", template=t)
1835        yield eq, "x", r(u"<?print template.opcodes[0].arg?>", template=t)
1836        yield eq, s, r(u"<?code loc = template.opcodes[0].location?><?print template.source[loc.starttag:loc.endtag]?>", template=t)
1837        yield eq, "x", r(u"<?code loc = template.opcodes[0].location?><?print template.source[loc.startcode:loc.endcode]?>", template=t)
1838
1839
1840def universaltemplate():
1841    return ul4c.Template("""
1842        text
1843        <?code x = 'gurk'?>
1844        <?code x = 42?>
1845        <?code x = 4.2?>
1846        <?code x = None?>
1847        <?code x = False?>
1848        <?code x = True?>
1849        <?code x = @2009-01-04T?>
1850        <?code x = #0063a8?>
1851        <?code x = [42]?>
1852        <?code x = {"fortytwo": 42}?>
1853        <?code x = {**{"fortytwo": 42}}?>
1854        <?code x = y?>
1855        <?code x += 42?>
1856        <?code x -= 42?>
1857        <?code x *= 42?>
1858        <?code x /= 42?>
1859        <?code x //= 42?>
1860        <?code x %= 42?>
1861        <?code del x?>
1862        <?print x.gurk?>
1863        <?print x["gurk"]?>
1864        <?print x[1:2]?>
1865        <?print x[1:]?>
1866        <?print x[:2]?>
1867        <?printx x?>
1868        <?for x in "12"?><?print x?><?break?><?continue?><?end for?>
1869        <?print not x?>
1870        <?print -x?>
1871        <?print x in y?>
1872        <?print x not in y?>
1873        <?print x==y?>
1874        <?print x!=y?>
1875        <?print x<y?>
1876        <?print x<=y?>
1877        <?print x>y?>
1878        <?print x>=y?>
1879        <?print x+y?>
1880        <?print x*y?>
1881        <?print x/y?>
1882        <?print x//y?>
1883        <?print x and y?>
1884        <?print x or y?>
1885        <?print x % y?>
1886        <?print now()?>
1887        <?print repr(1)?>
1888        <?print range(1, 2)?>
1889        <?print range(1, 2, 3)?>
1890        <?print rgb(1, 2, 3, 4)?>
1891        <?print x.r()?>
1892        <?print x.find(1)?>
1893        <?print x.find(1, 2)?>
1894        <?print x.find(1, 2, 3)?>
1895        <?if x?>gurk<?elif y?>hurz<?else?>hinz<?end if?>
1896        <?render x(a=1, b=2)?>
1897        <?def x?>foo<?end def?>
1898        <?render x()?>
1899    """)
1900
1901
1902@py.test.mark.ul4
1903def test_strtemplate():
1904    t = universaltemplate()
1905    str(t)
1906
1907
1908@py.test.mark.ul4
1909def test_pythonsource():
1910    t = universaltemplate()
1911    t.pythonsource()
1912
1913
1914@py.test.mark.ul4
1915def test_pythonfunction():
1916    t = universaltemplate()
1917    t.pythonfunction()
1918
1919
1920@py.test.mark.ul4
1921def test_jssource():
1922    t = universaltemplate()
1923    t.jssource()
1924
1925
1926@py.test.mark.ul4
1927def test_javasource():
1928    t = universaltemplate()
1929    t.javasource()
1930
1931
1932@py.test.mark.ul4
1933def test_attr_if():
1934    cond = ul4.attr_if(html.a("gu'\"rk"), cond="cond")
1935
1936    s = html.div(class_=cond).conv().string()
1937    for r in all_renderers:
1938        yield eq, u'<div></div>', r(s, cond=False)
1939        yield eq, u'''<div class="gu'&quot;rk"></div>''', r(s, cond=True)
1940
1941    s = html.div(class_=(cond, "hurz")).conv().string()
1942    for r in all_renderers:
1943        yield eq, u'<div class="hurz"></div>', r(s, cond=False)
1944        yield eq, u'''<div class="gu'&quot;rkhurz"></div>''', r(s, cond=True)
1945
1946    s = cond.conv().string()
1947    for r in all_renderers:
1948        yield eq, u'', r(s, cond=False)
1949        yield eq, u'''<a>gu'"rk</a>''', r(s, cond=True)
Note: See TracBrowser for help on using the browser.