summaryrefslogtreecommitdiff
path: root/test/ruby/test_array.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/ruby/test_array.rb')
-rw-r--r--test/ruby/test_array.rb54
1 files changed, 54 insertions, 0 deletions
diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb
index 76455187a5..36f8801614 100644
--- a/test/ruby/test_array.rb
+++ b/test/ruby/test_array.rb
@@ -2812,6 +2812,60 @@ class TestArray < Test::Unit::TestCase
assert_equal("b", x.ary.join(""))
end
+ def test_join_encoding
+ # Multibyte UTF-8 elements: result is UTF-8, valid, not ASCII-only.
+ r = @cls["caf\u00e9", "na\u00efve"].join(" ")
+ assert_equal("caf\u00e9 na\u00efve", r)
+ assert_equal(Encoding::UTF_8, r.encoding)
+ assert_equal(true, r.valid_encoding?)
+ assert_equal(false, r.ascii_only?)
+
+ # All 7-bit content stays ASCII-only.
+ r = @cls["abc", "def"].join(",")
+ assert_equal("abc,def", r)
+ assert_equal(true, r.ascii_only?)
+
+ # Multibyte separator (same encoding as the elements).
+ r = @cls["a", "b", "c"].join("\u2014")
+ assert_equal("a\u2014b\u2014c", r)
+ assert_equal(Encoding::UTF_8, r.encoding)
+ assert_equal(false, r.ascii_only?)
+ assert_equal(true, r.valid_encoding?)
+
+ # Mixed ASCII-compatible encodings, all 7-bit: result takes element 0's encoding.
+ r = @cls["abc".dup.force_encoding("US-ASCII"), "def".dup.force_encoding("UTF-8")].join(" ")
+ assert_equal("abc def", r)
+ assert_equal(Encoding::US_ASCII, r.encoding)
+ assert_equal(true, r.ascii_only?)
+
+ # 7-bit content in a non-ASCII encoding (Shift_JIS).
+ r = @cls["abc".encode("Shift_JIS"), "def".encode("Shift_JIS")].join(" ")
+ assert_equal(Encoding::Shift_JIS, r.encoding)
+ assert_equal("abc def".b, r.b)
+
+ # Same-encoding multibyte (Shift_JIS): byte-for-byte concatenation.
+ s = "\u65e5\u672c".encode("Shift_JIS")
+ sep = "/".encode("Shift_JIS")
+ r = @cls[s, s].join(sep)
+ assert_equal(Encoding::Shift_JIS, r.encoding)
+ assert_equal((s + sep + s).b, r.b)
+
+ # Broken bytes: result keeps them and reports invalid.
+ bad = "\xff\xfe".dup.force_encoding("UTF-8")
+ r = @cls[bad, bad].join(" ")
+ assert_equal((bad + " " + bad).b, r.b)
+ assert_equal(false, r.valid_encoding?)
+
+ # Incompatible element/separator encodings still raise.
+ assert_raise(Encoding::CompatibilityError) do
+ @cls["a".dup.force_encoding("UTF-8"), "b".encode("UTF-16LE")].join(" ")
+ end
+
+ # Bulk copy: large array, verified against a non-join oracle.
+ big = @cls.new(500) { "ab" }
+ assert_equal(("ab," * 500).chomp(","), big.join(","))
+ end
+
def test_to_a2
klass = Class.new(Array)
a = klass.new.to_a