login

local lud = require "ludweb"

local render = lud.template.render_str

local Suite = {}

function Suite.render_nop()
    local str = "foo bar\n"
    assert(render(str) == str)
end

function Suite.render_literal_expr()
    local cases = {
        {"foo {{13}} bar", "foo 13 bar"},
        {"foo {{13+21}} bar", "foo 34 bar"},
        {"{{(13+21)..' things'}}", "34 things"},
    }
    for i, case in ipairs(cases) do
        assert(render(case[1].."\n") == case[2].."\n", "failed for case "..i)
    end
end

function Suite.render_var_expr()
    local cases = {
        {"foo {{$n}} {{$foo}}", "foo 42 bar"},
        {"foo {{$n+21}} {{$foo}}", "foo 63 bar"},
        {"{{($n+21)..' things'}}", "63 things"},
    }
    local env = {n=42, foo="bar"}
    for i, case in ipairs(cases) do
        assert(render(case[1].."\n", env) == case[2].."\n", "failed for case "..i)
    end
end

function Suite.render_assign()
    local str = ([[
        % set foo = "bar"
        foo = {{$foo}}
    ]]):gsub(" *$", "")
    local r = render(str, {foo=true})
    assert(r:gsub("^%s*", "") == "foo = bar\n")
end

function Suite.render_if()
    local str = ([[
        % if $foo then
            foo is true
        % else
            foo is false
        % end
    ]]):gsub(" *$", "")
    local r
    r = render(str, {foo=true})
    assert(r:gsub("^%s*", "") == "foo is true\n")
    r = render(str, {foo=false})
    assert(r:gsub("^%s*", "") == "foo is false\n")
end

function Suite.render_while()
    local str = ([[
        % set i = 1
        % while $i <= 3 do
            i = {{$i}}
            % set i = $i + 1
        % end
    ]]):gsub(" *$", "")
    local r = render(str, {foo=true})
    r = r:gsub("^ *", ""):gsub("\n *", "\n")
    assert(r == "i = 1\ni = 2\ni = 3\n")
end

function Suite.render_for()
    local str = ([[
        % for i in {2, 3, 5} do
            i = {{$i}}
        % end
    ]]):gsub(" *$", "")
    local r = render(str, {foo=true})
    r = r:gsub("^ *", ""):gsub("\n *", "\n")
    assert(r == "i = 2\ni = 3\ni = 5\n")
end

function Suite.render_raw()
    local env = {html="<p>foo</p>"}
    local str = "{{$html}} --&gt; {{!$html}}\n"
    local r = render(str, env)
    assert(r == "&#60;p&#62;foo&#60;/p&#62; --&gt; <p>foo</p>\n")
end

return Suite