2018-03-04 10:09:32 -05:00
|
|
|
require_relative '../../spec_helper'
|
2017-05-07 08:04:49 -04:00
|
|
|
require 'stringio'
|
|
|
|
|
|
|
|
describe "StringIO#initialize when passed [Object, mode]" do
|
|
|
|
before :each do
|
|
|
|
@io = StringIO.allocate
|
|
|
|
end
|
|
|
|
|
|
|
|
it "uses the passed Object as the StringIO backend" do
|
|
|
|
@io.send(:initialize, str = "example", "r")
|
|
|
|
@io.string.should equal(str)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "sets the mode based on the passed mode" do
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", "r")
|
|
|
|
io.closed_read?.should be_false
|
|
|
|
io.closed_write?.should be_true
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", "rb")
|
|
|
|
io.closed_read?.should be_false
|
|
|
|
io.closed_write?.should be_true
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", "r+")
|
|
|
|
io.closed_read?.should be_false
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", "rb+")
|
|
|
|
io.closed_read?.should be_false
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", "w")
|
|
|
|
io.closed_read?.should be_true
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", "wb")
|
|
|
|
io.closed_read?.should be_true
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", "w+")
|
|
|
|
io.closed_read?.should be_false
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", "wb+")
|
|
|
|
io.closed_read?.should be_false
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", "a")
|
|
|
|
io.closed_read?.should be_true
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", "ab")
|
|
|
|
io.closed_read?.should be_true
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", "a+")
|
|
|
|
io.closed_read?.should be_false
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", "ab+")
|
|
|
|
io.closed_read?.should be_false
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
end
|
|
|
|
|
|
|
|
it "allows passing the mode as an Integer" do
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", IO::RDONLY)
|
|
|
|
io.closed_read?.should be_false
|
|
|
|
io.closed_write?.should be_true
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", IO::RDWR)
|
|
|
|
io.closed_read?.should be_false
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", IO::WRONLY)
|
|
|
|
io.closed_read?.should be_true
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", IO::WRONLY | IO::TRUNC)
|
|
|
|
io.closed_read?.should be_true
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", IO::RDWR | IO::TRUNC)
|
|
|
|
io.closed_read?.should be_false
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", IO::WRONLY | IO::APPEND)
|
|
|
|
io.closed_read?.should be_true
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
|
|
|
|
io = StringIO.allocate
|
|
|
|
io.send(:initialize, "example", IO::RDWR | IO::APPEND)
|
|
|
|
io.closed_read?.should be_false
|
|
|
|
io.closed_write?.should be_false
|
|
|
|
end
|
|
|
|
|
2020-02-08 21:07:01 -05:00
|
|
|
it "raises a FrozenError when passed a frozen String in truncate mode as StringIO backend" do
|
2017-05-07 08:04:49 -04:00
|
|
|
io = StringIO.allocate
|
2020-02-08 21:07:01 -05:00
|
|
|
-> { io.send(:initialize, "example".freeze, IO::TRUNC) }.should raise_error(FrozenError)
|
2017-05-07 08:04:49 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "tries to convert the passed mode to a String using #to_str" do
|
|
|
|
obj = mock('to_str')
|
|
|
|
obj.should_receive(:to_str).and_return("r")
|
|
|
|
@io.send(:initialize, "example", obj)
|
|
|
|
|
|
|
|
@io.closed_read?.should be_false
|
|
|
|
@io.closed_write?.should be_true
|
|
|
|
end
|
|
|
|
|
|
|
|
it "raises an Errno::EACCES error when passed a frozen string with a write-mode" do
|
|
|
|
(str = "example").freeze
|
2019-07-27 06:40:09 -04:00
|
|
|
-> { @io.send(:initialize, str, "r+") }.should raise_error(Errno::EACCES)
|
|
|
|
-> { @io.send(:initialize, str, "w") }.should raise_error(Errno::EACCES)
|
|
|
|
-> { @io.send(:initialize, str, "a") }.should raise_error(Errno::EACCES)
|
2017-05-07 08:04:49 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "StringIO#initialize when passed [Object]" do
|
|
|
|
before :each do
|
|
|
|
@io = StringIO.allocate
|
|
|
|
end
|
|
|
|
|
|
|
|
it "uses the passed Object as the StringIO backend" do
|
|
|
|
@io.send(:initialize, str = "example")
|
|
|
|
@io.string.should equal(str)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "sets the mode to read-write" do
|
|
|
|
@io.send(:initialize, "example")
|
|
|
|
@io.closed_read?.should be_false
|
|
|
|
@io.closed_write?.should be_false
|
|
|
|
end
|
|
|
|
|
|
|
|
it "tries to convert the passed Object to a String using #to_str" do
|
|
|
|
obj = mock('to_str')
|
|
|
|
obj.should_receive(:to_str).and_return("example")
|
|
|
|
@io.send(:initialize, obj)
|
|
|
|
@io.string.should == "example"
|
|
|
|
end
|
|
|
|
|
|
|
|
it "automatically sets the mode to read-only when passed a frozen string" do
|
|
|
|
(str = "example").freeze
|
|
|
|
@io.send(:initialize, str)
|
|
|
|
@io.closed_read?.should be_false
|
|
|
|
@io.closed_write?.should be_true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "StringIO#initialize when passed no arguments" do
|
|
|
|
before :each do
|
|
|
|
@io = StringIO.allocate
|
|
|
|
end
|
|
|
|
|
|
|
|
it "is private" do
|
|
|
|
StringIO.should have_private_instance_method(:initialize)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "sets the mode to read-write" do
|
|
|
|
@io.send(:initialize, "example")
|
|
|
|
@io.closed_read?.should be_false
|
|
|
|
@io.closed_write?.should be_false
|
|
|
|
end
|
|
|
|
|
|
|
|
it "uses an empty String as the StringIO backend" do
|
|
|
|
@io.send(:initialize)
|
|
|
|
@io.string.should == ""
|
|
|
|
end
|
|
|
|
end
|
2019-01-27 08:12:39 -05:00
|
|
|
|
2020-03-27 19:22:51 -04:00
|
|
|
describe "StringIO#initialize sets" do
|
2019-01-27 08:12:39 -05:00
|
|
|
before :each do
|
|
|
|
@external = Encoding.default_external
|
2020-03-12 08:55:20 -04:00
|
|
|
@internal = Encoding.default_internal
|
2019-01-27 08:12:39 -05:00
|
|
|
Encoding.default_external = Encoding::ISO_8859_2
|
2020-03-12 08:55:20 -04:00
|
|
|
Encoding.default_internal = Encoding::ISO_8859_2
|
2019-01-27 08:12:39 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
after :each do
|
|
|
|
Encoding.default_external = @external
|
2020-03-12 08:55:20 -04:00
|
|
|
Encoding.default_internal = @internal
|
2019-01-27 08:12:39 -05:00
|
|
|
end
|
|
|
|
|
2020-03-27 19:22:51 -04:00
|
|
|
it "the encoding to Encoding.default_external when passed no arguments" do
|
2019-01-27 08:12:39 -05:00
|
|
|
io = StringIO.new
|
|
|
|
io.external_encoding.should == Encoding::ISO_8859_2
|
|
|
|
io.string.encoding.should == Encoding::ISO_8859_2
|
|
|
|
end
|
|
|
|
|
2020-03-27 19:22:51 -04:00
|
|
|
it "the encoding to the encoding of the String when passed a String" do
|
2019-01-27 08:12:39 -05:00
|
|
|
s = ''.force_encoding(Encoding::EUC_JP)
|
|
|
|
io = StringIO.new(s)
|
2020-03-27 19:22:51 -04:00
|
|
|
io.string.encoding.should == Encoding::EUC_JP
|
|
|
|
end
|
|
|
|
|
|
|
|
guard_not -> { # [Bug #16497]
|
|
|
|
stringio_version = StringIO.const_defined?(:VERSION) ? StringIO::VERSION : "0.0.2"
|
|
|
|
version_is(stringio_version, "0.0.3"..."0.1.1")
|
|
|
|
} do
|
|
|
|
it "the #external_encoding to the encoding of the String when passed a String" do
|
|
|
|
s = ''.force_encoding(Encoding::EUC_JP)
|
|
|
|
io = StringIO.new(s)
|
2020-03-15 09:15:39 -04:00
|
|
|
io.external_encoding.should == Encoding::EUC_JP
|
|
|
|
end
|
2019-01-27 08:12:39 -05:00
|
|
|
end
|
|
|
|
end
|