From 774c93390cfa5af0675b398b308f90cd692b4af6 Mon Sep 17 00:00:00 2001 From: Jakub Jirutka Date: Mon, 26 Mar 2018 02:20:06 +0200 Subject: [PATCH] Disable specs using GB2312 encoding on musl Musl libc does not support GB2312 encoding. Fixes #3976 Upstream-Issue: https://github.com/crystal-lang/crystal/pull/5867 --- spec/std/io/buffered_spec.cr | 19 ++++--- spec/std/io/io_spec.cr | 133 +++++++++++++++++++++++-------------------- spec/std/string_spec.cr | 41 ++++++------- 3 files changed, 104 insertions(+), 89 deletions(-) diff --git a/spec/std/io/buffered_spec.cr b/spec/std/io/buffered_spec.cr index 1e4d4a473f..6e34c994ea 100644 --- a/spec/std/io/buffered_spec.cr +++ b/spec/std/io/buffered_spec.cr @@ -374,15 +374,18 @@ describe "IO::Buffered" do end end - it "gets big GB2312 string" do - str = ("你好我是人\n" * 1000).encode("GB2312") - base_io = IO::Memory.new(str) - io = BufferedWrapper.new(base_io) - io.set_encoding("GB2312") - 1000.times do - io.gets(chomp: false).should eq("你好我是人\n") + # Musl does not support GB2312 encoding. + {% unless flag?(:musl) %} + it "gets big GB2312 string" do + str = ("你好我是人\n" * 1000).encode("GB2312") + base_io = IO::Memory.new(str) + io = BufferedWrapper.new(base_io) + io.set_encoding("GB2312") + 1000.times do + io.gets(chomp: false).should eq("你好我是人\n") + end end - end + {% end %} it "reads char" do str = "x\nHello world" + ("1234567890" * 1000) diff --git a/spec/std/io/io_spec.cr b/spec/std/io/io_spec.cr index 01e829c800..946bfa70ac 100644 --- a/spec/std/io/io_spec.cr +++ b/spec/std/io/io_spec.cr @@ -550,16 +550,19 @@ describe IO do end end - it "gets big GB2312 string" do - 2.times do - str = ("你好我是人\n" * 1000).encode("GB2312") - io = SimpleIOMemory.new(str) - io.set_encoding("GB2312") - 1000.times do - io.gets.should eq("你好我是人") + # Musl does not support GB2312 encoding. + {% unless flag?(:musl) %} + it "gets big GB2312 string" do + 2.times do + str = ("你好我是人\n" * 1000).encode("GB2312") + io = SimpleIOMemory.new(str) + io.set_encoding("GB2312") + 1000.times do + io.gets.should eq("你好我是人") + end end end - end + {% end %} it "does gets on unicode with char and limit without off-by-one" do io = SimpleIOMemory.new("test\nabc".encode("UCS-2LE")) @@ -635,51 +638,54 @@ describe IO do io.read_utf8_byte.should be_nil end - it "reads utf8" do - io = IO::Memory.new("你".encode("GB2312")) - io.set_encoding("GB2312") + # Musl does not support GB2312 encoding. + {% unless flag?(:musl) %} + it "reads utf8" do + io = IO::Memory.new("你".encode("GB2312")) + io.set_encoding("GB2312") - buffer = uninitialized UInt8[1024] - bytes_read = io.read_utf8(buffer.to_slice) # => 3 - bytes_read.should eq(3) - buffer.to_slice[0, bytes_read].to_a.should eq("你".bytes) - end + buffer = uninitialized UInt8[1024] + bytes_read = io.read_utf8(buffer.to_slice) # => 3 + bytes_read.should eq(3) + buffer.to_slice[0, bytes_read].to_a.should eq("你".bytes) + end - it "raises on incomplete byte sequence" do - io = SimpleIOMemory.new("好".byte_slice(0, 1)) - io.set_encoding("GB2312") - expect_raises ArgumentError, "Incomplete multibyte sequence" do - io.read_char + it "raises on incomplete byte sequence" do + io = SimpleIOMemory.new("好".byte_slice(0, 1)) + io.set_encoding("GB2312") + expect_raises ArgumentError, "Incomplete multibyte sequence" do + io.read_char + end end - end - it "says invalid byte sequence" do - io = SimpleIOMemory.new(Slice.new(1, 140_u8)) - io.set_encoding("GB2312") - expect_raises ArgumentError, "Invalid multibyte sequence" do - io.read_char + it "says invalid byte sequence" do + io = SimpleIOMemory.new(Slice.new(1, 140_u8)) + io.set_encoding("GB2312") + expect_raises ArgumentError, "Invalid multibyte sequence" do + io.read_char + end end - end - it "skips invalid byte sequences" do - string = String.build do |str| - str.write "好".encode("GB2312") - str.write_byte 140_u8 - str.write "是".encode("GB2312") + it "skips invalid byte sequences" do + string = String.build do |str| + str.write "好".encode("GB2312") + str.write_byte 140_u8 + str.write "是".encode("GB2312") + end + io = SimpleIOMemory.new(string) + io.set_encoding("GB2312", invalid: :skip) + io.read_char.should eq('好') + io.read_char.should eq('是') + io.read_char.should be_nil end - io = SimpleIOMemory.new(string) - io.set_encoding("GB2312", invalid: :skip) - io.read_char.should eq('好') - io.read_char.should eq('是') - io.read_char.should be_nil - end - it "says invalid 'invalid' option" do - io = SimpleIOMemory.new - expect_raises ArgumentError, "Valid values for `invalid` option are `nil` and `:skip`, not :foo" do - io.set_encoding("GB2312", invalid: :foo) + it "says invalid 'invalid' option" do + io = SimpleIOMemory.new + expect_raises ArgumentError, "Valid values for `invalid` option are `nil` and `:skip`, not :foo" do + io.set_encoding("GB2312", invalid: :foo) + end end - end + {% end %} it "says invalid encoding" do io = SimpleIOMemory.new("foo") @@ -803,28 +809,31 @@ describe IO do slice.should eq("hi-123-45.67".encode("UCS-2LE")) end - it "raises on invalid byte sequence" do - io = SimpleIOMemory.new - io.set_encoding("GB2312") - expect_raises ArgumentError, "Invalid multibyte sequence" do - io.print "ñ" + # Musl does not support GB2312 encoding. + {% unless flag?(:musl) %} + it "raises on invalid byte sequence" do + io = SimpleIOMemory.new + io.set_encoding("GB2312") + expect_raises ArgumentError, "Invalid multibyte sequence" do + io.print "ñ" + end end - end - it "skips on invalid byte sequence" do - io = SimpleIOMemory.new - io.set_encoding("GB2312", invalid: :skip) - io.print "ñ" - io.print "foo" - end + it "skips on invalid byte sequence" do + io = SimpleIOMemory.new + io.set_encoding("GB2312", invalid: :skip) + io.print "ñ" + io.print "foo" + end - it "raises on incomplete byte sequence" do - io = SimpleIOMemory.new - io.set_encoding("GB2312") - expect_raises ArgumentError, "Incomplete multibyte sequence" do - io.print "好".byte_slice(0, 1) + it "raises on incomplete byte sequence" do + io = SimpleIOMemory.new + io.set_encoding("GB2312") + expect_raises ArgumentError, "Incomplete multibyte sequence" do + io.print "好".byte_slice(0, 1) + end end - end + {% end %} it "says invalid encoding" do io = SimpleIOMemory.new diff --git a/spec/std/string_spec.cr b/spec/std/string_spec.cr index 6fbdebc7d0..761398fb8f 100644 --- a/spec/std/string_spec.cr +++ b/spec/std/string_spec.cr @@ -2285,35 +2285,38 @@ describe "String" do end end - it "raises if illegal byte sequence" do - expect_raises ArgumentError, "Invalid multibyte sequence" do - "ñ".encode("GB2312") + # Musl does not support GB2312 encoding. + {% unless flag?(:musl) %} + it "raises if illegal byte sequence" do + expect_raises ArgumentError, "Invalid multibyte sequence" do + "ñ".encode("GB2312") + end end - end - it "doesn't raise on invalid byte sequence" do - "好ñ是".encode("GB2312", invalid: :skip).to_a.should eq([186, 195, 202, 199]) - end + it "doesn't raise on invalid byte sequence" do + "好ñ是".encode("GB2312", invalid: :skip).to_a.should eq([186, 195, 202, 199]) + end - it "raises if incomplete byte sequence" do - expect_raises ArgumentError, "Incomplete multibyte sequence" do - "好".byte_slice(0, 1).encode("GB2312") + it "raises if incomplete byte sequence" do + expect_raises ArgumentError, "Incomplete multibyte sequence" do + "好".byte_slice(0, 1).encode("GB2312") + end end - end - it "doesn't raise if incomplete byte sequence" do - ("好".byte_slice(0, 1) + "是").encode("GB2312", invalid: :skip).to_a.should eq([202, 199]) - end + it "doesn't raise if incomplete byte sequence" do + ("好".byte_slice(0, 1) + "是").encode("GB2312", invalid: :skip).to_a.should eq([202, 199]) + end + + it "decodes with skip" do + bytes = Bytes[186, 195, 140, 202, 199] + String.new(bytes, "GB2312", invalid: :skip).should eq("好是") + end + {% end %} it "decodes" do bytes = "Hello".encode("UTF-16LE") String.new(bytes, "UTF-16LE").should eq("Hello") end - - it "decodes with skip" do - bytes = Bytes[186, 195, 140, 202, 199] - String.new(bytes, "GB2312", invalid: :skip).should eq("好是") - end end it "inserts" do