tools/generate_format_spec.lua
author Matthew Wild <mwild1@gmail.com>
Wed, 27 Mar 2024 15:35:15 +0000
branch0.12
changeset 13469 54a936345aaa
parent 12043 e0a8c5b1ab4f
permissions -rw-r--r--
prosodyctl check: Warn about invalid domain names in the config file This ensures that domain names of virtual hosts and components are valid in XMPP, and that they are encoded correctly.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12038
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
local format = require"util.format".format;
12041
82f6a0b0a425 tools/generate_format_spec: Apply lua-format to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12038
diff changeset
     2
local dump = require"util.serialization".new("oneline")
12038
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
local types = {
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
	"nil";
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
	"boolean";
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
	"number";
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
	"string";
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
	"function";
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
	-- "userdata";
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
	"thread";
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
	"table";
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
};
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
local example_values = {
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
	["nil"] = { n = 1; nil };
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
	["boolean"] = { true; false };
12041
82f6a0b0a425 tools/generate_format_spec: Apply lua-format to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12038
diff changeset
    16
	["number"] = { 97; -12345; 1.5; 73786976294838206464; math.huge; 2147483647 };
82f6a0b0a425 tools/generate_format_spec: Apply lua-format to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12038
diff changeset
    17
	["string"] = { "hello"; "foo \1\2\3 bar"; "nödåtgärd"; string.sub("nödåtgärd", 1, -4) };
12038
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
	["function"] = { function() end };
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
	-- ["userdata"] = {};
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
	["thread"] = { coroutine.create(function() end) };
12043
e0a8c5b1ab4f util.format: Ensure metatable __tostring results are also sanitized
Kim Alvefur <zash@zash.se>
parents: 12041
diff changeset
    21
	["table"] = { {}, setmetatable({},{__tostring=function ()return "foo \1\2\3 bar"end}) };
12038
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
};
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
local example_strings = setmetatable({
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
	["nil"] = { "nil" };
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
	["function"] = { "function() end" };
12041
82f6a0b0a425 tools/generate_format_spec: Apply lua-format to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12038
diff changeset
    26
	["number"] = { "97"; "-12345"; "1.5"; "73786976294838206464"; "math.huge"; "2147483647" };
12038
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
	["thread"] = { "coroutine.create(function() end)" };
12043
e0a8c5b1ab4f util.format: Ensure metatable __tostring results are also sanitized
Kim Alvefur <zash@zash.se>
parents: 12041
diff changeset
    28
	["table"] = { "{ }", "setmetatable({},{__tostring=function ()return \"foo \\1\\2\\3 bar\"end})" }
12038
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
}, { __index = function() return {} end });
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
for _, lua_type in ipairs(types) do
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
	print(string.format("\t\tdescribe(\"%s\", function ()", lua_type));
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
	local examples = example_values[lua_type];
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
	for fmt in ("cdiouxXaAeEfgGqs"):gmatch(".") do
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
		print(string.format("\t\t\tdescribe(\"to %%%s\", function ()", fmt));
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
		print("\t\t\t\tit(\"works\", function ()");
12041
82f6a0b0a425 tools/generate_format_spec: Apply lua-format to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12038
diff changeset
    36
		for i = 1, examples.n or #examples do
12038
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
			local example = examples[i];
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
			if not tostring(example):match("%w+: 0[xX]%x+") then
12041
82f6a0b0a425 tools/generate_format_spec: Apply lua-format to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12038
diff changeset
    39
				print(string.format("\t\t\t\t\tassert.equal(%q, format(%q, %s))", format("%" .. fmt, example), "%" .. fmt,
82f6a0b0a425 tools/generate_format_spec: Apply lua-format to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12038
diff changeset
    40
					example_strings[lua_type][i] or dump(example)));
12038
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
			else
12041
82f6a0b0a425 tools/generate_format_spec: Apply lua-format to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12038
diff changeset
    42
				print(string.format("\t\t\t\t\tassert.matches(\"[%s: 0[xX]%%x+]\", format(%q, %s))", lua_type, "%" .. fmt,
82f6a0b0a425 tools/generate_format_spec: Apply lua-format to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12038
diff changeset
    43
					example_strings[lua_type][i] or dump(example)));
12038
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
			end
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
		end
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
		print("\t\t\t\tend);");
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
		print("\t\t\tend);");
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
		print()
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
	end
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
	print("\t\tend);");
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
	print()
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
end