summaryrefslogtreecommitdiff
path: root/spec/ruby/core/io
diff options
context:
space:
mode:
authorBenoit Daloze <eregontp@gmail.com>2019-04-28 23:20:11 +0200
committerBenoit Daloze <eregontp@gmail.com>2019-04-28 23:20:11 +0200
commit79671ec57e59091260a0bc3d40a31d31d9c72a94 (patch)
tree2f59a8727b8f63f9e79d50352fa4f78a7cc00234 /spec/ruby/core/io
parent994833085ae06afbe94d30ab183d80e0234fbe14 (diff)
Update to ruby/spec@7de852d
Diffstat (limited to 'spec/ruby/core/io')
-rw-r--r--spec/ruby/core/io/external_encoding_spec.rb302
-rw-r--r--spec/ruby/core/io/fixtures/classes.rb4
-rw-r--r--spec/ruby/core/io/foreach_spec.rb2
-rw-r--r--spec/ruby/core/io/gets_spec.rb8
-rw-r--r--spec/ruby/core/io/initialize_spec.rb32
-rw-r--r--spec/ruby/core/io/internal_encoding_spec.rb228
-rw-r--r--spec/ruby/core/io/popen_spec.rb28
-rw-r--r--spec/ruby/core/io/puts_spec.rb32
-rw-r--r--spec/ruby/core/io/read_spec.rb206
-rw-r--r--spec/ruby/core/io/readlines_spec.rb6
-rw-r--r--spec/ruby/core/io/reopen_spec.rb17
-rw-r--r--spec/ruby/core/io/set_encoding_spec.rb286
-rw-r--r--spec/ruby/core/io/shared/write.rb6
-rw-r--r--spec/ruby/core/io/write_spec.rb68
14 files changed, 594 insertions, 631 deletions
diff --git a/spec/ruby/core/io/external_encoding_spec.rb b/spec/ruby/core/io/external_encoding_spec.rb
index e625484670..3581019207 100644
--- a/spec/ruby/core/io/external_encoding_spec.rb
+++ b/spec/ruby/core/io/external_encoding_spec.rb
@@ -1,218 +1,216 @@
require_relative '../../spec_helper'
-with_feature :encoding do
- describe :io_external_encoding_write, shared: true do
+describe :io_external_encoding_write, shared: true do
+ describe "when Encoding.default_internal is nil" do
+ before :each do
+ Encoding.default_internal = nil
+ end
+
+ it "returns nil" do
+ @io = new_io @name, @object
+ Encoding.default_external = Encoding::IBM437
+ @io.external_encoding.should be_nil
+ end
+
+ it "returns the external encoding specified when the instance was created" do
+ @io = new_io @name, "#{@object}:ibm866"
+ Encoding.default_external = Encoding::IBM437
+ @io.external_encoding.should equal(Encoding::IBM866)
+ end
+
+ it "returns the encoding set by #set_encoding" do
+ @io = new_io @name, "#{@object}:ibm866"
+ @io.set_encoding Encoding::EUC_JP, nil
+ @io.external_encoding.should equal(Encoding::EUC_JP)
+ end
+ end
+
+ describe "when Encoding.default_external != Encoding.default_internal" do
+ before :each do
+ Encoding.default_external = Encoding::IBM437
+ Encoding.default_internal = Encoding::IBM866
+ end
+
+ it "returns the value of Encoding.default_external when the instance was created" do
+ @io = new_io @name, @object
+ Encoding.default_external = Encoding::UTF_8
+ @io.external_encoding.should equal(Encoding::IBM437)
+ end
+
+ it "returns the external encoding specified when the instance was created" do
+ @io = new_io @name, "#{@object}:ibm866"
+ Encoding.default_external = Encoding::IBM437
+ @io.external_encoding.should equal(Encoding::IBM866)
+ end
+
+ it "returns the encoding set by #set_encoding" do
+ @io = new_io @name, "#{@object}:ibm866"
+ @io.set_encoding Encoding::EUC_JP, nil
+ @io.external_encoding.should equal(Encoding::EUC_JP)
+ end
+ end
+
+ describe "when Encoding.default_external == Encoding.default_internal" do
+ before :each do
+ Encoding.default_external = Encoding::IBM866
+ Encoding.default_internal = Encoding::IBM866
+ end
+
+ it "returns the value of Encoding.default_external when the instance was created" do
+ @io = new_io @name, @object
+ Encoding.default_external = Encoding::UTF_8
+ @io.external_encoding.should equal(Encoding::IBM866)
+ end
+
+ it "returns the external encoding specified when the instance was created" do
+ @io = new_io @name, "#{@object}:ibm866"
+ Encoding.default_external = Encoding::IBM437
+ @io.external_encoding.should equal(Encoding::IBM866)
+ end
+
+ it "returns the encoding set by #set_encoding" do
+ @io = new_io @name, "#{@object}:ibm866"
+ @io.set_encoding Encoding::EUC_JP, nil
+ @io.external_encoding.should equal(Encoding::EUC_JP)
+ end
+ end
+end
+
+describe "IO#external_encoding" do
+ before :each do
+ @external = Encoding.default_external
+ @internal = Encoding.default_internal
+
+ @name = tmp("io_external_encoding")
+ touch(@name)
+ end
+
+ after :each do
+ Encoding.default_external = @external
+ Encoding.default_internal = @internal
+
+ @io.close if @io
+ rm_r @name
+ end
+
+ describe "with 'r' mode" do
describe "when Encoding.default_internal is nil" do
before :each do
Encoding.default_internal = nil
+ Encoding.default_external = Encoding::IBM866
end
- it "returns nil" do
- @io = new_io @name, @object
+ it "returns Encoding.default_external if the external encoding is not set" do
+ @io = new_io @name, "r"
+ @io.external_encoding.should equal(Encoding::IBM866)
+ end
+
+ it "returns Encoding.default_external when that encoding is changed after the instance is created" do
+ @io = new_io @name, "r"
Encoding.default_external = Encoding::IBM437
- @io.external_encoding.should be_nil
+ @io.external_encoding.should equal(Encoding::IBM437)
end
it "returns the external encoding specified when the instance was created" do
- @io = new_io @name, "#{@object}:ibm866"
+ @io = new_io @name, "r:utf-8"
Encoding.default_external = Encoding::IBM437
- @io.external_encoding.should equal(Encoding::IBM866)
+ @io.external_encoding.should equal(Encoding::UTF_8)
end
it "returns the encoding set by #set_encoding" do
- @io = new_io @name, "#{@object}:ibm866"
+ @io = new_io @name, "r:utf-8"
@io.set_encoding Encoding::EUC_JP, nil
@io.external_encoding.should equal(Encoding::EUC_JP)
end
end
- describe "when Encoding.default_external != Encoding.default_internal" do
+ describe "when Encoding.default_external == Encoding.default_internal" do
before :each do
- Encoding.default_external = Encoding::IBM437
+ Encoding.default_external = Encoding::IBM866
Encoding.default_internal = Encoding::IBM866
end
it "returns the value of Encoding.default_external when the instance was created" do
- @io = new_io @name, @object
- Encoding.default_external = Encoding::UTF_8
- @io.external_encoding.should equal(Encoding::IBM437)
+ @io = new_io @name, "r"
+ Encoding.default_external = Encoding::IBM437
+ @io.external_encoding.should equal(Encoding::IBM866)
end
it "returns the external encoding specified when the instance was created" do
- @io = new_io @name, "#{@object}:ibm866"
+ @io = new_io @name, "r:utf-8"
Encoding.default_external = Encoding::IBM437
- @io.external_encoding.should equal(Encoding::IBM866)
+ @io.external_encoding.should equal(Encoding::UTF_8)
end
it "returns the encoding set by #set_encoding" do
- @io = new_io @name, "#{@object}:ibm866"
+ @io = new_io @name, "r:utf-8"
@io.set_encoding Encoding::EUC_JP, nil
@io.external_encoding.should equal(Encoding::EUC_JP)
end
end
- describe "when Encoding.default_external == Encoding.default_internal" do
+ describe "when Encoding.default_external != Encoding.default_internal" do
before :each do
- Encoding.default_external = Encoding::IBM866
+ Encoding.default_external = Encoding::IBM437
Encoding.default_internal = Encoding::IBM866
end
- it "returns the value of Encoding.default_external when the instance was created" do
- @io = new_io @name, @object
- Encoding.default_external = Encoding::UTF_8
- @io.external_encoding.should equal(Encoding::IBM866)
- end
it "returns the external encoding specified when the instance was created" do
- @io = new_io @name, "#{@object}:ibm866"
+ @io = new_io @name, "r:utf-8"
Encoding.default_external = Encoding::IBM437
- @io.external_encoding.should equal(Encoding::IBM866)
+ @io.external_encoding.should equal(Encoding::UTF_8)
end
it "returns the encoding set by #set_encoding" do
- @io = new_io @name, "#{@object}:ibm866"
+ @io = new_io @name, "r:utf-8"
@io.set_encoding Encoding::EUC_JP, nil
@io.external_encoding.should equal(Encoding::EUC_JP)
end
end
end
- describe "IO#external_encoding" do
- before :each do
- @external = Encoding.default_external
- @internal = Encoding.default_internal
-
- @name = tmp("io_external_encoding")
- touch(@name)
- end
-
- after :each do
- Encoding.default_external = @external
- Encoding.default_internal = @internal
-
- @io.close if @io
- rm_r @name
- end
-
- describe "with 'r' mode" do
- describe "when Encoding.default_internal is nil" do
- before :each do
- Encoding.default_internal = nil
- Encoding.default_external = Encoding::IBM866
- end
-
- it "returns Encoding.default_external if the external encoding is not set" do
- @io = new_io @name, "r"
- @io.external_encoding.should equal(Encoding::IBM866)
- end
-
- it "returns Encoding.default_external when that encoding is changed after the instance is created" do
- @io = new_io @name, "r"
- Encoding.default_external = Encoding::IBM437
- @io.external_encoding.should equal(Encoding::IBM437)
- end
-
- it "returns the external encoding specified when the instance was created" do
- @io = new_io @name, "r:utf-8"
- Encoding.default_external = Encoding::IBM437
- @io.external_encoding.should equal(Encoding::UTF_8)
- end
-
- it "returns the encoding set by #set_encoding" do
- @io = new_io @name, "r:utf-8"
- @io.set_encoding Encoding::EUC_JP, nil
- @io.external_encoding.should equal(Encoding::EUC_JP)
- end
- end
-
- describe "when Encoding.default_external == Encoding.default_internal" do
- before :each do
- Encoding.default_external = Encoding::IBM866
- Encoding.default_internal = Encoding::IBM866
- end
-
- it "returns the value of Encoding.default_external when the instance was created" do
- @io = new_io @name, "r"
- Encoding.default_external = Encoding::IBM437
- @io.external_encoding.should equal(Encoding::IBM866)
- end
-
- it "returns the external encoding specified when the instance was created" do
- @io = new_io @name, "r:utf-8"
- Encoding.default_external = Encoding::IBM437
- @io.external_encoding.should equal(Encoding::UTF_8)
- end
-
- it "returns the encoding set by #set_encoding" do
- @io = new_io @name, "r:utf-8"
- @io.set_encoding Encoding::EUC_JP, nil
- @io.external_encoding.should equal(Encoding::EUC_JP)
- end
- end
-
- describe "when Encoding.default_external != Encoding.default_internal" do
- before :each do
- Encoding.default_external = Encoding::IBM437
- Encoding.default_internal = Encoding::IBM866
- end
-
-
- it "returns the external encoding specified when the instance was created" do
- @io = new_io @name, "r:utf-8"
- Encoding.default_external = Encoding::IBM437
- @io.external_encoding.should equal(Encoding::UTF_8)
- end
-
- it "returns the encoding set by #set_encoding" do
- @io = new_io @name, "r:utf-8"
- @io.set_encoding Encoding::EUC_JP, nil
- @io.external_encoding.should equal(Encoding::EUC_JP)
- end
- end
+ describe "with 'rb' mode" do
+ it "returns Encoding::ASCII_8BIT" do
+ @io = new_io @name, "rb"
+ @io.external_encoding.should equal(Encoding::ASCII_8BIT)
end
- describe "with 'rb' mode" do
- it "returns Encoding::ASCII_8BIT" do
- @io = new_io @name, "rb"
- @io.external_encoding.should equal(Encoding::ASCII_8BIT)
- end
-
- it "returns the external encoding specified by the mode argument" do
- @io = new_io @name, "rb:ibm437"
- @io.external_encoding.should equal(Encoding::IBM437)
- end
- end
-
- describe "with 'r+' mode" do
- it_behaves_like :io_external_encoding_write, nil, "r+"
+ it "returns the external encoding specified by the mode argument" do
+ @io = new_io @name, "rb:ibm437"
+ @io.external_encoding.should equal(Encoding::IBM437)
end
+ end
- describe "with 'w' mode" do
- it_behaves_like :io_external_encoding_write, nil, "w"
- end
+ describe "with 'r+' mode" do
+ it_behaves_like :io_external_encoding_write, nil, "r+"
+ end
- describe "with 'wb' mode" do
- it "returns Encoding::ASCII_8BIT" do
- @io = new_io @name, "wb"
- @io.external_encoding.should equal(Encoding::ASCII_8BIT)
- end
+ describe "with 'w' mode" do
+ it_behaves_like :io_external_encoding_write, nil, "w"
+ end
- it "returns the external encoding specified by the mode argument" do
- @io = new_io @name, "wb:ibm437"
- @io.external_encoding.should equal(Encoding::IBM437)
- end
+ describe "with 'wb' mode" do
+ it "returns Encoding::ASCII_8BIT" do
+ @io = new_io @name, "wb"
+ @io.external_encoding.should equal(Encoding::ASCII_8BIT)
end
- describe "with 'w+' mode" do
- it_behaves_like :io_external_encoding_write, nil, "w+"
+ it "returns the external encoding specified by the mode argument" do
+ @io = new_io @name, "wb:ibm437"
+ @io.external_encoding.should equal(Encoding::IBM437)
end
+ end
- describe "with 'a' mode" do
- it_behaves_like :io_external_encoding_write, nil, "a"
- end
+ describe "with 'w+' mode" do
+ it_behaves_like :io_external_encoding_write, nil, "w+"
+ end
- describe "with 'a+' mode" do
- it_behaves_like :io_external_encoding_write, nil, "a+"
- end
+ describe "with 'a' mode" do
+ it_behaves_like :io_external_encoding_write, nil, "a"
+ end
+
+ describe "with 'a+' mode" do
+ it_behaves_like :io_external_encoding_write, nil, "a+"
end
end
diff --git a/spec/ruby/core/io/fixtures/classes.rb b/spec/ruby/core/io/fixtures/classes.rb
index a771e3d929..460dd62387 100644
--- a/spec/ruby/core/io/fixtures/classes.rb
+++ b/spec/ruby/core/io/fixtures/classes.rb
@@ -118,10 +118,10 @@ module IOSpecs
# Creates an IO instance for an existing fixture file. The
# file should obviously not be deleted.
- def self.io_fixture(name, options_or_mode="r:utf-8")
+ def self.io_fixture(name, mode = "r:utf-8")
path = fixture __FILE__, name
name = path if File.exist? path
- new_io name, options_or_mode
+ new_io(name, mode)
end
# Returns a closed instance of IO that was opened to reference
diff --git a/spec/ruby/core/io/foreach_spec.rb b/spec/ruby/core/io/foreach_spec.rb
index c5c1178787..c2276cf544 100644
--- a/spec/ruby/core/io/foreach_spec.rb
+++ b/spec/ruby/core/io/foreach_spec.rb
@@ -24,7 +24,7 @@ describe "IO.foreach" do
ScratchPad.recorded.should == ["hello\n", "line2\n"]
end
- with_feature :fork do
+ platform_is_not :windows do
it "gets data from a fork when passed -" do
parent_pid = $$
diff --git a/spec/ruby/core/io/gets_spec.rb b/spec/ruby/core/io/gets_spec.rb
index 525c7547cd..ac763f2a13 100644
--- a/spec/ruby/core/io/gets_spec.rb
+++ b/spec/ruby/core/io/gets_spec.rb
@@ -156,11 +156,11 @@ describe "IO#gets" do
end
it "raises an IOError if the stream is opened for append only" do
- lambda { File.open(@name, fmode("a:utf-8")) { |f| f.gets } }.should raise_error(IOError)
+ lambda { File.open(@name, "a:utf-8") { |f| f.gets } }.should raise_error(IOError)
end
it "raises an IOError if the stream is opened for writing only" do
- lambda { File.open(@name, fmode("w:utf-8")) { |f| f.gets } }.should raise_error(IOError)
+ lambda { File.open(@name, "w:utf-8") { |f| f.gets } }.should raise_error(IOError)
end
end
@@ -168,7 +168,7 @@ describe "IO#gets" do
before :each do
@name = tmp("io_gets")
touch(@name) { |f| f.write "one\n\ntwo\n\nthree\nfour\n" }
- @io = new_io @name, fmode("r:utf-8")
+ @io = new_io @name, "r:utf-8"
end
after :each do
@@ -232,7 +232,7 @@ describe "IO#gets" do
# create data "朝日" + "\xE3\x81" * 100 to avoid utf-8 conflicts
data = "朝日" + ([227,129].pack('C*') * 100).force_encoding('utf-8')
touch(@name) { |f| f.write data }
- @io = new_io @name, fmode("r:utf-8")
+ @io = new_io @name, "r:utf-8"
end
after :each do
diff --git a/spec/ruby/core/io/initialize_spec.rb b/spec/ruby/core/io/initialize_spec.rb
index 5bf194f15c..4858e0360c 100644
--- a/spec/ruby/core/io/initialize_spec.rb
+++ b/spec/ruby/core/io/initialize_spec.rb
@@ -13,26 +13,18 @@ describe "IO#initialize" do
rm_r @name
end
- # File descriptor numbers are not predictable in multi-threaded code;
- # MJIT will be opening/closing files the background
- without_feature :mjit do
- it "reassociates the IO instance with the new descriptor when passed a Fixnum" do
- fd = new_fd @name, "r:utf-8"
- @io.send :initialize, fd, 'r'
- @io.fileno.should == fd
- # initialize has closed the old descriptor
- lambda { IO.for_fd(@fd).close }.should raise_error(Errno::EBADF)
- end
-
- it "calls #to_int to coerce the object passed as an fd" do
- obj = mock('fileno')
- fd = new_fd @name, "r:utf-8"
- obj.should_receive(:to_int).and_return(fd)
- @io.send :initialize, obj, 'r'
- @io.fileno.should == fd
- # initialize has closed the old descriptor
- lambda { IO.for_fd(@fd).close }.should raise_error(Errno::EBADF)
- end
+ it "reassociates the IO instance with the new descriptor when passed a Fixnum" do
+ fd = new_fd @name, "r:utf-8"
+ @io.send :initialize, fd, 'r'
+ @io.fileno.should == fd
+ end
+
+ it "calls #to_int to coerce the object passed as an fd" do
+ obj = mock('fileno')
+ fd = new_fd @name, "r:utf-8"
+ obj.should_receive(:to_int).and_return(fd)
+ @io.send :initialize, obj, 'r'
+ @io.fileno.should == fd
end
it "raises a TypeError when passed an IO" do
diff --git a/spec/ruby/core/io/internal_encoding_spec.rb b/spec/ruby/core/io/internal_encoding_spec.rb
index a4f13fa100..772cdeeaaf 100644
--- a/spec/ruby/core/io/internal_encoding_spec.rb
+++ b/spec/ruby/core/io/internal_encoding_spec.rb
@@ -1,140 +1,138 @@
require_relative '../../spec_helper'
-with_feature :encoding do
- describe :io_internal_encoding, shared: true do
- describe "when Encoding.default_internal is not set" do
- before :each do
- Encoding.default_internal = nil
- end
-
- it "returns nil if the internal encoding is not set" do
- @io = new_io @name, @object
- @io.internal_encoding.should be_nil
- end
-
- it "returns nil if Encoding.default_internal is changed after the instance is created" do
- @io = new_io @name, @object
- Encoding.default_internal = Encoding::IBM437
- @io.internal_encoding.should be_nil
- end
-
- it "returns the value set when the instance was created" do
- @io = new_io @name, "#{@object}:utf-8:euc-jp"
- Encoding.default_internal = Encoding::IBM437
- @io.internal_encoding.should equal(Encoding::EUC_JP)
- end
-
- it "returns the value set by #set_encoding" do
- @io = new_io @name, @object
- @io.set_encoding(Encoding::US_ASCII, Encoding::IBM437)
- @io.internal_encoding.should equal(Encoding::IBM437)
- end
- end
-
- describe "when Encoding.default_internal == Encoding.default_external" do
- before :each do
- Encoding.default_external = Encoding::IBM866
- Encoding.default_internal = Encoding::IBM866
- end
-
- it "returns nil" do
- @io = new_io @name, @object
- @io.internal_encoding.should be_nil
- end
-
- it "returns nil regardless of Encoding.default_internal changes" do
- @io = new_io @name, @object
- Encoding.default_internal = Encoding::IBM437
- @io.internal_encoding.should be_nil
- end
- end
-
- describe "when Encoding.default_internal != Encoding.default_external" do
- before :each do
- Encoding.default_external = Encoding::IBM437
- Encoding.default_internal = Encoding::IBM866
- end
-
- it "returns the value of Encoding.default_internal when the instance was created if the internal encoding is not set" do
- @io = new_io @name, @object
- @io.internal_encoding.should equal(Encoding::IBM866)
- end
-
- it "does not change when Encoding.default_internal is changed" do
- @io = new_io @name, @object
- Encoding.default_internal = Encoding::IBM437
- @io.internal_encoding.should equal(Encoding::IBM866)
- end
-
- it "returns the internal encoding set when the instance was created" do
- @io = new_io @name, "#{@object}:utf-8:euc-jp"
- @io.internal_encoding.should equal(Encoding::EUC_JP)
- end
-
- it "does not change when set and Encoding.default_internal is changed" do
- @io = new_io @name, "#{@object}:utf-8:euc-jp"
- Encoding.default_internal = Encoding::IBM437
- @io.internal_encoding.should equal(Encoding::EUC_JP)
- end
-
- it "returns the value set by #set_encoding" do
- @io = new_io @name, @object
- @io.set_encoding(Encoding::US_ASCII, Encoding::IBM437)
- @io.internal_encoding.should equal(Encoding::IBM437)
- end
-
- it "returns nil when Encoding.default_external is ASCII-8BIT and the internal encoding is not set" do
- Encoding.default_external = Encoding::ASCII_8BIT
- @io = new_io @name, @object
- @io.internal_encoding.should be_nil
- end
-
- it "returns nil when the external encoding is ASCII-8BIT and the internal encoding is not set" do
- @io = new_io @name, "#{@object}:ascii-8bit"
- @io.internal_encoding.should be_nil
- end
+describe :io_internal_encoding, shared: true do
+ describe "when Encoding.default_internal is not set" do
+ before :each do
+ Encoding.default_internal = nil
+ end
+
+ it "returns nil if the internal encoding is not set" do
+ @io = new_io @name, @object
+ @io.internal_encoding.should be_nil
+ end
+
+ it "returns nil if Encoding.default_internal is changed after the instance is created" do
+ @io = new_io @name, @object
+ Encoding.default_internal = Encoding::IBM437
+ @io.internal_encoding.should be_nil
+ end
+
+ it "returns the value set when the instance was created" do
+ @io = new_io @name, "#{@object}:utf-8:euc-jp"
+ Encoding.default_internal = Encoding::IBM437
+ @io.internal_encoding.should equal(Encoding::EUC_JP)
+ end
+
+ it "returns the value set by #set_encoding" do
+ @io = new_io @name, @object
+ @io.set_encoding(Encoding::US_ASCII, Encoding::IBM437)
+ @io.internal_encoding.should equal(Encoding::IBM437)
end
end
- describe "IO#internal_encoding" do
+ describe "when Encoding.default_internal == Encoding.default_external" do
before :each do
- @external = Encoding.default_external
- @internal = Encoding.default_internal
+ Encoding.default_external = Encoding::IBM866
+ Encoding.default_internal = Encoding::IBM866
+ end
+
+ it "returns nil" do
+ @io = new_io @name, @object
+ @io.internal_encoding.should be_nil
+ end
- @name = tmp("io_internal_encoding")
- touch(@name)
+ it "returns nil regardless of Encoding.default_internal changes" do
+ @io = new_io @name, @object
+ Encoding.default_internal = Encoding::IBM437
+ @io.internal_encoding.should be_nil
end
+ end
- after :each do
- @io.close if @io
- rm_r @name
+ describe "when Encoding.default_internal != Encoding.default_external" do
+ before :each do
+ Encoding.default_external = Encoding::IBM437
+ Encoding.default_internal = Encoding::IBM866
+ end
- Encoding.default_external = @external
- Encoding.default_internal = @internal
+ it "returns the value of Encoding.default_internal when the instance was created if the internal encoding is not set" do
+ @io = new_io @name, @object
+ @io.internal_encoding.should equal(Encoding::IBM866)
end
- describe "with 'r' mode" do
- it_behaves_like :io_internal_encoding, nil, "r"
+ it "does not change when Encoding.default_internal is changed" do
+ @io = new_io @name, @object
+ Encoding.default_internal = Encoding::IBM437
+ @io.internal_encoding.should equal(Encoding::IBM866)
end
- describe "with 'r+' mode" do
- it_behaves_like :io_internal_encoding, nil, "r+"
+ it "returns the internal encoding set when the instance was created" do
+ @io = new_io @name, "#{@object}:utf-8:euc-jp"
+ @io.internal_encoding.should equal(Encoding::EUC_JP)
end
- describe "with 'w' mode" do
- it_behaves_like :io_internal_encoding, nil, "w"
+ it "does not change when set and Encoding.default_internal is changed" do
+ @io = new_io @name, "#{@object}:utf-8:euc-jp"
+ Encoding.default_internal = Encoding::IBM437
+ @io.internal_encoding.should equal(Encoding::EUC_JP)
end
- describe "with 'w+' mode" do
- it_behaves_like :io_internal_encoding, nil, "w+"
+ it "returns the value set by #set_encoding" do
+ @io = new_io @name, @object
+ @io.set_encoding(Encoding::US_ASCII, Encoding::IBM437)
+ @io.internal_encoding.should equal(Encoding::IBM437)
end
- describe "with 'a' mode" do
- it_behaves_like :io_internal_encoding, nil, "a"
+ it "returns nil when Encoding.default_external is ASCII-8BIT and the internal encoding is not set" do
+ Encoding.default_external = Encoding::ASCII_8BIT
+ @io = new_io @name, @object
+ @io.internal_encoding.should be_nil
end
- describe "with 'a+' mode" do
- it_behaves_like :io_internal_encoding, nil, "a+"
+ it "returns nil when the external encoding is ASCII-8BIT and the internal encoding is not set" do
+ @io = new_io @name, "#{@object}:ascii-8bit"
+ @io.internal_encoding.should be_nil
end
end
end
+
+describe "IO#internal_encoding" do
+ before :each do
+ @external = Encoding.default_external
+ @internal = Encoding.default_internal
+
+ @name = tmp("io_internal_encoding")
+ touch(@name)
+ end
+
+ after :each do
+ @io.close if @io
+ rm_r @name
+
+ Encoding.default_external = @external
+ Encoding.default_internal = @internal
+ end
+
+ describe "with 'r' mode" do
+ it_behaves_like :io_internal_encoding, nil, "r"
+ end
+
+ describe "with 'r+' mode" do
+ it_behaves_like :io_internal_encoding, nil, "r+"
+ end
+
+ describe "with 'w' mode" do
+ it_behaves_like :io_internal_encoding, nil, "w"
+ end
+
+ describe "with 'w+' mode" do
+ it_behaves_like :io_internal_encoding, nil, "w+"
+ end
+
+ describe "with 'a' mode" do
+ it_behaves_like :io_internal_encoding, nil, "a"
+ end
+
+ describe "with 'a+' mode" do
+ it_behaves_like :io_internal_encoding, nil, "a+"
+ end
+end
diff --git a/spec/ruby/core/io/popen_spec.rb b/spec/ruby/core/io/popen_spec.rb
index d15ac48fe4..289bb076e4 100644
--- a/spec/ruby/core/io/popen_spec.rb
+++ b/spec/ruby/core/io/popen_spec.rb
@@ -136,7 +136,7 @@ describe "IO.popen" do
end
end
- with_feature :fork do
+ platform_is_not :windows do
it "starts returns a forked process if the command is -" do
io = IO.popen("-")
@@ -153,22 +153,20 @@ describe "IO.popen" do
end
end
- with_feature :encoding do
- it "has the given external encoding" do
- @io = IO.popen(ruby_cmd('exit'), external_encoding: Encoding::EUC_JP)
- @io.external_encoding.should == Encoding::EUC_JP
- end
+ it "has the given external encoding" do
+ @io = IO.popen(ruby_cmd('exit'), external_encoding: Encoding::EUC_JP)
+ @io.external_encoding.should == Encoding::EUC_JP
+ end
- it "has the given internal encoding" do
- @io = IO.popen(ruby_cmd('exit'), internal_encoding: Encoding::EUC_JP)
- @io.internal_encoding.should == Encoding::EUC_JP
- end
+ it "has the given internal encoding" do
+ @io = IO.popen(ruby_cmd('exit'), internal_encoding: Encoding::EUC_JP)
+ @io.internal_encoding.should == Encoding::EUC_JP
+ end
- it "sets the internal encoding to nil if it's the same as the external encoding" do
- @io = IO.popen(ruby_cmd('exit'), external_encoding: Encoding::EUC_JP,
- internal_encoding: Encoding::EUC_JP)
- @io.internal_encoding.should be_nil
- end
+ it "sets the internal encoding to nil if it's the same as the external encoding" do
+ @io = IO.popen(ruby_cmd('exit'), external_encoding: Encoding::EUC_JP,
+ internal_encoding: Encoding::EUC_JP)
+ @io.internal_encoding.should be_nil
end
context "with a leading ENV Hash" do
diff --git a/spec/ruby/core/io/puts_spec.rb b/spec/ruby/core/io/puts_spec.rb
index e99cffb00f..e8d599730f 100644
--- a/spec/ruby/core/io/puts_spec.rb
+++ b/spec/ruby/core/io/puts_spec.rb
@@ -114,28 +114,26 @@ describe "IO#puts" do
lambda { IOSpecs.closed_io.puts("stuff") }.should raise_error(IOError)
end
- with_feature :encoding do
- it "writes crlf when IO is opened with newline: :crlf" do
- File.open(@name, 'wt', newline: :crlf) do |file|
- file.puts
- end
- File.binread(@name).should == "\r\n"
+ it "writes crlf when IO is opened with newline: :crlf" do
+ File.open(@name, 'wt', newline: :crlf) do |file|
+ file.puts
end
+ File.binread(@name).should == "\r\n"
+ end
- it "writes cr when IO is opened with newline: :cr" do
- File.open(@name, 'wt', newline: :cr) do |file|
- file.puts
- end
- File.binread(@name).should == "\r"
+ it "writes cr when IO is opened with newline: :cr" do
+ File.open(@name, 'wt', newline: :cr) do |file|
+ file.puts
end
+ File.binread(@name).should == "\r"
+ end
- platform_is_not :windows do # https://bugs.ruby-lang.org/issues/12436
- it "writes lf when IO is opened with newline: :lf" do
- File.open(@name, 'wt', newline: :lf) do |file|
- file.puts
- end
- File.binread(@name).should == "\n"
+ platform_is_not :windows do # https://bugs.ruby-lang.org/issues/12436
+ it "writes lf when IO is opened with newline: :lf" do
+ File.open(@name, 'wt', newline: :lf) do |file|
+ file.puts
end
+ File.binread(@name).should == "\n"
end
end
end
diff --git a/spec/ruby/core/io/read_spec.rb b/spec/ruby/core/io/read_spec.rb
index 6f6713d957..ccb341a1f9 100644
--- a/spec/ruby/core/io/read_spec.rb
+++ b/spec/ruby/core/io/read_spec.rb
@@ -95,16 +95,14 @@ describe "IO.read" do
lambda { IO.read @fname, -1, -1 }.should raise_error(Errno::EINVAL)
end
- with_feature :encoding do
- it "uses the external encoding specified via the :external_encoding option" do
- str = IO.read(@fname, external_encoding: Encoding::ISO_8859_1)
- str.encoding.should == Encoding::ISO_8859_1
- end
+ it "uses the external encoding specified via the :external_encoding option" do
+ str = IO.read(@fname, external_encoding: Encoding::ISO_8859_1)
+ str.encoding.should == Encoding::ISO_8859_1
+ end
- it "uses the external encoding specified via the :encoding option" do
- str = IO.read(@fname, encoding: Encoding::ISO_8859_1)
- str.encoding.should == Encoding::ISO_8859_1
- end
+ it "uses the external encoding specified via the :encoding option" do
+ str = IO.read(@fname, encoding: Encoding::ISO_8859_1)
+ str.encoding.should == Encoding::ISO_8859_1
end
end
@@ -117,7 +115,7 @@ describe "IO.read from a pipe" do
IO.read(cmd).should == "hello\n"
end
- with_feature :fork do
+ platform_is_not :windows do
it "opens a pipe to a fork if the rest is -" do
str = IO.read("|-")
if str # parent
@@ -456,135 +454,133 @@ describe "IO.read with BOM" do
end
end
-with_feature :encoding do
- describe :io_read_internal_encoding, shared: true do
- it "returns a transcoded String" do
- @io.read.should == "ありがとう\n"
+describe :io_read_internal_encoding, shared: true do
+ it "returns a transcoded String" do
+ @io.read.should == "ありがとう\n"
+ end
+
+ it "sets the String encoding to the internal encoding" do
+ @io.read.encoding.should equal(Encoding::UTF_8)
+ end
+
+ describe "when passed nil for limit" do
+ it "sets the buffer to a transcoded String" do
+ result = @io.read(nil, buf = "")
+ buf.should equal(result)
+ buf.should == "ありがとう\n"
end
- it "sets the String encoding to the internal encoding" do
- @io.read.encoding.should equal(Encoding::UTF_8)
+ it "sets the buffer's encoding to the internal encoding" do
+ buf = "".force_encoding Encoding::ISO_8859_1
+ @io.read(nil, buf)
+ buf.encoding.should equal(Encoding::UTF_8)
end
+ end
+end
- describe "when passed nil for limit" do
- it "sets the buffer to a transcoded String" do
- result = @io.read(nil, buf = "")
- buf.should equal(result)
- buf.should == "ありがとう\n"
- end
+describe :io_read_size_internal_encoding, shared: true do
+ it "reads bytes when passed a size" do
+ @io.read(2).should == [164, 162].pack('C*').force_encoding(Encoding::ASCII_8BIT)
+ end
- it "sets the buffer's encoding to the internal encoding" do
- buf = "".force_encoding Encoding::ISO_8859_1
- @io.read(nil, buf)
- buf.encoding.should equal(Encoding::UTF_8)
- end
- end
+ it "returns a String in ASCII-8BIT when passed a size" do
+ @io.read(4).encoding.should equal(Encoding::ASCII_8BIT)
end
- describe :io_read_size_internal_encoding, shared: true do
- it "reads bytes when passed a size" do
- @io.read(2).should == [164, 162].pack('C*').force_encoding(Encoding::ASCII_8BIT)
- end
+ it "does not change the buffer's encoding when passed a limit" do
+ buf = "".force_encoding Encoding::ISO_8859_1
+ @io.read(4, buf)
+ buf.should == [164, 162, 164, 234].pack('C*').force_encoding(Encoding::ISO_8859_1)
+ buf.encoding.should equal(Encoding::ISO_8859_1)
+ end
- it "returns a String in ASCII-8BIT when passed a size" do
- @io.read(4).encoding.should equal(Encoding::ASCII_8BIT)
- end
+ it "truncates the buffer but does not change the buffer's encoding when no data remains" do
+ buf = "abc".force_encoding Encoding::ISO_8859_1
+ @io.read
- it "does not change the buffer's encoding when passed a limit" do
- buf = "".force_encoding Encoding::ISO_8859_1
- @io.read(4, buf)
- buf.should == [164, 162, 164, 234].pack('C*').force_encoding(Encoding::ISO_8859_1)
- buf.encoding.should equal(Encoding::ISO_8859_1)
+ @io.read(1, buf).should be_nil
+ buf.size.should == 0
+ buf.encoding.should equal(Encoding::ISO_8859_1)
+ end
+end
+
+describe "IO#read" do
+ describe "when IO#external_encoding and IO#internal_encoding are nil" do
+ before :each do
+ @name = tmp("io_read.txt")
+ touch(@name) { |f| f.write "\x00\x01\x02" }
+ @io = new_io @name, "r+"
end
- it "truncates the buffer but does not change the buffer's encoding when no data remains" do
- buf = "abc".force_encoding Encoding::ISO_8859_1
- @io.read
+ after :each do
+ @io.close if @io
+ rm_r @name
+ end
- @io.read(1, buf).should be_nil
- buf.size.should == 0
- buf.encoding.should equal(Encoding::ISO_8859_1)
+ it "sets the String encoding to Encoding.default_external" do
+ @io.read.encoding.should equal(Encoding.default_external)
end
end
- describe "IO#read" do
- describe "when IO#external_encoding and IO#internal_encoding are nil" do
- before :each do
- @name = tmp("io_read.txt")
- touch(@name) { |f| f.write "\x00\x01\x02" }
- @io = new_io @name, "r+"
- end
+ describe "with internal encoding" do
+ after :each do
+ @io.close if @io
+ end
- after :each do
- @io.close if @io
- rm_r @name
+ describe "not specified" do
+ before :each do
+ @io = IOSpecs.io_fixture "read_euc_jp.txt", "r:euc-jp"
end
- it "sets the String encoding to Encoding.default_external" do
- @io.read.encoding.should equal(Encoding.default_external)
+ it "does not transcode the String" do
+ @io.read.should == ("ありがとう\n").encode(Encoding::EUC_JP)
end
- end
- describe "with internal encoding" do
- after :each do
- @io.close if @io
+ it "sets the String encoding to the external encoding" do
+ @io.read.encoding.should equal(Encoding::EUC_JP)
end
- describe "not specified" do
- before :each do
- @io = IOSpecs.io_fixture "read_euc_jp.txt", "r:euc-jp"
- end
-
- it "does not transcode the String" do
- @io.read.should == ("ありがとう\n").encode(Encoding::EUC_JP)
- end
-
- it "sets the String encoding to the external encoding" do
- @io.read.encoding.should equal(Encoding::EUC_JP)
- end
+ it_behaves_like :io_read_size_internal_encoding, nil
+ end
- it_behaves_like :io_read_size_internal_encoding, nil
+ describe "specified by open mode" do
+ before :each do
+ @io = IOSpecs.io_fixture "read_euc_jp.txt", "r:euc-jp:utf-8"
end
- describe "specified by open mode" do
- before :each do
- @io = IOSpecs.io_fixture "read_euc_jp.txt", "r:euc-jp:utf-8"
- end
+ it_behaves_like :io_read_internal_encoding, nil
+ it_behaves_like :io_read_size_internal_encoding, nil
+ end
- it_behaves_like :io_read_internal_encoding, nil
- it_behaves_like :io_read_size_internal_encoding, nil
+ describe "specified by mode: option" do
+ before :each do
+ @io = IOSpecs.io_fixture "read_euc_jp.txt", mode: "r:euc-jp:utf-8"
end
- describe "specified by mode: option" do
- before :each do
- @io = IOSpecs.io_fixture "read_euc_jp.txt", mode: "r:euc-jp:utf-8"
- end
+ it_behaves_like :io_read_internal_encoding, nil
+ it_behaves_like :io_read_size_internal_encoding, nil
+ end
- it_behaves_like :io_read_internal_encoding, nil
- it_behaves_like :io_read_size_internal_encoding, nil
+ describe "specified by internal_encoding: option" do
+ before :each do
+ options = { mode: "r",
+ internal_encoding: "utf-8",
+ external_encoding: "euc-jp" }
+ @io = IOSpecs.io_fixture "read_euc_jp.txt", options
end
- describe "specified by internal_encoding: option" do
- before :each do
- options = { mode: "r",
- internal_encoding: "utf-8",
- external_encoding: "euc-jp" }
- @io = IOSpecs.io_fixture "read_euc_jp.txt", options
- end
+ it_behaves_like :io_read_internal_encoding, nil
+ it_behaves_like :io_read_size_internal_encoding, nil
+ end
- it_behaves_like :io_read_internal_encoding, nil
- it_behaves_like :io_read_size_internal_encoding, nil
+ describe "specified by encoding: option" do
+ before :each do
+ options = { mode: "r", encoding: "euc-jp:utf-8" }
+ @io = IOSpecs.io_fixture "read_euc_jp.txt", options
end
- describe "specified by encoding: option" do
- before :each do
- options = { mode: "r", encoding: "euc-jp:utf-8" }
- @io = IOSpecs.io_fixture "read_euc_jp.txt", options
- end
-
- it_behaves_like :io_read_internal_encoding, nil
- it_behaves_like :io_read_size_internal_encoding, nil
- end
+ it_behaves_like :io_read_internal_encoding, nil
+ it_behaves_like :io_read_size_internal_encoding, nil
end
end
end
diff --git a/spec/ruby/core/io/readlines_spec.rb b/spec/ruby/core/io/readlines_spec.rb
index c1ea706b26..9e145f12f4 100644
--- a/spec/ruby/core/io/readlines_spec.rb
+++ b/spec/ruby/core/io/readlines_spec.rb
@@ -112,7 +112,7 @@ describe "IO#readlines" do
lines.should == ["hello\n", "line2\n"]
end
- with_feature :fork do
+ platform_is_not :windows do
it "gets data from a fork when passed -" do
lines = IO.readlines("|-")
@@ -139,13 +139,13 @@ describe "IO#readlines" do
it "raises an IOError if the stream is opened for append only" do
lambda do
- File.open(@name, fmode("a:utf-8")) { |f| f.readlines }
+ File.open(@name, "a:utf-8") { |f| f.readlines }
end.should raise_error(IOError)
end
it "raises an IOError if the stream is opened for write only" do
lambda do
- File.open(@name, fmode("w:utf-8")) { |f| f.readlines }
+ File.open(@name, "w:utf-8") { |f| f.readlines }
end.should raise_error(IOError)
end
end
diff --git a/spec/ruby/core/io/reopen_spec.rb b/spec/ruby/core/io/reopen_spec.rb
index 53fcc9dede..84c23472b7 100644
--- a/spec/ruby/core/io/reopen_spec.rb
+++ b/spec/ruby/core/io/reopen_spec.rb
@@ -145,23 +145,6 @@ describe "IO#reopen with a String" do
File.read(@other_name).should == "new data"
end
- # File descriptor numbers are not predictable in multi-threaded code;
- # MJIT will be opening/closing files the background
- without_feature :mjit do
- it "closes the file descriptor obtained by opening the new file" do
- @io = new_io @name, "w"
-
- @other_io = File.open @other_name, "w"
- max = @other_io.fileno
- @other_io.close
-
- @io.reopen @other_name
-
- @other_io = File.open @other_name, "w"
- @other_io.fileno.should == max
- end
- end
-
it "always resets the close-on-exec flag to true on non-STDIO objects" do
@io = new_io @name, "w"
diff --git a/spec/ruby/core/io/set_encoding_spec.rb b/spec/ruby/core/io/set_encoding_spec.rb
index 9875d64ab8..a9d783325c 100644
--- a/spec/ruby/core/io/set_encoding_spec.rb
+++ b/spec/ruby/core/io/set_encoding_spec.rb
@@ -1,193 +1,191 @@
require_relative '../../spec_helper'
-with_feature :encoding do
- describe :io_set_encoding_write, shared: true do
- it "sets the encodings to nil" do
- @io = new_io @name, "#{@object}:ibm437:ibm866"
- @io.set_encoding nil, nil
+describe :io_set_encoding_write, shared: true do
+ it "sets the encodings to nil" do
+ @io = new_io @name, "#{@object}:ibm437:ibm866"
+ @io.set_encoding nil, nil
- @io.external_encoding.should be_nil
- @io.internal_encoding.should be_nil
- end
+ @io.external_encoding.should be_nil
+ @io.internal_encoding.should be_nil
+ end
- it "prevents the encodings from changing when Encoding defaults are changed" do
- @io = new_io @name, "#{@object}:utf-8:us-ascii"
- @io.set_encoding nil, nil
+ it "prevents the encodings from changing when Encoding defaults are changed" do
+ @io = new_io @name, "#{@object}:utf-8:us-ascii"
+ @io.set_encoding nil, nil
- Encoding.default_external = Encoding::IBM437
- Encoding.default_internal = Encoding::IBM866
+ Encoding.default_external = Encoding::IBM437
+ Encoding.default_internal = Encoding::IBM866
- @io.external_encoding.should be_nil
- @io.internal_encoding.should be_nil
- end
+ @io.external_encoding.should be_nil
+ @io.internal_encoding.should be_nil
+ end
- it "sets the encodings to the current Encoding defaults" do
- @io = new_io @name, @object
+ it "sets the encodings to the current Encoding defaults" do
+ @io = new_io @name, @object
- Encoding.default_external = Encoding::IBM437
- Encoding.default_internal = Encoding::IBM866
+ Encoding.default_external = Encoding::IBM437
+ Encoding.default_internal = Encoding::IBM866
- @io.set_encoding nil, nil
+ @io.set_encoding nil, nil
- @io.external_encoding.should == Encoding::IBM437
- @io.internal_encoding.should == Encoding::IBM866
- end
+ @io.external_encoding.should == Encoding::IBM437
+ @io.internal_encoding.should == Encoding::IBM866
end
+end
- describe "IO#set_encoding when passed nil, nil" do
- before :each do
- @external = Encoding.default_external
- @internal = Encoding.default_internal
+describe "IO#set_encoding when passed nil, nil" do
+ before :each do
+ @external = Encoding.default_external
+ @internal = Encoding.default_internal
- Encoding.default_external = Encoding::UTF_8
- Encoding.default_internal = nil
+ Encoding.default_external = Encoding::UTF_8
+ Encoding.default_internal = nil
- @name = tmp('io_set_encoding.txt')
- touch(@name)
- end
+ @name = tmp('io_set_encoding.txt')
+ touch(@name)
+ end
- after :each do
- Encoding.default_external = @external
- Encoding.default_internal = @internal
+ after :each do
+ Encoding.default_external = @external
+ Encoding.default_internal = @internal
- @io.close if @io and not @io.closed?
- rm_r @name
- end
+ @io.close if @io and not @io.closed?
+ rm_r @name
+ end
- describe "with 'r' mode" do
- it "sets the encodings to the current Encoding defaults" do
- @io = new_io @name, "r"
+ describe "with 'r' mode" do
+ it "sets the encodings to the current Encoding defaults" do
+ @io = new_io @name, "r"
- Encoding.default_external = Encoding::IBM437
- Encoding.default_internal = Encoding::IBM866
+ Encoding.default_external = Encoding::IBM437
+ Encoding.default_internal = Encoding::IBM866
- @io.set_encoding nil, nil
- @io.external_encoding.should equal(Encoding::IBM437)
- @io.internal_encoding.should equal(Encoding::IBM866)
- end
+ @io.set_encoding nil, nil
+ @io.external_encoding.should equal(Encoding::IBM437)
+ @io.internal_encoding.should equal(Encoding::IBM866)
+ end
- it "prevents the #internal_encoding from changing when Encoding.default_internal is changed" do
- @io = new_io @name, "r"
- @io.set_encoding nil, nil
+ it "prevents the #internal_encoding from changing when Encoding.default_internal is changed" do
+ @io = new_io @name, "r"
+ @io.set_encoding nil, nil
- Encoding.default_internal = Encoding::IBM437
+ Encoding.default_internal = Encoding::IBM437
- @io.internal_encoding.should be_nil
- end
+ @io.internal_encoding.should be_nil
+ end
- it "allows the #external_encoding to change when Encoding.default_external is changed" do
- @io = new_io @name, "r"
- @io.set_encoding nil, nil
+ it "allows the #external_encoding to change when Encoding.default_external is changed" do
+ @io = new_io @name, "r"
+ @io.set_encoding nil, nil
- Encoding.default_external = Encoding::IBM437
+ Encoding.default_external = Encoding::IBM437
- @io.external_encoding.should equal(Encoding::IBM437)
- end
+ @io.external_encoding.should equal(Encoding::IBM437)
end
+ end
- describe "with 'rb' mode" do
- it "returns Encoding.default_external" do
- @io = new_io @name, "rb"
- @io.external_encoding.should equal(Encoding::ASCII_8BIT)
+ describe "with 'rb' mode" do
+ it "returns Encoding.default_external" do
+ @io = new_io @name, "rb"
+ @io.external_encoding.should equal(Encoding::ASCII_8BIT)
- @io.set_encoding nil, nil
- @io.external_encoding.should equal(Encoding.default_external)
- end
+ @io.set_encoding nil, nil
+ @io.external_encoding.should equal(Encoding.default_external)
end
+ end
- describe "with 'r+' mode" do
- it_behaves_like :io_set_encoding_write, nil, "r+"
- end
+ describe "with 'r+' mode" do
+ it_behaves_like :io_set_encoding_write, nil, "r+"
+ end
- describe "with 'w' mode" do
- it_behaves_like :io_set_encoding_write, nil, "w"
- end
+ describe "with 'w' mode" do
+ it_behaves_like :io_set_encoding_write, nil, "w"
+ end
- describe "with 'w+' mode" do
- it_behaves_like :io_set_encoding_write, nil, "w+"
- end
+ describe "with 'w+' mode" do
+ it_behaves_like :io_set_encoding_write, nil, "w+"
+ end
- describe "with 'a' mode" do
- it_behaves_like :io_set_encoding_write, nil, "a"
- end
+ describe "with 'a' mode" do
+ it_behaves_like :io_set_encoding_write, nil, "a"
+ end
- describe "with 'a+' mode" do
- it_behaves_like :io_set_encoding_write, nil, "a+"
- end
+ describe "with 'a+' mode" do
+ it_behaves_like :io_set_encoding_write, nil, "a+"
end
+end
- describe "IO#set_encoding" do
- before :each do
- @name = tmp('io_set_encoding.txt')
- touch(@name)
- @io = new_io @name
- end
+describe "IO#set_encoding" do
+ before :each do
+ @name = tmp('io_set_encoding.txt')
+ touch(@name)
+ @io = new_io @name
+ end
- after :each do
- @io.close unless @io.closed?
- rm_r @name
- end
+ after :each do
+ @io.close unless @io.closed?
+ rm_r @name
+ end
- it "returns self" do
- @io.set_encoding(Encoding::UTF_8).should equal(@io)
- end
+ it "returns self" do
+ @io.set_encoding(Encoding::UTF_8).should equal(@io)
+ end
- it "sets the external encoding when passed an Encoding argument" do
- @io.set_encoding(Encoding::UTF_8)
- @io.external_encoding.should == Encoding::UTF_8
- @io.internal_encoding.should be_nil
- end
+ it "sets the external encoding when passed an Encoding argument" do
+ @io.set_encoding(Encoding::UTF_8)
+ @io.external_encoding.should == Encoding::UTF_8
+ @io.internal_encoding.should be_nil
+ end
- it "sets the external and internal encoding when passed two Encoding arguments" do
- @io.set_encoding(Encoding::UTF_8, Encoding::UTF_16BE)
- @io.external_encoding.should == Encoding::UTF_8
- @io.internal_encoding.should == Encoding::UTF_16BE
- end
+ it "sets the external and internal encoding when passed two Encoding arguments" do
+ @io.set_encoding(Encoding::UTF_8, Encoding::UTF_16BE)
+ @io.external_encoding.should == Encoding::UTF_8
+ @io.internal_encoding.should == Encoding::UTF_16BE
+ end
- it "sets the external encoding when passed the name of an Encoding" do
- @io.set_encoding("utf-8")
- @io.external_encoding.should == Encoding::UTF_8
- @io.internal_encoding.should be_nil
- end
+ it "sets the external encoding when passed the name of an Encoding" do
+ @io.set_encoding("utf-8")
+ @io.external_encoding.should == Encoding::UTF_8
+ @io.internal_encoding.should be_nil
+ end
- it "ignores the internal encoding if the same as external when passed Encoding objects" do
- @io.set_encoding(Encoding::UTF_8, Encoding::UTF_8)
- @io.external_encoding.should == Encoding::UTF_8
- @io.internal_encoding.should be_nil
- end
+ it "ignores the internal encoding if the same as external when passed Encoding objects" do
+ @io.set_encoding(Encoding::UTF_8, Encoding::UTF_8)
+ @io.external_encoding.should == Encoding::UTF_8
+ @io.internal_encoding.should be_nil
+ end
- it "ignores the internal encoding if the same as external when passed encoding names separated by ':'" do
- @io.set_encoding("utf-8:utf-8")
- @io.external_encoding.should == Encoding::UTF_8
- @io.internal_encoding.should be_nil
- end
+ it "ignores the internal encoding if the same as external when passed encoding names separated by ':'" do
+ @io.set_encoding("utf-8:utf-8")
+ @io.external_encoding.should == Encoding::UTF_8
+ @io.internal_encoding.should be_nil
+ end
- it "sets the external and internal encoding when passed the names of Encodings separated by ':'" do
- @io.set_encoding("utf-8:utf-16be")
- @io.external_encoding.should == Encoding::UTF_8
- @io.internal_encoding.should == Encoding::UTF_16BE
- end
+ it "sets the external and internal encoding when passed the names of Encodings separated by ':'" do
+ @io.set_encoding("utf-8:utf-16be")
+ @io.external_encoding.should == Encoding::UTF_8
+ @io.internal_encoding.should == Encoding::UTF_16BE
+ end
- it "sets the external and internal encoding when passed two String arguments" do
- @io.set_encoding("utf-8", "utf-16be")
- @io.external_encoding.should == Encoding::UTF_8
- @io.internal_encoding.should == Encoding::UTF_16BE
- end
+ it "sets the external and internal encoding when passed two String arguments" do
+ @io.set_encoding("utf-8", "utf-16be")
+ @io.external_encoding.should == Encoding::UTF_8
+ @io.internal_encoding.should == Encoding::UTF_16BE
+ end
- it "calls #to_str to convert an abject to a String" do
- obj = mock("io_set_encoding")
- obj.should_receive(:to_str).and_return("utf-8:utf-16be")
- @io.set_encoding(obj)
- @io.external_encoding.should == Encoding::UTF_8
- @io.internal_encoding.should == Encoding::UTF_16BE
- end
+ it "calls #to_str to convert an abject to a String" do
+ obj = mock("io_set_encoding")
+ obj.should_receive(:to_str).and_return("utf-8:utf-16be")
+ @io.set_encoding(obj)
+ @io.external_encoding.should == Encoding::UTF_8
+ @io.internal_encoding.should == Encoding::UTF_16BE
+ end
- it "calls #to_str to convert the second argument to a String" do
- obj = mock("io_set_encoding")
- obj.should_receive(:to_str).at_least(1).times.and_return("utf-16be")
- @io.set_encoding(Encoding::UTF_8, obj)
- @io.external_encoding.should == Encoding::UTF_8
- @io.internal_encoding.should == Encoding::UTF_16BE
- end
+ it "calls #to_str to convert the second argument to a String" do
+ obj = mock("io_set_encoding")
+ obj.should_receive(:to_str).at_least(1).times.and_return("utf-16be")
+ @io.set_encoding(Encoding::UTF_8, obj)
+ @io.external_encoding.should == Encoding::UTF_8
+ @io.internal_encoding.should == Encoding::UTF_16BE
end
end
diff --git a/spec/ruby/core/io/shared/write.rb b/spec/ruby/core/io/shared/write.rb
index 3cd4f8954e..aa6b3eedeb 100644
--- a/spec/ruby/core/io/shared/write.rb
+++ b/spec/ruby/core/io/shared/write.rb
@@ -85,7 +85,11 @@ describe :io_write, shared: true do
@r.read.should == "foo"
end
- without_feature :mjit do # [ruby-core:90895] MJIT worker may leave fd open in a forked child. TODO: consider acquiring GVL from MJIT worker.
+ # [ruby-core:90895] MJIT worker may leave fd open in a forked child.
+ # For instance, MJIT creates a worker before @r.close with fork(), @r.close happens,
+ # and the MJIT worker keeps the pipe open until the worker execve().
+ # TODO: consider acquiring GVL from MJIT worker.
+ guard_not -> { defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled? } do
it "raises Errno::EPIPE if the read end is closed and does not die from SIGPIPE" do
@r.close
-> { @w.send(@method, "foo") }.should raise_error(Errno::EPIPE, /Broken pipe/)
diff --git a/spec/ruby/core/io/write_spec.rb b/spec/ruby/core/io/write_spec.rb
index 50e3df864d..5fb3941505 100644
--- a/spec/ruby/core/io/write_spec.rb
+++ b/spec/ruby/core/io/write_spec.rb
@@ -28,51 +28,49 @@ describe "IO#write on a file" do
@file.write('').should == 0
end
- with_feature :encoding do
- before :each do
- @external = Encoding.default_external
- @internal = Encoding.default_internal
+ before :each do
+ @external = Encoding.default_external
+ @internal = Encoding.default_internal
- Encoding.default_external = Encoding::UTF_8
- end
+ Encoding.default_external = Encoding::UTF_8
+ end
- after :each do
- Encoding.default_external = @external
- Encoding.default_internal = @internal
- end
+ after :each do
+ Encoding.default_external = @external
+ Encoding.default_internal = @internal
+ end
- it "returns the number of bytes written" do
- @file.write("hellø").should == 6
- end
+ it "returns the number of bytes written" do
+ @file.write("hellø").should == 6
+ end
- it "uses the encoding from the given option for non-ascii encoding" do
- File.open(@filename, "w", encoding: Encoding::UTF_32LE) do |file|
- file.write("hi").should == 8
- end
- File.binread(@filename).should == "h\u0000\u0000\u0000i\u0000\u0000\u0000"
+ it "uses the encoding from the given option for non-ascii encoding" do
+ File.open(@filename, "w", encoding: Encoding::UTF_32LE) do |file|
+ file.write("hi").should == 8
end
+ File.binread(@filename).should == "h\u0000\u0000\u0000i\u0000\u0000\u0000"
+ end
- it "uses an :open_args option" do
- IO.write(@filename, 'hi', open_args: ["w", nil, {encoding: Encoding::UTF_32LE}]).should == 8
- end
+ it "uses an :open_args option" do
+ IO.write(@filename, 'hi', open_args: ["w", nil, {encoding: Encoding::UTF_32LE}]).should == 8
+ end
- it "raises a invalid byte sequence error if invalid bytes are being written" do
- # pack "\xFEhi" to avoid utf-8 conflict
- xFEhi = ([254].pack('C*') + 'hi').force_encoding('utf-8')
- File.open(@filename, "w", encoding: Encoding::US_ASCII) do |file|
- lambda { file.write(xFEhi) }.should raise_error(Encoding::InvalidByteSequenceError)
- end
+ it "raises a invalid byte sequence error if invalid bytes are being written" do
+ # pack "\xFEhi" to avoid utf-8 conflict
+ xFEhi = ([254].pack('C*') + 'hi').force_encoding('utf-8')
+ File.open(@filename, "w", encoding: Encoding::US_ASCII) do |file|
+ lambda { file.write(xFEhi) }.should raise_error(Encoding::InvalidByteSequenceError)
end
+ end
- it "writes binary data if no encoding is given" do
- File.open(@filename, "w") do |file|
- file.write('Hëllö'.encode('ISO-8859-1'))
- end
- ë = ([235].pack('U')).encode('ISO-8859-1')
- ö = ([246].pack('U')).encode('ISO-8859-1')
- res = "H#{ë}ll#{ö}"
- File.binread(@filename).should == res.force_encoding(Encoding::ASCII_8BIT)
+ it "writes binary data if no encoding is given" do
+ File.open(@filename, "w") do |file|
+ file.write('Hëllö'.encode('ISO-8859-1'))
end
+ ë = ([235].pack('U')).encode('ISO-8859-1')
+ ö = ([246].pack('U')).encode('ISO-8859-1')
+ res = "H#{ë}ll#{ö}"
+ File.binread(@filename).should == res.force_encoding(Encoding::ASCII_8BIT)
end
end