diff --git a/core/thread/each_caller_location_spec.rb b/core/thread/each_caller_location_spec.rb new file mode 100644 index 000000000..535926266 --- /dev/null +++ b/core/thread/each_caller_location_spec.rb @@ -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