1require 'test/unit' 2require_relative 'envutil' 3 4class TestEncoding < Test::Unit::TestCase 5 6 # Test basic encoding methods: list, find, name 7 def test_encoding 8 encodings = Encoding.list 9 assert_equal(encodings.empty?, false) 10 11 encodings.each do |e| 12 assert_equal(e, Encoding.find(e.name)) 13 assert_equal(e, Encoding.find(e.name.upcase)) 14 assert_equal(e, Encoding.find(e.name.capitalize)) 15 assert_equal(e, Encoding.find(e.name.downcase)) 16 assert_equal(e, Encoding.find(e)) 17 end 18 end 19 20 def test_enc_names 21 aliases = Encoding.aliases 22 aliases.each do |a, en| 23 e = Encoding.find(a) 24 assert_equal(e.name, en) 25 assert(e.names.include?(a)) 26 end 27 end 28 29 # Test that Encoding objects can't be copied 30 # And that they can be compared by object_id 31 def test_singleton 32 encodings = Encoding.list 33 encodings.each do |e| 34 assert_raise(TypeError) { e.dup } 35 assert_raise(TypeError) { e.clone } 36 assert_equal(e.object_id, Marshal.load(Marshal.dump(e)).object_id) 37 end 38 end 39 40 def test_find 41 assert_raise(ArgumentError) { Encoding.find("foobarbazqux") } 42 assert_nothing_raised{Encoding.find("locale")} 43 assert_nothing_raised{Encoding.find("filesystem")} 44 45 if /(?:ms|dar)win|mingw/ !~ RUBY_PLATFORM 46 # Unix's filesystem encoding is default_external 47 assert_ruby_status(%w[-EUTF-8:EUC-JP], <<-'EOS') 48 exit Encoding.find("filesystem") == Encoding::UTF_8 49 Encoding.default_external = Encoding::EUC_JP 50 exit Encoding.find("filesystem") == Encoding::EUC_JP 51 EOS 52 end 53 54 bug5150 = '[ruby-dev:44327]' 55 assert_raise(TypeError, bug5150) {Encoding.find(1)} 56 end 57 58 def test_replicate 59 assert_instance_of(Encoding, Encoding::UTF_8.replicate('UTF-8-ANOTHER')) 60 assert_instance_of(Encoding, Encoding::ISO_2022_JP.replicate('ISO-2022-JP-ANOTHER')) 61 bug3127 = '[ruby-dev:40954]' 62 assert_raise(TypeError, bug3127) {Encoding::UTF_8.replicate(0)} 63 assert_raise(ArgumentError, bug3127) {Encoding::UTF_8.replicate("\0")} 64 end 65 66 def test_dummy_p 67 assert_equal(true, Encoding::ISO_2022_JP.dummy?) 68 assert_equal(false, Encoding::UTF_8.dummy?) 69 end 70 71 def test_ascii_compatible_p 72 assert_equal(true, Encoding::ASCII_8BIT.ascii_compatible?) 73 assert_equal(true, Encoding::UTF_8.ascii_compatible?) 74 assert_equal(false, Encoding::UTF_16BE.ascii_compatible?) 75 assert_equal(false, Encoding::ISO_2022_JP.ascii_compatible?) 76 end 77 78 def test_name_list 79 assert_instance_of(Array, Encoding.name_list) 80 Encoding.name_list.each do |x| 81 assert_instance_of(String, x) 82 end 83 end 84 85 def test_aliases 86 assert_instance_of(Hash, Encoding.aliases) 87 Encoding.aliases.each do |k, v| 88 assert(Encoding.name_list.include?(k)) 89 assert(Encoding.name_list.include?(v)) 90 assert_instance_of(String, k) 91 assert_instance_of(String, v) 92 end 93 end 94 95 def test_marshal 96 str = "".force_encoding("EUC-JP") 97 str2 = Marshal.load(Marshal.dump(str)) 98 assert_equal(str, str2) 99 str2 = Marshal.load(Marshal.dump(str2)) 100 assert_equal(str, str2, '[ruby-dev:38596]') 101 end 102 103 def test_unsafe 104 bug5279 = '[ruby-dev:44469]' 105 assert_ruby_status([], '$SAFE=4; "a".encode("utf-16be")', bug5279) 106 end 107 108 def test_compatible_p 109 ua = "abc".force_encoding(Encoding::UTF_8) 110 assert_equal(Encoding::UTF_8, Encoding.compatible?(ua, :abc)) 111 assert_equal(nil, Encoding.compatible?(ua, 1)) 112 bin = "a".force_encoding(Encoding::ASCII_8BIT) 113 asc = "b".force_encoding(Encoding::US_ASCII) 114 assert_equal(Encoding::ASCII_8BIT, Encoding.compatible?(bin, asc)) 115 end 116 117 def test_errinfo_after_autoload 118 bug9038 = '[ruby-core:57949] [Bug #9038]' 119 assert_separately(%w[--disable=gems], <<-"end;") 120 e = assert_raise(SyntaxError) { eval("/regexp/sQ") } 121 assert_match(/unknown regexp option - Q/, e.message, #{bug9038.dump}) 122 end; 123 end 124end 125