From 86e5a498ba22347873a1ce74903b127712f5583d Mon Sep 17 00:00:00 2001 From: Andrew Konchin Date: Tue, 24 Sep 2024 13:52:53 +0300 Subject: [PATCH] Add more specs for encoding negotiation Check all the combinations of empty, 7 bits and non-7-bits Strings in US-ASCII/UTF-8/BINARY/ascii-compatible/non-ascii-compatible/dummy encodings --- spec/ruby/core/encoding/compatible_spec.rb | 375 +++++++++++++++++++++ 1 file changed, 375 insertions(+) diff --git a/spec/ruby/core/encoding/compatible_spec.rb b/spec/ruby/core/encoding/compatible_spec.rb index f18d8680a96..ee381de1cb7 100644 --- a/spec/ruby/core/encoding/compatible_spec.rb +++ b/spec/ruby/core/encoding/compatible_spec.rb @@ -161,6 +161,381 @@ Encoding.compatible?(@str, "").should == Encoding::UTF_7 end end + + # Encoding negotiation depends on whether encodings are ASCII-compatible, empty + # and contain only ASCII characters (that take 7 bits). Check US-ASCII, UTF-8 and + # BINARY encodings (as most common) as well as an ASCII-compatible, a non-ASCII-compatible and a dummy + # encodings in all possible combinations. + describe "compatibility matrix" do + +=begin + Use the following script to regenerate the matrix: + + ``` + # -*- encoding: binary -*- + + ENCODINGS = [ + "US-ASCII", + "UTF-8", + "ASCII-8BIT", + "ISO-8859-1", # ASCII-compatible + "UTF-16BE", # non-ASCII-compatible + "ISO-2022-JP" # dummy + ] + + TYPES = [:empty, :"7bits", :non7bits] + + VALUES = { + empty: "", + :"7bits" => "\x01", + non7bits: "\x81" + } + + ENCODINGS.product(TYPES, ENCODINGS, TYPES).each do |encoding1, type1, encoding2, type2| + value1 = VALUES[type1].dup.force_encoding(encoding1) + value2 = VALUES[type2].dup.force_encoding(encoding2) + + result_encoding = Encoding.compatible?(value1, value2) + + puts "[#{encoding1.inspect}, #{value1.inspect}, #{encoding2.inspect}, #{value2.inspect}, #{result_encoding&.name.inspect}]," + end + ``` +=end + + matrix = [ + ["US-ASCII", "", "US-ASCII", "", "US-ASCII"], + ["US-ASCII", "", "US-ASCII", "\x01", "US-ASCII"], + ["US-ASCII", "", "US-ASCII", "\x81", "US-ASCII"], + ["US-ASCII", "", "UTF-8", "", "US-ASCII"], + ["US-ASCII", "", "UTF-8", "\u0001", "US-ASCII"], + ["US-ASCII", "", "UTF-8", "\x81", "UTF-8"], + ["US-ASCII", "", "ASCII-8BIT", "", "US-ASCII"], + ["US-ASCII", "", "ASCII-8BIT", "\x01", "US-ASCII"], + ["US-ASCII", "", "ASCII-8BIT", "\x81", "ASCII-8BIT"], + ["US-ASCII", "", "ISO-8859-1", "", "US-ASCII"], + ["US-ASCII", "", "ISO-8859-1", "\x01", "US-ASCII"], + ["US-ASCII", "", "ISO-8859-1", "\x81", "ISO-8859-1"], + ["US-ASCII", "", "UTF-16BE", "", "US-ASCII"], + ["US-ASCII", "", "UTF-16BE", "\x01", "UTF-16BE"], + ["US-ASCII", "", "UTF-16BE", "\x81", "UTF-16BE"], + ["US-ASCII", "", "ISO-2022-JP", "", "US-ASCII"], + ["US-ASCII", "", "ISO-2022-JP", "\x01", "ISO-2022-JP"], + ["US-ASCII", "", "ISO-2022-JP", "\x81", "ISO-2022-JP"], + ["US-ASCII", "\x01", "US-ASCII", "", "US-ASCII"], + ["US-ASCII", "\x01", "US-ASCII", "\x01", "US-ASCII"], + ["US-ASCII", "\x01", "US-ASCII", "\x81", "US-ASCII"], + ["US-ASCII", "\x01", "UTF-8", "", "US-ASCII"], + ["US-ASCII", "\x01", "UTF-8", "\u0001", "US-ASCII"], + ["US-ASCII", "\x01", "UTF-8", "\x81", "UTF-8"], + ["US-ASCII", "\x01", "ASCII-8BIT", "", "US-ASCII"], + ["US-ASCII", "\x01", "ASCII-8BIT", "\x01", "US-ASCII"], + ["US-ASCII", "\x01", "ASCII-8BIT", "\x81", "ASCII-8BIT"], + ["US-ASCII", "\x01", "ISO-8859-1", "", "US-ASCII"], + ["US-ASCII", "\x01", "ISO-8859-1", "\x01", "US-ASCII"], + ["US-ASCII", "\x01", "ISO-8859-1", "\x81", "ISO-8859-1"], + ["US-ASCII", "\x01", "UTF-16BE", "", "US-ASCII"], + ["US-ASCII", "\x01", "UTF-16BE", "\x01", nil], + ["US-ASCII", "\x01", "UTF-16BE", "\x81", nil], + ["US-ASCII", "\x01", "ISO-2022-JP", "", "US-ASCII"], + ["US-ASCII", "\x01", "ISO-2022-JP", "\x01", nil], + ["US-ASCII", "\x01", "ISO-2022-JP", "\x81", nil], + ["US-ASCII", "\x81", "US-ASCII", "", "US-ASCII"], + ["US-ASCII", "\x81", "US-ASCII", "\x01", "US-ASCII"], + ["US-ASCII", "\x81", "US-ASCII", "\x81", "US-ASCII"], + ["US-ASCII", "\x81", "UTF-8", "", "US-ASCII"], + ["US-ASCII", "\x81", "UTF-8", "\u0001", "US-ASCII"], + ["US-ASCII", "\x81", "UTF-8", "\x81", nil], + ["US-ASCII", "\x81", "ASCII-8BIT", "", "US-ASCII"], + ["US-ASCII", "\x81", "ASCII-8BIT", "\x01", "US-ASCII"], + ["US-ASCII", "\x81", "ASCII-8BIT", "\x81", nil], + ["US-ASCII", "\x81", "ISO-8859-1", "", "US-ASCII"], + ["US-ASCII", "\x81", "ISO-8859-1", "\x01", "US-ASCII"], + ["US-ASCII", "\x81", "ISO-8859-1", "\x81", nil], + ["US-ASCII", "\x81", "UTF-16BE", "", "US-ASCII"], + ["US-ASCII", "\x81", "UTF-16BE", "\x01", nil], + ["US-ASCII", "\x81", "UTF-16BE", "\x81", nil], + ["US-ASCII", "\x81", "ISO-2022-JP", "", "US-ASCII"], + ["US-ASCII", "\x81", "ISO-2022-JP", "\x01", nil], + ["US-ASCII", "\x81", "ISO-2022-JP", "\x81", nil], + ["UTF-8", "", "US-ASCII", "", "UTF-8"], + ["UTF-8", "", "US-ASCII", "\x01", "UTF-8"], + ["UTF-8", "", "US-ASCII", "\x81", "US-ASCII"], + ["UTF-8", "", "UTF-8", "", "UTF-8"], + ["UTF-8", "", "UTF-8", "\u0001", "UTF-8"], + ["UTF-8", "", "UTF-8", "\x81", "UTF-8"], + ["UTF-8", "", "ASCII-8BIT", "", "UTF-8"], + ["UTF-8", "", "ASCII-8BIT", "\x01", "UTF-8"], + ["UTF-8", "", "ASCII-8BIT", "\x81", "ASCII-8BIT"], + ["UTF-8", "", "ISO-8859-1", "", "UTF-8"], + ["UTF-8", "", "ISO-8859-1", "\x01", "UTF-8"], + ["UTF-8", "", "ISO-8859-1", "\x81", "ISO-8859-1"], + ["UTF-8", "", "UTF-16BE", "", "UTF-8"], + ["UTF-8", "", "UTF-16BE", "\x01", "UTF-16BE"], + ["UTF-8", "", "UTF-16BE", "\x81", "UTF-16BE"], + ["UTF-8", "", "ISO-2022-JP", "", "UTF-8"], + ["UTF-8", "", "ISO-2022-JP", "\x01", "ISO-2022-JP"], + ["UTF-8", "", "ISO-2022-JP", "\x81", "ISO-2022-JP"], + ["UTF-8", "\u0001", "US-ASCII", "", "UTF-8"], + ["UTF-8", "\u0001", "US-ASCII", "\x01", "UTF-8"], + ["UTF-8", "\u0001", "US-ASCII", "\x81", "US-ASCII"], + ["UTF-8", "\u0001", "UTF-8", "", "UTF-8"], + ["UTF-8", "\u0001", "UTF-8", "\u0001", "UTF-8"], + ["UTF-8", "\u0001", "UTF-8", "\x81", "UTF-8"], + ["UTF-8", "\u0001", "ASCII-8BIT", "", "UTF-8"], + ["UTF-8", "\u0001", "ASCII-8BIT", "\x01", "UTF-8"], + ["UTF-8", "\u0001", "ASCII-8BIT", "\x81", "ASCII-8BIT"], + ["UTF-8", "\u0001", "ISO-8859-1", "", "UTF-8"], + ["UTF-8", "\u0001", "ISO-8859-1", "\x01", "UTF-8"], + ["UTF-8", "\u0001", "ISO-8859-1", "\x81", "ISO-8859-1"], + ["UTF-8", "\u0001", "UTF-16BE", "", "UTF-8"], + ["UTF-8", "\u0001", "UTF-16BE", "\x01", nil], + ["UTF-8", "\u0001", "UTF-16BE", "\x81", nil], + ["UTF-8", "\u0001", "ISO-2022-JP", "", "UTF-8"], + ["UTF-8", "\u0001", "ISO-2022-JP", "\x01", nil], + ["UTF-8", "\u0001", "ISO-2022-JP", "\x81", nil], + ["UTF-8", "\x81", "US-ASCII", "", "UTF-8"], + ["UTF-8", "\x81", "US-ASCII", "\x01", "UTF-8"], + ["UTF-8", "\x81", "US-ASCII", "\x81", nil], + ["UTF-8", "\x81", "UTF-8", "", "UTF-8"], + ["UTF-8", "\x81", "UTF-8", "\u0001", "UTF-8"], + ["UTF-8", "\x81", "UTF-8", "\x81", "UTF-8"], + ["UTF-8", "\x81", "ASCII-8BIT", "", "UTF-8"], + ["UTF-8", "\x81", "ASCII-8BIT", "\x01", "UTF-8"], + ["UTF-8", "\x81", "ASCII-8BIT", "\x81", nil], + ["UTF-8", "\x81", "ISO-8859-1", "", "UTF-8"], + ["UTF-8", "\x81", "ISO-8859-1", "\x01", "UTF-8"], + ["UTF-8", "\x81", "ISO-8859-1", "\x81", nil], + ["UTF-8", "\x81", "UTF-16BE", "", "UTF-8"], + ["UTF-8", "\x81", "UTF-16BE", "\x01", nil], + ["UTF-8", "\x81", "UTF-16BE", "\x81", nil], + ["UTF-8", "\x81", "ISO-2022-JP", "", "UTF-8"], + ["UTF-8", "\x81", "ISO-2022-JP", "\x01", nil], + ["UTF-8", "\x81", "ISO-2022-JP", "\x81", nil], + ["ASCII-8BIT", "", "US-ASCII", "", "ASCII-8BIT"], + ["ASCII-8BIT", "", "US-ASCII", "\x01", "ASCII-8BIT"], + ["ASCII-8BIT", "", "US-ASCII", "\x81", "US-ASCII"], + ["ASCII-8BIT", "", "UTF-8", "", "ASCII-8BIT"], + ["ASCII-8BIT", "", "UTF-8", "\u0001", "ASCII-8BIT"], + ["ASCII-8BIT", "", "UTF-8", "\x81", "UTF-8"], + ["ASCII-8BIT", "", "ASCII-8BIT", "", "ASCII-8BIT"], + ["ASCII-8BIT", "", "ASCII-8BIT", "\x01", "ASCII-8BIT"], + ["ASCII-8BIT", "", "ASCII-8BIT", "\x81", "ASCII-8BIT"], + ["ASCII-8BIT", "", "ISO-8859-1", "", "ASCII-8BIT"], + ["ASCII-8BIT", "", "ISO-8859-1", "\x01", "ASCII-8BIT"], + ["ASCII-8BIT", "", "ISO-8859-1", "\x81", "ISO-8859-1"], + ["ASCII-8BIT", "", "UTF-16BE", "", "ASCII-8BIT"], + ["ASCII-8BIT", "", "UTF-16BE", "\x01", "UTF-16BE"], + ["ASCII-8BIT", "", "UTF-16BE", "\x81", "UTF-16BE"], + ["ASCII-8BIT", "", "ISO-2022-JP", "", "ASCII-8BIT"], + ["ASCII-8BIT", "", "ISO-2022-JP", "\x01", "ISO-2022-JP"], + ["ASCII-8BIT", "", "ISO-2022-JP", "\x81", "ISO-2022-JP"], + ["ASCII-8BIT", "\x01", "US-ASCII", "", "ASCII-8BIT"], + ["ASCII-8BIT", "\x01", "US-ASCII", "\x01", "ASCII-8BIT"], + ["ASCII-8BIT", "\x01", "US-ASCII", "\x81", "US-ASCII"], + ["ASCII-8BIT", "\x01", "UTF-8", "", "ASCII-8BIT"], + ["ASCII-8BIT", "\x01", "UTF-8", "\u0001", "ASCII-8BIT"], + ["ASCII-8BIT", "\x01", "UTF-8", "\x81", "UTF-8"], + ["ASCII-8BIT", "\x01", "ASCII-8BIT", "", "ASCII-8BIT"], + ["ASCII-8BIT", "\x01", "ASCII-8BIT", "\x01", "ASCII-8BIT"], + ["ASCII-8BIT", "\x01", "ASCII-8BIT", "\x81", "ASCII-8BIT"], + ["ASCII-8BIT", "\x01", "ISO-8859-1", "", "ASCII-8BIT"], + ["ASCII-8BIT", "\x01", "ISO-8859-1", "\x01", "ASCII-8BIT"], + ["ASCII-8BIT", "\x01", "ISO-8859-1", "\x81", "ISO-8859-1"], + ["ASCII-8BIT", "\x01", "UTF-16BE", "", "ASCII-8BIT"], + ["ASCII-8BIT", "\x01", "UTF-16BE", "\x01", nil], + ["ASCII-8BIT", "\x01", "UTF-16BE", "\x81", nil], + ["ASCII-8BIT", "\x01", "ISO-2022-JP", "", "ASCII-8BIT"], + ["ASCII-8BIT", "\x01", "ISO-2022-JP", "\x01", nil], + ["ASCII-8BIT", "\x01", "ISO-2022-JP", "\x81", nil], + ["ASCII-8BIT", "\x81", "US-ASCII", "", "ASCII-8BIT"], + ["ASCII-8BIT", "\x81", "US-ASCII", "\x01", "ASCII-8BIT"], + ["ASCII-8BIT", "\x81", "US-ASCII", "\x81", nil], + ["ASCII-8BIT", "\x81", "UTF-8", "", "ASCII-8BIT"], + ["ASCII-8BIT", "\x81", "UTF-8", "\u0001", "ASCII-8BIT"], + ["ASCII-8BIT", "\x81", "UTF-8", "\x81", nil], + ["ASCII-8BIT", "\x81", "ASCII-8BIT", "", "ASCII-8BIT"], + ["ASCII-8BIT", "\x81", "ASCII-8BIT", "\x01", "ASCII-8BIT"], + ["ASCII-8BIT", "\x81", "ASCII-8BIT", "\x81", "ASCII-8BIT"], + ["ASCII-8BIT", "\x81", "ISO-8859-1", "", "ASCII-8BIT"], + ["ASCII-8BIT", "\x81", "ISO-8859-1", "\x01", "ASCII-8BIT"], + ["ASCII-8BIT", "\x81", "ISO-8859-1", "\x81", nil], + ["ASCII-8BIT", "\x81", "UTF-16BE", "", "ASCII-8BIT"], + ["ASCII-8BIT", "\x81", "UTF-16BE", "\x01", nil], + ["ASCII-8BIT", "\x81", "UTF-16BE", "\x81", nil], + ["ASCII-8BIT", "\x81", "ISO-2022-JP", "", "ASCII-8BIT"], + ["ASCII-8BIT", "\x81", "ISO-2022-JP", "\x01", nil], + ["ASCII-8BIT", "\x81", "ISO-2022-JP", "\x81", nil], + ["ISO-8859-1", "", "US-ASCII", "", "ISO-8859-1"], + ["ISO-8859-1", "", "US-ASCII", "\x01", "ISO-8859-1"], + ["ISO-8859-1", "", "US-ASCII", "\x81", "US-ASCII"], + ["ISO-8859-1", "", "UTF-8", "", "ISO-8859-1"], + ["ISO-8859-1", "", "UTF-8", "\u0001", "ISO-8859-1"], + ["ISO-8859-1", "", "UTF-8", "\x81", "UTF-8"], + ["ISO-8859-1", "", "ASCII-8BIT", "", "ISO-8859-1"], + ["ISO-8859-1", "", "ASCII-8BIT", "\x01", "ISO-8859-1"], + ["ISO-8859-1", "", "ASCII-8BIT", "\x81", "ASCII-8BIT"], + ["ISO-8859-1", "", "ISO-8859-1", "", "ISO-8859-1"], + ["ISO-8859-1", "", "ISO-8859-1", "\x01", "ISO-8859-1"], + ["ISO-8859-1", "", "ISO-8859-1", "\x81", "ISO-8859-1"], + ["ISO-8859-1", "", "UTF-16BE", "", "ISO-8859-1"], + ["ISO-8859-1", "", "UTF-16BE", "\x01", "UTF-16BE"], + ["ISO-8859-1", "", "UTF-16BE", "\x81", "UTF-16BE"], + ["ISO-8859-1", "", "ISO-2022-JP", "", "ISO-8859-1"], + ["ISO-8859-1", "", "ISO-2022-JP", "\x01", "ISO-2022-JP"], + ["ISO-8859-1", "", "ISO-2022-JP", "\x81", "ISO-2022-JP"], + ["ISO-8859-1", "\x01", "US-ASCII", "", "ISO-8859-1"], + ["ISO-8859-1", "\x01", "US-ASCII", "\x01", "ISO-8859-1"], + ["ISO-8859-1", "\x01", "US-ASCII", "\x81", "US-ASCII"], + ["ISO-8859-1", "\x01", "UTF-8", "", "ISO-8859-1"], + ["ISO-8859-1", "\x01", "UTF-8", "\u0001", "ISO-8859-1"], + ["ISO-8859-1", "\x01", "UTF-8", "\x81", "UTF-8"], + ["ISO-8859-1", "\x01", "ASCII-8BIT", "", "ISO-8859-1"], + ["ISO-8859-1", "\x01", "ASCII-8BIT", "\x01", "ISO-8859-1"], + ["ISO-8859-1", "\x01", "ASCII-8BIT", "\x81", "ASCII-8BIT"], + ["ISO-8859-1", "\x01", "ISO-8859-1", "", "ISO-8859-1"], + ["ISO-8859-1", "\x01", "ISO-8859-1", "\x01", "ISO-8859-1"], + ["ISO-8859-1", "\x01", "ISO-8859-1", "\x81", "ISO-8859-1"], + ["ISO-8859-1", "\x01", "UTF-16BE", "", "ISO-8859-1"], + ["ISO-8859-1", "\x01", "UTF-16BE", "\x01", nil], + ["ISO-8859-1", "\x01", "UTF-16BE", "\x81", nil], + ["ISO-8859-1", "\x01", "ISO-2022-JP", "", "ISO-8859-1"], + ["ISO-8859-1", "\x01", "ISO-2022-JP", "\x01", nil], + ["ISO-8859-1", "\x01", "ISO-2022-JP", "\x81", nil], + ["ISO-8859-1", "\x81", "US-ASCII", "", "ISO-8859-1"], + ["ISO-8859-1", "\x81", "US-ASCII", "\x01", "ISO-8859-1"], + ["ISO-8859-1", "\x81", "US-ASCII", "\x81", nil], + ["ISO-8859-1", "\x81", "UTF-8", "", "ISO-8859-1"], + ["ISO-8859-1", "\x81", "UTF-8", "\u0001", "ISO-8859-1"], + ["ISO-8859-1", "\x81", "UTF-8", "\x81", nil], + ["ISO-8859-1", "\x81", "ASCII-8BIT", "", "ISO-8859-1"], + ["ISO-8859-1", "\x81", "ASCII-8BIT", "\x01", "ISO-8859-1"], + ["ISO-8859-1", "\x81", "ASCII-8BIT", "\x81", nil], + ["ISO-8859-1", "\x81", "ISO-8859-1", "", "ISO-8859-1"], + ["ISO-8859-1", "\x81", "ISO-8859-1", "\x01", "ISO-8859-1"], + ["ISO-8859-1", "\x81", "ISO-8859-1", "\x81", "ISO-8859-1"], + ["ISO-8859-1", "\x81", "UTF-16BE", "", "ISO-8859-1"], + ["ISO-8859-1", "\x81", "UTF-16BE", "\x01", nil], + ["ISO-8859-1", "\x81", "UTF-16BE", "\x81", nil], + ["ISO-8859-1", "\x81", "ISO-2022-JP", "", "ISO-8859-1"], + ["ISO-8859-1", "\x81", "ISO-2022-JP", "\x01", nil], + ["ISO-8859-1", "\x81", "ISO-2022-JP", "\x81", nil], + ["UTF-16BE", "", "US-ASCII", "", "UTF-16BE"], + ["UTF-16BE", "", "US-ASCII", "\x01", "US-ASCII"], + ["UTF-16BE", "", "US-ASCII", "\x81", "US-ASCII"], + ["UTF-16BE", "", "UTF-8", "", "UTF-16BE"], + ["UTF-16BE", "", "UTF-8", "\u0001", "UTF-8"], + ["UTF-16BE", "", "UTF-8", "\x81", "UTF-8"], + ["UTF-16BE", "", "ASCII-8BIT", "", "UTF-16BE"], + ["UTF-16BE", "", "ASCII-8BIT", "\x01", "ASCII-8BIT"], + ["UTF-16BE", "", "ASCII-8BIT", "\x81", "ASCII-8BIT"], + ["UTF-16BE", "", "ISO-8859-1", "", "UTF-16BE"], + ["UTF-16BE", "", "ISO-8859-1", "\x01", "ISO-8859-1"], + ["UTF-16BE", "", "ISO-8859-1", "\x81", "ISO-8859-1"], + ["UTF-16BE", "", "UTF-16BE", "", "UTF-16BE"], + ["UTF-16BE", "", "UTF-16BE", "\x01", "UTF-16BE"], + ["UTF-16BE", "", "UTF-16BE", "\x81", "UTF-16BE"], + ["UTF-16BE", "", "ISO-2022-JP", "", "UTF-16BE"], + ["UTF-16BE", "", "ISO-2022-JP", "\x01", "ISO-2022-JP"], + ["UTF-16BE", "", "ISO-2022-JP", "\x81", "ISO-2022-JP"], + ["UTF-16BE", "\x01", "US-ASCII", "", "UTF-16BE"], + ["UTF-16BE", "\x01", "US-ASCII", "\x01", nil], + ["UTF-16BE", "\x01", "US-ASCII", "\x81", nil], + ["UTF-16BE", "\x01", "UTF-8", "", "UTF-16BE"], + ["UTF-16BE", "\x01", "UTF-8", "\u0001", nil], + ["UTF-16BE", "\x01", "UTF-8", "\x81", nil], + ["UTF-16BE", "\x01", "ASCII-8BIT", "", "UTF-16BE"], + ["UTF-16BE", "\x01", "ASCII-8BIT", "\x01", nil], + ["UTF-16BE", "\x01", "ASCII-8BIT", "\x81", nil], + ["UTF-16BE", "\x01", "ISO-8859-1", "", "UTF-16BE"], + ["UTF-16BE", "\x01", "ISO-8859-1", "\x01", nil], + ["UTF-16BE", "\x01", "ISO-8859-1", "\x81", nil], + ["UTF-16BE", "\x01", "UTF-16BE", "", "UTF-16BE"], + ["UTF-16BE", "\x01", "UTF-16BE", "\x01", "UTF-16BE"], + ["UTF-16BE", "\x01", "UTF-16BE", "\x81", "UTF-16BE"], + ["UTF-16BE", "\x01", "ISO-2022-JP", "", "UTF-16BE"], + ["UTF-16BE", "\x01", "ISO-2022-JP", "\x01", nil], + ["UTF-16BE", "\x01", "ISO-2022-JP", "\x81", nil], + ["UTF-16BE", "\x81", "US-ASCII", "", "UTF-16BE"], + ["UTF-16BE", "\x81", "US-ASCII", "\x01", nil], + ["UTF-16BE", "\x81", "US-ASCII", "\x81", nil], + ["UTF-16BE", "\x81", "UTF-8", "", "UTF-16BE"], + ["UTF-16BE", "\x81", "UTF-8", "\u0001", nil], + ["UTF-16BE", "\x81", "UTF-8", "\x81", nil], + ["UTF-16BE", "\x81", "ASCII-8BIT", "", "UTF-16BE"], + ["UTF-16BE", "\x81", "ASCII-8BIT", "\x01", nil], + ["UTF-16BE", "\x81", "ASCII-8BIT", "\x81", nil], + ["UTF-16BE", "\x81", "ISO-8859-1", "", "UTF-16BE"], + ["UTF-16BE", "\x81", "ISO-8859-1", "\x01", nil], + ["UTF-16BE", "\x81", "ISO-8859-1", "\x81", nil], + ["UTF-16BE", "\x81", "UTF-16BE", "", "UTF-16BE"], + ["UTF-16BE", "\x81", "UTF-16BE", "\x01", "UTF-16BE"], + ["UTF-16BE", "\x81", "UTF-16BE", "\x81", "UTF-16BE"], + ["UTF-16BE", "\x81", "ISO-2022-JP", "", "UTF-16BE"], + ["UTF-16BE", "\x81", "ISO-2022-JP", "\x01", nil], + ["UTF-16BE", "\x81", "ISO-2022-JP", "\x81", nil], + ["ISO-2022-JP", "", "US-ASCII", "", "ISO-2022-JP"], + ["ISO-2022-JP", "", "US-ASCII", "\x01", "US-ASCII"], + ["ISO-2022-JP", "", "US-ASCII", "\x81", "US-ASCII"], + ["ISO-2022-JP", "", "UTF-8", "", "ISO-2022-JP"], + ["ISO-2022-JP", "", "UTF-8", "\u0001", "UTF-8"], + ["ISO-2022-JP", "", "UTF-8", "\x81", "UTF-8"], + ["ISO-2022-JP", "", "ASCII-8BIT", "", "ISO-2022-JP"], + ["ISO-2022-JP", "", "ASCII-8BIT", "\x01", "ASCII-8BIT"], + ["ISO-2022-JP", "", "ASCII-8BIT", "\x81", "ASCII-8BIT"], + ["ISO-2022-JP", "", "ISO-8859-1", "", "ISO-2022-JP"], + ["ISO-2022-JP", "", "ISO-8859-1", "\x01", "ISO-8859-1"], + ["ISO-2022-JP", "", "ISO-8859-1", "\x81", "ISO-8859-1"], + ["ISO-2022-JP", "", "UTF-16BE", "", "ISO-2022-JP"], + ["ISO-2022-JP", "", "UTF-16BE", "\x01", "UTF-16BE"], + ["ISO-2022-JP", "", "UTF-16BE", "\x81", "UTF-16BE"], + ["ISO-2022-JP", "", "ISO-2022-JP", "", "ISO-2022-JP"], + ["ISO-2022-JP", "", "ISO-2022-JP", "\x01", "ISO-2022-JP"], + ["ISO-2022-JP", "", "ISO-2022-JP", "\x81", "ISO-2022-JP"], + ["ISO-2022-JP", "\x01", "US-ASCII", "", "ISO-2022-JP"], + ["ISO-2022-JP", "\x01", "US-ASCII", "\x01", nil], + ["ISO-2022-JP", "\x01", "US-ASCII", "\x81", nil], + ["ISO-2022-JP", "\x01", "UTF-8", "", "ISO-2022-JP"], + ["ISO-2022-JP", "\x01", "UTF-8", "\u0001", nil], + ["ISO-2022-JP", "\x01", "UTF-8", "\x81", nil], + ["ISO-2022-JP", "\x01", "ASCII-8BIT", "", "ISO-2022-JP"], + ["ISO-2022-JP", "\x01", "ASCII-8BIT", "\x01", nil], + ["ISO-2022-JP", "\x01", "ASCII-8BIT", "\x81", nil], + ["ISO-2022-JP", "\x01", "ISO-8859-1", "", "ISO-2022-JP"], + ["ISO-2022-JP", "\x01", "ISO-8859-1", "\x01", nil], + ["ISO-2022-JP", "\x01", "ISO-8859-1", "\x81", nil], + ["ISO-2022-JP", "\x01", "UTF-16BE", "", "ISO-2022-JP"], + ["ISO-2022-JP", "\x01", "UTF-16BE", "\x01", nil], + ["ISO-2022-JP", "\x01", "UTF-16BE", "\x81", nil], + ["ISO-2022-JP", "\x01", "ISO-2022-JP", "", "ISO-2022-JP"], + ["ISO-2022-JP", "\x01", "ISO-2022-JP", "\x01", "ISO-2022-JP"], + ["ISO-2022-JP", "\x01", "ISO-2022-JP", "\x81", "ISO-2022-JP"], + ["ISO-2022-JP", "\x81", "US-ASCII", "", "ISO-2022-JP"], + ["ISO-2022-JP", "\x81", "US-ASCII", "\x01", nil], + ["ISO-2022-JP", "\x81", "US-ASCII", "\x81", nil], + ["ISO-2022-JP", "\x81", "UTF-8", "", "ISO-2022-JP"], + ["ISO-2022-JP", "\x81", "UTF-8", "\u0001", nil], + ["ISO-2022-JP", "\x81", "UTF-8", "\x81", nil], + ["ISO-2022-JP", "\x81", "ASCII-8BIT", "", "ISO-2022-JP"], + ["ISO-2022-JP", "\x81", "ASCII-8BIT", "\x01", nil], + ["ISO-2022-JP", "\x81", "ASCII-8BIT", "\x81", nil], + ["ISO-2022-JP", "\x81", "ISO-8859-1", "", "ISO-2022-JP"], + ["ISO-2022-JP", "\x81", "ISO-8859-1", "\x01", nil], + ["ISO-2022-JP", "\x81", "ISO-8859-1", "\x81", nil], + ["ISO-2022-JP", "\x81", "UTF-16BE", "", "ISO-2022-JP"], + ["ISO-2022-JP", "\x81", "UTF-16BE", "\x01", nil], + ["ISO-2022-JP", "\x81", "UTF-16BE", "\x81", nil], + ["ISO-2022-JP", "\x81", "ISO-2022-JP", "", "ISO-2022-JP"], + ["ISO-2022-JP", "\x81", "ISO-2022-JP", "\x01", "ISO-2022-JP"], + ["ISO-2022-JP", "\x81", "ISO-2022-JP", "\x81", "ISO-2022-JP"], + ] + + matrix.each do |encoding1, value1, encoding2, value2, compatible_encoding| + it "returns #{compatible_encoding} for #{value1.inspect} in #{encoding1} and #{value2.inspect} in #{encoding2}" do + actual_encoding = Encoding.compatible?(value1.force_encoding(encoding1), value2.force_encoding(encoding2)) + actual_encoding&.name.should == compatible_encoding + end + end + end end describe "Encoding.compatible? String, Regexp" do