From 4fbb9aa3cb6c31ec128bfb31f59efa66d66adba4 Mon Sep 17 00:00:00 2001 From: eregon Date: Sat, 28 Apr 2018 19:50:06 +0000 Subject: Update to ruby/spec@6f38a82 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63293 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- .../core/exception/backtrace_locations_spec.rb | 39 ++++++++++ spec/ruby/core/exception/fixtures/common.rb | 10 ++- spec/ruby/core/exception/full_message_spec.rb | 38 +++++++++ spec/ruby/core/exception/name_spec.rb | 36 +++------ spec/ruby/core/exception/receiver_spec.rb | 90 +++++++++++----------- 5 files changed, 140 insertions(+), 73 deletions(-) create mode 100644 spec/ruby/core/exception/backtrace_locations_spec.rb create mode 100644 spec/ruby/core/exception/full_message_spec.rb (limited to 'spec/ruby/core/exception') diff --git a/spec/ruby/core/exception/backtrace_locations_spec.rb b/spec/ruby/core/exception/backtrace_locations_spec.rb new file mode 100644 index 0000000000..86eb9d3413 --- /dev/null +++ b/spec/ruby/core/exception/backtrace_locations_spec.rb @@ -0,0 +1,39 @@ +require_relative '../../spec_helper' +require_relative 'fixtures/common' + +describe "Exception#backtrace_locations" do + before :each do + @backtrace = ExceptionSpecs::Backtrace.backtrace_locations + end + + it "returns nil if no backtrace was set" do + Exception.new.backtrace_locations.should be_nil + end + + it "returns an Array" do + @backtrace.should be_an_instance_of(Array) + end + + it "sets each element to a Thread::Backtrace::Location" do + @backtrace.each {|l| l.should be_an_instance_of(Thread::Backtrace::Location)} + end + + it "produces a backtrace for an exception captured using $!" do + exception = begin + raise + rescue RuntimeError + $! + end + + exception.backtrace_locations.first.path.should =~ /backtrace_locations_spec/ + end + + it "returns an Array that can be updated" do + begin + raise + rescue RuntimeError => e + e.backtrace_locations.unshift "backtrace first" + e.backtrace_locations[0].should == "backtrace first" + end + end +end diff --git a/spec/ruby/core/exception/fixtures/common.rb b/spec/ruby/core/exception/fixtures/common.rb index e1ba102197..9ddabace11 100644 --- a/spec/ruby/core/exception/fixtures/common.rb +++ b/spec/ruby/core/exception/fixtures/common.rb @@ -4,11 +4,19 @@ module ExceptionSpecs class Backtrace def self.backtrace begin - raise # Do not move this line or update backtrace_spec.rb + raise # If you move this line, update backtrace_spec.rb rescue RuntimeError => e e.backtrace end end + + def self.backtrace_locations + begin + raise + rescue RuntimeError => e + e.backtrace_locations + end + end end class UnExceptional < Exception diff --git a/spec/ruby/core/exception/full_message_spec.rb b/spec/ruby/core/exception/full_message_spec.rb new file mode 100644 index 0000000000..f56282d67b --- /dev/null +++ b/spec/ruby/core/exception/full_message_spec.rb @@ -0,0 +1,38 @@ +require_relative '../../spec_helper' + +ruby_version_is "2.5" do + describe "Exception#full_message" do + it "returns formatted string of exception using the same format that is used to print an uncaught exceptions to stderr" do + e = RuntimeError.new("Some runtime error") + e.set_backtrace(["a.rb:1", "b.rb:2"]) + + full_message = e.full_message + full_message.should include "RuntimeError" + full_message.should include "Some runtime error" + full_message.should include "a.rb:1" + full_message.should include "b.rb:2" + end + + ruby_version_is "2.5.1" do + it "supports :highlight option and adds escape sequences to highlight some strings" do + e = RuntimeError.new("Some runtime error") + + full_message = e.full_message(highlight: true, order: :bottom) + full_message.should include "\e[1mTraceback\e[m (most recent call last)" + full_message.should include "\e[1mSome runtime error (\e[1;4mRuntimeError\e[m\e[1m)" + + full_message = e.full_message(highlight: false, order: :bottom) + full_message.should include "Traceback (most recent call last)" + full_message.should include "Some runtime error (RuntimeError)" + end + + it "supports :order option and places the error message and the backtrace at the top or the bottom" do + e = RuntimeError.new("Some runtime error") + e.set_backtrace(["a.rb:1", "b.rb:2"]) + + e.full_message(order: :top, highlight: false).should =~ /a.rb:1.*b.rb:2/m + e.full_message(order: :bottom, highlight: false).should =~ /b.rb:2.*a.rb:1/m + end + end + end +end diff --git a/spec/ruby/core/exception/name_spec.rb b/spec/ruby/core/exception/name_spec.rb index 5380432ddf..d1def51f24 100644 --- a/spec/ruby/core/exception/name_spec.rb +++ b/spec/ruby/core/exception/name_spec.rb @@ -27,35 +27,19 @@ describe "NameError#name" do }.should raise_error(NameError) { |e| e.name.should == :@@doesnt_exist } end - ruby_version_is ""..."2.3" do - it "always returns a symbol when a NameError is raised from #instance_variable_get" do - -> { - Object.new.instance_variable_get("invalid_ivar_name") - }.should raise_error(NameError) { |e| e.name.should == :invalid_ivar_name } - end + it "returns the first argument passed to the method when a NameError is raised from #instance_variable_get" do + invalid_ivar_name = "invalid_ivar_name" - it "always returns a symbol when a NameError is raised from #class_variable_get" do - -> { - Object.class_variable_get("invalid_cvar_name") - }.should raise_error(NameError) { |e| e.name.should == :invalid_cvar_name } - end + -> { + Object.new.instance_variable_get(invalid_ivar_name) + }.should raise_error(NameError) {|e| e.name.should equal(invalid_ivar_name) } end - ruby_version_is "2.3" do - it "returns the first argument passed to the method when a NameError is raised from #instance_variable_get" do - invalid_ivar_name = "invalid_ivar_name" - - -> { - Object.new.instance_variable_get(invalid_ivar_name) - }.should raise_error(NameError) {|e| e.name.should equal(invalid_ivar_name) } - end - - it "returns the first argument passed to the method when a NameError is raised from #class_variable_get" do - invalid_cvar_name = "invalid_cvar_name" + it "returns the first argument passed to the method when a NameError is raised from #class_variable_get" do + invalid_cvar_name = "invalid_cvar_name" - -> { - Object.class_variable_get(invalid_cvar_name) - }.should raise_error(NameError) {|e| e.name.should equal(invalid_cvar_name) } - end + -> { + Object.class_variable_get(invalid_cvar_name) + }.should raise_error(NameError) {|e| e.name.should equal(invalid_cvar_name) } end end diff --git a/spec/ruby/core/exception/receiver_spec.rb b/spec/ruby/core/exception/receiver_spec.rb index c5fca7d73a..7c57d63c3e 100644 --- a/spec/ruby/core/exception/receiver_spec.rb +++ b/spec/ruby/core/exception/receiver_spec.rb @@ -1,62 +1,60 @@ require_relative '../../spec_helper' require_relative 'fixtures/common' -ruby_version_is "2.3" do - describe "NameError#receiver" do - class ::ReceiverClass - def call_undefined_class_variable; @@doesnt_exist end - end +describe "NameError#receiver" do + class ::ReceiverClass + def call_undefined_class_variable; @@doesnt_exist end + end - it "returns the object that raised the exception" do - receiver = Object.new + it "returns the object that raised the exception" do + receiver = Object.new - -> { - receiver.doesnt_exist - }.should raise_error(NameError) {|e| e.receiver.should equal(receiver) } - end + -> { + receiver.doesnt_exist + }.should raise_error(NameError) {|e| e.receiver.should equal(receiver) } + end - it "returns the Object class when an undefined constant is called without namespace" do - -> { - DoesntExist - }.should raise_error(NameError) {|e| e.receiver.should equal(Object) } - end + it "returns the Object class when an undefined constant is called without namespace" do + -> { + DoesntExist + }.should raise_error(NameError) {|e| e.receiver.should equal(Object) } + end - it "returns a class when an undefined constant is called" do - -> { - NameErrorSpecs::ReceiverClass::DoesntExist - }.should raise_error(NameError) {|e| e.receiver.should equal(NameErrorSpecs::ReceiverClass) } - end + it "returns a class when an undefined constant is called" do + -> { + NameErrorSpecs::ReceiverClass::DoesntExist + }.should raise_error(NameError) {|e| e.receiver.should equal(NameErrorSpecs::ReceiverClass) } + end - it "returns the Object class when an undefined class variable is called" do + it "returns the Object class when an undefined class variable is called" do + -> { -> { - -> { - @@doesnt_exist - }.should complain(/class variable access from toplevel/) - }.should raise_error(NameError) {|e| e.receiver.should equal(Object) } - end + @@doesnt_exist + }.should complain(/class variable access from toplevel/) + }.should raise_error(NameError) {|e| e.receiver.should equal(Object) } + end - it "returns a class when an undefined class variable is called in a subclass' namespace" do - -> { - NameErrorSpecs::ReceiverClass.new.call_undefined_class_variable - }.should raise_error(NameError) {|e| e.receiver.should equal(NameErrorSpecs::ReceiverClass) } - end + it "returns a class when an undefined class variable is called in a subclass' namespace" do + -> { + NameErrorSpecs::ReceiverClass.new.call_undefined_class_variable + }.should raise_error(NameError) {|e| e.receiver.should equal(NameErrorSpecs::ReceiverClass) } + end - it "returns the receiver when raised from #instance_variable_get" do - receiver = Object.new + it "returns the receiver when raised from #instance_variable_get" do + receiver = Object.new - -> { - receiver.instance_variable_get("invalid_ivar_name") - }.should raise_error(NameError) {|e| e.receiver.should equal(receiver) } - end + -> { + receiver.instance_variable_get("invalid_ivar_name") + }.should raise_error(NameError) {|e| e.receiver.should equal(receiver) } + end - it "returns the receiver when raised from #class_variable_get" do - -> { - Object.class_variable_get("invalid_cvar_name") - }.should raise_error(NameError) {|e| e.receiver.should equal(Object) } - end + it "returns the receiver when raised from #class_variable_get" do + -> { + Object.class_variable_get("invalid_cvar_name") + }.should raise_error(NameError) {|e| e.receiver.should equal(Object) } + end - it "raises an ArgumentError when the receiver is none" do - -> { NameError.new.receiver }.should raise_error(ArgumentError) - end + it "raises an ArgumentError when the receiver is none" do + -> { NameError.new.receiver }.should raise_error(ArgumentError) end end -- cgit v1.2.3