Forum: Ruby How can I find __LINE__ on the execution stack ?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Christer N. (Guest)
on 2005-12-06 16:20
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
bob.news (Guest)
on 2005-12-06 16:51
(Received via mailing list)
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
Christer N. (Guest)
on 2005-12-06 17:01
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
bob.news (Guest)
on 2005-12-06 18:08
(Received via mailing list)
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
Christer N. (Guest)
on 2005-12-06 19:06
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
This topic is locked and can not be replied to.