Skip to content

Commit

Permalink
Add specs for Thread.each_caller_location
Browse files Browse the repository at this point in the history
  • Loading branch information
moozzi committed May 26, 2023
1 parent d598249 commit af20488
Showing 1 changed file with 79 additions and 0 deletions.
79 changes: 79 additions & 0 deletions core/thread/each_caller_location_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
require_relative '../../spec_helper'

describe "Thread.each_caller_location" do
ruby_version_is "3.2" do
it "iterates through the current execution stack and matches caller_locations content and type" do
i = 0;
ecl = Thread.each_caller_location do |loc|
i += 1;
break loc if i == 1;
end

ecl.to_s.should == caller_locations(1, 1)[0].to_s
ecl.should be_kind_of(Thread::Backtrace::Location)
end

it "using to_enum doesn't add any locations related to to_enum" do
cl = caller_locations(1, 2).map(&:to_s)
en = Thread.to_enum(:each_caller_location).to_a[2..3].map(&:to_s)

cl.should == en
end

it "'break' stops the backtrace iteration" do
i = 0
ar = []
ecl = Thread.each_caller_location do |x|
ar << x
i += 1
break x if i == 2
end

ar.map(&:to_s).should == caller_locations(1, 2).map(&:to_s)
ecl.should be_kind_of(Thread::Backtrace::Location)
end

it "show multiple block farames" do
i = 0
ar = []
cl = nil
ecl = nil

-> {
-> {
cl = caller_locations(1, 2)
ecl = Thread.each_caller_location do |x|
ar << x
i += 1
break x if i == 2
end
}.()
}.()

cl.map(&:to_s).should == ar.map(&:to_s)
ecl.should be_kind_of(Thread::Backtrace::Location)
end

it "returns nil if no caller locations found" do
Thread.each_caller_location {}.should == nil
end

it "raises StopIteration at the end when used as an external enumerator" do
-> {
Thread.to_enum(:each_caller_location).next
}.should raise_error(StopIteration, "iteration reached an end")
end

it "raises raises LocalJumpError when called without a block" do
-> {
Thread.each_caller_location
}.should raise_error(LocalJumpError, "no block given")
end

it "doesn't accepts positional and keyword arguments" do
-> {
Thread.each_caller_location(12, foo: 10) {}
}.should raise_error(ArgumentError, "wrong number of arguments (given 2, expected 0)")
end
end
end

0 comments on commit af20488

Please sign in to comment.