I wanted a small update to the testing framework, which I’ll explain below. Here is the new version:
Tests = {}
local test_correct
local test_wrong
function Tests:assert_equals(result, expected, message)
local message = message or ""
local correct = result == expected
if correct then
test_correct += 1
else
test_wrong += 1
self:diagnose(result, 'was expected to be', expected, message)
-- print(`{message}:{result} == {expected} {correct}`)
end
end
function Tests:assert_nearly_equal(result, expected, delta, message)
local message = message or ""
correct = ll.Fabs(result-expected) <= delta
if correct then
test_correct += 1
else
test_wrong += 1
self:diagnose(result, `should be within {delta} of`, expected, message)
end
end
function Tests:run_tests(verbose)
test_correct = 0
test_wrong = 0
for k, v in pairs(Tests) do
if k:sub(1, 5) == 'test_' then
Tests.current_name = k
if verbose then print(k) end
v(Tests)
end
end
print(`Tests: correct {test_correct}, wrong {test_wrong}`)
end
function Tests:diagnose(result, check_name, expected, message)
print(`{self.current_name}: {result} {check_name} {expected} ({message})`)
end
I moved the assert functions to be methods of the object Tests, and changed the error messages to use the new diagnose method. The diagnose now prepends error messages with the name of the test, e.g. test_this_thing, and includes a description of the error that is created by the individual assert. So:
self:assert_nearly_equal(30, 15, 1, "unlikely comparison")
-- should print
test_foo: 30 should be within 1 of 15 (unlikely comparison)
It is my practice to upgrade my tools when I get what seems a better idea. Here, my main point was to make the free-standing assert functions into methods on the Tests object, and then the duplication in the error printing induced me to write diagnose.
I find that keeping my tools sharp helps me make steady progress in my work.
Until next time, safe paths!