From 369daa530dd9db7bbba79b8c75012e0fa84c9f48 Mon Sep 17 00:00:00 2001 From: Cliff Pruitt Date: Thu, 25 Jul 2019 14:51:42 -0400 Subject: Handle US-ASCII strings with invalid characters in transliterate US-ASCII is a subset of UTF-8 so we can temporarily convert US-ASCII strings to UTF-8 to perform the transliteration. After we've converted characters to ASCII representations, we can set the encoding back to US-ASCII to return the same encoding we accepted. --- activesupport/test/transliterate_test.rb | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) (limited to 'activesupport/test') diff --git a/activesupport/test/transliterate_test.rb b/activesupport/test/transliterate_test.rb index 4101e4878a..47830946bf 100644 --- a/activesupport/test/transliterate_test.rb +++ b/activesupport/test/transliterate_test.rb @@ -67,7 +67,9 @@ class TransliterateTest < ActiveSupport::TestCase # Valid US-ASCII Works def test_transliterate_handles_strings_with_valid_us_ascii_encodings string = String.new("A", encoding: Encoding::US_ASCII) - assert_equal "A", ActiveSupport::Inflector.transliterate(string) + transcoded = ActiveSupport::Inflector.transliterate(string) + assert_equal "A", transcoded + assert_equal Encoding::US_ASCII, transcoded.encoding end # Valid GB18030 Works @@ -76,20 +78,19 @@ class TransliterateTest < ActiveSupport::TestCase assert_equal "A", ActiveSupport::Inflector.transliterate(string) end - # All other encodings raise exceptions + # All other encodings raise argument errors def test_transliterate_handles_strings_with_incompatible_encodings incompatible_encodings = Encoding.list - [ Encoding::UTF_8, Encoding::US_ASCII, - Encoding::GB18030, + Encoding::GB18030 ] - # This Raises an argument error - incompatible_encodings -= [Encoding::ASCII_8BIT] incompatible_encodings.each do |encoding| string = String.new("", encoding: encoding) - exception = assert_raises Encoding::CompatibilityError do + exception = assert_raises ArgumentError do ActiveSupport::Inflector.transliterate(string) end + assert_equal "Can not transliterate strings with #{encoding} encoding", exception.message end end @@ -102,9 +103,10 @@ class TransliterateTest < ActiveSupport::TestCase # Invalid raises exception def test_transliterate_handles_strings_with_invalid_us_ascii_bytes string = String.new("\255", encoding: Encoding::US_ASCII) - exception = assert_raises Encoding::CompatibilityError do - ActiveSupport::Inflector.transliterate(string) - end + # exception = assert_raises Encoding::CompatibilityError do + # ActiveSupport::Inflector.transliterate(string) + # end + assert_equal "?", ActiveSupport::Inflector.transliterate(string) end # Invalid GB18030 raises exception @@ -114,12 +116,4 @@ class TransliterateTest < ActiveSupport::TestCase ActiveSupport::Inflector.transliterate(string) end end - - def test_transliterate_handles_ascci_8bit_strings - ascii_8bit_string = "A".b - exception = assert_raises ArgumentError do - ActiveSupport::Inflector.transliterate(ascii_8bit_string) - end - assert_equal "Can not transliterate strings with ASCII-8BIT encoding", exception.message - end end -- cgit v1.2.3