blob: 8b3bdb92904ffaace3491cb08a694efc94cbb2fe [file] [log] [blame]
Armin Ronacherc1e30402007-03-18 22:41:09 +01001# -*- coding: utf-8 -*-
2"""
3 unit test for the macros
4 ~~~~~~~~~~~~~~~~~~~~~~~~
5
Armin Ronacher62ccd1b2009-01-04 14:26:19 +01006 :copyright: (c) 2009 by the Jinja Team.
Armin Ronacherc1e30402007-03-18 22:41:09 +01007 :license: BSD, see LICENSE for more details.
8"""
9
Rene Leonhardtc7e6c6d2009-04-20 23:08:53 +020010import conftest
11conftest.GlobalLoader.scope = globals()
12
13
Armin Ronacherc1e30402007-03-18 22:41:09 +010014SIMPLE = '''\
Armin Ronacherb5124e62008-04-25 00:36:14 +020015{% macro say_hello(name) %}Hello {{ name }}!{% endmacro %}
Armin Ronacherc1e30402007-03-18 22:41:09 +010016{{ say_hello('Peter') }}\
17'''
18
Armin Ronacherc1e30402007-03-18 22:41:09 +010019SCOPING = '''\
Armin Ronacherb5124e62008-04-25 00:36:14 +020020{% macro level1(data1) %}
21{% macro level2(data2) %}{{ data1 }}|{{ data2 }}{% endmacro %}
Armin Ronacherc1e30402007-03-18 22:41:09 +010022{{ level2('bar') }}{% endmacro %}
Armin Ronacher963f97d2008-04-25 11:44:59 +020023{{ level1('foo') }}\
Armin Ronacherc1e30402007-03-18 22:41:09 +010024'''
25
26ARGUMENTS = '''\
Armin Ronacherb5124e62008-04-25 00:36:14 +020027{% macro m(a, b, c='c', d='d') %}{{ a }}|{{ b }}|{{ c }}|{{ d }}{% endmacro %}
Armin Ronacherc1e30402007-03-18 22:41:09 +010028{{ m() }}|{{ m('a') }}|{{ m('a', 'b') }}|{{ m(1, 2, 3) }}\
29'''
30
Armin Ronacher44fb2e12007-04-29 09:45:00 +020031VARARGS = '''\
Armin Ronacherb5124e62008-04-25 00:36:14 +020032{% macro test() %}{{ varargs|join('|') }}{% endmacro %}\
Armin Ronacher44fb2e12007-04-29 09:45:00 +020033{{ test(1, 2, 3) }}\
34'''
35
Armin Ronacher9bcd4112007-05-29 14:17:24 +020036SIMPLECALL = '''\
Armin Ronacherb5124e62008-04-25 00:36:14 +020037{% macro test() %}[[{{ caller() }}]]{% endmacro %}\
Armin Ronacher9bcd4112007-05-29 14:17:24 +020038{% call test() %}data{% endcall %}\
39'''
40
41COMPLEXCALL = '''\
Armin Ronacherc9705c22008-04-27 21:28:03 +020042{% macro test() %}[[{{ caller('data') }}]]{% endmacro %}\
43{% call(data) test() %}{{ data }}{% endcall %}\
Armin Ronacher9bcd4112007-05-29 14:17:24 +020044'''
45
46CALLERUNDEFINED = '''\
Armin Ronacher0a2ac692008-05-13 01:03:08 +020047{% set caller = 42 %}\
Armin Ronacher9bcd4112007-05-29 14:17:24 +020048{% macro test() %}{{ caller is not defined }}{% endmacro %}\
49{{ test() }}\
50'''
51
Armin Ronacher1cc232c2007-09-07 17:52:41 +020052INCLUDETEMPLATE = '''{% macro test(foo) %}[{{ foo }}]{% endmacro %}'''
53
Armin Ronacher44fb2e12007-04-29 09:45:00 +020054
Armin Ronacherc1e30402007-03-18 22:41:09 +010055def test_simple(env):
56 tmpl = env.from_string(SIMPLE)
57 assert tmpl.render() == 'Hello Peter!'
58
59
Armin Ronacherc1e30402007-03-18 22:41:09 +010060def test_scoping(env):
61 tmpl = env.from_string(SCOPING)
Armin Ronacher963f97d2008-04-25 11:44:59 +020062 assert tmpl.render() == 'foo|bar'
Armin Ronacherc1e30402007-03-18 22:41:09 +010063
64
65def test_arguments(env):
66 tmpl = env.from_string(ARGUMENTS)
67 assert tmpl.render() == '||c|d|a||c|d|a|b|c|d|1|2|3|d'
Armin Ronacher44fb2e12007-04-29 09:45:00 +020068
69
Armin Ronacher44fb2e12007-04-29 09:45:00 +020070def test_varargs(env):
71 tmpl = env.from_string(VARARGS)
72 assert tmpl.render() == '1|2|3'
Armin Ronacher9bcd4112007-05-29 14:17:24 +020073
74
75def test_simple_call(env):
76 tmpl = env.from_string(SIMPLECALL)
77 assert tmpl.render() == '[[data]]'
78
79
80def test_complex_call(env):
81 tmpl = env.from_string(COMPLEXCALL)
82 assert tmpl.render() == '[[data]]'
83
84
85def test_caller_undefined(env):
86 tmpl = env.from_string(CALLERUNDEFINED)
87 assert tmpl.render() == 'True'
Armin Ronacher1cc232c2007-09-07 17:52:41 +020088
89
90def test_include(env):
Armin Ronacherc9705c22008-04-27 21:28:03 +020091 tmpl = env.from_string('{% from "include" import test %}{{ test("foo") }}')
Armin Ronacher1cc232c2007-09-07 17:52:41 +020092 assert tmpl.render() == '[foo]'
Armin Ronachere62b7ef2008-05-24 20:47:29 +020093
94
95def test_macro_api(env):
96 tmpl = env.from_string('{% macro foo(a, b) %}{% endmacro %}'
97 '{% macro bar() %}{{ varargs }}{{ kwargs }}{% endmacro %}'
98 '{% macro baz() %}{{ caller() }}{% endmacro %}')
99 assert tmpl.module.foo.arguments == ('a', 'b')
100 assert tmpl.module.foo.defaults == ()
101 assert tmpl.module.foo.name == 'foo'
102 assert not tmpl.module.foo.caller
103 assert not tmpl.module.foo.catch_kwargs
104 assert not tmpl.module.foo.catch_varargs
105 assert tmpl.module.bar.arguments == ()
106 assert tmpl.module.bar.defaults == ()
107 assert not tmpl.module.bar.caller
108 assert tmpl.module.bar.catch_kwargs
109 assert tmpl.module.bar.catch_varargs
110 assert tmpl.module.baz.caller