How can I find __LINE__ on the execution stack ?

  • Thread starter Christer Nilsson
  • Start date
C

Christer Nilsson

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
 
R

Robert Klemme

Christer said:
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.

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
 
C

Christer Nilsson

bob.news said:
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
 
R

Robert Klemme

Christer said:
bob.news said:
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!

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
 
C

Christer Nilsson

bob.news said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,020
Latest member
GenesisGai

Latest Threads

Top