PageRenderTime 53ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/test/ruby/test_m17n.rb

http://github.com/ruby/ruby
Ruby | 1715 lines | 1467 code | 229 blank | 19 comment | 19 complexity | 4209cfb73644538dc9c32b9f1e119527 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, AGPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. # coding: US-ASCII
  2. # frozen_string_literal: false
  3. require 'test/unit'
  4. class TestM17N < Test::Unit::TestCase
  5. def assert_encoding(encname, actual, message=nil)
  6. assert_equal(Encoding.find(encname), actual, message)
  7. end
  8. module AESU
  9. def ua(str) str.dup.force_encoding("US-ASCII") end
  10. def a(str) str.b end
  11. def e(str) str.dup.force_encoding("EUC-JP") end
  12. def s(str) str.dup.force_encoding("Windows-31J") end
  13. def u(str) str.dup.force_encoding("UTF-8") end
  14. end
  15. include AESU
  16. extend AESU
  17. def assert_strenc(bytes, enc, actual, message=nil)
  18. assert_instance_of(String, actual, message)
  19. enc = Encoding.find(enc) if String === enc
  20. assert_equal(enc, actual.encoding, message)
  21. assert_equal(a(bytes), a(actual), message)
  22. end
  23. def assert_regexp_generic_encoding(r)
  24. assert_not_predicate(r, :fixed_encoding?)
  25. %w[ASCII-8BIT EUC-JP Windows-31J UTF-8].each {|ename|
  26. # "\xc2\xa1" is a valid sequence for ASCII-8BIT, EUC-JP, Windows-31J and UTF-8.
  27. assert_nothing_raised { r =~ "\xc2\xa1".force_encoding(ename) }
  28. }
  29. end
  30. def assert_regexp_fixed_encoding(r)
  31. assert_predicate(r, :fixed_encoding?)
  32. %w[ASCII-8BIT EUC-JP Windows-31J UTF-8].each {|ename|
  33. enc = Encoding.find(ename)
  34. if enc == r.encoding
  35. assert_nothing_raised { r =~ "\xc2\xa1".force_encoding(enc) }
  36. else
  37. assert_raise(Encoding::CompatibilityError) { r =~ "\xc2\xa1".force_encoding(enc) }
  38. end
  39. }
  40. end
  41. def assert_regexp_generic_ascii(r)
  42. assert_encoding("US-ASCII", r.encoding)
  43. assert_regexp_generic_encoding(r)
  44. end
  45. def assert_regexp_fixed_ascii8bit(r)
  46. assert_encoding("ASCII-8BIT", r.encoding)
  47. assert_regexp_fixed_encoding(r)
  48. end
  49. def assert_regexp_fixed_eucjp(r)
  50. assert_encoding("EUC-JP", r.encoding)
  51. assert_regexp_fixed_encoding(r)
  52. end
  53. def assert_regexp_fixed_sjis(r)
  54. assert_encoding("Windows-31J", r.encoding)
  55. assert_regexp_fixed_encoding(r)
  56. end
  57. def assert_regexp_fixed_utf8(r)
  58. assert_encoding("UTF-8", r.encoding)
  59. assert_regexp_fixed_encoding(r)
  60. end
  61. def assert_regexp_usascii_literal(r, enc, ex = nil)
  62. code = "# -*- encoding: US-ASCII -*-\n#{r}.encoding"
  63. if ex
  64. assert_raise(ex) { eval(code) }
  65. else
  66. assert_equal(enc, eval(code))
  67. end
  68. end
  69. def encdump(str)
  70. d = str.dump
  71. if /\.force_encoding\("[A-Za-z0-9.:_+-]*"\)\z/ =~ d
  72. d
  73. else
  74. "#{d}.force_encoding(#{str.encoding.name.dump})"
  75. end
  76. end
  77. def encdumpargs(args)
  78. r = '('
  79. args.each_with_index {|a, i|
  80. r << ',' if 0 < i
  81. if String === a
  82. r << encdump(a)
  83. else
  84. r << a.inspect
  85. end
  86. }
  87. r << ')'
  88. r
  89. end
  90. def assert_str_enc_propagation(t, s1, s2)
  91. if !s1.ascii_only?
  92. assert_equal(s1.encoding, t.encoding)
  93. elsif !s2.ascii_only?
  94. assert_equal(s2.encoding, t.encoding)
  95. else
  96. assert_include([s1.encoding, s2.encoding], t.encoding)
  97. end
  98. end
  99. def assert_same_result(expected_proc, actual_proc)
  100. e = nil
  101. begin
  102. t = expected_proc.call
  103. rescue
  104. e = $!
  105. end
  106. if e
  107. assert_raise(e.class) { actual_proc.call }
  108. else
  109. assert_equal(t, actual_proc.call)
  110. end
  111. end
  112. def str_enc_compatible?(*strs)
  113. encs = []
  114. strs.each {|s|
  115. encs << s.encoding if !s.ascii_only?
  116. }
  117. encs.uniq!
  118. encs.length <= 1
  119. end
  120. # tests start
  121. def test_string_ascii_literal
  122. assert_encoding("ASCII-8BIT", eval(a(%{""})).encoding)
  123. assert_encoding("ASCII-8BIT", eval(a(%{"a"})).encoding)
  124. end
  125. def test_string_eucjp_literal
  126. assert_encoding("EUC-JP", eval(e(%{""})).encoding)
  127. assert_encoding("EUC-JP", eval(e(%{"a"})).encoding)
  128. assert_encoding("EUC-JP", eval(e(%{"\xa1\xa1"})).encoding)
  129. assert_encoding("EUC-JP", eval(e(%{"\\xa1\\xa1"})).encoding)
  130. assert_encoding("EUC-JP", eval(e(%{"\\x20"})).encoding)
  131. assert_encoding("EUC-JP", eval(e(%{"\\n"})).encoding)
  132. assert_encoding("EUC-JP", eval(e(%{"\\x80"})).encoding)
  133. end
  134. def test_utf8_literal
  135. assert_equal(Encoding::UTF_8, "\u3042".encoding, "[ruby-dev:33406] \"\\u3042\".encoding")
  136. assert_raise(SyntaxError) { eval(a('\u3052\x80')) }
  137. end
  138. def test_string_mixed_unicode
  139. assert_raise(SyntaxError) { eval(a(%{"\xc2\xa1\\u{6666}"})) }
  140. assert_raise(SyntaxError) { eval(e(%{"\xc2\xa1\\u{6666}"})) }
  141. assert_raise(SyntaxError) { eval(s(%{"\xc2\xa1\\u{6666}"})) }
  142. assert_nothing_raised { eval(u(%{"\xc2\xa1\\u{6666}"})) }
  143. assert_raise(SyntaxError) { eval(a(%{"\\u{6666}\xc2\xa1"})) }
  144. assert_raise(SyntaxError) { eval(e(%{"\\u{6666}\xc2\xa1"})) }
  145. assert_raise(SyntaxError) { eval(s(%{"\\u{6666}\xc2\xa1"})) }
  146. assert_nothing_raised { eval(u(%{"\\u{6666}\xc2\xa1"})) }
  147. end
  148. def test_string_inspect_invalid
  149. assert_equal('"\xFE"', e("\xfe").inspect)
  150. assert_equal('"\x8E"', e("\x8e").inspect)
  151. assert_equal('"\x8F"', e("\x8f").inspect)
  152. assert_equal('"\x8F\xA1"', e("\x8f\xa1").inspect)
  153. assert_equal('"\xEF"', s("\xef").inspect)
  154. assert_equal('"\xC2"', u("\xc2").inspect)
  155. assert_equal('"\xE0\x80"', u("\xe0\x80").inspect)
  156. assert_equal('"\xF0\x80\x80"', u("\xf0\x80\x80").inspect)
  157. assert_equal('"\xF8\x80\x80\x80"', u("\xf8\x80\x80\x80").inspect)
  158. assert_equal('"\xFC\x80\x80\x80\x80"', u("\xfc\x80\x80\x80\x80").inspect)
  159. assert_equal('"\xFE "', e("\xfe ").inspect)
  160. assert_equal('"\x8E "', e("\x8e ").inspect)
  161. assert_equal('"\x8F "', e("\x8f ").inspect)
  162. assert_equal('"\x8F\xA1 "', e("\x8f\xa1 ").inspect)
  163. assert_equal('"\xEF "', s("\xef ").inspect)
  164. assert_equal('"\xC2 "', u("\xc2 ").inspect)
  165. assert_equal('"\xE0\x80 "', u("\xe0\x80 ").inspect)
  166. assert_equal('"\xF0\x80\x80 "', u("\xf0\x80\x80 ").inspect)
  167. assert_equal('"\xF8\x80\x80\x80 "', u("\xf8\x80\x80\x80 ").inspect)
  168. assert_equal('"\xFC\x80\x80\x80\x80 "', u("\xfc\x80\x80\x80\x80 ").inspect)
  169. assert_equal('"\x81."', s("\x81.").inspect)
  170. assert_equal('"\xFC"', u("\xfc").inspect)
  171. end
  172. def test_string_inspect_encoding
  173. EnvUtil.suppress_warning do
  174. begin
  175. orig_int = Encoding.default_internal
  176. orig_ext = Encoding.default_external
  177. Encoding.default_internal = nil
  178. [Encoding::UTF_8, Encoding::EUC_JP, Encoding::Windows_31J, Encoding::GB18030].
  179. each do |e|
  180. Encoding.default_external = e
  181. str = "\x81\x30\x81\x30".force_encoding('GB18030')
  182. assert_equal(Encoding::GB18030 == e ? %{"#{str}"} : '"\x{81308130}"', str.inspect)
  183. str = e("\xa1\x8f\xa1\xa1")
  184. expected = "\"\\xA1\x8F\xA1\xA1\"".force_encoding("EUC-JP")
  185. assert_equal(Encoding::EUC_JP == e ? expected : "\"\\xA1\\x{8FA1A1}\"", str.inspect)
  186. str = s("\x81@")
  187. assert_equal(Encoding::Windows_31J == e ? %{"#{str}"} : '"\x{8140}"', str.inspect)
  188. str = "\u3042\u{10FFFD}"
  189. assert_equal(Encoding::UTF_8 == e ? %{"#{str}"} : '"\u3042\u{10FFFD}"', str.inspect)
  190. end
  191. Encoding.default_external = Encoding::UTF_8
  192. [Encoding::UTF_16BE, Encoding::UTF_16LE, Encoding::UTF_32BE, Encoding::UTF_32LE,
  193. Encoding::UTF8_SOFTBANK].each do |e|
  194. str = "abc".encode(e)
  195. assert_equal('"abc"', str.inspect)
  196. end
  197. ensure
  198. Encoding.default_internal = orig_int
  199. Encoding.default_external = orig_ext
  200. end
  201. end
  202. end
  203. STR_WITHOUT_BOM = "\u3042".freeze
  204. STR_WITH_BOM = "\uFEFF\u3042".freeze
  205. bug8940 = '[ruby-core:59757] [Bug #8940]'
  206. bug9415 = '[ruby-dev:47895] [Bug #9415]'
  207. %w/UTF-16 UTF-32/.each do |enc|
  208. %w/BE LE/.each do |endian|
  209. bom = "\uFEFF".encode("#{enc}#{endian}").force_encoding(enc)
  210. define_method("test_utf_16_32_inspect(#{enc}#{endian})") do
  211. s = STR_WITHOUT_BOM.encode(enc + endian)
  212. # When a UTF-16/32 string doesn't have a BOM,
  213. # inspect as a dummy encoding string.
  214. assert_equal(s.dup.force_encoding("ISO-2022-JP").inspect,
  215. s.dup.force_encoding(enc).inspect)
  216. assert_normal_exit("#{bom.b.dump}.force_encoding('#{enc}').inspect", bug8940)
  217. end
  218. define_method("test_utf_16_32_codepoints(#{enc}#{endian})") do
  219. assert_equal([0xFEFF], bom.codepoints, bug9415)
  220. end
  221. define_method("test_utf_16_32_ord(#{enc}#{endian})") do
  222. assert_equal(0xFEFF, bom.ord, bug9415)
  223. end
  224. define_method("test_utf_16_32_inspect(#{enc}#{endian}-BOM)") do
  225. s = STR_WITH_BOM.encode(enc + endian)
  226. # When a UTF-16/32 string has a BOM,
  227. # inspect as a particular encoding string.
  228. assert_equal(s.inspect,
  229. s.dup.force_encoding(enc).inspect)
  230. end
  231. end
  232. end
  233. def test_utf_without_bom_asciionly
  234. bug10598 = '[ruby-core:66835] [Bug #10598]'
  235. encs = [Encoding::UTF_16, Encoding::UTF_32].find_all {|enc|
  236. "abcd".force_encoding(enc).ascii_only?
  237. }
  238. assert_empty(encs, bug10598)
  239. end
  240. def test_utf_without_bom_valid
  241. encs = [Encoding::UTF_16, Encoding::UTF_32].find_all {|enc|
  242. !(+"abcd").encode!(enc).force_encoding(enc).valid_encoding?
  243. }
  244. assert_empty(encs)
  245. end
  246. def test_object_utf16_32_inspect
  247. EnvUtil.suppress_warning do
  248. begin
  249. orig_int = Encoding.default_internal
  250. orig_ext = Encoding.default_external
  251. Encoding.default_internal = nil
  252. Encoding.default_external = Encoding::UTF_8
  253. o = Object.new
  254. [Encoding::UTF_16BE, Encoding::UTF_16LE, Encoding::UTF_32BE, Encoding::UTF_32LE].each do |e|
  255. o.instance_eval "undef inspect;def inspect;'abc'.encode('#{e}');end"
  256. assert_equal '[abc]', [o].inspect
  257. end
  258. ensure
  259. Encoding.default_internal = orig_int
  260. Encoding.default_external = orig_ext
  261. end
  262. end
  263. end
  264. def test_object_inspect_external
  265. orig_v, $VERBOSE = $VERBOSE, false
  266. orig_int, Encoding.default_internal = Encoding.default_internal, nil
  267. orig_ext = Encoding.default_external
  268. o = Object.new
  269. Encoding.default_external = Encoding::UTF_16BE
  270. def o.inspect
  271. "abc"
  272. end
  273. assert_nothing_raised(Encoding::CompatibilityError) { [o].inspect }
  274. def o.inspect
  275. "abc".encode(Encoding.default_external)
  276. end
  277. assert_equal '[abc]', [o].inspect
  278. Encoding.default_external = Encoding::US_ASCII
  279. def o.inspect
  280. "\u3042"
  281. end
  282. assert_equal '[\u3042]', [o].inspect
  283. def o.inspect
  284. "\x82\xa0".force_encoding(Encoding::Windows_31J)
  285. end
  286. assert_equal '[\x{82A0}]', [o].inspect
  287. ensure
  288. Encoding.default_internal = orig_int
  289. Encoding.default_external = orig_ext
  290. $VERBOSE = orig_v
  291. end
  292. def test_str_dump
  293. [
  294. e("\xfe"),
  295. e("\x8e"),
  296. e("\x8f"),
  297. e("\x8f\xa1"),
  298. s("\xef"),
  299. u("\xc2"),
  300. u("\xe0\x80"),
  301. u("\xf0\x80\x80"),
  302. u("\xf8\x80\x80\x80"),
  303. u("\xfc\x80\x80\x80\x80"),
  304. e("\xfe "),
  305. e("\x8e "),
  306. e("\x8f "),
  307. e("\x8f\xa1 "),
  308. s("\xef "),
  309. u("\xc2 "),
  310. u("\xe0\x80 "),
  311. u("\xf0\x80\x80 "),
  312. u("\xf8\x80\x80\x80 "),
  313. u("\xfc\x80\x80\x80\x80 "),
  314. e("\xa1\x8f\xa1\xa1"),
  315. s("\x81."),
  316. s("\x81@"),
  317. u("\xfc"),
  318. "\u3042",
  319. "ascii",
  320. "\u3042".encode("UTF-16LE"),
  321. "\u3042".encode("UTF-16BE"),
  322. ].each do |str|
  323. dump = str.dump
  324. assert_equal(str, eval(dump), "[ruby-dev:33142]")
  325. assert_equal(str, dump.undump)
  326. assert_equal(str, eval("# frozen-string-literal: true\n#{dump}"), '[Bug #14687]')
  327. end
  328. end
  329. def test_validate_redundant_utf8
  330. bits_0x10ffff = "11110100 10001111 10111111 10111111"
  331. [
  332. "0xxxxxxx",
  333. "110XXXXx 10xxxxxx",
  334. "1110XXXX 10Xxxxxx 10xxxxxx",
  335. "11110XXX 10XXxxxx 10xxxxxx 10xxxxxx",
  336. "111110XX 10XXXxxx 10xxxxxx 10xxxxxx 10xxxxxx",
  337. "1111110X 10XXXXxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx",
  338. "11111110 10XXXXXx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx",
  339. "11111111 10XXXXXX 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx",
  340. ].each {|pat0|
  341. [
  342. pat0.gsub(/x/, '1'),
  343. pat0.gsub(/x/, '0')
  344. ].each {|pat1|
  345. [
  346. pat1.sub(/X([^X]*)\z/, '1\1').gsub(/X/, "0"),
  347. pat1.gsub(/X/, "1"),
  348. ].each {|pat2|
  349. s = [pat2.gsub(/ /, "")].pack("B*").force_encoding("utf-8")
  350. if pat2 <= bits_0x10ffff
  351. assert_predicate(s, :valid_encoding?, "#{pat2}")
  352. else
  353. assert_not_predicate(s, :valid_encoding?, "#{pat2}")
  354. end
  355. }
  356. if / / =~ pat0
  357. pat3 = pat1.gsub(/X/, "0")
  358. s = [pat3.gsub(/ /, "")].pack("B*").force_encoding("utf-8")
  359. assert_not_predicate(s, :valid_encoding?, "#{pat3}")
  360. end
  361. }
  362. }
  363. end
  364. def test_validate_surrogate
  365. # 1110XXXX 10Xxxxxx 10xxxxxx : 3 bytes UTF-8
  366. pats = [
  367. "11101101 10011111 10111111", # just before surrogate high
  368. "11101101 1010xxxx 10xxxxxx", # surrogate high
  369. "11101101 1011xxxx 10xxxxxx", # surrogate low
  370. "11101110 10000000 10000000", # just after surrogate low
  371. ]
  372. pats.values_at(1,2).each {|pat0|
  373. [
  374. pat0.gsub(/x/, '0'),
  375. pat0.gsub(/x/, '1'),
  376. ].each {|pat1|
  377. s = [pat1.gsub(/ /, "")].pack("B*").force_encoding("utf-8")
  378. assert_not_predicate(s, :valid_encoding?, "#{pat1}")
  379. }
  380. }
  381. pats.values_at(0,3).each {|pat|
  382. s = [pat.gsub(/ /, "")].pack("B*").force_encoding("utf-8")
  383. assert_predicate(s, :valid_encoding?, "#{pat}")
  384. }
  385. end
  386. def test_regexp_too_short_multibyte_character
  387. assert_raise(SyntaxError) { eval('/\xfe/e') }
  388. assert_raise(SyntaxError) { eval('/\x8e/e') }
  389. assert_raise(SyntaxError) { eval('/\x8f/e') }
  390. assert_raise(SyntaxError) { eval('/\x8f\xa1/e') }
  391. assert_raise(SyntaxError) { eval('/\xef/s') }
  392. assert_raise(SyntaxError) { eval('/\xc2/u') }
  393. assert_raise(SyntaxError) { eval('/\xe0\x80/u') }
  394. assert_raise(SyntaxError) { eval('/\xf0\x80\x80/u') }
  395. assert_raise(SyntaxError) { eval('/\xf8\x80\x80\x80/u') }
  396. assert_raise(SyntaxError) { eval('/\xfc\x80\x80\x80\x80/u') }
  397. # raw 8bit
  398. assert_raise(SyntaxError) { eval("/\xfe/e") }
  399. assert_raise(SyntaxError) { eval("/\xc2/u") }
  400. # invalid suffix
  401. assert_raise(SyntaxError) { eval('/\xc2\xff/u') }
  402. assert_raise(SyntaxError) { eval('/\xc2 /u') }
  403. assert_raise(SyntaxError) { eval('/\xc2\x20/u') }
  404. end
  405. def test_regexp_generic
  406. assert_regexp_generic_ascii(/a/)
  407. assert_regexp_generic_ascii(Regexp.new(a("a")))
  408. assert_regexp_generic_ascii(Regexp.new(e("a")))
  409. assert_regexp_generic_ascii(Regexp.new(s("a")))
  410. assert_regexp_generic_ascii(Regexp.new(u("a")))
  411. [/a/, Regexp.new(a("a"))].each {|r|
  412. assert_equal(0, r =~ a("a"))
  413. assert_equal(0, r =~ e("a"))
  414. assert_equal(0, r =~ s("a"))
  415. assert_equal(0, r =~ u("a"))
  416. assert_equal(nil, r =~ a("\xc2\xa1"))
  417. assert_equal(nil, r =~ e("\xc2\xa1"))
  418. assert_equal(nil, r =~ s("\xc2\xa1"))
  419. assert_equal(nil, r =~ u("\xc2\xa1"))
  420. }
  421. end
  422. def test_regexp_ascii_none
  423. r = /a/n
  424. assert_warning(%r{historical binary regexp match /\.\.\./n against}) {
  425. assert_regexp_generic_ascii(r)
  426. }
  427. assert_equal(0, r =~ a("a"))
  428. assert_equal(0, r =~ e("a"))
  429. assert_equal(0, r =~ s("a"))
  430. assert_equal(0, r =~ u("a"))
  431. assert_equal(nil, r =~ a("\xc2\xa1"))
  432. assert_warning(%r{historical binary regexp match /\.\.\./n against EUC-JP string}) {
  433. assert_equal(nil, r =~ e("\xc2\xa1"))
  434. }
  435. assert_warning(%r{historical binary regexp match /\.\.\./n against Windows-31J string}) {
  436. assert_equal(nil, r =~ s("\xc2\xa1"))
  437. }
  438. assert_warning(%r{historical binary regexp match /\.\.\./n against UTF-8 string}) {
  439. assert_equal(nil, r =~ u("\xc2\xa1"))
  440. }
  441. assert_nothing_raised { eval(e("/\\x80/n")) }
  442. end
  443. def test_regexp_ascii
  444. assert_regexp_fixed_ascii8bit(/\xc2\xa1/n)
  445. assert_regexp_fixed_ascii8bit(eval(a(%{/\xc2\xa1/})))
  446. assert_regexp_fixed_ascii8bit(eval(a(%{/\xc2\xa1/n})))
  447. assert_regexp_fixed_ascii8bit(eval(a(%q{/\xc2\xa1/})))
  448. s = '\xc2\xa1'
  449. assert_regexp_fixed_ascii8bit(/#{s}/)
  450. assert_raise(SyntaxError) { eval("/\xa1\xa1/n".force_encoding("euc-jp")) }
  451. [/\xc2\xa1/n, eval(a(%{/\xc2\xa1/})), eval(a(%{/\xc2\xa1/n}))].each {|r|
  452. assert_equal(nil, r =~ a("a"))
  453. assert_equal(nil, r =~ e("a"))
  454. assert_equal(nil, r =~ s("a"))
  455. assert_equal(nil, r =~ u("a"))
  456. assert_equal(0, r =~ a("\xc2\xa1"))
  457. assert_raise(Encoding::CompatibilityError) { r =~ e("\xc2\xa1") }
  458. assert_raise(Encoding::CompatibilityError) { r =~ s("\xc2\xa1") }
  459. assert_raise(Encoding::CompatibilityError) { r =~ u("\xc2\xa1") }
  460. }
  461. end
  462. def test_regexp_euc
  463. assert_regexp_fixed_eucjp(/a/e)
  464. assert_regexp_fixed_eucjp(/\xc2\xa1/e)
  465. assert_regexp_fixed_eucjp(eval(e(%{/\xc2\xa1/})))
  466. assert_regexp_fixed_eucjp(eval(e(%q{/\xc2\xa1/})))
  467. [/a/e].each {|r|
  468. assert_equal(0, r =~ a("a"))
  469. assert_equal(0, r =~ e("a"))
  470. assert_equal(0, r =~ s("a"))
  471. assert_equal(0, r =~ u("a"))
  472. assert_raise(Encoding::CompatibilityError) { r =~ a("\xc2\xa1") }
  473. assert_equal(nil, r =~ e("\xc2\xa1"))
  474. assert_raise(Encoding::CompatibilityError) { r =~ s("\xc2\xa1") }
  475. assert_raise(Encoding::CompatibilityError) { r =~ u("\xc2\xa1") }
  476. }
  477. [/\xc2\xa1/e, eval(e(%{/\xc2\xa1/})), eval(e(%q{/\xc2\xa1/}))].each {|r|
  478. assert_equal(nil, r =~ a("a"))
  479. assert_equal(nil, r =~ e("a"))
  480. assert_equal(nil, r =~ s("a"))
  481. assert_equal(nil, r =~ u("a"))
  482. assert_raise(Encoding::CompatibilityError) { r =~ a("\xc2\xa1") }
  483. assert_equal(0, r =~ e("\xc2\xa1"))
  484. assert_raise(Encoding::CompatibilityError) { r =~ s("\xc2\xa1") }
  485. assert_raise(Encoding::CompatibilityError) { r =~ u("\xc2\xa1") }
  486. }
  487. end
  488. def test_regexp_sjis
  489. assert_regexp_fixed_sjis(/a/s)
  490. assert_regexp_fixed_sjis(/\xc2\xa1/s)
  491. assert_regexp_fixed_sjis(eval(s(%{/\xc2\xa1/})))
  492. assert_regexp_fixed_sjis(eval(s(%q{/\xc2\xa1/})))
  493. end
  494. def test_regexp_windows_31j
  495. begin
  496. Regexp.new("\xa1".force_encoding("windows-31j")) =~ "\xa1\xa1".force_encoding("euc-jp")
  497. rescue Encoding::CompatibilityError
  498. err = $!
  499. end
  500. assert_match(/windows-31j/i, err.message)
  501. end
  502. def test_regexp_embed
  503. r = eval(e("/\xc2\xa1/"))
  504. assert_raise(RegexpError) { eval(s("/\xc2\xa1\#{r}/s")) }
  505. assert_raise(RegexpError) { eval(s("/\#{r}\xc2\xa1/s")) }
  506. r = /\xc2\xa1/e
  507. assert_raise(RegexpError) { eval(s("/\xc2\xa1\#{r}/s")) }
  508. assert_raise(RegexpError) { eval(s("/\#{r}\xc2\xa1/s")) }
  509. r = eval(e("/\xc2\xa1/"))
  510. assert_raise(RegexpError) { /\xc2\xa1#{r}/s }
  511. r = /\xc2\xa1/e
  512. assert_raise(RegexpError) { /\xc2\xa1#{r}/s }
  513. r1 = Regexp.new('foo'.force_encoding("ascii-8bit"))
  514. r2 = eval('/bar#{r1}/'.force_encoding('ascii-8bit'))
  515. assert_equal(Encoding::US_ASCII, r2.encoding)
  516. r1 = Regexp.new('foo'.force_encoding("us-ascii"))
  517. r2 = eval('/bar#{r1}/'.force_encoding('ascii-8bit'))
  518. assert_equal(Encoding::US_ASCII, r2.encoding)
  519. r1 = Regexp.new('foo'.force_encoding("ascii-8bit"))
  520. r2 = eval('/bar#{r1}/'.force_encoding('us-ascii'))
  521. assert_equal(Encoding::US_ASCII, r2.encoding)
  522. r1 = Regexp.new('foo'.force_encoding("us-ascii"))
  523. r2 = eval('/bar#{r1}/'.force_encoding('us-ascii'))
  524. assert_equal(Encoding::US_ASCII, r2.encoding)
  525. r1 = Regexp.new('\xa1'.force_encoding("ascii-8bit"))
  526. r2 = eval('/bar#{r1}/'.force_encoding('ascii-8bit'))
  527. assert_equal(Encoding::ASCII_8BIT, r2.encoding)
  528. r1 = Regexp.new('\xa1'.force_encoding("ascii-8bit"))
  529. r2 = eval('/bar#{r1}/'.force_encoding('us-ascii'))
  530. assert_equal(Encoding::ASCII_8BIT, r2.encoding)
  531. r1 = Regexp.new('foo'.force_encoding("ascii-8bit"))
  532. r2 = eval('/\xa1#{r1}/'.force_encoding('ascii-8bit'))
  533. assert_equal(Encoding::ASCII_8BIT, r2.encoding)
  534. r1 = Regexp.new('foo'.force_encoding("us-ascii"))
  535. r2 = eval('/\xa1#{r1}/'.force_encoding('ascii-8bit'))
  536. assert_equal(Encoding::ASCII_8BIT, r2.encoding)
  537. r1 = Regexp.new('\xa1'.force_encoding("ascii-8bit"))
  538. r2 = eval('/\xa1#{r1}/'.force_encoding('ascii-8bit'))
  539. assert_equal(Encoding::ASCII_8BIT, r2.encoding)
  540. [r1, r2]
  541. end
  542. def test_regexp_named_class
  543. assert_match(/[[:space:]]/u, "\u{00a0}")
  544. assert_match(/[[:space:]]/, "\u{00a0}")
  545. end
  546. def test_regexp_property
  547. s = '\p{Hiragana}'.force_encoding("euc-jp")
  548. assert_equal(Encoding::EUC_JP, s.encoding)
  549. r = nil
  550. assert_nothing_raised {
  551. r = Regexp.new(s)
  552. }
  553. assert_predicate(r, :fixed_encoding?)
  554. assert_match(r, "\xa4\xa2".force_encoding("euc-jp"))
  555. r = eval('/\p{Hiragana}/'.force_encoding("euc-jp"))
  556. assert_predicate(r, :fixed_encoding?)
  557. assert_match(r, "\xa4\xa2".force_encoding("euc-jp"))
  558. r = /\p{Hiragana}/e
  559. assert_predicate(r, :fixed_encoding?)
  560. assert_match(r, "\xa4\xa2".force_encoding("euc-jp"))
  561. r = /\p{AsciI}/e
  562. assert_predicate(r, :fixed_encoding?)
  563. assert_match(r, "a".force_encoding("euc-jp"))
  564. r = /\p{hiraganA}/e
  565. assert_predicate(r, :fixed_encoding?)
  566. assert_match(r, "\xa4\xa2".force_encoding("euc-jp"))
  567. r = eval('/\u{3042}\p{Hiragana}/'.force_encoding("euc-jp"))
  568. assert_predicate(r, :fixed_encoding?)
  569. assert_equal(Encoding::UTF_8, r.encoding)
  570. r = eval('/\p{Hiragana}\u{3042}/'.force_encoding("euc-jp"))
  571. assert_predicate(r, :fixed_encoding?)
  572. assert_equal(Encoding::UTF_8, r.encoding)
  573. end
  574. def test_regexp_embed_preprocess
  575. r1 = /\xa4\xa2/e
  576. r2 = /#{r1}/
  577. assert_include(r2.source, r1.source)
  578. end
  579. def test_begin_end_offset
  580. str = e("\244\242\244\244\244\246\244\250\244\252a")
  581. assert(/(a)/ =~ str)
  582. assert_equal("a", $&)
  583. assert_equal(5, $~.begin(0))
  584. assert_equal(6, $~.end(0))
  585. assert_equal([5,6], $~.offset(0))
  586. assert_equal(5, $~.begin(1))
  587. assert_equal(6, $~.end(1))
  588. assert_equal([5,6], $~.offset(1))
  589. end
  590. def test_begin_end_offset_sjis
  591. str = s("\x81@@")
  592. assert(/@/ =~ str)
  593. assert_equal(s("\x81@"), $`)
  594. assert_equal("@", $&)
  595. assert_equal("", $')
  596. assert_equal([1,2], $~.offset(0))
  597. end
  598. def test_quote
  599. assert_regexp_generic_ascii(/#{Regexp.quote(a("a"))}#{Regexp.quote(e("e"))}/)
  600. assert_encoding("US-ASCII", Regexp.quote(a("")).encoding)
  601. assert_encoding("US-ASCII", Regexp.quote(e("")).encoding)
  602. assert_encoding("US-ASCII", Regexp.quote(s("")).encoding)
  603. assert_encoding("US-ASCII", Regexp.quote(u("")).encoding)
  604. assert_encoding("US-ASCII", Regexp.quote(a("a")).encoding)
  605. assert_encoding("US-ASCII", Regexp.quote(e("a")).encoding)
  606. assert_encoding("US-ASCII", Regexp.quote(s("a")).encoding)
  607. assert_encoding("US-ASCII", Regexp.quote(u("a")).encoding)
  608. assert_encoding("ASCII-8BIT", Regexp.quote(a("\xc2\xa1")).encoding)
  609. assert_encoding("EUC-JP", Regexp.quote(e("\xc2\xa1")).encoding)
  610. assert_encoding("Windows-31J", Regexp.quote(s("\xc2\xa1")).encoding)
  611. assert_encoding("UTF-8", Regexp.quote(u("\xc2\xa1")).encoding)
  612. end
  613. def test_union_0
  614. r = Regexp.union
  615. assert_regexp_generic_ascii(r)
  616. assert_not_match(r, a(""))
  617. assert_not_match(r, e(""))
  618. assert_not_match(r, s(""))
  619. assert_not_match(r, u(""))
  620. end
  621. def test_union_1_asciionly_string
  622. assert_regexp_generic_ascii(Regexp.union(a("")))
  623. assert_regexp_generic_ascii(Regexp.union(e("")))
  624. assert_regexp_generic_ascii(Regexp.union(s("")))
  625. assert_regexp_generic_ascii(Regexp.union(u("")))
  626. assert_regexp_generic_ascii(Regexp.union(a("a")))
  627. assert_regexp_generic_ascii(Regexp.union(e("a")))
  628. assert_regexp_generic_ascii(Regexp.union(s("a")))
  629. assert_regexp_generic_ascii(Regexp.union(u("a")))
  630. assert_regexp_generic_ascii(Regexp.union(a("\t")))
  631. assert_regexp_generic_ascii(Regexp.union(e("\t")))
  632. assert_regexp_generic_ascii(Regexp.union(s("\t")))
  633. assert_regexp_generic_ascii(Regexp.union(u("\t")))
  634. end
  635. def test_union_1_nonascii_string
  636. assert_regexp_fixed_ascii8bit(Regexp.union(a("\xc2\xa1")))
  637. assert_regexp_fixed_eucjp(Regexp.union(e("\xc2\xa1")))
  638. assert_regexp_fixed_sjis(Regexp.union(s("\xc2\xa1")))
  639. assert_regexp_fixed_utf8(Regexp.union(u("\xc2\xa1")))
  640. end
  641. def test_union_1_regexp
  642. assert_regexp_generic_ascii(Regexp.union(//))
  643. assert_warning(%r{historical binary regexp match /.../n against}) {
  644. assert_regexp_generic_ascii(Regexp.union(//n))
  645. }
  646. assert_regexp_fixed_eucjp(Regexp.union(//e))
  647. assert_regexp_fixed_sjis(Regexp.union(//s))
  648. assert_regexp_fixed_utf8(Regexp.union(//u))
  649. end
  650. def test_union_2
  651. ary = [
  652. a(""), e(""), s(""), u(""),
  653. a("\xc2\xa1"), e("\xc2\xa1"), s("\xc2\xa1"), u("\xc2\xa1")
  654. ]
  655. ary.each {|s1|
  656. ary.each {|s2|
  657. if s1.empty?
  658. if s2.empty?
  659. assert_regexp_generic_ascii(Regexp.union(s1, s2))
  660. else
  661. r = Regexp.union(s1, s2)
  662. assert_regexp_fixed_encoding(r)
  663. assert_equal(s2.encoding, r.encoding)
  664. end
  665. else
  666. if s2.empty?
  667. r = Regexp.union(s1, s2)
  668. assert_regexp_fixed_encoding(r)
  669. assert_equal(s1.encoding, r.encoding)
  670. else
  671. if s1.encoding == s2.encoding
  672. r = Regexp.union(s1, s2)
  673. assert_regexp_fixed_encoding(r)
  674. assert_equal(s1.encoding, r.encoding)
  675. else
  676. assert_raise(ArgumentError) { Regexp.union(s1, s2) }
  677. end
  678. end
  679. end
  680. }
  681. }
  682. end
  683. def test_dynamic_ascii_regexp
  684. assert_warning(%r{historical binary regexp match /.../n against}) {
  685. assert_regexp_generic_ascii(/#{ }/n)
  686. }
  687. assert_regexp_fixed_ascii8bit(/#{ }\xc2\xa1/n)
  688. assert_regexp_fixed_ascii8bit(/\xc2\xa1#{ }/n)
  689. assert_nothing_raised { s1, s2 = a('\xc2'), a('\xa1'); /#{s1}#{s2}/ }
  690. end
  691. def test_dynamic_eucjp_regexp
  692. assert_regexp_fixed_eucjp(/#{ }/e)
  693. assert_regexp_fixed_eucjp(/#{ }\xc2\xa1/e)
  694. assert_regexp_fixed_eucjp(/\xc2\xa1#{ }/e)
  695. assert_raise(SyntaxError) { eval('/\xc2#{ }/e') }
  696. assert_raise(SyntaxError) { eval('/#{ }\xc2/e') }
  697. assert_raise(SyntaxError) { eval('/\xc2#{ }\xa1/e') }
  698. assert_raise(ArgumentError) { s1, s2 = e('\xc2'), e('\xa1'); /#{s1}#{s2}/ }
  699. end
  700. def test_dynamic_sjis_regexp
  701. assert_regexp_fixed_sjis(/#{ }/s)
  702. assert_regexp_fixed_sjis(/#{ }\xc2\xa1/s)
  703. assert_regexp_fixed_sjis(/\xc2\xa1#{ }/s)
  704. assert_raise(SyntaxError) { eval('/\x81#{ }/s') }
  705. assert_raise(SyntaxError) { eval('/#{ }\x81/s') }
  706. assert_raise(SyntaxError) { eval('/\x81#{ }\xa1/s') }
  707. assert_raise(ArgumentError) { s1, s2 = s('\x81'), s('\xa1'); /#{s1}#{s2}/ }
  708. end
  709. def test_dynamic_utf8_regexp
  710. assert_regexp_fixed_utf8(/#{ }/u)
  711. assert_regexp_fixed_utf8(/#{ }\xc2\xa1/u)
  712. assert_regexp_fixed_utf8(/\xc2\xa1#{ }/u)
  713. assert_raise(SyntaxError) { eval('/\xc2#{ }/u') }
  714. assert_raise(SyntaxError) { eval('/#{ }\xc2/u') }
  715. assert_raise(SyntaxError) { eval('/\xc2#{ }\xa1/u') }
  716. assert_raise(ArgumentError) { s1, s2 = u('\xc2'), u('\xa1'); /#{s1}#{s2}/ }
  717. end
  718. def test_regexp_unicode
  719. assert_nothing_raised { eval '/\u{0}/u' }
  720. assert_nothing_raised { eval '/\u{D7FF}/u' }
  721. assert_raise(SyntaxError) { eval '/\u{D800}/u' }
  722. assert_raise(SyntaxError) { eval '/\u{DFFF}/u' }
  723. assert_nothing_raised { eval '/\u{E000}/u' }
  724. assert_nothing_raised { eval '/\u{10FFFF}/u' }
  725. assert_raise(SyntaxError) { eval '/\u{110000}/u' }
  726. end
  727. def test_regexp_mixed_unicode
  728. assert_raise(SyntaxError) { eval(a(%{/\xc2\xa1\\u{6666}/})) }
  729. assert_raise(SyntaxError) { eval(e(%{/\xc2\xa1\\u{6666}/})) }
  730. assert_raise(SyntaxError) { eval(s(%{/\xc2\xa1\\u{6666}/})) }
  731. assert_nothing_raised { eval(u(%{/\xc2\xa1\\u{6666}/})) }
  732. assert_raise(SyntaxError) { eval(a(%{/\\u{6666}\xc2\xa1/})) }
  733. assert_raise(SyntaxError) { eval(e(%{/\\u{6666}\xc2\xa1/})) }
  734. assert_raise(SyntaxError) { eval(s(%{/\\u{6666}\xc2\xa1/})) }
  735. assert_nothing_raised { eval(u(%{/\\u{6666}\xc2\xa1/})) }
  736. assert_raise(SyntaxError) { eval(a(%{/\\xc2\\xa1\\u{6666}/})) }
  737. assert_raise(SyntaxError) { eval(e(%{/\\xc2\\xa1\\u{6666}/})) }
  738. assert_raise(SyntaxError) { eval(s(%{/\\xc2\\xa1\\u{6666}/})) }
  739. assert_nothing_raised { eval(u(%{/\\xc2\\xa1\\u{6666}/})) }
  740. assert_raise(SyntaxError) { eval(a(%{/\\u{6666}\\xc2\\xa1/})) }
  741. assert_raise(SyntaxError) { eval(e(%{/\\u{6666}\\xc2\\xa1/})) }
  742. assert_raise(SyntaxError) { eval(s(%{/\\u{6666}\\xc2\\xa1/})) }
  743. assert_nothing_raised { eval(u(%{/\\u{6666}\\xc2\\xa1/})) }
  744. assert_raise(SyntaxError) { eval(a(%{/\xc2\xa1#{ }\\u{6666}/})) }
  745. assert_raise(SyntaxError) { eval(e(%{/\xc2\xa1#{ }\\u{6666}/})) }
  746. assert_raise(SyntaxError) { eval(s(%{/\xc2\xa1#{ }\\u{6666}/})) }
  747. assert_nothing_raised { eval(u(%{/\xc2\xa1#{ }\\u{6666}/})) }
  748. assert_raise(SyntaxError) { eval(a(%{/\\u{6666}#{ }\xc2\xa1/})) }
  749. assert_raise(SyntaxError) { eval(e(%{/\\u{6666}#{ }\xc2\xa1/})) }
  750. assert_raise(SyntaxError) { eval(s(%{/\\u{6666}#{ }\xc2\xa1/})) }
  751. assert_nothing_raised { eval(u(%{/\\u{6666}#{ }\xc2\xa1/})) }
  752. assert_raise(SyntaxError) { eval(a(%{/\\xc2\\xa1#{ }\\u{6666}/})) }
  753. assert_raise(SyntaxError) { eval(e(%{/\\xc2\\xa1#{ }\\u{6666}/})) }
  754. assert_raise(SyntaxError) { eval(s(%{/\\xc2\\xa1#{ }\\u{6666}/})) }
  755. assert_nothing_raised { eval(u(%{/\\xc2\\xa1#{ }\\u{6666}/})) }
  756. assert_raise(SyntaxError) { eval(a(%{/\\u{6666}#{ }\\xc2\\xa1/})) }
  757. assert_raise(SyntaxError) { eval(e(%{/\\u{6666}#{ }\\xc2\\xa1/})) }
  758. assert_raise(SyntaxError) { eval(s(%{/\\u{6666}#{ }\\xc2\\xa1/})) }
  759. assert_nothing_raised { eval(u(%{/\\u{6666}#{ }\\xc2\\xa1/})) }
  760. end
  761. def test_str_allocate
  762. s = String.allocate
  763. assert_equal(Encoding::ASCII_8BIT, s.encoding)
  764. end
  765. def test_str_String
  766. s = String(10)
  767. assert_equal(Encoding::US_ASCII, s.encoding)
  768. end
  769. def test_sprintf_c
  770. assert_strenc("\x80", 'ASCII-8BIT', a("%c") % 128)
  771. #assert_raise(ArgumentError) { a("%c") % 0xc2a1 }
  772. assert_strenc("\xc2\xa1", 'EUC-JP', e("%c") % 0xc2a1)
  773. assert_raise(ArgumentError) { e("%c") % 0xc2 }
  774. assert_strenc("\xc2", 'Windows-31J', s("%c") % 0xc2)
  775. #assert_raise(ArgumentError) { s("%c") % 0xc2a1 }
  776. assert_strenc("\u{c2a1}", 'UTF-8', u("%c") % 0xc2a1)
  777. assert_strenc("\u{c2}", 'UTF-8', u("%c") % 0xc2)
  778. assert_raise(Encoding::CompatibilityError) {
  779. "%s%s" % [s("\xc2\xa1"), e("\xc2\xa1")]
  780. }
  781. end
  782. def test_sprintf_p
  783. Encoding.list.each do |e|
  784. format = "%p".force_encoding(e)
  785. ['', 'a', "\xC2\xA1", "\x00"].each do |s|
  786. s.force_encoding(e)
  787. enc = (''.force_encoding(e) + s.inspect).encoding
  788. assert_strenc(s.inspect, enc, format % s)
  789. end
  790. s = "\xC2\xA1".force_encoding(e)
  791. enc = ('' + s.inspect).encoding
  792. assert_strenc('%10s' % s.inspect, enc, "%10p" % s)
  793. end
  794. end
  795. def test_sprintf_s
  796. assert_strenc('', 'ASCII-8BIT', a("%s") % a(""))
  797. assert_strenc('', 'EUC-JP', e("%s") % e(""))
  798. assert_strenc('', 'Windows-31J', s("%s") % s(""))
  799. assert_strenc('', 'UTF-8', u("%s") % u(""))
  800. assert_strenc('a', 'ASCII-8BIT', a("%s") % a("a"))
  801. assert_strenc('a', 'EUC-JP', e("%s") % e("a"))
  802. assert_strenc('a', 'Windows-31J', s("%s") % s("a"))
  803. assert_strenc('a', 'UTF-8', u("%s") % u("a"))
  804. assert_strenc("\xC2\xA1", 'ASCII-8BIT', a("%s") % a("\xc2\xa1"))
  805. assert_strenc("\xC2\xA1", 'EUC-JP', e("%s") % e("\xc2\xa1"))
  806. #assert_strenc("\xC2\xA1", 'Windows-31J', s("%s") % s("\xc2\xa1"))
  807. assert_strenc("\xC2\xA1", 'UTF-8', u("%s") % u("\xc2\xa1"))
  808. assert_strenc(" \xC2\xA1", 'ASCII-8BIT', "%10s" % a("\xc2\xa1"))
  809. assert_strenc(" \xA1\xA1", 'EUC-JP', "%10s" % e("\xa1\xa1"))
  810. #assert_strenc(" \xC2\xA1", 'Windows-31J', "%10s" % s("\xc2\xa1"))
  811. assert_strenc(" \xC2\xA1", 'UTF-8', "%10s" % u("\xc2\xa1"))
  812. assert_strenc("\x00", 'ASCII-8BIT', a("%s") % a("\x00"))
  813. assert_strenc("\x00", 'EUC-JP', e("%s") % e("\x00"))
  814. assert_strenc("\x00", 'Windows-31J', s("%s") % s("\x00"))
  815. assert_strenc("\x00", 'UTF-8', u("%s") % u("\x00"))
  816. assert_equal("EUC-JP", (e("\xc2\xa1 %s") % "foo").encoding.name)
  817. end
  818. def test_str_lt
  819. assert_operator(a("a"), :<, a("\xa1"))
  820. assert_operator(a("a"), :<, s("\xa1"))
  821. assert_operator(s("a"), :<, a("\xa1"))
  822. end
  823. def test_str_multiply
  824. str = "\u3042"
  825. assert_equal(true, (str * 0).ascii_only?, "[ruby-dev:33895]")
  826. assert_equal(false, (str * 1).ascii_only?)
  827. assert_equal(false, (str * 2).ascii_only?)
  828. end
  829. def test_str_aref
  830. assert_equal(a("\xc2"), a("\xc2\xa1")[0])
  831. assert_equal(a("\xa1"), a("\xc2\xa1")[1])
  832. assert_equal(nil, a("\xc2\xa1")[2])
  833. assert_equal(e("\xc2\xa1"), e("\xc2\xa1")[0])
  834. assert_equal(nil, e("\xc2\xa1")[1])
  835. assert_equal(s("\xc2"), s("\xc2\xa1")[0])
  836. assert_equal(s("\xa1"), s("\xc2\xa1")[1])
  837. assert_equal(nil, s("\xc2\xa1")[2])
  838. assert_equal(u("\xc2\xa1"), u("\xc2\xa1")[0])
  839. assert_equal(nil, u("\xc2\xa1")[1])
  840. str = "\u3042"
  841. assert_equal(true, str[0, 0].ascii_only?, "[ruby-dev:33895]")
  842. assert_equal(false, str[0, 1].ascii_only?)
  843. assert_equal(false, str[0..-1].ascii_only?)
  844. end
  845. def test_utf8str_aref
  846. s = "abcdefghijklmnopqrstuvwxyz\u{3042 3044 3046 3048 304A}"
  847. assert_equal("a", s[0])
  848. assert_equal("h", s[7])
  849. assert_equal("i", s[8])
  850. assert_equal("j", s[9])
  851. assert_equal("\u{3044}", s[27])
  852. assert_equal("\u{3046}", s[28])
  853. assert_equal("\u{3048}", s[29])
  854. s = "abcdefghijklmnopqrstuvw\u{3042 3044 3046 3048 304A}"
  855. assert_equal("\u{3044}", s[24])
  856. end
  857. def test_str_aref_len
  858. assert_equal(a("\xa1"), a("\xc2\xa1\xc2\xa2\xc2\xa3")[1, 1])
  859. assert_equal(a("\xa1\xc2"), a("\xc2\xa1\xc2\xa2\xc2\xa3")[1, 2])
  860. assert_equal(e("\xc2\xa2"), e("\xc2\xa1\xc2\xa2\xc2\xa3")[1, 1])
  861. assert_equal(e("\xc2\xa2\xc2\xa3"), e("\xc2\xa1\xc2\xa2\xc2\xa3")[1, 2])
  862. assert_equal(s("\xa1"), s("\xc2\xa1\xc2\xa2\xc2\xa3")[1, 1])
  863. assert_equal(s("\xa1\xc2"), s("\xc2\xa1\xc2\xa2\xc2\xa3")[1, 2])
  864. assert_equal(u("\xc2\xa2"), u("\xc2\xa1\xc2\xa2\xc2\xa3")[1, 1])
  865. assert_equal(u("\xc2\xa2\xc2\xa3"), u("\xc2\xa1\xc2\xa2\xc2\xa3")[1, 2])
  866. end
  867. def test_str_aref_substr
  868. assert_equal(a("\xa1\xc2"), a("\xc2\xa1\xc2\xa2\xc2\xa3")[a("\xa1\xc2")])
  869. assert_raise(Encoding::CompatibilityError) { a("\xc2\xa1\xc2\xa2\xc2\xa3")[e("\xa1\xc2")] }
  870. assert_equal(nil, e("\xc2\xa1\xc2\xa2\xc2\xa3")[e("\xa1\xc2")])
  871. assert_raise(Encoding::CompatibilityError) { e("\xc2\xa1\xc2\xa2\xc2\xa3")[s("\xa1\xc2")] }
  872. assert_equal(s("\xa1\xc2"), s("\xc2\xa1\xc2\xa2\xc2\xa3")[s("\xa1\xc2")])
  873. assert_raise(Encoding::CompatibilityError) { s("\xc2\xa1\xc2\xa2\xc2\xa3")[u("\xa1\xc2")] }
  874. assert_equal(nil, u("\xc2\xa1\xc2\xa2\xc2\xa3")[u("\xa1\xc2")])
  875. assert_raise(Encoding::CompatibilityError) { u("\xc2\xa1\xc2\xa2\xc2\xa3")[a("\xa1\xc2")] }
  876. assert_nil(e("\xa1\xa2\xa3\xa4")[e("\xa2\xa3")])
  877. bug2379 = '[ruby-core:26787]'
  878. assert_equal("\u{439}", "\u{439}"[0, 30], bug2379)
  879. assert_equal("\u{439}", "a\u{439}"[1, 30], bug2379)
  880. assert_equal("\u{439}", "a\u{439}bcdefghijklmnop"[1, 1][0, 1], bug2379)
  881. end
  882. def test_str_aref_force_encoding
  883. bug5836 = '[ruby-core:41896]'
  884. Encoding.list.each do |enc|
  885. next unless enc.ascii_compatible?
  886. s = "abc".force_encoding(enc)
  887. assert_equal("", s[3, 1], bug5836)
  888. end
  889. end
  890. def test_aset
  891. s = e("\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4")
  892. assert_raise(Encoding::CompatibilityError){s["\xb0\xa3"] = "foo"}
  893. a = ua("a")
  894. a[/a/] = u("")
  895. assert_equal Encoding::US_ASCII, a.encoding
  896. end
  897. def test_str_center
  898. assert_encoding("EUC-JP", "a".center(5, e("\xa1\xa2")).encoding)
  899. assert_encoding("EUC-JP", e("\xa3\xb0").center(10).encoding)
  900. end
  901. def test_squeeze
  902. s = e("\xa3\xb0\xa3\xb1\xa3\xb1\xa3\xb3\xa3\xb4")
  903. assert_equal(e("\xa3\xb0\xa3\xb1\xa3\xb3\xa3\xb4"), s.squeeze)
  904. end
  905. def test_tr
  906. s = s("\x81\x41")
  907. assert_equal(s.tr("A", "B"), s)
  908. assert_equal(s.tr_s("A", "B"), s)
  909. assert_nothing_raised {
  910. "a".force_encoding("ASCII-8BIT").tr(a("a"), a("a"))
  911. }
  912. assert_equal(e("\xA1\xA1"), a("a").tr(a("a"), e("\xA1\xA1")))
  913. assert_equal("X\u3042\u3044X", "A\u3042\u3044\u3046".tr("^\u3042\u3044", "X"))
  914. assert_equal("\u3042\u3046" * 100, ("\u3042\u3044" * 100).tr("\u3044", "\u3046"))
  915. assert_equal("Y", "\u3042".tr("^X", "Y"))
  916. end
  917. def test_tr_s
  918. assert_equal("\xA1\xA1".force_encoding("EUC-JP"),
  919. "a".force_encoding("ASCII-8BIT").tr("a".force_encoding("ASCII-8BIT"), "\xA1\xA1".force_encoding("EUC-JP")))
  920. end
  921. def test_count
  922. assert_equal(0, e("\xa1\xa2").count("z"))
  923. s = e("\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4")
  924. assert_raise(Encoding::CompatibilityError){s.count(a("\xa3\xb0"))}
  925. end
  926. def test_count_sjis_trailing_byte
  927. bug10078 = '[ruby-dev:48442] [Bug #10078]'
  928. assert_equal(0, s("\x98\x61").count("a"), bug10078)
  929. end
  930. def test_delete
  931. assert_equal(1, e("\xa1\xa2").delete("z").length)
  932. s = e("\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4")
  933. assert_raise(Encoding::CompatibilityError){s.delete(a("\xa3\xb2"))}
  934. a = "\u3042\u3044\u3046\u3042\u3044\u3046"
  935. a.delete!("\u3042\u3044", "^\u3044")
  936. assert_equal("\u3044\u3046\u3044\u3046", a)
  937. end
  938. def test_include?
  939. assert_equal(false, e("\xa1\xa2\xa3\xa4").include?(e("\xa3")))
  940. s = e("\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4")
  941. assert_equal(false, s.include?(e("\xb0\xa3")))
  942. bug11488 = '[ruby-core:70592] [Bug #11488]'
  943. each_encoding("abcdef", "def") do |str, substr|
  944. assert_equal(true, str.include?(substr), bug11488)
  945. end
  946. end
  947. def test_index
  948. s = e("\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4")
  949. assert_nil(s.index(e("\xb3\xa3")))
  950. assert_nil(e("\xa1\xa2\xa3\xa4").index(e("\xa3")))
  951. assert_nil(e("\xa1\xa2\xa3\xa4").rindex(e("\xa3")))
  952. s = e("\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4")
  953. assert_raise(Encoding::CompatibilityError){s.rindex(a("\xb1\xa3"))}
  954. bug11488 = '[ruby-core:70592] [Bug #11488]'
  955. each_encoding("abcdef", "def") do |str, substr|
  956. assert_equal(3, str.index(substr), bug11488)
  957. end
  958. end
  959. def test_next
  960. s1 = e("\xa1\xa1")
  961. s2 = s1.dup
  962. (94*94+94).times { s2.next! }
  963. assert_not_equal(s1, s2)
  964. end
  965. def test_sub
  966. s = "abc".sub(/b/, "\xa1\xa1".force_encoding("euc-jp"))
  967. assert_encoding("EUC-JP", s.encoding)
  968. assert_equal(Encoding::EUC_JP, "\xa4\xa2".force_encoding("euc-jp").sub(/./, '\&').encoding)
  969. assert_equal(Encoding::EUC_JP, "\xa4\xa2".force_encoding("euc-jp").gsub(/./, '\&').encoding)
  970. end
  971. def test_sub2
  972. s = "\x80".force_encoding("ASCII-8BIT")
  973. r = Regexp.new("\x80".force_encoding("ASCII-8BIT"))
  974. s2 = s.sub(r, "")
  975. assert_empty(s2)
  976. assert_predicate(s2, :ascii_only?)
  977. end
  978. def test_sub3
  979. repl = "\x81".force_encoding("sjis")
  980. assert_equal(false, repl.valid_encoding?)
  981. s = "a@".sub(/a/, repl)
  982. assert_predicate(s, :valid_encoding?)
  983. end
  984. def test_insert
  985. s = e("\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4")
  986. assert_equal(e("\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4a"), s.insert(-1, "a"))
  987. end
  988. def test_scan
  989. assert_equal(["a"], e("\xa1\xa2a\xa3\xa4").scan(/a/))
  990. end
  991. def test_dup_scan
  992. s1 = e("\xa4\xa2")*100
  993. s2 = s1.b
  994. s2.scan(/\A./n) {|f|
  995. assert_equal(Encoding::ASCII_8BIT, f.encoding)
  996. }
  997. end
  998. def test_dup_aref
  999. s1 = e("\xa4\xa2")*100
  1000. s2 = s1.b
  1001. assert_equal(Encoding::ASCII_8BIT, s2[10..-1].encoding)
  1002. end
  1003. def test_upto
  1004. s1 = e("\xa1\xa2")
  1005. s2 = s("\xa1\xa2")
  1006. assert_raise(Encoding::CompatibilityError){s1.upto(s2) {|x| break }}
  1007. end
  1008. def test_casecmp
  1009. s1 = s("\x81\x41")
  1010. s2 = s("\x81\x61")
  1011. assert_not_equal(0, s1.casecmp(s2))
  1012. end
  1013. def test_reverse
  1014. bug11387 = '[ruby-dev:49189] [Bug #11387]'
  1015. s1 = u("abcdefghij\xf0")
  1016. s2 = s1.reverse
  1017. assert_not_predicate(s1, :valid_encoding?, bug11387)
  1018. assert_equal(u("\xf0jihgfedcba"), s2)
  1019. assert_not_predicate(s2, :valid_encoding?, bug11387)
  1020. end
  1021. def test_reverse_bang
  1022. s = u("abcdefghij\xf0")
  1023. s.reverse!
  1024. assert_equal(u("\xf0jihgfedcba"), s)
  1025. end
  1026. def test_plus
  1027. assert_raise(Encoding::CompatibilityError){u("\xe3\x81\x82") + a("\xa1")}
  1028. end
  1029. def test_chomp
  1030. s = e("\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4")
  1031. assert_raise(Encoding::CompatibilityError){s.chomp(s("\xa3\xb4"))}
  1032. end
  1033. def test_gsub
  1034. s = 'abc'
  1035. s.ascii_only?
  1036. s.gsub!(/b/, "\x80")
  1037. assert_equal(false, s.ascii_only?, "[ruby-core:14566] reported by Sam Ruby")
  1038. s = "abc".force_encoding(Encoding::ASCII_8BIT)
  1039. assert_equal(Encoding::ASCII_8BIT, s.encoding)
  1040. assert_raise(Encoding::CompatibilityError) {
  1041. "abc".gsub(/[ac]/) {
  1042. $& == "a" ? "\xc2\xa1".force_encoding("euc-jp") :
  1043. "\xc2\xa1".force_encoding("utf-8")
  1044. }
  1045. }
  1046. s = e("\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4")
  1047. assert_equal(e("\xa3\xb0z\xa3\xb2\xa3\xb3\xa3\xb4"), s.gsub(/\xa3\xb1/e, "z"))
  1048. assert_equal(Encoding::ASCII_8BIT, (a("").gsub(//) { e("") }.encoding))
  1049. assert_equal(Encoding::ASCII_8BIT, (a("a").gsub(/a/) { e("") }.encoding))
  1050. end
  1051. def test_end_with
  1052. s1 = s("\x81\x40")
  1053. s2 = "@"
  1054. assert_equal(false, s1.end_with?(s2), "#{encdump s1}.end_with?(#{encdump s2})")
  1055. each_encoding("\u3042\u3044", "\u3044") do |_s1, _s2|
  1056. assert_equal(true, _s1.end_with?(_s2), "#{encdump _s1}.end_with?(#{encdump _s2})")
  1057. end
  1058. each_encoding("\u3042a\u3044", "a\u3044") do |_s1, _s2|
  1059. assert_equal(true, _s1.end_with?(_s2), "#{encdump _s1}.end_with?(#{encdump _s2})")
  1060. end
  1061. end
  1062. def test_each_line
  1063. s = e("\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4")
  1064. assert_raise(Encoding::CompatibilityError){s.each_line(a("\xa3\xb1")) {|l| }}
  1065. s = e("\xa4\xa2\nfoo")
  1066. actual = []
  1067. s.each_line {|line| actual << line }
  1068. expected = [e("\xa4\xa2\n"), e("foo")]
  1069. assert_equal(expected, actual)
  1070. end
  1071. def test_each_char
  1072. a = [e("\xa4\xa2"), "b", e("\xa4\xa4"), "c"]
  1073. s = "\xa4\xa2b\xa4\xa4c".force_encoding("euc-jp")
  1074. assert_equal(a, s.each_char.to_a, "[ruby-dev:33211] #{encdump s}.each_char.to_a")
  1075. end
  1076. def test_str_concat
  1077. assert_equal(1, "".concat(0xA2).size)
  1078. assert_equal(Encoding::ASCII_8BIT, "".force_encoding("US-ASCII").concat(0xA2).encoding)
  1079. assert_equal("A\x84\x31\xA4\x39".force_encoding("GB18030"),
  1080. "A".force_encoding("GB18030") << 0x8431A439)
  1081. end
  1082. def test_regexp_match
  1083. assert_equal([0,0], //.match("\xa1\xa1".force_encoding("euc-jp"),-1).offset(0))
  1084. assert_equal(0, // =~ :a)
  1085. end
  1086. def test_split
  1087. assert_equal(e("\xa1\xa2\xa1\xa3").split(//),
  1088. [e("\xa1\xa2"), e("\xa1\xa3")],
  1089. '[ruby-dev:32452]')
  1090. each_encoding("abc,def", ",", "abc", "def") do |str, sep, *expected|
  1091. assert_equal(expected, str.split(sep, -1))
  1092. end
  1093. each_encoding("abc\0def", "\0", "abc", "def") do |str, sep, *expected|
  1094. assert_equal(expected, str.split(sep, -1))
  1095. end
  1096. end
  1097. def test_nonascii_method_name
  1098. eval(e("def \xc2\xa1() @nonascii_method_name = :e end"))
  1099. eval(u("def \xc2\xa1() @nonascii_method_name = :u end"))
  1100. eval(e("\xc2\xa1()"))
  1101. assert_equal(:e, @nonascii_method_name)
  1102. eval(u("\xc2\xa1()"))
  1103. assert_equal(:u, @nonascii_method_name)
  1104. me = method(e("\xc2\xa1"))
  1105. mu = method(u("\xc2\xa1"))
  1106. assert_not_equal(me.name, mu.name)
  1107. assert_not_equal(me.inspect, mu.inspect)
  1108. assert_equal(e("\xc2\xa1"), me.name.to_s)
  1109. assert_equal(u("\xc2\xa1"), mu.name.to_s)
  1110. end
  1111. def test_symbol
  1112. s1 = "\xc2\xa1".force_encoding("euc-jp").intern
  1113. s2 = "\xc2\xa1".force_encoding("utf-8").intern
  1114. assert_not_equal(s1, s2)
  1115. end
  1116. def test_symbol_op
  1117. ops = %w"
  1118. .. ... + - * / % ** +@ -@ | ^ & ! <=> > >= < <= ==
  1119. === != =~ !~ ~ ! [] []= << >> :: `
  1120. "
  1121. ops.each do |op|
  1122. assert_equal(Encoding::US_ASCII, op.intern.encoding, "[ruby-dev:33449]")
  1123. end
  1124. end
  1125. def test_chr
  1126. 0.upto(255) {|b|
  1127. assert_equal([b].pack("C"), b.chr)
  1128. }
  1129. assert_equal("\x84\x31\xA4\x39".force_encoding("GB18030"), 0x8431A439.chr("GB18030"))
  1130. e = assert_raise(RangeError) {
  1131. 2206368128.chr(Encoding::UTF_8)
  1132. }
  1133. assert_not_match(/-\d+ out of char range/, e.message)
  1134. assert_raise(RangeError){ 0x80.chr("US-ASCII") }
  1135. assert_raise(RangeError){ 0x80.chr("SHIFT_JIS") }
  1136. assert_raise(RangeError){ 0xE0.chr("SHIFT_JIS") }
  1137. assert_raise(RangeError){ 0x100.chr("SHIFT_JIS") }
  1138. assert_raise(RangeError){ 0xA0.chr("EUC-JP") }
  1139. assert_raise(RangeError){ 0x100.chr("EUC-JP") }
  1140. assert_raise(RangeError){ 0xA1A0.chr("EUC-JP") }
  1141. end
  1142. def test_marshal
  1143. s1 = "\xa1\xa1".force_encoding("euc-jp")
  1144. s2 = Marshal.load(Marshal.dump(s1))
  1145. assert_equal(s1, s2)
  1146. end
  1147. def test_env
  1148. locale_encoding = Encoding.find("locale")
  1149. ENV.each {|k, v|
  1150. assert_equal(locale_encoding, k.encoding, k)
  1151. assert_equal(locale_encoding, v.encoding, v)
  1152. }
  1153. end
  1154. def test_empty_string
  1155. assert_equal(Encoding::US_ASCII, "".encoding)
  1156. end
  1157. def test_nil_to_s
  1158. assert_equal(Encoding::US_ASCII, nil.to_s.encoding)
  1159. end
  1160. def test_nil_inspect
  1161. assert_equal(Encoding::US_ASCII, nil.inspect.encoding)
  1162. end
  1163. def test_true_to_s
  1164. assert_equal(Encoding::US_ASCII, true.to_s.encoding)
  1165. end
  1166. def test_false_to_s
  1167. assert_equal(Encoding::US_ASCII, false.to_s.encoding)
  1168. end
  1169. def test_fixnum_to_s
  1170. assert_equal(Encoding::US_ASCII, 1.to_s.encoding)
  1171. end
  1172. def test_float_to_s
  1173. assert_equal(Encoding::US_ASCII, 1.0.to_s.encoding)
  1174. end
  1175. def test_bignum_to_s
  1176. assert_equal(Encoding::US_ASCII, (1 << 129).to_s.encoding)
  1177. end
  1178. def test_array_to_s
  1179. assert_equal(Encoding::US_ASCII, [].to_s.encoding)
  1180. assert_equal(Encoding::US_ASCII, [nil].to_s.encoding)
  1181. assert_equal(Encoding::US_ASCII, [1].to_s.encoding)
  1182. assert_equal("".inspect.encoding, [""].to_s.encoding)
  1183. assert_equal("a".inspect.encoding, ["a"].to_s.encoding)
  1184. assert_equal(Encoding::US_ASCII, [nil,1,"","a","\x20",[]].to_s.encoding)
  1185. end
  1186. def test_hash_to_s
  1187. assert_equal(Encoding::US_ASCII, {}.to_s.encoding)
  1188. assert_equal(Encoding::US_ASCII, {1=>nil,"foo"=>""}.to_s.encoding)
  1189. end
  1190. def test_encoding_find
  1191. assert_raise(TypeError) {Encoding.find(nil)}
  1192. assert_raise(TypeError) {Encoding.find(0)}
  1193. assert_raise(TypeError) {Encoding.find([])}
  1194. assert_raise(TypeError) {Encoding.find({})}
  1195. end
  1196. def test_encoding_to_s
  1197. assert_equal(Encoding::US_ASCII, Encoding::US_ASCII.to_s.encoding)
  1198. assert_equal(Encoding::US_ASCII, Encoding::US_ASCII.inspect.encoding)
  1199. end
  1200. def test_regexp_source
  1201. s = "\xa4\xa2".force_encoding("euc-jp")
  1202. r = Regexp.new(s)
  1203. t = r.source
  1204. assert_equal(s, t, "[ruby-dev:33377] Regexp.new(#{encdump s}).source")
  1205. end
  1206. def test_magic_comment
  1207. assert_equal(Encoding::US_ASCII, eval("__ENCODING__".force_encoding("US-ASCII")))
  1208. assert_equal(Encoding::ASCII_8BIT, eval("__ENCODING__".force_encoding("ASCII-8BIT")))
  1209. assert_equal(Encoding::US_ASCII, eval("# -*- encoding: US-ASCII -*-\n__ENCODING__".force_encoding("ASCII-8BIT")))
  1210. assert_equal(Encoding::ASCII_8BIT, eval("# -*- encoding: ASCII-8BIT -*-\n__ENCODING__".force_encoding("US-ASCII")))
  1211. end
  1212. def test_magic_comment_vim
  1213. assert_equal(Encoding::US_ASCII, eval("# vim: filetype=ruby, fileencoding: US-ASCII, ts=3, sw=3\n__ENCODING__".force_encoding("ASCII-8BIT")))
  1214. assert_equal(Encoding::ASCII_8BIT, eval("# vim: filetype=ruby, fileencoding: ASCII-8BIT, ts=3, sw=3\n__ENCODING__".force_encoding("US-ASCII")))
  1215. end
  1216. def test_magic_comment_at_various_positions
  1217. # after shebang
  1218. assert_equal(Encoding::US_ASCII, eval("#!/usr/bin/ruby\n# -*- encoding: US-ASCII -*-\n__ENCODING__".force_encoding("ASCII-8BIT")))
  1219. assert_equal(Encoding::ASCII_8BIT, eval("#!/usr/bin/ruby\n# -*- encoding: ASCII-8BIT -*-\n__ENCODING__".force_encoding("US-ASCII")))
  1220. # wrong position
  1221. assert_equal(Encoding::ASCII_8BIT, eval("\n# -*- encoding: US-ASCII -*-\n__ENCODING__".force_encoding("ASCII-8BIT")))
  1222. assert_equal(Encoding::US_ASCII, eval("\n# -*- encoding: ASCII-8BIT -*-\n__ENCODING__".force_encoding("US-ASCII")))
  1223. # leading expressions
  1224. assert_equal(Encoding::ASCII_8BIT, eval("v=1 # -*- encoding: US-ASCII -*-\n__ENCODING__".force_encoding("ASCII-8BIT")))
  1225. assert_equal(Encoding::US_ASCII, eval("v=1 # -*- encoding: ASCII-8BIT -*-\n__ENCODING__".force_encoding("US-ASCII")))
  1226. end
  1227. def test_regexp_usascii
  1228. assert_regexp_usascii_literal('//', Encoding::US_ASCII)
  1229. assert_regexp_usascii_literal('/#{ }/', Encoding::US_ASCII)
  1230. assert_regexp_usascii_literal('/#{"a"}/', Encoding::US_ASCII)
  1231. assert_regexp_usascii_literal('/#{%q"\x80"}/', Encoding::ASCII_8BIT)
  1232. assert_regexp_usascii_literal('/#{"\x80"}/', nil, SyntaxError)
  1233. assert_regexp_usascii_literal('/a/', Encoding::US_ASCII)
  1234. assert_regexp_usascii_literal('/a#{ }/', Encoding::US_ASCII)
  1235. assert_regexp_usascii_literal('/a#{"a"}/', Encoding::US_ASCII)
  1236. assert_regexp_usascii_literal('/a#{%q"\x80"}/', Encoding::ASCII_8BIT)
  1237. assert_regexp_usascii_literal('/a#{"\x80"}/', nil, SyntaxError)
  1238. assert_regexp_usascii_literal('/\x80/', Encoding::ASCII_8BIT)
  1239. assert_regexp_usascii_literal('/\x80#{ }/', Encoding::ASCII_8BIT)
  1240. assert_regexp_usascii_literal('/\x80#{"a"}/', Encoding::ASCII_8BIT)
  1241. assert_regexp_usascii_literal('/\x80#{%q"\x80"}/', Encoding::ASCII_8BIT)
  1242. assert_regexp_usascii_literal('/\x80#{"\x80"}/', nil, SyntaxError)
  1243. assert_regexp_usascii_literal('/\u1234/', Encoding::UTF_8)
  1244. assert_regexp_usascii_literal('/\u1234#{ }/', Encoding::UTF_8)
  1245. assert_regexp_usascii_literal('/\u1234#{"a"}/', Encoding:

Large files files are truncated, but you can click here to view the full file