Standard Library: Test

Write tests and verify program behavior


Module Contents


Test.assert(predicate)

Panic if the boolean predicate is false.

assert(1 + 1 == 2)
none
assert(1 + 1 == 11)
panic: assertion error

assert(1 + 1 == 11)
      ^
At Test:embedded:1:7

Test.equals(actual, expected)

Check that actual equals expected.

Test.equals(2 + 2, 4)
Test.equals(1 + 1, 11)
{ status: "pass" }
{ status: "fail", expected: 11, got: 2 }

Test.returns(func, expected)

Check that func returns expected.

Test.returns(fn() 2 + 2 end, 4)
Test.returns(fn() 1 + 1 end, 11)
Test.returns(fn() 0 / 0 end, 0)
{ status: "pass" }
{ status: "fail", expected: 11, got: 2 }
{
  status: "fail",
  panic: "panic: invalid numeric result\n\nTest.returns(fn() 0 / 0 end, 0)\n                    ^\nAt Test:embedded:3:21 in fn()",
}

Test.runs(func)

Check that func runs without panicking or throwing an error.

fn inverse(n)
  assert(n != 0)
  1 / n
end

Test.runs(fn() inverse(10) end)
Test.runs(fn() inverse(0) end)
{ status: "pass" }
{
  status: "fail",
  panic: "panic: assertion error\n\n  assert(n != 0)\n        ^\nAt Test:embedded:2:9 in inverse(n)\n\nTest.runs(fn() inverse(0) end)\n                      ^\nAt Test:embedded:7:23 in fn()",
}

Test.throws(func, payload)

Check that func throws an error containing payload.

fn inverse(n)
  if n == 0 then
    Err.throw("n must not be zero")
  end

  1 / n
end

Test.throws(fn() inverse(0) end, "n must not be zero")
Test.throws(fn() inverse(0) end, "wrong!")
Test.throws(fn() inverse(10) end, "n must not be zero")
Test.throws(fn() inverse("0") end, "n must not be zero")
{ status: "pass" }
{ status: "fail", expected: "wrong!", actual: "n must not be zero" }
{ status: "fail", returned: 0.1 }
{
  status: "fail",
  panic: "panic: type error\nexpected: number\ngot: string\n\n  1 / n\n    ^\nAt Test:embedded:6:5 in inverse(n)\n\nTest.throws(fn() inverse(\"0\") end, \"n must not be zero\")\n                        ^\nAt Test:embedded:12:25 in fn()",
}