diff options
-rw-r--r-- | io.c | 2 | ||||
-rw-r--r-- | test/ruby/test_io.rb | 72 |
2 files changed, 45 insertions, 29 deletions
@@ -10313,7 +10313,7 @@ rb_io_s_pipe(int argc, VALUE *argv, VALUE klass) extract_binmode(opt, &fmode); - if (fmode & FMODE_BINMODE) { + if ((fmode & FMODE_BINMODE) && v1 == Qnil) { rb_io_ascii8bit_binmode(r); rb_io_ascii8bit_binmode(w); } diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb index e633e1c600..8c57ad35c1 100644 --- a/test/ruby/test_io.rb +++ b/test/ruby/test_io.rb @@ -113,35 +113,51 @@ class TestIO < Test::Unit::TestCase ].each{|thr| thr.join} end - def test_binmode_writer + def test_binmode_pipe EnvUtil.with_default_internal(Encoding::UTF_8) do - reader, writer = IO.pipe - reader.binmode - writer.binmode - - reader2, writer2 = IO.pipe(binmode: true) - - assert writer.binmode? - assert writer2.binmode? - assert_equal writer.binmode?, writer2.binmode? - assert_equal writer.external_encoding, writer2.external_encoding - assert_equal writer.internal_encoding, writer2.internal_encoding - end - end - - def test_binmode_reader - EnvUtil.with_default_internal(Encoding::UTF_8) do - reader, writer = IO.pipe - reader.binmode - writer.binmode - - reader2, writer2 = IO.pipe(binmode: true) - - assert reader.binmode? - assert reader2.binmode? - assert_equal reader.binmode?, reader2.binmode? - assert_equal reader.external_encoding, reader2.external_encoding - assert_equal reader.internal_encoding, reader2.internal_encoding + EnvUtil.with_default_external(Encoding::UTF_8) do + reader, writer = IO.pipe + reader.binmode + writer.binmode + + reader1, writer1 = IO.pipe + + reader2, writer2 = IO.pipe(binmode: true) + assert_predicate writer, :binmode? + assert_predicate writer2, :binmode? + assert_equal writer.binmode?, writer2.binmode? + assert_equal writer.external_encoding, writer2.external_encoding + assert_equal writer.internal_encoding, writer2.internal_encoding + assert_predicate reader, :binmode? + assert_predicate reader2, :binmode? + assert_equal reader.binmode?, reader2.binmode? + assert_equal reader.external_encoding, reader2.external_encoding + assert_equal reader.internal_encoding, reader2.internal_encoding + + reader3, writer3 = IO.pipe("UTF-8:UTF-8", binmode: true) + assert_predicate writer3, :binmode? + assert_equal writer1.external_encoding, writer3.external_encoding + assert_equal writer1.internal_encoding, writer3.internal_encoding + assert_predicate reader3, :binmode? + assert_equal reader1.external_encoding, reader3.external_encoding + assert_equal reader1.internal_encoding, reader3.internal_encoding + + reader4, writer4 = IO.pipe("UTF-8:UTF-8", binmode: true) + assert_predicate writer4, :binmode? + assert_equal writer1.external_encoding, writer4.external_encoding + assert_equal writer1.internal_encoding, writer4.internal_encoding + assert_predicate reader4, :binmode? + assert_equal reader1.external_encoding, reader4.external_encoding + assert_equal reader1.internal_encoding, reader4.internal_encoding + + reader5, writer5 = IO.pipe("UTF-8", "UTF-8", binmode: true) + assert_predicate writer5, :binmode? + assert_equal writer1.external_encoding, writer5.external_encoding + assert_equal writer1.internal_encoding, writer5.internal_encoding + assert_predicate reader5, :binmode? + assert_equal reader1.external_encoding, reader5.external_encoding + assert_equal reader1.internal_encoding, reader5.internal_encoding + end end end |