summaryrefslogtreecommitdiff
path: root/test/ruby/test_transcode.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/ruby/test_transcode.rb')
-rw-r--r--test/ruby/test_transcode.rb110
1 files changed, 109 insertions, 1 deletions
diff --git a/test/ruby/test_transcode.rb b/test/ruby/test_transcode.rb
index 4b63263aae..99b5ee8d43 100644
--- a/test/ruby/test_transcode.rb
+++ b/test/ruby/test_transcode.rb
@@ -661,6 +661,25 @@ class TestTranscode < Test::Unit::TestCase
check_both_ways("\u00A0", "\xFF", 'IBM863') # non-breaking space
end
+ def test_IBM864
+ check_both_ways("\u00B0", "\x80", 'IBM864') # °
+ check_both_ways("\u2518", "\x8F", 'IBM864') # ┘
+ check_both_ways("\u03B2", "\x90", 'IBM864') # β
+ check_both_ways("\uFE73", "\x9F", 'IBM864') # ﹳ
+ check_both_ways("\u00A0", "\xA0", 'IBM864') # non-breaking space
+ check_both_ways("\uFEA5", "\xAF", 'IBM864') # ﺥ
+ check_both_ways("\u0660", "\xB0", 'IBM864') # ٠
+ check_both_ways("\u061F", "\xBF", 'IBM864') # ؟
+ check_both_ways("\u00A2", "\xC0", 'IBM864') # ¢
+ check_both_ways("\uFEA9", "\xCF", 'IBM864') # ﺩ
+ check_both_ways("\uFEAB", "\xD0", 'IBM864') # ﺫ
+ check_both_ways("\uFEC9", "\xDF", 'IBM864') # ﻉ
+ check_both_ways("\u0640", "\xE0", 'IBM864') # ـ
+ check_both_ways("\uFEE1", "\xEF", 'IBM864') # ﻡ
+ check_both_ways("\uFE7D", "\xF0", 'IBM864') # ﹽ
+ check_both_ways("\u25A0", "\xFE", 'IBM864') # ■
+ end
+
def test_IBM865
check_both_ways("\u00C7", "\x80", 'IBM865') # Ç
check_both_ways("\u00C5", "\x8F", 'IBM865') # Å
@@ -1615,6 +1634,8 @@ class TestTranscode < Test::Unit::TestCase
assert_equal("\e$B%*!+%,%I%J!+%N!+%P%\\%^!+%Q%]%\"\e(B".force_encoding("cp50220"),
"\xB5\xDE\xB6\xDE\xC4\xDE\xC5\xDE\xC9\xDE\xCA\xDE\xCE\xDE\xCF\xDE\xCA\xDF\xCE\xDF\xB1".
encode("cp50220", "sjis"))
+ assert_equal("\e$B\x21\x23\e(I\x7E\e(B".force_encoding("cp50220"),
+ "\x8E\xA1\x8E\xFE".encode("cp50220", "cp51932"))
end
def test_iso_2022_jp_1
@@ -2265,7 +2286,7 @@ class TestTranscode < Test::Unit::TestCase
result = th.map(&:value)
end
end
- expected = "\xa4\xa2".force_encoding(Encoding::EUC_JP)
+ expected = "\xa4\xa2".dup.force_encoding(Encoding::EUC_JP)
assert_equal([expected]*num, result, bug11277)
end;
end
@@ -2299,6 +2320,93 @@ class TestTranscode < Test::Unit::TestCase
assert_equal("A\nB\nC", s.encode(usascii, newline: :lf))
end
+ def test_ractor_lazy_load_encoding
+ assert_ractor("#{<<~"begin;"}\n#{<<~'end;'}", timeout: 60)
+ begin;
+ rs = []
+ autoload_encodings = Encoding.list.select { |e| e.inspect.include?("(autoload)") }.freeze
+ 7.times do
+ rs << Ractor.new(autoload_encodings) do |encodings|
+ str = "\u0300"
+ encodings.each do |enc|
+ str.encode(enc) rescue Encoding::UndefinedConversionError
+ end
+ end
+ end
+
+ while rs.any?
+ r, _obj = Ractor.select(*rs)
+ rs.delete(r)
+ end
+ assert_empty rs
+ end;
+ end
+
+ def test_ractor_lazy_load_encoding_random
+ omit 'unstable on s390x and windows' if RUBY_PLATFORM =~ /s390x|mswin/
+ assert_ractor("#{<<~"begin;"}\n#{<<~'end;'}")
+ begin;
+ rs = []
+ 100.times do
+ rs << Ractor.new do
+ "\u0300".encode(Encoding.list.sample) rescue Encoding::UndefinedConversionError
+ end
+ end
+
+ while rs.any?
+ r, _obj = Ractor.select(*rs)
+ rs.delete(r)
+ end
+ assert_empty rs
+ end;
+ end
+
+ def test_ractor_asciicompat_encoding_exists
+ assert_ractor("#{<<~"begin;"}\n#{<<~'end;'}")
+ begin;
+ rs = []
+ 7.times do
+ rs << Ractor.new do
+ string = "ISO-2022-JP"
+ encoding = Encoding.find(string)
+ 20_000.times do
+ Encoding::Converter.asciicompat_encoding(string)
+ Encoding::Converter.asciicompat_encoding(encoding)
+ end
+ end
+ end
+
+ while rs.any?
+ r, _obj = Ractor.select(*rs)
+ rs.delete(r)
+ end
+ assert_empty rs
+ end;
+ end
+
+ def test_ractor_asciicompat_encoding_doesnt_exist
+ assert_ractor("#{<<~"begin;"}\n#{<<~'end;'}", timeout: 60)
+ begin;
+ rs = []
+ NO_EXIST = "I".freeze
+ 7.times do
+ rs << Ractor.new do
+ 50.times do
+ if (val = Encoding::Converter.asciicompat_encoding(NO_EXIST))
+ raise "Got #{val}, expected nil"
+ end
+ end
+ end
+ end
+
+ while rs.any?
+ r, _obj = Ractor.select(*rs)
+ rs.delete(r)
+ end
+ assert_empty rs
+ end;
+ end
+
private
def assert_conversion_both_ways_utf8(utf8, raw, encoding)