From 5e5bcf37450d07f7f2812255bbd1df35d8e6ce75 Mon Sep 17 00:00:00 2001 From: Benoit Germain Date: Mon, 27 Oct 2025 08:43:22 +0100 Subject: verbose_errors improvement * Use std::format instead of sprintf for verbose errors when decoding table keys * Add a unit test for the different table key types --- unit_tests/scripts/misc/verbose_errors.lua | 34 ++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 unit_tests/scripts/misc/verbose_errors.lua (limited to 'unit_tests/scripts') diff --git a/unit_tests/scripts/misc/verbose_errors.lua b/unit_tests/scripts/misc/verbose_errors.lua new file mode 100644 index 0000000..40948ca --- /dev/null +++ b/unit_tests/scripts/misc/verbose_errors.lua @@ -0,0 +1,34 @@ +local fixture = require "fixture" -- require fixture before lanes so that it is not registered and will cause transfer errors +local lanes = require("lanes").configure{verbose_errors = true} +local l = lanes.linda{name = "my linda"} + + +local do_test = function(key_) + local t = {[key_] = fixture.newuserdata()} + local b, e = pcall(l.send, l, "k", t) + assert(b == false and type(e) == "string") + local t_key = type(key_) + if t_key == "string" then + local x, y = string.find(e, "arg#2." .. key_, 1, true) + assert(x and y, "got " .. e) + elseif t_key == "boolean" then + local x, y = string.find(e, "arg#2[" .. tostring(key_) .. "]", 1, true) + assert(x and y, "got " .. e) + elseif t_key == "number" then + local x, y = string.find(e, "arg#2[" .. key_ .. "]", 1, true) + assert(x and y, "got " .. e) + elseif t_key == "userdata" then + local t_name + -- light userdata is formatted by std::format, where the pointer is written as a lowercase hex literal + local expected = "arg#2[U:0x" .. string.lower(string.match(tostring(key_), "userdata: (%x+)")) .. "]" + local x, y = string.find(e, expected, 1, true) + assert(x and y, "expecting " .. expected .. " got " .. e) + end +end + +do_test("bob") +do_test(true) +do_test(false) +do_test(42) +do_test(42.44) +do_test(lanes.null) -- cgit v1.2.3-55-g6feb