1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
require_relative '../fixtures/encoded_strings'
describe :array_inspect, shared: true do
it "returns a string" do
[1, 2, 3].send(@method).should be_an_instance_of(String)
end
it "returns '[]' for an empty Array" do
[].send(@method).should == "[]"
end
it "calls inspect on its elements and joins the results with commas" do
items = Array.new(3) do |i|
obj = mock(i.to_s)
obj.should_receive(:inspect).and_return(i.to_s)
obj
end
items.send(@method).should == "[0, 1, 2]"
end
it "does not call #to_s on a String returned from #inspect" do
str = +"abc"
str.should_not_receive(:to_s)
[str].send(@method).should == '["abc"]'
end
it "calls #to_s on the object returned from #inspect if the Object isn't a String" do
obj = mock("Array#inspect/to_s calls #to_s")
obj.should_receive(:inspect).and_return(obj)
obj.should_receive(:to_s).and_return("abc")
[obj].send(@method).should == "[abc]"
end
it "does not call #to_str on the object returned from #inspect when it is not a String" do
obj = mock("Array#inspect/to_s does not call #to_str")
obj.should_receive(:inspect).and_return(obj)
obj.should_not_receive(:to_str)
[obj].send(@method).should =~ /^\[#<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("Array#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)
[obj].send(@method).should =~ /^\[#<MockObject:0x[0-9a-f]+>\]$/
end
it "does not swallow exceptions raised by #to_s" do
obj = mock("Array#inspect/to_s does not swallow #to_s exceptions")
obj.should_receive(:inspect).and_return(obj)
obj.should_receive(:to_s).and_raise(Exception)
-> { [obj].send(@method) }.should raise_error(Exception)
end
it "represents a recursive element with '[...]'" do
ArraySpecs.recursive_array.send(@method).should == "[1, \"two\", 3.0, [...], [...], [...], [...], [...]]"
ArraySpecs.head_recursive_array.send(@method).should == "[[...], [...], [...], [...], [...], 1, \"two\", 3.0]"
ArraySpecs.empty_recursive_array.send(@method).should == "[[...]]"
end
describe "with encoding" do
before :each do
@default_external_encoding = Encoding.default_external
end
after :each do
Encoding.default_external = @default_external_encoding
end
it "returns a US-ASCII string for an empty Array" do
[].send(@method).encoding.should == Encoding::US_ASCII
end
it "use the default external encoding if it is ascii compatible" do
Encoding.default_external = Encoding.find('UTF-8')
utf8 = "utf8".encode("UTF-8")
jp = "jp".encode("EUC-JP")
array = [jp, utf8]
array.send(@method).encoding.name.should == "UTF-8"
end
it "use US-ASCII encoding if the default external encoding is not ascii compatible" do
Encoding.default_external = Encoding.find('UTF-32')
utf8 = "utf8".encode("UTF-8")
jp = "jp".encode("EUC-JP")
array = [jp, utf8]
array.send(@method).encoding.name.should == "US-ASCII"
end
it "does not raise if inspected result is not default external encoding" do
utf_16be = mock(+"utf_16be")
utf_16be.should_receive(:inspect).and_return(%<"utf_16be \u3042">.encode(Encoding::UTF_16BE))
[utf_16be].send(@method).should == '["utf_16be \u3042"]'
end
end
end
|