fn one() string { name := 'Peter' age := 25 numbers := [1, 2, 3] downloads := { 'vlang/ui': '3201' 'vlang/vtl': '123' } ignored := true return $tmpl('tmpl/base.txt') } fn outside_return() string { name := 'Peter' age := 25 numbers := [1, 2, 3] downloads := { 'vlang/ui': '3201' 'vlang/vtl': '123' } ignored := true result := $tmpl('tmpl/base.txt') return result } fn test_tmpl() { expected := "name: Peter age: 25 numbers: [1, 2, 3] 1 2 3 0 - 0 2 - 1 4 - 2 6 - 3 8 - 4 10 - 5 12 - 6 14 - 7 16 - 8 18 - 9 vlang/ui, downloaded 3201 times. vlang/vtl, downloaded 123 times. this is not ignored so, it's basically true" assert one().trim_space() == expected assert outside_return().trim_space() == expected } fn test_tmpl_in_anon_fn() { anon := fn (name string, age int, numbers []int, downloads map[string]string, ignored bool) string { return $tmpl('tmpl/base.txt') } assert anon('Peter', 25, [1, 2, 3], { 'vlang/ui': '3201' 'vlang/vtl': '123' }, true).trim_space() == "name: Peter age: 25 numbers: [1, 2, 3] 1 2 3 0 - 0 2 - 1 4 - 2 6 - 3 8 - 4 10 - 5 12 - 6 14 - 7 16 - 8 18 - 9 vlang/ui, downloaded 3201 times. vlang/vtl, downloaded 123 times. this is not ignored so, it's basically true" } fn test_tmpl_interpolation() { my_var := 'foo' s := $tmpl('tmpl/interpolation.txt') assert s == 'result: foo\n' } fn html_comment_tmpl() string { return $tmpl('html_comment_template.html') } fn test_tmpl_html_comments_do_not_interpolate() { result := html_comment_tmpl() assert result.contains('') assert result.contains('') assert result.contains('

hello

') } fn html_conditional_single_line_tmpl(optional bool) string { content := 'hello!' return $tmpl('tmpl/conditional_single_line.html') } fn html_conditional_multi_line_tmpl(optional bool) string { content := 'hello!' return $tmpl('tmpl/conditional_multi_line.html') } fn test_tmpl_html_conditional_single_line() { result := html_conditional_single_line_tmpl(true) assert result.trim_space() == '

hello!

optional

' assert !html_conditional_single_line_tmpl(false).contains('

optional

') } fn test_tmpl_html_conditional_multi_line() { result := html_conditional_multi_line_tmpl(true) assert result.trim_space() == '

hello!

optional

' assert !html_conditional_multi_line_tmpl(false).contains('

optional

') } fn map_index_tmpl() string { lang := { 'test_entry': 'Test Text' } return $tmpl('tmpl/map_index.txt') } fn test_tmpl_map_index() { assert map_index_tmpl().trim_space() == 'direct: Test Text paren: Test Text' } fn my_fn(s string) string { return s } // Add more examples of potentially buggy patterns in vlib/v/tests/tmpl/index.html fn test_tmpl_comptime() { index := $tmpl('tmpl/index.html').trim_space() // dump(index) assert index.contains('
Line ending with percent %\n') assert index.contains('
Line ending with at @\n') assert index.contains('
Line ending with ampersand &\n') assert index.contains('
Line ending with hash #\n') assert index.contains('
Line ending with slash /\n') assert index.contains('
Line ending with dollar $\n') assert index.contains('
Line ending with caret ^\n') } // Add a tests for @include // File contents for building repsonse const base = '

This is the base file

' const child = '

This is the child file

' const grandchild = '

This is the grandchild file

' const parent = '

This is the parent file

' // Call the parent file which contains all child templates fn test_tmpl_include_parent() { expected := [base, base, child, base, base, child, grandchild, parent].join('\n') parent_tmpl := $tmpl('tmpl/parent.html') assert parent_tmpl.contains(expected) } // Test the child template which calls parent template fn test_tmpl_include_child() { expected := [base, child].join('\n') child_tmpl := $tmpl('tmpl/nested/child.html') assert child_tmpl.contains(expected) } // Test the grandchild templates calling both parent and grandparent templates fn test_tmpl_include_grandchild() { expected := [base, base, child, grandchild].join('\n') child_tmpl := $tmpl('tmpl/nested/nested_deeper/grandchild.html') assert child_tmpl.contains(expected) }