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