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
AI-Mozi committed May 26, 2023
1 parent d598249 commit 96b5b45
Showing 1 changed file with 81 additions and 0 deletions.
81 changes: 81 additions & 0 deletions core/thread/each_caller_location_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
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
ar = []
Thread.each_caller_location { ar << _1; }

ar.map(&:to_s).should == caller_locations.map(&:to_s)
ar[0].should be_kind_of(Thread::Backtrace::Location)
end

it "returns subset of 'Thread.to_enum(:each_caller_location)' locations" do
i = 0
ar = []
ecl = Thread.each_caller_location do |x|
ar << x
i += 1
break x if i == 1
end

Thread.to_enum(:each_caller_location).to_a.map(&:to_s).should include(ecl.to_s)
end

it "stops the backtrace iteration if 'break' occurs" 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 unconditionally" do
Thread.each_caller_location {}.should == nil
end

it "raises StopIteration at the first invocation of 'next'" do
-> {
Thread.to_enum(:each_caller_location).next
}.should raise_error(StopIteration, "iteration reached an end")
end

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

it "doesn't accept 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 96b5b45

Please sign in to comment.