File

spec/util_interpolation_spec.lua @ 12983:4533c9b906b0

util.format: Tweak serialization of %q formatted entries Improves serialization of function references especially, the built-in default handling of that in util.serialization is not the most informative. Now, along with the function metatable from util.startup, the actual function can be found by filename and line number.
author Kim Alvefur <zash@zash.se>
date Sun, 26 Mar 2023 00:18:05 +0100
parent 11308:5d4d90d1eabb
line wrap: on
line source

local template = [[
{greet!?Hi}, {name?world}!
]];
local expect1 = [[
Hello, WORLD!
]];
local expect2 = [[
Hello, world!
]];
local expect3 = [[
Hi, YOU!
]];
local template_array = [[
{foo#{idx}. {item}
}]]
local expect_array = [[
1. HELLO
2. WORLD
]]
local template_func_pipe = [[
{foo|sort#{idx}. {item}
}]]
local expect_func_pipe = [[
1. A
2. B
3. C
4. D
]]
local template_map = [[
{foo%{idx}: {item!}
}]]
local expect_map = [[
FOO: bar
]]
local template_not = [[
{thing~Thing is falsy}{thing&Thing is truthy}
]]
local expect_not_true = [[
Thing is truthy
]]
local expect_not_nil = [[
Thing is falsy
]]
local expect_not_false = [[
Thing is falsy
]]
describe("util.interpolation", function ()
	it("renders", function ()
		local render = require "util.interpolation".new("%b{}", string.upper, { sort = function (t) table.sort(t) return t end });
		assert.equal(expect1, render(template, { greet = "Hello", name = "world" }));
		assert.equal(expect2, render(template, { greet = "Hello" }));
		assert.equal(expect3, render(template, { name = "you" }));
		assert.equal(expect_array, render(template_array, { foo = { "Hello", "World" } }));
		assert.equal(expect_func_pipe, render(template_func_pipe, { foo = { "c", "a", "d", "b", } }));
		-- assert.equal("", render(template_func_pipe, { foo = nil })); -- FIXME
		assert.equal(expect_map, render(template_map, { foo = { foo = "bar" } }));
		assert.equal(expect_not_true, render(template_not, { thing = true }));
		assert.equal(expect_not_nil, render(template_not, { thing = nil }));
		assert.equal(expect_not_false, render(template_not, { thing = false }));
	end);
	it("fixes #1623", function ()
		local render = require "util.interpolation".new("%b{}", string.upper, { x = string.lower });
		assert.equal("", render("{foo?}", {  }))
		assert.equal("", render("{foo|x?}", {  }))
	end);
end);