More Python 3 support.
[jinja2.git] / tests / test_lexer.py
1 # -*- coding: utf-8 -*-
2 """
3     unit test for the lexer
4     ~~~~~~~~~~~~~~~~~~~~~~~
5
6     :copyright: (c) 2009 by the Jinja Team.
7     :license: BSD, see LICENSE for more details.
8 """
9 from jinja2 import Environment
10
11 env = Environment()
12
13
14 RAW = '{% raw %}foo{% endraw %}|{%raw%}{{ bar }}|{% baz %}{%       endraw    %}'
15 BALANCING = '''{% for item in seq %}${{'foo': item}|upper}{% endfor %}'''
16 COMMENTS = '''\
17 <ul>
18 <!--- for item in seq -->
19   <li>{item}</li>
20 <!--- endfor -->
21 </ul>'''
22 BYTEFALLBACK = u'''{{ 'foo'|pprint }}|{{ 'bär'|pprint }}'''
23
24
25 def test_raw():
26     tmpl = env.from_string(RAW)
27     assert tmpl.render() == 'foo|{{ bar }}|{% baz %}'
28
29
30 def test_balancing():
31     from jinja2 import Environment
32     env = Environment('{%', '%}', '${', '}')
33     tmpl = env.from_string(BALANCING)
34     assert tmpl.render(seq=range(3)) == "{'FOO': 0}{'FOO': 1}{'FOO': 2}"
35
36
37 def test_comments():
38     from jinja2 import Environment
39     env = Environment('<!--', '-->', '{', '}')
40     tmpl = env.from_string(COMMENTS)
41     assert tmpl.render(seq=range(3)) == ("<ul>\n  <li>0</li>\n  "
42                                          "<li>1</li>\n  <li>2</li>\n</ul>")
43
44
45 def test_string_escapes():
46     for char in u'\0', u'\u2668', u'\xe4', u'\t', u'\r', u'\n':
47         tmpl = env.from_string('{{ %s }}' % repr(char)[1:])
48         assert tmpl.render() == char
49     assert env.from_string('{{ "\N{HOT SPRINGS}" }}').render() == u'\u2668'
50
51
52 def test_bytefallback():
53     tmpl = env.from_string(BYTEFALLBACK)
54     assert tmpl.render() == u"'foo'|u'b\\xe4r'"
55
56
57 def test_operators():
58     from jinja2.lexer import operators
59     for test, expect in operators.iteritems():
60         if test in '([{}])':
61             continue
62         stream = env.lexer.tokenize('{{ %s }}' % test)
63         stream.next()
64         assert stream.current.type == expect
65
66
67 def test_normalizing():
68     from jinja2 import Environment
69     for seq in '\r', '\r\n', '\n':
70         env = Environment(newline_sequence=seq)
71         tmpl = env.from_string('1\n2\r\n3\n4\n')
72         result = tmpl.render()
73         assert result.replace(seq, 'X') == '1X2X3X4'