How can I find __LINE__ on the execution stack?


#1

I would like to be able to display the line number in my simple assert.

1 def assert(expect, actual, *msg)
2 expect==actual ? print(".") : print("\nAssert at line #{LINE}
failed: #{expect.inspect} <> #{actual.inspect} #{msg}\n")
3 end
4
5 assert 1, 2
6 assert 1, 1

The solution above erroneously displays line 2 instead of line 5.

Christer


#2

Christer N. wrote:

The solution above erroneously displays line 2 instead of line 5.

You can use caller[0] to get the info you want:

irb(main):007:0> def test
irb(main):008:1> p caller[0]
irb(main):009:1> end
=> nil
irb(main):010:0> test
“(irb):10:in `irb_binding’”
=> nil

Kind regards

robert

#3

bob.news wrote:

You can use caller[0] to get the info you want:

irb(main):007:0> def test
irb(main):008:1> p caller[0]
irb(main):009:1> end
=> nil
irb(main):010:0> test
“(irb):10:in `irb_binding’”
=> nil

Kind regards

robert

Thank you Robert!

def assert(expect, actual, *msg)
expect==actual ? print(".") : print("\nAssert failed:
#{expect.inspect} <> #{actual.inspect} in line
#{caller[0].split(’\’).last} #{msg}\n")
end

Christer


#4

Christer N. wrote:

=> nil

Kind regards

robert

Thank you Robert!

You’re welcome.

def assert(expect, actual, *msg)
expect==actual ? print(".") : print("\nAssert failed:
#{expect.inspect} <> #{actual.inspect} in line
#{caller[0].split(’\’).last} #{msg}\n")
end

Btw, one way to make your assertion code maybe a bit more runtime savvy
would be to use blocks:

if do_test?
def assert()
raise AssertionError unless yield
end
else
def assert() end
end

assert { foo > 10 }

IIRC there is already an assert method that works exactly this way.

Kind regards

robert

#5

bob.news wrote:

if do_test?
def assert()
raise AssertionError unless yield
end
else
def assert() end
end

assert { foo > 10 }

IIRC there is already an assert method that works exactly this way.

Kind regards

robert

Robert, I guess this is a minimalistic approach. I will see the info I
need in the uncatched error.

I introduced my own assert, because of the timings. But since I switched
to ArachnoRuby there is no need to avoid test/unit.

Anyway, your trick can be handy too. I’ll save it in my tool chest.

Christer