From 98e62833efeae76d35134c129465c5258fa926d2 Mon Sep 17 00:00:00 2001 From: AI-Mozi Date: Mon, 15 May 2023 15:52:52 +0200 Subject: [PATCH] Add specs for `Exception#detailed_message` --- core/exception/detailed_message_spec.rb | 35 +++++++++++++++++++++++++ core/exception/fixtures/common.rb | 4 +++ core/exception/full_message_spec.rb | 21 +++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 core/exception/detailed_message_spec.rb diff --git a/core/exception/detailed_message_spec.rb b/core/exception/detailed_message_spec.rb new file mode 100644 index 0000000000..bd85927dbe --- /dev/null +++ b/core/exception/detailed_message_spec.rb @@ -0,0 +1,35 @@ +require_relative '../../spec_helper' +require_relative 'fixtures/common' + +describe "Exception#detailed_message" do + ruby_version_is "3.2" do + it "returns decorated message" do + RuntimeError.new("new error").detailed_message.should == "new error (RuntimeError)" + end + + it "accepts highlight keyword argument and adds escape control sequences" do + RuntimeError.new("new error").detailed_message(highlight: true).should == "\e[1mnew error (\e[1;4mRuntimeError\e[m\e[1m)\e[m" + end + + it "allows and ignores other keyword arguments" do + RuntimeError.new("new error").detailed_message(foo: true).should == "new error (RuntimeError)" + end + + it "returns just a message if exception class is anonymous" do + Class.new(RuntimeError).new("message").detailed_message.should == "message" + end + + it "returns 'unhandled exception' for an instance of RuntimeError with empty message" do + RuntimeError.new("").detailed_message.should == "unhandled exception" + end + + it "returns just class name for an instance of RuntimeError sublass with empty message" do + DetailedMessageSpec::C.new("").detailed_message.should == "DetailedMessageSpec::C" + end + + it "returns a generated class name for an instance of RuntimeError anonymous subclass with empty message" do + klass = Class.new(RuntimeError) + klass.new("").detailed_message.should =~ /\A#\z/ + end + end +end diff --git a/core/exception/fixtures/common.rb b/core/exception/fixtures/common.rb index 0ffb3ed855..1e243098bd 100644 --- a/core/exception/fixtures/common.rb +++ b/core/exception/fixtures/common.rb @@ -93,3 +93,7 @@ def call_undefined_class_variable end end end + +module DetailedMessageSpec + C = Class.new(RuntimeError) +end diff --git a/core/exception/full_message_spec.rb b/core/exception/full_message_spec.rb index 9757a2f407..ee66582022 100644 --- a/core/exception/full_message_spec.rb +++ b/core/exception/full_message_spec.rb @@ -103,4 +103,25 @@ exception.full_message.should include "intermediate exception" exception.full_message.should include "origin exception" end + + ruby_version_is "3.2" do + it "relies on #detailed_message" do + e = RuntimeError.new("new error") + e.define_singleton_method(:detailed_message) { |**opt| "DETAILED MESSAGE" } + + e.full_message.lines.first.should =~ /DETAILED MESSAGE/ + end + + it "passes all its own keyword arguments to #detailed_message" do + e = RuntimeError.new("new error") + opt_ = nil + e.define_singleton_method(:detailed_message) do |**opt| + opt_ = opt + "DETAILED MESSAGE" + end + + e.full_message(foo: "bar") + opt_.should == { foo: "bar", highlight: Exception.to_tty? } + end + end end