Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 5 additions & 66 deletions core/exception/set_backtrace_spec.rb
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
require_relative '../../spec_helper'
require_relative 'fixtures/common'
require_relative 'shared/set_backtrace'

describe "Exception#set_backtrace" do
it "accepts an Array of Strings" do
err = RuntimeError.new
err.set_backtrace ["unhappy"]
err.backtrace.should == ["unhappy"]
end

it "allows the user to set the backtrace from a rescued exception" do
bt = ExceptionSpecs::Backtrace.backtrace
err = RuntimeError.new
Expand All @@ -20,65 +15,9 @@
err.backtrace_locations.should == nil
end

ruby_version_is "3.4" do
it "allows the user to set backtrace locations from a rescued exception" do
bt_locations = ExceptionSpecs::Backtrace.backtrace_locations
err = RuntimeError.new
err.backtrace.should == nil
err.backtrace_locations.should == nil

err.set_backtrace bt_locations

err.backtrace_locations.size.should == bt_locations.size
err.backtrace_locations.each_with_index do |loc, index|
other_loc = bt_locations[index]

loc.path.should == other_loc.path
loc.label.should == other_loc.label
loc.base_label.should == other_loc.base_label
loc.lineno.should == other_loc.lineno
loc.absolute_path.should == other_loc.absolute_path
loc.to_s.should == other_loc.to_s
end
err.backtrace.size.should == err.backtrace_locations.size
end
end

it "accepts an empty Array" do
err = RuntimeError.new
err.set_backtrace []
err.backtrace.should == []
end

it "accepts a String" do
it_behaves_like :exception_set_backtrace, -> backtrace {
err = RuntimeError.new
err.set_backtrace "unhappy"
err.backtrace.should == ["unhappy"]
end

it "accepts nil" do
err = RuntimeError.new
err.set_backtrace nil
err.backtrace.should be_nil
end

it "raises a TypeError when passed a Symbol" do
err = RuntimeError.new
-> { err.set_backtrace :unhappy }.should raise_error(TypeError)
end

it "raises a TypeError when the Array contains a Symbol" do
err = RuntimeError.new
-> { err.set_backtrace ["String", :unhappy] }.should raise_error(TypeError)
end

it "raises a TypeError when the array contains nil" do
err = Exception.new
-> { err.set_backtrace ["String", nil] }.should raise_error(TypeError)
end

it "raises a TypeError when the argument is a nested array" do
err = Exception.new
-> { err.set_backtrace ["String", ["String"]] }.should raise_error(TypeError)
end
err.set_backtrace(backtrace)
err
}
end
64 changes: 64 additions & 0 deletions core/exception/shared/set_backtrace.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
require_relative '../fixtures/common'

describe :exception_set_backtrace, shared: true do
it "accepts an Array of Strings" do
err = @method.call(["unhappy"])
err.backtrace.should == ["unhappy"]
end

it "allows the user to set the backtrace from a rescued exception" do
bt = ExceptionSpecs::Backtrace.backtrace
err = @method.call(bt)
err.backtrace.should == bt
end

ruby_version_is "3.4" do
it "allows the user to set backtrace locations from a rescued exception" do
bt_locations = ExceptionSpecs::Backtrace.backtrace_locations
err = @method.call(bt_locations)
err.backtrace_locations.size.should == bt_locations.size
err.backtrace_locations.each_with_index do |loc, index|
other_loc = bt_locations[index]

loc.path.should == other_loc.path
loc.label.should == other_loc.label
loc.base_label.should == other_loc.base_label
loc.lineno.should == other_loc.lineno
loc.absolute_path.should == other_loc.absolute_path
loc.to_s.should == other_loc.to_s
end
err.backtrace.size.should == err.backtrace_locations.size
end
end

it "accepts an empty Array" do
err = @method.call([])
err.backtrace.should == []
end

it "accepts a String" do
err = @method.call("unhappy")
err.backtrace.should == ["unhappy"]
end

it "accepts nil" do
err = @method.call(nil)
err.backtrace.should be_nil
end

it "raises a TypeError when passed a Symbol" do
-> { @method.call(:unhappy) }.should raise_error(TypeError)
end

it "raises a TypeError when the Array contains a Symbol" do
-> { @method.call(["String", :unhappy]) }.should raise_error(TypeError)
end

it "raises a TypeError when the array contains nil" do
-> { @method.call(["String", nil]) }.should raise_error(TypeError)
end

it "raises a TypeError when the argument is a nested array" do
-> { @method.call(["String", ["String"]]) }.should raise_error(TypeError)
end
end
12 changes: 12 additions & 0 deletions language/predefined_spec.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require_relative '../spec_helper'
require_relative '../core/exception/shared/set_backtrace'
require 'stringio'

# The following tables are excerpted from Programming Ruby: The Pragmatic Programmer's Guide'
Expand Down Expand Up @@ -621,6 +622,17 @@ def foo
end
end

it_behaves_like :exception_set_backtrace, -> backtrace {
exception = nil
begin
raise
rescue
$@ = backtrace
exception = $!
end
exception
}

Comment thread
andrykonchin marked this conversation as resolved.
it "cannot be assigned when there is no a rescued exception" do
-> {
$@ = []
Expand Down
Loading