diff options
Diffstat (limited to 'spec/rubyspec/core/hash/shared/to_s.rb')
-rw-r--r-- | spec/rubyspec/core/hash/shared/to_s.rb | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/spec/rubyspec/core/hash/shared/to_s.rb b/spec/rubyspec/core/hash/shared/to_s.rb index 7ef2c207d4..0afe605826 100644 --- a/spec/rubyspec/core/hash/shared/to_s.rb +++ b/spec/rubyspec/core/hash/shared/to_s.rb @@ -15,7 +15,7 @@ describe :hash_to_s, shared: true do h.send(@method).should == str end - it "calls inspect on keys and values" do + it "calls #inspect on keys and values" do key = mock('key') val = mock('val') key.should_receive(:inspect).and_return('key') @@ -24,6 +24,46 @@ describe :hash_to_s, shared: true do { key => val }.send(@method).should == '{key=>val}' end + it "does not call #to_s on a String returned from #inspect" do + str = "abc" + str.should_not_receive(:to_s) + + { a: str }.send(@method).should == '{:a=>"abc"}' + end + + it "calls #to_s on the object returned from #inspect if the Object isn't a String" do + obj = mock("Hash#inspect/to_s calls #to_s") + obj.should_receive(:inspect).and_return(obj) + obj.should_receive(:to_s).and_return("abc") + + { a: obj }.send(@method).should == "{:a=>abc}" + end + + it "does not call #to_str on the object returned from #inspect when it is not a String" do + obj = mock("Hash#inspect/to_s does not call #to_str") + obj.should_receive(:inspect).and_return(obj) + obj.should_not_receive(:to_str) + + { a: obj }.send(@method).should =~ /^\{:a=>#<MockObject:0x[0-9a-f]+>\}$/ + end + + it "does not call #to_str on the object returned from #to_s when it is not a String" do + obj = mock("Hash#inspect/to_s does not call #to_str on #to_s result") + obj.should_receive(:inspect).and_return(obj) + obj.should_receive(:to_s).and_return(obj) + obj.should_not_receive(:to_str) + + { a: obj }.send(@method).should =~ /^\{:a=>#<MockObject:0x[0-9a-f]+>\}$/ + end + + it "does not swallow exceptions raised by #to_s" do + obj = mock("Hash#inspect/to_s does not swallow #to_s exceptions") + obj.should_receive(:inspect).and_return(obj) + obj.should_receive(:to_s).and_raise(Exception) + + lambda { { a: obj }.send(@method) }.should raise_error(Exception) + end + it "handles hashes with recursive values" do x = {} x[0] = x |