Automated merge with ssh://team@pocoo.org/jinja2-main
[jinja2.git] / tests / test_inheritance.py
1 # -*- coding: utf-8 -*-
2 """
3     unit test for the inheritance
4     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
6     :copyright: 2007 by Armin Ronacher.
7     :license: BSD, see LICENSE for more details.
8 """
9 from jinja2 import Environment, DictLoader
10 from jinja2.exceptions import TemplateSyntaxError
11
12 LAYOUTTEMPLATE = '''\
13 |{% block block1 %}block 1 from layout{% endblock %}
14 |{% block block2 %}block 2 from layout{% endblock %}
15 |{% block block3 %}
16 {% block block4 %}nested block 4 from layout{% endblock %}
17 {% endblock %}|'''
18
19 LEVEL1TEMPLATE = '''\
20 {% extends "layout" %}
21 {% block block1 %}block 1 from level1{% endblock %}'''
22
23 LEVEL2TEMPLATE = '''\
24 {% extends "level1" %}
25 {% block block2 %}{% block block5 %}nested block 5 from level2{%
26 endblock %}{% endblock %}'''
27
28 LEVEL3TEMPLATE = '''\
29 {% extends "level2" %}
30 {% block block5 %}block 5 from level3{% endblock %}
31 {% block block4 %}block 4 from level3{% endblock %}
32 '''
33
34 LEVEL4TEMPLATE = '''\
35 {% extends "level3" %}
36 {% block block3 %}block 3 from level4{% endblock %}
37 '''
38
39 WORKINGTEMPLATE = '''\
40 {% extends "layout" %}
41 {% block block1 %}
42   {% if false %}
43     {% block block2 %}
44       this should workd
45     {% endblock %}
46   {% endif %}
47 {% endblock %}
48 '''
49
50 def test_layout(env):
51     tmpl = env.get_template('layout')
52     assert tmpl.render() == ('|block 1 from layout|block 2 from '
53                              'layout|nested block 4 from layout|')
54
55
56 def test_level1(env):
57     tmpl = env.get_template('level1')
58     assert tmpl.render() == ('|block 1 from level1|block 2 from '
59                              'layout|nested block 4 from layout|')
60
61
62 def test_level2(env):
63     tmpl = env.get_template('level2')
64     assert tmpl.render() == ('|block 1 from level1|nested block 5 from '
65                              'level2|nested block 4 from layout|')
66
67
68 def test_level3(env):
69     tmpl = env.get_template('level3')
70     assert tmpl.render() == ('|block 1 from level1|block 5 from level3|'
71                              'block 4 from level3|')
72
73
74 def test_level4(env):
75     tmpl = env.get_template('level4')
76     assert tmpl.render() == ('|block 1 from level1|block 5 from '
77                              'level3|block 3 from level4|')
78
79
80 def test_super():
81     env = Environment(loader=DictLoader({
82         'a': '{% block intro %}INTRO{% endblock %}|'
83              'BEFORE|{% block data %}INNER{% endblock %}|AFTER',
84         'b': '{% extends "a" %}{% block data %}({{ '
85              'super() }}){% endblock %}',
86         'c': '{% extends "b" %}{% block intro %}--{{ '
87              'super() }}--{% endblock %}\n{% block data '
88              '%}[{{ super() }}]{% endblock %}'
89     }))
90     tmpl = env.get_template('c')
91     assert tmpl.render() == '--INTRO--|BEFORE|[(INNER)]|AFTER'
92
93
94 def test_working(env):
95     tmpl = env.get_template('working')
96
97
98 def test_reuse_blocks(env):
99     tmpl = env.from_string('{{ self.foo() }}|{% block foo %}42{% endblock %}|{{ self.foo() }}')
100     assert tmpl.render() == '42|42|42'
101
102
103 def test_preserve_blocks():
104     env = Environment(loader=DictLoader({
105         'a': '{% if false %}{% block x %}A{% endblock %}{% endif %}{{ self.x() }}',
106         'b': '{% extends "a" %}{% block x %}B{{ super() }}{% endblock %}'
107     }))
108     tmpl = env.get_template('b')
109     assert tmpl.render() == 'BA'
110
111
112 def test_dynamic_inheritance():
113     env = Environment(loader=DictLoader({
114         'master1': 'MASTER1{% block x %}{% endblock %}',
115         'master2': 'MASTER2{% block x %}{% endblock %}',
116         'child': '{% extends master %}{% block x %}CHILD{% endblock %}'
117     }))
118     tmpl = env.get_template('child')
119     for m in range(1, 3):
120         assert tmpl.render(master='master%d' % m) == 'MASTER%dCHILD' % m
121
122
123 def test_multi_inheritance():
124     env = Environment(loader=DictLoader({
125         'master1': 'MASTER1{% block x %}{% endblock %}',
126         'master2': 'MASTER2{% block x %}{% endblock %}',
127         'child': '''{% if master %}{% extends master %}{% else %}{% extends
128                     'master1' %}{% endif %}{% block x %}CHILD{% endblock %}'''
129     }))
130     tmpl = env.get_template('child')
131     assert tmpl.render(master='master2') == 'MASTER2CHILD'
132     assert tmpl.render(master='master1') == 'MASTER1CHILD'
133     assert tmpl.render() == 'MASTER1CHILD'