Jinja2-TT2

 view release on metacpan or  search on metacpan

t/03-emitter.t  view on Meta::CPAN

        'Simple if'
    );
};

subtest 'If-else statement' => sub {
    is(
        transpile('{% if user %}Hi{% else %}Bye{% endif %}'),
        '[% IF user %]Hi[% ELSE %]Bye[% END %]',
        'If-else'
    );
};

subtest 'If-elif-else' => sub {
    my $result = transpile('{% if a %}A{% elif b %}B{% else %}C{% endif %}');
    like($result, qr/\[% IF a %\]A/, 'If part');
    like($result, qr/\[% ELSIF b %\]B/, 'Elif becomes ELSIF');
    like($result, qr/\[% ELSE %\]C/, 'Else part');
    like($result, qr/\[% END %\]/, 'End tag');
};

subtest 'For loop' => sub {
    is(
        transpile('{% for x in items %}{{ x }}{% endfor %}'),
        '[% FOREACH x IN items %][% x %][% END %]',
        'For loop'
    );
};

subtest 'For with unpacking' => sub {
    like(
        transpile('{% for k, v in items %}{{ k }}{% endfor %}'),
        qr/FOREACH k, v IN items/,
        'Tuple unpacking'
    );
};

subtest 'Block' => sub {
    is(
        transpile('{% block content %}Hello{% endblock %}'),
        '[% BLOCK content %]Hello[% END %]',
        'Block'
    );
};

subtest 'Include' => sub {
    is(
        transpile('{% include "header.html" %}'),
        '[% INCLUDE header.html %]',
        'Include'
    );
};

subtest 'Set statement' => sub {
    is(
        transpile('{% set x = 42 %}'),
        '[% x = 42 %]',
        'Set variable'
    );
};

subtest 'Macro' => sub {
    my $result = transpile('{% macro greet(name) %}Hello {{ name }}{% endmacro %}');
    like($result, qr/MACRO greet\(name\) BLOCK/, 'Macro definition');
    like($result, qr/\[% name %\]/, 'Macro body');
};

subtest 'Whitespace control' => sub {
    like(transpile('{{- name -}}'), qr/\[%-.*-%\]/, 'Whitespace control markers');
};

subtest 'String concatenation' => sub {
    like(transpile('{{ a ~ b }}'), qr/\(a _ b\)/, 'Tilde becomes underscore');
};

subtest 'Logical operators' => sub {
    like(transpile('{% if a and b %}{% endif %}'), qr/IF \(a AND b\)/, 'And operator');
    like(transpile('{% if a or b %}{% endif %}'), qr/IF \(a OR b\)/, 'Or operator');
    like(transpile('{% if not a %}{% endif %}'), qr/IF NOT a/, 'Not operator');
};

subtest 'Comparison operators' => sub {
    like(transpile('{% if a == b %}{% endif %}'), qr/IF \(a == b\)/, 'Equals');
    like(transpile('{% if a != b %}{% endif %}'), qr/IF \(a != b\)/, 'Not equals');
    like(transpile('{% if a > b %}{% endif %}'), qr/IF \(a > b\)/, 'Greater than');
};

subtest 'Ternary expression' => sub {
    like(
        transpile('{{ x if condition else y }}'),
        qr/\(condition \? x : y\)/,
        'Ternary'
    );
};

subtest 'Loop variables' => sub {
    like(
        transpile('{{ loop.index }}'),
        qr/loop\.count/,
        'loop.index -> loop.count'
    );
    like(
        transpile('{{ loop.first }}'),
        qr/loop\.first/,
        'loop.first unchanged'
    );
    like(
        transpile('{{ loop.last }}'),
        qr/loop\.last/,
        'loop.last unchanged'
    );
    like(
        transpile('{{ loop.length }}'),
        qr/loop\.size/,
        'loop.length -> loop.size'
    );
};

subtest 'Boolean literals' => sub {
    like(transpile('{{ true }}'), qr/\[% 1 %\]/, 'true becomes 1');
    like(transpile('{{ false }}'), qr/\[% 0 %\]/, 'false becomes 0');
    like(transpile('{{ True }}'), qr/\[% 1 %\]/, 'True becomes 1');
    like(transpile('{{ False }}'), qr/\[% 0 %\]/, 'False becomes 0');
};



( run in 1.737 second using v1.01-cache-2.11-cpan-5c0b1e786e0 )