1 module tests.statements.macro_;
2 
3 private
4 {
5     import tests.asserts;
6 }
7 
8 
9 unittest
10 {
11     // Simple macro
12     assertRender(`{% macro test %}MACRO{% endmacro %}{{test()}}`, "MACRO");
13 
14     // Macro with params
15     assertRender(
16             `{% macro test(a, b='', c='c', d=10) %}` ~
17                 `<test a="{{a}}" b="{{b}}" c="{{c}}" d={{d}} />` ~
18             `{% endmacro %}` ~
19             `{{test('A')}}` ~
20             `{{test(10, 'b', 'c', 15) }}`
21             , 
22             `<test a="A" b="" c="c" d=10 />` ~
23             `<test a="10" b="b" c="c" d=15 />`
24         );
25 
26     // Simple call
27     assertRender(
28             `{% macro render_dialog(title, class='dialog') %}` ~
29                 `<div class="{{ class }}">` ~
30                     `<h2>{{title}}</h2>` ~
31                     `<div class="content">{{caller()}}</div>` ~
32                 `</div>` ~
33             `{% endmacro %}` ~
34             `{% call render_dialog("Hello world") %}` ~
35                 `Simple dialog render` ~
36             `{% endcall %}` 
37             , 
38             `<div class="dialog">` ~
39                 `<h2>Hello world</h2>` ~
40                 `<div class="content">Simple dialog render</div>` ~
41             `</div>`
42         );
43 
44     // Call with params
45     assertRender(
46             `{% macro num_filter(numbers=[]) %}` ~
47                 `{% for n in numbers if n % 2 and n < 8 %}` ~
48                     `{{caller(n, loop.cycle('#', '№'))}}` ~
49                 `{% endfor %}` ~
50             `{% endmacro %}` ~
51             `{% call(num, prefix='') num_filter([1,2,3,4,5,6,7,8,9]) %}` ~
52                 `Number: {{prefix}}{{num}}` ~
53             `{% endcall %}` 
54             , 
55             `Number: #1` ~
56             `Number: №3` ~
57             `Number: #5` ~
58             `Number: №7`
59         );
60 }
61 
62 
63 unittest
64 {
65     // varargs, kwargs
66     assertRender(
67             `{% macro test(a, b=0) %}` ~
68                 `A: {{a}} B: {{b}}`~
69                 `{{varargs}}` ~
70                 `{{kwargs | sort}}` ~
71             `{% endmacro %}` ~
72             `{{ test(1,2,3,4,c=5,d=6,e=7,f=8) }}`
73             , 
74             `A: 1 B: 2` ~
75             `[3, 4]` ~
76             `[['c', 5], ['d', 6], ['e', 7], ['f', 8]]`
77         );
78 }
79 
80 
81 // Extended behavior
82 unittest
83 {
84     // Return value
85     assertRender(
86             `{% macro sum(a, b) %}` ~
87             `{% endmacro return a + b %}` ~
88             `{{ sum(1, 2) }}`
89             , 
90             `3`
91         );
92 
93     // Macro as function/filter
94     long a = 10;
95     assertRender!(a)(
96             `{% macro inc(a, b) %}` ~
97             `{% endmacro return a + b %}` ~
98             `{{ a.inc(10) }}` ~
99             `{{ a | inc(15) }}`
100             , 
101             `20` ~ `25`
102         );
103 
104     // Macro as test
105     assertRender(
106             `{% macro good(value) %}` ~
107             `{% endmacro return value % 2 == 0 and value > 10 %}` ~
108             `{{ 10 is good }}` ~
109             `{{ 16 is good }}`
110             , 
111             `false` ~ `true`
112         );
113 }