summaryrefslogtreecommitdiff
path: root/spec/mspec/spec/helpers/io_spec.rb
blob: 6dfd81ee5627d6ae978fefbcd3143c6fdd8d8249 (plain)
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 !@io.closed?
    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