summaryrefslogtreecommitdiff
path: root/spec/mspec/spec/helpers/io_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/mspec/spec/helpers/io_spec.rb')
-rw-r--r--spec/mspec/spec/helpers/io_spec.rb174
1 files changed, 174 insertions, 0 deletions
diff --git a/spec/mspec/spec/helpers/io_spec.rb b/spec/mspec/spec/helpers/io_spec.rb
new file mode 100644
index 0000000000..6dfd81ee56
--- /dev/null
+++ b/spec/mspec/spec/helpers/io_spec.rb
@@ -0,0 +1,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