I got the code below. I am working on a slight change in how unittests
report errors. When my tests fail, however I get the line number for where
the error was thrown in the macro, but I would have wanted the line number
for the expression being compared.
module TLUnit
export @test
macro test(ex)
if typeof(ex) != Expr || ex.head != :comparison
error("Only comparison expressions may be evaluated with @test")
end
op = ex.args[2]
ex1 = ex.args[1]
ex2 = ex.args[3]
quote
oper = $(esc(op))
expr1 = $(esc(ex1))
expr2 = $(esc(ex2))
if oper(expr1, expr2)
nothing
else
error("test failed: ", $(string(ex1)), " ", oper, " ",
$(string(ex2)), " evaluates to: ", expr1, " ", oper, " ", expr2)
end
end
end
end
using TLUnit
a = 2
@test(a + 2 == 2*a + 1)
When I run this code I get the exception thrown showing a problem on line
number 20. But the test is on line 32. I have played around a bit with this
and sometimes macros seem to return line numbers the way I want, but I
don't understand how. So either this is a bug, or I just don't understand
how this is supposed to work. Could anybody explain what the correct
behavior should be?
[julia] $ julia TLUnit.jl
ERROR: test failed: :(+(a,2)) == :(+(*(2,a),1)) evaluates to: 4 == 5
in error at error.jl:22
in include at boot.jl:238
in include_from_node1 at loading.jl:114
in process_options at client.jl:303
in _start at client.jl:389
at /Users/erikengheim/Development/scripts/julia/TLUnit.jl:20