local minijinja = require("minijinja")
local Environment = minijinja.Environment
describe("State tests", function()
local function state_func(state, _)
assert.Equal("my_template", state:name())
assert.Equal("none", state:auto_escape())
assert.Equal("lenient", state:undefined_behavior())
assert.Equal("test_block", state:current_block())
assert.Equal(true, state:lookup("bar").baz)
assert.Equal(42, state:lookup("func")())
assert.Equal("my macro", state:call_macro("my_macro"))
assert.Same({ "my_macro" }, state:exports())
local known = state:known_variables()
table.sort(known)
assert.Same({ "bar", "foo", "func", "lua", "my_macro" }, known)
assert.Equal("HELLO", state:apply_filter("state_filter", "hello"))
assert.Equal(false, state:perform_test("state_test", "foo", "bar"))
assert.Equal("[1, 2, 3]", state:format({ 1, 2, 3 }))
assert.Equal(minijinja.None, state:fuel_levels())
return true
end
local function setup(src)
local env = Environment:empty()
env:add_global("lua", state_func)
env:add_filter("state_filter", function(val)
return val:upper()
end, false)
env:add_test("state_test", function(val, arg)
return val == arg
end, false)
local name = "my_template"
local source = "{% macro my_macro() %}my macro{% endmacro %}{% block test_block %}"
.. src
.. "{% endblock test_block %}"
local ctx = {
foo = "foo",
func = function()
return 42
end,
bar = { baz = true },
}
return env, name, source, ctx
end
it("filter#State", function()
local env, name, source, ctx = setup("{{ foo | lua }}")
env:add_filter("lua", state_func)
env:render_str(source, ctx, name)
end)
it("test#State", function()
local env, name, source, ctx = setup("{{ foo is lua }}")
env:add_test("lua", state_func)
env:render_str(source, ctx, name)
end)
it("global#State", function()
local env, name, source, ctx = setup("{{ lua() }}")
env:render_str(source, ctx, name)
end)
it("temps#State", function()
local env = Environment:empty()
local first = true
local function inc(state)
if first then
assert.Nil(state:get_temp("counter"))
first = false
end
local new = state:get_or_set_temp("counter", function()
return 0
end) + 1
state:set_temp("counter", new)
return new
end
env:add_global("inc", inc)
local rv = env:render_str("{{ inc() }} {{ inc() }} {{ inc() }}")
assert.Equal("1 2 3", rv)
end)
end)