annotate tools/generate_format_spec.lua @ 14217:7eb0e47418ab 13.0

util.human.io: Add simple version comparison This is a small helper function that compares version string (it can be passed to table.sort() as a comparator). Full version sorts (e.g. semver, and natural/alphanumeric sort in general) are more complex, and I would like to eventually support those. But this is a stable branch and we don't need it for anything just yet. Regarding justification for the stable branch: The function is being committed with extensive tests, and isn't currently used anywhere. The plan is to use it in an upcoming update of how TLS profiles are configured, but the inputs in that case will be fixed (meaning that the risk of breakage is lower than if we were running it against arbitrary data).
author Matthew Wild <mwild1@gmail.com>
date Fri, 12 Jun 2026 11:38:39 +0100
parents e0a8c5b1ab4f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12034
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 local format = require"util.format".format;
12037
82f6a0b0a425 tools/generate_format_spec: Apply lua-format to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12034
diff changeset
2 local dump = require"util.serialization".new("oneline")
12034
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 };
12037
82f6a0b0a425 tools/generate_format_spec: Apply lua-format to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12034
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: 12034
diff changeset
17 ["string"] = { "hello"; "foo \1\2\3 bar"; "nödåtgärd"; string.sub("nödåtgärd", 1, -4) };
12034
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) };
12039
e0a8c5b1ab4f util.format: Ensure metatable __tostring results are also sanitized
Kim Alvefur <zash@zash.se>
parents: 12037
diff changeset
21 ["table"] = { {}, setmetatable({},{__tostring=function ()return "foo \1\2\3 bar"end}) };
12034
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" };
12037
82f6a0b0a425 tools/generate_format_spec: Apply lua-format to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12034
diff changeset
26 ["number"] = { "97"; "-12345"; "1.5"; "73786976294838206464"; "math.huge"; "2147483647" };
12034
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 ["thread"] = { "coroutine.create(function() end)" };
12039
e0a8c5b1ab4f util.format: Ensure metatable __tostring results are also sanitized
Kim Alvefur <zash@zash.se>
parents: 12037
diff changeset
28 ["table"] = { "{ }", "setmetatable({},{__tostring=function ()return \"foo \\1\\2\\3 bar\"end})" }
12034
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 ()");
12037
82f6a0b0a425 tools/generate_format_spec: Apply lua-format to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12034
diff changeset
36 for i = 1, examples.n or #examples do
12034
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
12037
82f6a0b0a425 tools/generate_format_spec: Apply lua-format to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12034
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: 12034
diff changeset
40 example_strings[lua_type][i] or dump(example)));
12034
ee94ac51b2dd util.format: ALL THE TESTS!!!
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 else
12037
82f6a0b0a425 tools/generate_format_spec: Apply lua-format to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12034
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: 12034
diff changeset
43 example_strings[lua_type][i] or dump(example)));
12034
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