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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
|
require 'spec_helper'
require 'mspec/guards'
require 'mspec/helpers'
describe IOStub do
before :each do
@out = IOStub.new
@sep = $\
end
after :each do
$\ = @sep
end
it "provides a write method" do
@out.write "this"
@out.should == "this"
end
it "concatenates the arguments sent to write" do
@out.write "flim ", "flam"
@out.should == "flim flam"
end
it "provides a print method that appends the default separator" do
$\ = " [newline] "
@out.print "hello"
@out.print "world"
@out.should == "hello [newline] world [newline] "
end
it "provides a puts method that appends the default separator" do
@out.puts "hello", 1, 2, 3
@out.should == "hello\n1\n2\n3\n"
end
it "provides a puts method that appends separator if argument not given" do
@out.puts
@out.should == "\n"
end
it "provides a printf method" do
@out.printf "%-10s, %03d, %2.1f", "test", 42, 4.2
@out.should == "test , 042, 4.2"
end
it "provides a flush method that does nothing and returns self" do
@out.flush.should == @out
end
end
describe Object, "#new_fd" do
before :each do
@name = tmp("io_specs")
@io = nil
end
after :each do
@io.close if @io and not @io.closed?
rm_r @name
end
it "returns a Fixnum that can be used to create an IO instance" do
fd = new_fd @name
fd.should be_an_instance_of(Fixnum)
@io = IO.new fd, fmode('w:utf-8')
@io.sync = true
@io.print "io data"
IO.read(@name).should == "io data"
end
it "accepts an options Hash" do
FeatureGuard.stub(:enabled?).and_return(true)
fd = new_fd @name, { :mode => 'w:utf-8' }
fd.should be_an_instance_of(Fixnum)
@io = IO.new fd, fmode('w:utf-8')
@io.sync = true
@io.print "io data"
IO.read(@name).should == "io data"
end
it "raises an ArgumentError if the options Hash does not include :mode" do
FeatureGuard.stub(:enabled?).and_return(true)
lambda { new_fd @name, { :encoding => "utf-8" } }.should raise_error(ArgumentError)
end
end
describe Object, "#new_io" do
before :each do
@name = tmp("io_specs.txt")
end
after :each do
@io.close if @io and [email protected]?
rm_r @name
end
it "returns an IO instance" do
@io = new_io @name
@io.should be_an_instance_of(IO)
end
it "opens the IO for reading if passed 'r'" do
touch(@name) { |f| f.print "io data" }
@io = new_io @name, "r"
@io.read.should == "io data"
lambda { @io.puts "more data" }.should raise_error(IOError)
end
it "opens the IO for writing if passed 'w'" do
@io = new_io @name, "w"
@io.sync = true
@io.print "io data"
IO.read(@name).should == "io data"
end
it "opens the IO for reading if passed { :mode => 'r' }" do
touch(@name) { |f| f.print "io data" }
@io = new_io @name, { :mode => "r" }
@io.read.should == "io data"
lambda { @io.puts "more data" }.should raise_error(IOError)
end
it "opens the IO for writing if passed { :mode => 'w' }" do
@io = new_io @name, { :mode => "w" }
@io.sync = true
@io.print "io data"
IO.read(@name).should == "io data"
end
end
describe Object, "#fmode" do
it "returns the argument unmodified if :encoding feature is enabled" do
FeatureGuard.should_receive(:enabled?).with(:encoding).and_return(true)
fmode("rb:binary:utf-8").should == "rb:binary:utf-8"
end
it "returns only the file access mode if :encoding feature is not enabled" do
FeatureGuard.should_receive(:enabled?).with(:encoding).and_return(false)
fmode("rb:binary:utf-8").should == "rb"
end
end
describe Object, "#options_or_mode" do
describe "if passed a Hash" do
it "returns a mode string if :encoding feature is not enabled" do
FeatureGuard.should_receive(:enabled?).with(:encoding).twice.and_return(false)
options_or_mode(:mode => "rb:binary").should == "rb"
end
it "returns a Hash if :encoding feature is enabled" do
FeatureGuard.should_receive(:enabled?).with(:encoding).and_return(true)
options_or_mode(:mode => "rb:utf-8").should == { :mode => "rb:utf-8" }
end
end
describe "if passed a String" do
it "returns only the file access mode if :encoding feature is not enabled" do
FeatureGuard.should_receive(:enabled?).with(:encoding).and_return(false)
options_or_mode("rb:binary:utf-8").should == "rb"
end
it "returns the argument unmodified if :encoding feature is enabled" do
FeatureGuard.should_receive(:enabled?).with(:encoding).and_return(true)
options_or_mode("rb:binary:utf-8").should == "rb:binary:utf-8"
end
end
end
|