diff options
author | Benoit Daloze <eregontp@gmail.com> | 2019-04-28 23:20:11 +0200 |
---|---|---|
committer | Benoit Daloze <eregontp@gmail.com> | 2019-04-28 23:20:11 +0200 |
commit | 79671ec57e59091260a0bc3d40a31d31d9c72a94 (patch) | |
tree | 2f59a8727b8f63f9e79d50352fa4f78a7cc00234 /spec/ruby/core/io | |
parent | 994833085ae06afbe94d30ab183d80e0234fbe14 (diff) |
Update to ruby/spec@7de852d
Diffstat (limited to 'spec/ruby/core/io')
-rw-r--r-- | spec/ruby/core/io/external_encoding_spec.rb | 302 | ||||
-rw-r--r-- | spec/ruby/core/io/fixtures/classes.rb | 4 | ||||
-rw-r--r-- | spec/ruby/core/io/foreach_spec.rb | 2 | ||||
-rw-r--r-- | spec/ruby/core/io/gets_spec.rb | 8 | ||||
-rw-r--r-- | spec/ruby/core/io/initialize_spec.rb | 32 | ||||
-rw-r--r-- | spec/ruby/core/io/internal_encoding_spec.rb | 228 | ||||
-rw-r--r-- | spec/ruby/core/io/popen_spec.rb | 28 | ||||
-rw-r--r-- | spec/ruby/core/io/puts_spec.rb | 32 | ||||
-rw-r--r-- | spec/ruby/core/io/read_spec.rb | 206 | ||||
-rw-r--r-- | spec/ruby/core/io/readlines_spec.rb | 6 | ||||
-rw-r--r-- | spec/ruby/core/io/reopen_spec.rb | 17 | ||||
-rw-r--r-- | spec/ruby/core/io/set_encoding_spec.rb | 286 | ||||
-rw-r--r-- | spec/ruby/core/io/shared/write.rb | 6 | ||||
-rw-r--r-- | spec/ruby/core/io/write_spec.rb | 68 |
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 |