minijinja-lua 0.1.4

lua bindings for minijinja
Documentation
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 }))

		local c, r = table.unpack(state:fuel_levels())
		local total = c + r
		assert.Equal(1000, total)
		assert.True(c < total)

		return true
	end

	local function setup(src)
		local env = Environment:empty()

		env.fuel = 1000

		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)