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 }