blob: ca9506daa76e112ac4dfb6e798b038e6e05f6233 [file] [log] [blame]
Armin Ronacherccf284b2007-05-21 16:44:26 +02001# -*- coding: utf-8 -*-
2"""
3 unit test for the parser
4 ~~~~~~~~~~~~~~~~~~~~~~~~
5
Armin Ronacher62ccd1b2009-01-04 14:26:19 +01006 :copyright: (c) 2009 by the Jinja Team.
Armin Ronacherccf284b2007-05-21 16:44:26 +02007 :license: BSD, see LICENSE for more details.
8"""
Christoph Hacke9e43bb2008-04-13 23:35:48 +02009from jinja2 import Environment
Armin Ronacherccf284b2007-05-21 16:44:26 +020010
Armin Ronacherccf284b2007-05-21 16:44:26 +020011
12PHP_SYNTAX = '''\
13<!-- I'm a comment, I'm not interesting -->\
14<? for item in seq -?>
15 <?= item ?>
16<?- endfor ?>'''
17
18ERB_SYNTAX = '''\
19<%# I'm a comment, I'm not interesting %>\
20<% for item in seq -%>
21 <%= item %>
22<%- endfor %>'''
23
24COMMENT_SYNTAX = '''\
25<!--# I'm a comment, I'm not interesting -->\
26<!-- for item in seq --->
27 ${item}
28<!--- endfor -->'''
29
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020030MAKO_SYNTAX = '''\
Armin Ronacher59b6bd52009-03-30 21:00:16 +020031<%# regular comment %>
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020032% for item in seq:
33 ${item}
34% endfor'''
Armin Ronacherccf284b2007-05-21 16:44:26 +020035
Armin Ronacher59b6bd52009-03-30 21:00:16 +020036MAKO_SYNTAX_LINECOMMENTS = '''\
37<%# regular comment %>
38% for item in seq:
39 ${item} ## the rest of the stuff
40% endfor'''
41
Armin Ronacherecc051b2007-06-01 18:25:28 +020042BALANCING = '''{{{'foo':'bar'}.foo}}'''
43
Armin Ronacher9b0545a2007-09-26 13:16:41 +020044STARTCOMMENT = '''{# foo comment
45and bar comment #}
46{% macro blub() %}foo{% endmacro %}
47{{ blub() }}'''
48
Armin Ronacherdb7985d2009-03-31 23:51:56 +020049LINE_SYNTAX_PRIORITY1 = '''\
50/* ignore me.
51 I'm a multiline comment */
52## for item in seq:
53* ${item} # this is just extra stuff
54## endfor
55'''
56
57LINE_SYNTAX_PRIORITY2 = '''\
Armin Ronacher59b6bd52009-03-30 21:00:16 +020058/* ignore me.
59 I'm a multiline comment */
60# for item in seq:
61* ${item} ## this is just extra stuff
Armin Ronacher3617a022009-04-01 19:17:31 +020062 ## extra stuff i just want to ignore
Armin Ronacher59b6bd52009-03-30 21:00:16 +020063# endfor
64'''
65
Armin Ronacherccf284b2007-05-21 16:44:26 +020066
Armin Ronacherccf284b2007-05-21 16:44:26 +020067def test_php_syntax():
68 env = Environment('<?', '?>', '<?=', '?>', '<!--', '-->')
69 tmpl = env.from_string(PHP_SYNTAX)
70 assert tmpl.render(seq=range(5)) == '01234'
71
72
73def test_erb_syntax():
74 env = Environment('<%', '%>', '<%=', '%>', '<%#', '%>')
75 tmpl = env.from_string(ERB_SYNTAX)
76 assert tmpl.render(seq=range(5)) == '01234'
77
78
79def test_comment_syntax():
80 env = Environment('<!--', '-->', '${', '}', '<!--#', '-->')
81 tmpl = env.from_string(COMMENT_SYNTAX)
82 assert tmpl.render(seq=range(5)) == '01234'
83
84
Armin Ronacherecc051b2007-06-01 18:25:28 +020085def test_balancing(env):
86 tmpl = env.from_string(BALANCING)
87 assert tmpl.render() == 'bar'
Armin Ronacher9b0545a2007-09-26 13:16:41 +020088
89
90def test_start_comment(env):
91 tmpl = env.from_string(STARTCOMMENT)
92 assert tmpl.render().strip() == 'foo'
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020093
94
95def test_line_syntax():
96 env = Environment('<%', '%>', '${', '}', '<%#', '%>', '%')
97 tmpl = env.from_string(MAKO_SYNTAX)
98 assert [int(x.strip()) for x in tmpl.render(seq=range(5)).split()] == \
Armin Ronacher59b6bd52009-03-30 21:00:16 +020099 range(5)
100
101 env = Environment('<%', '%>', '${', '}', '<%#', '%>', '%', '##')
102 tmpl = env.from_string(MAKO_SYNTAX_LINECOMMENTS)
103 assert [int(x.strip()) for x in tmpl.render(seq=range(5)).split()] == \
104 range(5)
105
106
107def test_line_syntax_priority():
Armin Ronacherdb7985d2009-03-31 23:51:56 +0200108 # XXX: why is the whitespace there in front of the newline?
109 env = Environment('{%', '%}', '${', '}', '/*', '*/', '##', '#')
110 tmpl = env.from_string(LINE_SYNTAX_PRIORITY1)
Armin Ronacher1bb3ab72009-04-01 19:16:25 +0200111 assert tmpl.render(seq=[1, 2]).strip() == '* 1\n* 2'
Armin Ronacher59b6bd52009-03-30 21:00:16 +0200112 env = Environment('{%', '%}', '${', '}', '/*', '*/', '#', '##')
Armin Ronacherdb7985d2009-03-31 23:51:56 +0200113 tmpl = env.from_string(LINE_SYNTAX_PRIORITY2)
Armin Ronacher3617a022009-04-01 19:17:31 +0200114 assert tmpl.render(seq=[1, 2]).strip() == '* 1\n\n* 2'