* 2022-01-18 [ci skip]
[ruby-80x24.org.git] / test / -ext- / string / test_cstr.rb
blobd909781700a78fbf029c1fdb78b0697f31d209b2
1 # frozen_string_literal: false
2 require 'test/unit'
3 require "-test-/string"
5 class Test_StringCStr < Test::Unit::TestCase
6   Bug4319 = '[ruby-dev:43094]'
8   def test_embed
9     s = Bug::String.new("abcdef")
10     s.set_len(3)
11     s.cstr_unterm('x')
12     assert_equal(0, s.cstr_term, Bug4319)
13   end
15   def test_long
16     s = Bug::String.new(Bug::String.new("abcdef")*100000)
17     s.cstr_unterm('x')
18     assert_equal(0, s.cstr_term, Bug4319)
19   end
21   def test_shared
22     s = Bug::String.new(Bug::String.new("abcdef")*5)
23     s = s.unterminated_substring(0, 29)
24     assert_equal(0, s.cstr_term, Bug4319)
25   end
27   def test_frozen
28     s0 = Bug::String.new("abcdefgh"*8)
30     [4, 4*3-1, 8*3-1, 64].each do |n|
31       s = Bug::String.new(s0[0, n])
32       s.cstr_unterm('x')
33       s.freeze
34       assert_equal(0, s.cstr_term)
35       WCHARS.each do |enc|
36         s = s0.encode(enc)
37         s.set_len(n - n % s[0].bytesize)
38         s.cstr_unterm('x')
39         s.freeze
40         assert_equal(0, s.cstr_term)
41       end
42     end
43   end
45   def test_rb_str_new_frozen_embed
46     str = Bug::String.cstr_noembed("rbconfig.rb")
47     str = Bug::String.rb_str_new_frozen(str)
48     assert_equal true, Bug::String.cstr_embedded?(str)
49   end
51   WCHARS = [Encoding::UTF_16BE, Encoding::UTF_16LE, Encoding::UTF_32BE, Encoding::UTF_32LE]
53   def test_wchar_embed
54     WCHARS.each do |enc|
55       s = Bug::String.new("\u{4022}a".encode(enc))
56       s.cstr_unterm('x')
57       assert_nothing_raised(ArgumentError) {s.cstr_term}
58       s.set_len(s.bytesize / 2)
59       assert_equal(1, s.size)
60       s.cstr_unterm('x')
61       assert_equal(0, s.cstr_term)
62     end
63   end
65   def test_wchar_long
66     str = "\u{4022}abcdef"
67     n = 100
68     len = str.size * n
69     WCHARS.each do |enc|
70       s = Bug::String.new(Bug::String.new(str.encode(enc))*n)
71       s.cstr_unterm('x')
72       assert_nothing_raised(ArgumentError, enc.name) {s.cstr_term}
73       s.set_len(s.bytesize / 2)
74       assert_equal(len / 2, s.size, enc.name)
75       s.cstr_unterm('x')
76       assert_equal(0, s.cstr_term, enc.name)
77     end
78   end
80   def test_wchar_lstrip!
81     assert_wchars_term_char(" a") {|s| s.lstrip!}
82   end
84   def test_wchar_rstrip!
85     assert_wchars_term_char("a ") {|s| s.rstrip!}
86   end
88   def test_wchar_chop!
89     assert_wchars_term_char("a\n") {|s| s.chop!}
90   end
92   def test_wchar_chomp!
93     assert_wchars_term_char("a\n") {|s| s.chomp!}
94   end
96   def test_wchar_aset
97     assert_wchars_term_char("a"*30) {|s| s[29,1] = ""}
98   end
100   def test_wchar_sub!
101     assert_wchars_term_char("foobar") {|s| s.sub!(/#{"foo".encode(s.encoding)}/, "")}
102   end
104   def test_wchar_delete!
105     assert_wchars_term_char("foobar") {|s| s.delete!("ao".encode(s.encoding))}
106   end
108   def test_wchar_squeeze!
109     assert_wchars_term_char("foo!") {|s| s.squeeze!}
110   end
112   def test_wchar_tr!
113     assert_wchars_term_char("\u{3042}foobar") {|s|
114       enc = s.encoding
115       s.tr!("\u{3042}".encode(enc), "c".encode(enc))
116     }
117   end
119   def test_wchar_tr_s!
120     assert_wchars_term_char("\u{3042}foobar") {|s|
121       enc = s.encoding
122       s.tr_s!("\u{3042}".encode(enc), "c".encode(enc))
123     }
124   end
126   def test_wchar_replace
127     assert_wchars_term_char("abc") {|s|
128       w = s.dup
129       s.replace("abcdefghijklmnop")
130       s.replace(w)
131     }
132   end
134   def test_embedded_from_heap
135     gh821 = "[GH-821]"
136     embedded_string = "abcdefghi"
137     string = embedded_string.gsub("efg", "123")
138     {}[string] = 1
139     non_terminated = "#{string}#{nil}"
140     assert_nil(Bug::String.cstr_term_char(non_terminated), gh821)
142     result = {}
143     WCHARS.map do |enc|
144       embedded_string = "ab".encode(enc)
145       string = embedded_string.gsub("b".encode(enc), "1".encode(enc))
146       {}[string] = 1
147       non_terminated = "#{string}#{nil}"
148       c = Bug::String.cstr_term_char(non_terminated)
149       result[enc] = c if c
150     end
151     assert_empty(result, gh821)
152   end
154   def assert_wchars_term_char(str)
155     result = {}
156     WCHARS.map do |enc|
157       s = Bug::String.new(str.encode(enc))
158       yield s
159       c = s.cstr_term_char
160       result[enc] = c if c
161     end
162     assert_empty(result)
163   end