PageRenderTime 57ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/test/ruby/test_regexp.rb

https://github.com/mion/ruby
Ruby | 946 lines | 911 code | 33 blank | 2 comment | 0 complexity | 647f6701ccfdb3a95ff12e30fc26b27e MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause
  1. # coding: US-ASCII
  2. require 'test/unit'
  3. require_relative 'envutil'
  4. class TestRegexp < Test::Unit::TestCase
  5. def setup
  6. @verbose = $VERBOSE
  7. $VERBOSE = nil
  8. end
  9. def teardown
  10. $VERBOSE = @verbose
  11. end
  12. def test_has_NOENCODING
  13. assert Regexp::NOENCODING
  14. re = //n
  15. assert_equal Regexp::NOENCODING, re.options
  16. end
  17. def test_ruby_dev_999
  18. assert_match(/(?<=a).*b/, "aab")
  19. assert_match(/(?<=\u3042).*b/, "\u3042ab")
  20. end
  21. def test_ruby_core_27247
  22. assert_match(/(a){2}z/, "aaz")
  23. end
  24. def test_ruby_dev_24643
  25. assert_nothing_raised("[ruby-dev:24643]") {
  26. /(?:(?:[a]*[a])?b)*a*$/ =~ "aabaaca"
  27. }
  28. end
  29. def test_ruby_talk_116455
  30. assert_match(/^(\w{2,}).* ([A-Za-z\xa2\xc0-\xff]{2,}?)$/n, "Hallo Welt")
  31. end
  32. def test_ruby_dev_24887
  33. assert_equal("a".gsub(/a\Z/, ""), "")
  34. end
  35. def test_yoshidam_net_20041111_1
  36. s = "[\xC2\xA0-\xC3\xBE]"
  37. assert_match(Regexp.new(s, nil, "u"), "\xC3\xBE")
  38. end
  39. def test_yoshidam_net_20041111_2
  40. assert_raise(RegexpError) do
  41. s = "[\xFF-\xFF]".force_encoding("utf-8")
  42. Regexp.new(s, nil, "u")
  43. end
  44. end
  45. def test_ruby_dev_31309
  46. assert_equal('Ruby', 'Ruby'.sub(/[^a-z]/i, '-'))
  47. end
  48. def test_assert_normal_exit
  49. # moved from knownbug. It caused core.
  50. Regexp.union("a", "a")
  51. end
  52. def test_to_s
  53. assert_equal '(?-mix:\x00)', Regexp.new("\0").to_s
  54. end
  55. def test_union
  56. assert_equal :ok, begin
  57. Regexp.union(
  58. "a",
  59. Regexp.new("\xc2\xa1".force_encoding("euc-jp")),
  60. Regexp.new("\xc2\xa1".force_encoding("utf-8")))
  61. :ng
  62. rescue ArgumentError
  63. :ok
  64. end
  65. end
  66. def test_word_boundary
  67. assert_match(/\u3042\b /, "\u3042 ")
  68. assert_not_match(/\u3042\ba/, "\u3042a")
  69. end
  70. def test_named_capture
  71. m = /&(?<foo>.*?);/.match("aaa &amp; yyy")
  72. assert_equal("amp", m["foo"])
  73. assert_equal("amp", m[:foo])
  74. assert_equal(5, m.begin(:foo))
  75. assert_equal(8, m.end(:foo))
  76. assert_equal([5,8], m.offset(:foo))
  77. assert_equal("aaa [amp] yyy",
  78. "aaa &amp; yyy".sub(/&(?<foo>.*?);/, '[\k<foo>]'))
  79. assert_equal('#<MatchData "&amp; y" foo:"amp">',
  80. /&(?<foo>.*?); (y)/.match("aaa &amp; yyy").inspect)
  81. assert_equal('#<MatchData "&amp; y" 1:"amp" 2:"y">',
  82. /&(.*?); (y)/.match("aaa &amp; yyy").inspect)
  83. assert_equal('#<MatchData "&amp; y" foo:"amp" bar:"y">',
  84. /&(?<foo>.*?); (?<bar>y)/.match("aaa &amp; yyy").inspect)
  85. assert_equal('#<MatchData "&amp; y" foo:"amp" foo:"y">',
  86. /&(?<foo>.*?); (?<foo>y)/.match("aaa &amp; yyy").inspect)
  87. /(?<id>[A-Za-z_]+)/ =~ "!abc"
  88. assert_equal("abc", Regexp.last_match(:id))
  89. /a/ =~ "b" # doesn't match.
  90. assert_equal(nil, Regexp.last_match)
  91. assert_equal(nil, Regexp.last_match(1))
  92. assert_equal(nil, Regexp.last_match(:foo))
  93. assert_equal(["foo", "bar"], /(?<foo>.)(?<bar>.)/.names)
  94. assert_equal(["foo"], /(?<foo>.)(?<foo>.)/.names)
  95. assert_equal([], /(.)(.)/.names)
  96. assert_equal(["foo", "bar"], /(?<foo>.)(?<bar>.)/.match("ab").names)
  97. assert_equal(["foo"], /(?<foo>.)(?<foo>.)/.match("ab").names)
  98. assert_equal([], /(.)(.)/.match("ab").names)
  99. assert_equal({"foo"=>[1], "bar"=>[2]},
  100. /(?<foo>.)(?<bar>.)/.named_captures)
  101. assert_equal({"foo"=>[1, 2]},
  102. /(?<foo>.)(?<foo>.)/.named_captures)
  103. assert_equal({}, /(.)(.)/.named_captures)
  104. assert_equal("a[b]c", "abc".sub(/(?<x>[bc])/, "[\\k<x>]"))
  105. assert_equal("o", "foo"[/(?<bar>o)/, "bar"])
  106. s = "foo"
  107. s[/(?<bar>o)/, "bar"] = "baz"
  108. assert_equal("fbazo", s)
  109. end
  110. def test_assign_named_capture
  111. assert_equal("a", eval('/(?<foo>.)/ =~ "a"; foo'))
  112. assert_equal("a", eval('foo = 1; /(?<foo>.)/ =~ "a"; foo'))
  113. assert_equal("a", eval('1.times {|foo| /(?<foo>.)/ =~ "a"; break foo }'))
  114. assert_nothing_raised { eval('/(?<Foo>.)/ =~ "a"') }
  115. assert_nil(eval('/(?<Foo>.)/ =~ "a"; defined? Foo'))
  116. end
  117. def test_assign_named_capture_to_reserved_word
  118. /(?<nil>.)/ =~ "a"
  119. assert(!local_variables.include?(:nil), "[ruby-dev:32675]")
  120. end
  121. def test_match_regexp
  122. r = /./
  123. m = r.match("a")
  124. assert_equal(r, m.regexp)
  125. re = /foo/
  126. assert_equal(re, re.match("foo").regexp)
  127. end
  128. def test_source
  129. bug5484 = '[ruby-core:40364]'
  130. assert_equal('', //.source)
  131. assert_equal('\:', /\:/.source, bug5484)
  132. assert_equal(':', %r:\::.source, bug5484)
  133. end
  134. def test_source_escaped
  135. expected, result = "$*+.?^|".each_char.map {|c|
  136. [
  137. ["\\#{c}", "\\#{c}", 1],
  138. begin
  139. re = eval("%r#{c}\\#{c}#{c}", nil, __FILE__, __LINE__)
  140. t = eval("/\\#{c}/", nil, __FILE__, __LINE__).source
  141. rescue SyntaxError => e
  142. [e, t, nil]
  143. else
  144. [re.source, t, re =~ "a#{c}a"]
  145. end
  146. ]
  147. }.transpose
  148. assert_equal(expected, result)
  149. end
  150. def test_source_escaped_paren
  151. bug7610 = '[ruby-core:51088] [Bug #7610]'
  152. bug8133 = '[ruby-core:53578] [Bug #8133]'
  153. [
  154. ["(", ")", bug7610], ["[", "]", bug8133],
  155. ["{", "}", bug8133], ["<", ">", bug8133],
  156. ].each do |lparen, rparen, bug|
  157. s = "\\#{lparen}a\\#{rparen}"
  158. assert_equal(/#{s}/, eval("%r#{lparen}#{s}#{rparen}"), bug)
  159. end
  160. end
  161. def test_source_unescaped
  162. expected, result = "!\"#%&',-/:;=@_`~".each_char.map {|c|
  163. [
  164. ["#{c}", "\\#{c}", 1],
  165. begin
  166. re = eval("%r#{c}\\#{c}#{c}", nil, __FILE__, __LINE__)
  167. t = eval("%r{\\#{c}}", nil, __FILE__, __LINE__).source
  168. rescue SyntaxError => e
  169. [e, t, nil]
  170. else
  171. [re.source, t, re =~ "a#{c}a"]
  172. end
  173. ]
  174. }.transpose
  175. assert_equal(expected, result)
  176. end
  177. def test_inspect
  178. assert_equal('//', //.inspect)
  179. assert_equal('//i', //i.inspect)
  180. assert_equal('/\//i', /\//i.inspect)
  181. assert_equal('/\//i', %r"#{'/'}"i.inspect)
  182. assert_equal('/\/x/i', /\/x/i.inspect)
  183. assert_equal('/\x00/i', /#{"\0"}/i.inspect)
  184. assert_equal("/\n/i", /#{"\n"}/i.inspect)
  185. s = [0xf1, 0xf2, 0xf3].pack("C*")
  186. assert_equal('/\/\xF1\xF2\xF3/i', /\/#{s}/i.inspect)
  187. end
  188. def test_char_to_option
  189. assert_equal("BAR", "FOOBARBAZ"[/b../i])
  190. assert_equal("bar", "foobarbaz"[/ b . . /x])
  191. assert_equal("bar\n", "foo\nbar\nbaz"[/b.../m])
  192. assert_raise(SyntaxError) { eval('//z') }
  193. end
  194. def test_char_to_option_kcode
  195. assert_equal("bar", "foobarbaz"[/b../s])
  196. assert_equal("bar", "foobarbaz"[/b../e])
  197. assert_equal("bar", "foobarbaz"[/b../u])
  198. end
  199. def test_to_s2
  200. assert_equal('(?-mix:foo)', /(?:foo)/.to_s)
  201. assert_equal('(?m-ix:foo)', /(?:foo)/m.to_s)
  202. assert_equal('(?mi-x:foo)', /(?:foo)/mi.to_s)
  203. assert_equal('(?mix:foo)', /(?:foo)/mix.to_s)
  204. assert_equal('(?m-ix:foo)', /(?m-ix:foo)/.to_s)
  205. assert_equal('(?mi-x:foo)', /(?mi-x:foo)/.to_s)
  206. assert_equal('(?mix:foo)', /(?mix:foo)/.to_s)
  207. assert_equal('(?mix:)', /(?mix)/.to_s)
  208. assert_equal('(?-mix:(?mix:foo) )', /(?mix:foo) /.to_s)
  209. end
  210. def test_casefold_p
  211. assert_equal(false, /a/.casefold?)
  212. assert_equal(true, /a/i.casefold?)
  213. assert_equal(false, /(?i:a)/.casefold?)
  214. end
  215. def test_options
  216. assert_equal(Regexp::IGNORECASE, /a/i.options)
  217. assert_equal(Regexp::EXTENDED, /a/x.options)
  218. assert_equal(Regexp::MULTILINE, /a/m.options)
  219. end
  220. def test_match_init_copy
  221. m = /foo/.match("foo")
  222. assert_equal(/foo/, m.dup.regexp)
  223. assert_raise(TypeError) do
  224. m.instance_eval { initialize_copy(nil) }
  225. end
  226. assert_equal([0, 3], m.offset(0))
  227. assert_equal(/foo/, m.dup.regexp)
  228. end
  229. def test_match_size
  230. m = /(.)(.)(\d+)(\d)/.match("THX1138.")
  231. assert_equal(5, m.size)
  232. end
  233. def test_match_offset_begin_end
  234. m = /(?<x>b..)/.match("foobarbaz")
  235. assert_equal([3, 6], m.offset("x"))
  236. assert_equal(3, m.begin("x"))
  237. assert_equal(6, m.end("x"))
  238. assert_raise(IndexError) { m.offset("y") }
  239. assert_raise(IndexError) { m.offset(2) }
  240. assert_raise(IndexError) { m.begin(2) }
  241. assert_raise(IndexError) { m.end(2) }
  242. m = /(?<x>q..)?/.match("foobarbaz")
  243. assert_equal([nil, nil], m.offset("x"))
  244. assert_equal(nil, m.begin("x"))
  245. assert_equal(nil, m.end("x"))
  246. m = /\A\u3042(.)(.)?(.)\z/.match("\u3042\u3043\u3044")
  247. assert_equal([1, 2], m.offset(1))
  248. assert_equal([nil, nil], m.offset(2))
  249. assert_equal([2, 3], m.offset(3))
  250. end
  251. def test_match_to_s
  252. m = /(?<x>b..)/.match("foobarbaz")
  253. assert_equal("bar", m.to_s)
  254. end
  255. def test_match_pre_post
  256. m = /(?<x>b..)/.match("foobarbaz")
  257. assert_equal("foo", m.pre_match)
  258. assert_equal("baz", m.post_match)
  259. end
  260. def test_match_array
  261. m = /(...)(...)(...)(...)?/.match("foobarbaz")
  262. assert_equal(["foobarbaz", "foo", "bar", "baz", nil], m.to_a)
  263. end
  264. def test_match_captures
  265. m = /(...)(...)(...)(...)?/.match("foobarbaz")
  266. assert_equal(["foo", "bar", "baz", nil], m.captures)
  267. end
  268. def test_match_aref
  269. m = /(...)(...)(...)(...)?/.match("foobarbaz")
  270. assert_equal("foo", m[1])
  271. assert_equal(["foo", "bar", "baz"], m[1..3])
  272. assert_nil(m[5])
  273. assert_raise(IndexError) { m[:foo] }
  274. end
  275. def test_match_values_at
  276. m = /(...)(...)(...)(...)?/.match("foobarbaz")
  277. assert_equal(["foo", "bar", "baz"], m.values_at(1, 2, 3))
  278. end
  279. def test_match_string
  280. m = /(?<x>b..)/.match("foobarbaz")
  281. assert_equal("foobarbaz", m.string)
  282. end
  283. def test_match_inspect
  284. m = /(...)(...)(...)(...)?/.match("foobarbaz")
  285. assert_equal('#<MatchData "foobarbaz" 1:"foo" 2:"bar" 3:"baz" 4:nil>', m.inspect)
  286. end
  287. def test_initialize
  288. assert_raise(ArgumentError) { Regexp.new }
  289. assert_equal(/foo/, Regexp.new(/foo/, Regexp::IGNORECASE))
  290. re = /foo/
  291. assert_raise(SecurityError) do
  292. Thread.new { $SAFE = 4; re.instance_eval { initialize(re) } }.join
  293. end
  294. re.taint
  295. assert_raise(SecurityError) do
  296. Thread.new { $SAFE = 4; re.instance_eval { initialize(re) } }.join
  297. end
  298. assert_equal(Encoding.find("US-ASCII"), Regexp.new("b..", nil, "n").encoding)
  299. assert_equal("bar", "foobarbaz"[Regexp.new("b..", nil, "n")])
  300. assert_equal(//n, Regexp.new("", nil, "n"))
  301. arg_encoding_none = 32 # ARG_ENCODING_NONE is implementation defined value
  302. assert_equal(arg_encoding_none, Regexp.new("", nil, "n").options)
  303. assert_equal(arg_encoding_none, Regexp.new("", nil, "N").options)
  304. assert_raise(RegexpError) { Regexp.new(")(") }
  305. end
  306. def test_unescape
  307. assert_raise(ArgumentError) { s = '\\'; /#{ s }/ }
  308. assert_equal(/\xFF/n, /#{ s="\\xFF" }/n)
  309. assert_equal(/\177/, (s = '\177'; /#{ s }/))
  310. assert_raise(ArgumentError) { s = '\u'; /#{ s }/ }
  311. assert_raise(ArgumentError) { s = '\u{ ffffffff }'; /#{ s }/ }
  312. assert_raise(ArgumentError) { s = '\u{ ffffff }'; /#{ s }/ }
  313. assert_raise(ArgumentError) { s = '\u{ ffff X }'; /#{ s }/ }
  314. assert_raise(ArgumentError) { s = '\u{ }'; /#{ s }/ }
  315. assert_equal("b", "abc"[(s = '\u{0062}'; /#{ s }/)])
  316. assert_equal("b", "abc"[(s = '\u0062'; /#{ s }/)])
  317. assert_raise(ArgumentError) { s = '\u0'; /#{ s }/ }
  318. assert_raise(ArgumentError) { s = '\u000X'; /#{ s }/ }
  319. assert_raise(ArgumentError) { s = "\xff" + '\u3042'; /#{ s }/ }
  320. assert_raise(ArgumentError) { s = '\u3042' + [0xff].pack("C"); /#{ s }/ }
  321. assert_raise(SyntaxError) { s = ''; eval(%q(/\u#{ s }/)) }
  322. assert_equal(/a/, eval(%q(s="\u0061";/#{s}/n)))
  323. assert_raise(RegexpError) { s = "\u3042"; eval(%q(/#{s}/n)) }
  324. assert_raise(RegexpError) { s = "\u0061"; eval(%q(/\u3042#{s}/n)) }
  325. assert_raise(RegexpError) { s1=[0xff].pack("C"); s2="\u3042"; eval(%q(/#{s1}#{s2}/)) }
  326. assert_raise(ArgumentError) { s = '\x'; /#{ s }/ }
  327. assert_equal("\xe1", [0x00, 0xe1, 0xff].pack("C*")[/\M-a/])
  328. assert_equal("\xdc", [0x00, 0xdc, 0xff].pack("C*")[/\M-\\/])
  329. assert_equal("\x8a", [0x00, 0x8a, 0xff].pack("C*")[/\M-\n/])
  330. assert_equal("\x89", [0x00, 0x89, 0xff].pack("C*")[/\M-\t/])
  331. assert_equal("\x8d", [0x00, 0x8d, 0xff].pack("C*")[/\M-\r/])
  332. assert_equal("\x8c", [0x00, 0x8c, 0xff].pack("C*")[/\M-\f/])
  333. assert_equal("\x8b", [0x00, 0x8b, 0xff].pack("C*")[/\M-\v/])
  334. assert_equal("\x87", [0x00, 0x87, 0xff].pack("C*")[/\M-\a/])
  335. assert_equal("\x9b", [0x00, 0x9b, 0xff].pack("C*")[/\M-\e/])
  336. assert_equal("\x01", [0x00, 0x01, 0xff].pack("C*")[/\C-a/])
  337. assert_raise(ArgumentError) { s = '\M'; /#{ s }/ }
  338. assert_raise(ArgumentError) { s = '\M-\M-a'; /#{ s }/ }
  339. assert_raise(ArgumentError) { s = '\M-\\'; /#{ s }/ }
  340. assert_raise(ArgumentError) { s = '\C'; /#{ s }/ }
  341. assert_raise(ArgumentError) { s = '\c'; /#{ s }/ }
  342. assert_raise(ArgumentError) { s = '\C-\C-a'; /#{ s }/ }
  343. assert_raise(ArgumentError) { s = '\M-\z'; /#{ s }/ }
  344. assert_raise(ArgumentError) { s = '\M-\777'; /#{ s }/ }
  345. assert_equal("\u3042\u3042", "\u3042\u3042"[(s = "\u3042" + %q(\xe3\x81\x82); /#{s}/)])
  346. assert_raise(ArgumentError) { s = "\u3042" + %q(\xe3); /#{s}/ }
  347. assert_raise(ArgumentError) { s = "\u3042" + %q(\xe3\xe3); /#{s}/ }
  348. assert_raise(ArgumentError) { s = '\u3042' + [0xff].pack("C"); /#{s}/ }
  349. assert_raise(SyntaxError) { eval("/\u3042/n") }
  350. s = ".........."
  351. 5.times { s.sub!(".", "") }
  352. assert_equal(".....", s)
  353. end
  354. def test_equal
  355. bug5484 = '[ruby-core:40364]'
  356. assert_equal(/abc/, /abc/)
  357. assert_not_equal(/abc/, /abc/m)
  358. assert_not_equal(/abc/, /abd/)
  359. assert_equal(/\/foo/, Regexp.new('/foo'), bug5484)
  360. end
  361. def test_match
  362. assert_nil(//.match(nil))
  363. assert_equal("abc", /.../.match(:abc)[0])
  364. assert_raise(TypeError) { /.../.match(Object.new)[0] }
  365. assert_equal("bc", /../.match('abc', 1)[0])
  366. assert_equal("bc", /../.match('abc', -2)[0])
  367. assert_nil(/../.match("abc", -4))
  368. assert_nil(/../.match("abc", 4))
  369. assert_equal('\x', /../n.match("\u3042" + '\x', 1)[0])
  370. r = nil
  371. /.../.match("abc") {|m| r = m[0] }
  372. assert_equal("abc", r)
  373. $_ = "abc"; assert_equal(1, ~/bc/)
  374. $_ = "abc"; assert_nil(~/d/)
  375. $_ = nil; assert_nil(~/./)
  376. end
  377. def test_eqq
  378. assert_equal(false, /../ === nil)
  379. end
  380. def test_quote
  381. assert_equal("\xff", Regexp.quote([0xff].pack("C")))
  382. assert_equal("\\ ", Regexp.quote("\ "))
  383. assert_equal("\\t", Regexp.quote("\t"))
  384. assert_equal("\\n", Regexp.quote("\n"))
  385. assert_equal("\\r", Regexp.quote("\r"))
  386. assert_equal("\\f", Regexp.quote("\f"))
  387. assert_equal("\\v", Regexp.quote("\v"))
  388. assert_equal("\u3042\\t", Regexp.quote("\u3042\t"))
  389. assert_equal("\\t\xff", Regexp.quote("\t" + [0xff].pack("C")))
  390. end
  391. def test_try_convert
  392. assert_equal(/re/, Regexp.try_convert(/re/))
  393. assert_nil(Regexp.try_convert("re"))
  394. o = Object.new
  395. assert_nil(Regexp.try_convert(o))
  396. def o.to_regexp() /foo/ end
  397. assert_equal(/foo/, Regexp.try_convert(o))
  398. end
  399. def test_union2
  400. assert_equal(/(?!)/, Regexp.union)
  401. assert_equal(/foo/, Regexp.union(/foo/))
  402. assert_equal(/foo/, Regexp.union([/foo/]))
  403. assert_equal(/\t/, Regexp.union("\t"))
  404. assert_equal(/(?-mix:\u3042)|(?-mix:\u3042)/, Regexp.union(/\u3042/, /\u3042/))
  405. assert_equal("\u3041", "\u3041"[Regexp.union(/\u3042/, "\u3041")])
  406. end
  407. def test_dup
  408. assert_equal(//, //.dup)
  409. assert_raise(TypeError) { //.instance_eval { initialize_copy(nil) } }
  410. end
  411. def test_regsub
  412. assert_equal("fooXXXbaz", "foobarbaz".sub!(/bar/, "XXX"))
  413. s = [0xff].pack("C")
  414. assert_equal(s, "X".sub!(/./, s))
  415. assert_equal('\\' + s, "X".sub!(/./, '\\' + s))
  416. assert_equal('\k', "foo".sub!(/.../, '\k'))
  417. assert_raise(RuntimeError) { "foo".sub!(/(?<x>o)/, '\k<x') }
  418. assert_equal('foo[bar]baz', "foobarbaz".sub!(/(b..)/, '[\0]'))
  419. assert_equal('foo[foo]baz', "foobarbaz".sub!(/(b..)/, '[\`]'))
  420. assert_equal('foo[baz]baz', "foobarbaz".sub!(/(b..)/, '[\\\']'))
  421. assert_equal('foo[r]baz', "foobarbaz".sub!(/(b)(.)(.)/, '[\+]'))
  422. assert_equal('foo[\\]baz', "foobarbaz".sub!(/(b..)/, '[\\\\]'))
  423. assert_equal('foo[\z]baz', "foobarbaz".sub!(/(b..)/, '[\z]'))
  424. end
  425. def test_KCODE
  426. assert_nil($KCODE)
  427. assert_nothing_raised { $KCODE = nil }
  428. assert_equal(false, $=)
  429. assert_nothing_raised { $= = nil }
  430. end
  431. def test_match_setter
  432. /foo/ =~ "foo"
  433. m = $~
  434. /bar/ =~ "bar"
  435. $~ = m
  436. assert_equal("foo", $&)
  437. end
  438. def test_last_match
  439. /(...)(...)(...)(...)?/.match("foobarbaz")
  440. assert_equal("foobarbaz", Regexp.last_match(0))
  441. assert_equal("foo", Regexp.last_match(1))
  442. assert_nil(Regexp.last_match(5))
  443. assert_nil(Regexp.last_match(-1))
  444. end
  445. def test_getter
  446. alias $__REGEXP_TEST_LASTMATCH__ $&
  447. alias $__REGEXP_TEST_PREMATCH__ $`
  448. alias $__REGEXP_TEST_POSTMATCH__ $'
  449. alias $__REGEXP_TEST_LASTPARENMATCH__ $+
  450. /(b)(.)(.)/.match("foobarbaz")
  451. assert_equal("bar", $__REGEXP_TEST_LASTMATCH__)
  452. assert_equal("foo", $__REGEXP_TEST_PREMATCH__)
  453. assert_equal("baz", $__REGEXP_TEST_POSTMATCH__)
  454. assert_equal("r", $__REGEXP_TEST_LASTPARENMATCH__)
  455. /(...)(...)(...)/.match("foobarbaz")
  456. assert_equal("baz", $+)
  457. end
  458. def test_rindex_regexp
  459. assert_equal(3, "foobarbaz\u3042".rindex(/b../n, 5))
  460. end
  461. def test_taint
  462. m = Thread.new do
  463. "foo"[/foo/]
  464. $SAFE = 4
  465. /foo/.match("foo")
  466. end.value
  467. assert(m.tainted?)
  468. assert_nothing_raised('[ruby-core:26137]') {
  469. m = proc {$SAFE = 4; %r"#{ }"o}.call
  470. }
  471. assert(m.tainted?)
  472. end
  473. def check(re, ss, fs = [], msg = nil)
  474. re = Regexp.new(re) unless re.is_a?(Regexp)
  475. ss = [ss] unless ss.is_a?(Array)
  476. ss.each do |e, s|
  477. s ||= e
  478. assert_match(re, s, msg)
  479. m = re.match(s)
  480. assert_equal(e, m[0], msg)
  481. end
  482. fs = [fs] unless fs.is_a?(Array)
  483. fs.each {|s| assert_no_match(re, s, msg) }
  484. end
  485. def failcheck(re)
  486. assert_raise(RegexpError) { %r"#{ re }" }
  487. end
  488. def test_parse
  489. check(/\*\+\?\{\}\|\(\)\<\>\`\'/, "*+?{}|()<>`'")
  490. check(/\A\w\W\z/, %w(a. b!), %w(.. ab))
  491. check(/\A.\b.\b.\B.\B.\z/, %w(a.aaa .a...), %w(aaaaa .....))
  492. check(/\A\s\S\z/, [' a', "\n."], [' ', "\n\n", 'a '])
  493. check(/\A\d\D\z/, '0a', %w(00 aa))
  494. check(/\A\h\H\z/, %w(0g ag BH), %w(a0 af GG))
  495. check(/\Afoo\Z\s\z/, "foo\n", ["foo", "foo\nbar"])
  496. assert_equal(%w(a b c), "abc def".scan(/\G\w/))
  497. check(/\A\u3042\z/, "\u3042", ["", "\u3043", "a"])
  498. check(/\A(..)\1\z/, %w(abab ....), %w(abba aba))
  499. failcheck('\1')
  500. check(/\A\80\z/, "80", ["\100", ""])
  501. check(/\A\77\z/, "?")
  502. check(/\A\78\z/, "\7" + '8', ["\100", ""])
  503. check(/\A\Qfoo\E\z/, "QfooE")
  504. check(/\Aa++\z/, "aaa")
  505. check('\Ax]\z', "x]")
  506. check(/x#foo/x, "x", "#foo")
  507. check(/\Ax#foo#{ "\n" }x\z/x, "xx", ["x", "x#foo\nx"])
  508. check(/\A\p{Alpha}\z/, ["a", "z"], [".", "", ".."])
  509. check(/\A\p{^Alpha}\z/, [".", "!"], ["!a", ""])
  510. check(/\A\n\z/, "\n")
  511. check(/\A\t\z/, "\t")
  512. check(/\A\r\z/, "\r")
  513. check(/\A\f\z/, "\f")
  514. check(/\A\a\z/, "\007")
  515. check(/\A\e\z/, "\033")
  516. check(/\A\v\z/, "\v")
  517. failcheck('(')
  518. failcheck('(?foo)')
  519. failcheck('/\p{foobarbazqux}/')
  520. failcheck('/\p{foobarbazqux' + 'a' * 1000 + '}/')
  521. failcheck('/[1-\w]/')
  522. end
  523. def test_exec
  524. check(/A*B/, %w(B AB AAB AAAB), %w(A))
  525. check(/\w*!/, %w(! a! ab! abc!), %w(abc))
  526. check(/\w*\W/, %w(! a" ab# abc$), %w(abc))
  527. check(/\w*\w/, %w(z az abz abcz), %w(!))
  528. check(/[a-z]*\w/, %w(z az abz abcz), %w(!))
  529. check(/[a-z]*\W/, %w(! a" ab# abc$), %w(A))
  530. check(/((a|bb|ccc|dddd)(1|22|333|4444))/i, %w(a1 bb1 a22), %w(a2 b1))
  531. check(/\u0080/, (1..4).map {|i| ["\u0080", "\u0080" * i] }, ["\u0081"])
  532. check(/\u0080\u0080/, (2..4).map {|i| ["\u0080" * 2, "\u0080" * i] }, ["\u0081"])
  533. check(/\u0080\u0080\u0080/, (3..4).map {|i| ["\u0080" * 3, "\u0080" * i] }, ["\u0081"])
  534. check(/\u0080\u0080\u0080\u0080/, (4..4).map {|i| ["\u0080" * 4, "\u0080" * i] }, ["\u0081"])
  535. check(/[^\u3042\u3043\u3044]/, %W(a b \u0080 \u3041 \u3045), %W(\u3042 \u3043 \u3044))
  536. check(/a.+/m, %W(a\u0080 a\u0080\u0080 a\u0080\u0080\u0080), %W(a))
  537. check(/a.+z/m, %W(a\u0080z a\u0080\u0080z a\u0080\u0080\u0080z), %W(az))
  538. check(/abc\B.\Bxyz/, %w(abcXxyz abc0xyz), %w(abc|xyz abc-xyz))
  539. check(/\Bxyz/, [%w(xyz abcXxyz), %w(xyz abc0xyz)], %w(abc xyz abc-xyz))
  540. check(/abc\B/, [%w(abc abcXxyz), %w(abc abc0xyz)], %w(abc xyz abc-xyz))
  541. failcheck('(?<foo>abc)\1')
  542. check(/^(A+|B+)(?>\g<1>)*[BC]$/, %w(AC BC ABC BAC AABBC), %w(AABB))
  543. check(/^(A+|B(?>\g<1>)*)[AC]$/, %w(AAAC BBBAAAAC), %w(BBBAAA))
  544. check(/^()(?>\g<1>)*$/, "", "a")
  545. check(/^(?>(?=a)(#{ "a" * 1000 }|))++$/, ["a" * 1000, "a" * 2000, "a" * 3000], ["", "a" * 500, "b" * 1000])
  546. check(eval('/^(?:a?)?$/'), ["", "a"], ["aa"])
  547. check(eval('/^(?:a+)?$/'), ["", "a", "aa"], ["ab"])
  548. check(/^(?:a?)+?$/, ["", "a", "aa"], ["ab"])
  549. check(/^a??[ab]/, [["a", "a"], ["a", "aa"], ["b", "b"], ["a", "ab"]], ["c"])
  550. check(/^(?:a*){3,5}$/, ["", "a", "aa", "aaa", "aaaa", "aaaaa", "aaaaaa"], ["b"])
  551. check(/^(?:a+){3,5}$/, ["aaa", "aaaa", "aaaaa", "aaaaaa"], ["", "a", "aa", "b"])
  552. end
  553. def test_parse_look_behind
  554. check(/(?<=A)B(?=C)/, [%w(B ABC)], %w(aBC ABc aBc))
  555. check(/(?<!A)B(?!C)/, [%w(B aBc)], %w(ABC aBC ABc))
  556. failcheck('(?<=.*)')
  557. failcheck('(?<!.*)')
  558. check(/(?<=A|B.)C/, [%w(C AC), %w(C BXC)], %w(C BC))
  559. check(/(?<!A|B.)C/, [%w(C C), %w(C BC)], %w(AC BXC))
  560. assert_not_match(/(?<!aa|b)c/i, "Aac")
  561. assert_not_match(/(?<!b|aa)c/i, "Aac")
  562. end
  563. def test_parse_kg
  564. check(/\A(.)(.)\k<1>(.)\z/, %w(abac abab ....), %w(abcd aaba xxx))
  565. check(/\A(.)(.)\k<-1>(.)\z/, %w(abbc abba ....), %w(abcd aaba xxx))
  566. check(/\A(?<n>.)(?<x>\g<n>){0}(?<y>\k<n+0>){0}\g<x>\g<y>\z/, "aba", "abb")
  567. check(/\A(?<n>.)(?<x>\g<n>){0}(?<y>\k<n+1>){0}\g<x>\g<y>\z/, "abb", "aba")
  568. check(/\A(?<x>..)\k<x>\z/, %w(abab ....), %w(abac abba xxx))
  569. check(/\A(.)(..)\g<-1>\z/, "abcde", %w(.... ......))
  570. failcheck('\k<x>')
  571. failcheck('\k<')
  572. failcheck('\k<>')
  573. failcheck('\k<.>')
  574. failcheck('\k<x.>')
  575. failcheck('\k<1.>')
  576. failcheck('\k<x')
  577. failcheck('\k<x+')
  578. failcheck('()\k<-2>')
  579. failcheck('()\g<-2>')
  580. check(/\A(?<x>.)(?<x>.)\k<x>\z/, %w(aba abb), %w(abc .. ....))
  581. check(/\A(?<x>.)(?<x>.)\k<x>\z/i, %w(aba ABa abb ABb), %w(abc .. ....))
  582. check('\k\g', "kg")
  583. failcheck('(.\g<1>)')
  584. failcheck('(.\g<2>)')
  585. failcheck('(?=\g<1>)')
  586. failcheck('((?=\g<1>))')
  587. failcheck('(\g<1>|.)')
  588. failcheck('(.|\g<1>)')
  589. check(/(!)(?<=(a)|\g<1>)/, ["!"], %w(a))
  590. check(/^(a|b\g<1>c)$/, %w(a bac bbacc bbbaccc), %w(bbac bacc))
  591. check(/^(a|b\g<2>c)(B\g<1>C){0}$/, %w(a bBaCc bBbBaCcCc bBbBbBaCcCcCc), %w(bBbBaCcC BbBaCcCc))
  592. check(/\A(?<n>.|X\g<n>)(?<x>\g<n>){0}(?<y>\k<n+0>){0}\g<x>\g<y>\z/, "XXaXbXXa", %w(XXabXa abb))
  593. check(/\A(?<n>.|X\g<n>)(?<x>\g<n>){0}(?<y>\k<n+1>){0}\g<x>\g<y>\z/, "XaXXbXXb", %w(aXXbXb aba))
  594. failcheck('(?<x>)(?<x>)(\g<x>)')
  595. check(/^(?<x>foo)(bar)\k<x>/, %w(foobarfoo), %w(foobar barfoo))
  596. check(/^(?<a>f)(?<a>o)(?<a>o)(?<a>b)(?<a>a)(?<a>r)(?<a>b)(?<a>a)(?<a>z)\k<a>{9}$/, %w(foobarbazfoobarbaz foobarbazbazbarfoo foobarbazzabraboof), %w(foobar barfoo))
  597. end
  598. def test_parse_curly_brace
  599. check(/\A{/, ["{", ["{", "{x"]])
  600. check(/\A{ /, ["{ ", ["{ ", "{ x"]])
  601. check(/\A{,}\z/, "{,}")
  602. check(/\A{}\z/, "{}")
  603. check(/\Aa{0}+\z/, "", %w(a aa aab))
  604. check(/\Aa{1}+\z/, %w(a aa), ["", "aab"])
  605. check(/\Aa{1,2}b{1,2}\z/, %w(ab aab abb aabb), ["", "aaabb", "abbb"])
  606. check(/(?!x){0,1}/, [ ['', 'ab'], ['', ''] ])
  607. check(/c\z{0,1}/, [ ['c', 'abc'], ['c', 'cab']], ['abd'])
  608. check(/\A{0,1}a/, [ ['a', 'abc'], ['a', '____abc']], ['bcd'])
  609. failcheck('.{100001}')
  610. failcheck('.{0,100001}')
  611. failcheck('.{1,0}')
  612. failcheck('{0}')
  613. end
  614. def test_parse_comment
  615. check(/\A(?#foo\)bar)\z/, "", "a")
  616. failcheck('(?#')
  617. end
  618. def test_char_type
  619. check(/\u3042\d/, ["\u30421", "\u30422"])
  620. # CClassTable cache test
  621. assert_match(/\u3042\d/, "\u30421")
  622. assert_match(/\u3042\d/, "\u30422")
  623. end
  624. def test_char_class
  625. failcheck('[]')
  626. failcheck('[x')
  627. check('\A[]]\z', "]", "")
  628. check('\A[]\.]+\z', %w(] . ]..]), ["", "["])
  629. check(/\A[\u3042]\z/, "\u3042", "\u3042aa")
  630. check(/\A[\u3042\x61]+\z/, ["aa\u3042aa", "\u3042\u3042", "a"], ["", "b"])
  631. check(/\A[\u3042\x61\x62]+\z/, "abab\u3042abab\u3042")
  632. check(/\A[abc]+\z/, "abcba", ["", "ada"])
  633. check(/\A[\w][\W]\z/, %w(a. b!), %w(.. ab))
  634. check(/\A[\s][\S]\z/, [' a', "\n."], [' ', "\n\n", 'a '])
  635. check(/\A[\d][\D]\z/, '0a', %w(00 aa))
  636. check(/\A[\h][\H]\z/, %w(0g ag BH), %w(a0 af GG))
  637. check(/\A[\p{Alpha}]\z/, ["a", "z"], [".", "", ".."])
  638. check(/\A[\p{^Alpha}]\z/, [".", "!"], ["!a", ""])
  639. check(/\A[\xff]\z/, "\xff", ["", "\xfe"])
  640. check(/\A[\80]+\z/, "8008", ["\\80", "\100", "\1000"])
  641. check(/\A[\77]+\z/, "???")
  642. check(/\A[\78]+\z/, "\788\7")
  643. check(/\A[\0]\z/, "\0")
  644. check(/\A[[:0]]\z/, [":", "0"], ["", ":0"])
  645. check(/\A[0-]\z/, ["0", "-"], "0-")
  646. check('\A[a-&&\w]\z', "a", "-")
  647. check('\A[--0]\z', ["-", "/", "0"], ["", "1"])
  648. check('\A[\'--0]\z', %w(* + \( \) 0 ,), ["", ".", "1"])
  649. check(/\A[a-b-]\z/, %w(a b -), ["", "c"])
  650. check('\A[a-b-&&\w]\z', %w(a b), ["", "-"])
  651. check('\A[a-b-&&\W]\z', "-", ["", "a", "b"])
  652. check('\A[a-c-e]\z', %w(a b c e -), %w(d))
  653. check(/\A[a-f&&[^b-c]&&[^e]]\z/, %w(a d f), %w(b c e g 0))
  654. check(/\A[[^b-c]&&[^e]&&a-f]\z/, %w(a d f), %w(b c e g 0))
  655. check(/\A[\n\r\t]\z/, ["\n", "\r", "\t"])
  656. failcheck('[9-1]')
  657. assert_match(/\A\d+\z/, "0123456789")
  658. assert_no_match(/\d/, "\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19")
  659. assert_match(/\A\w+\z/, "09azAZ_")
  660. assert_no_match(/\w/, "\uff10\uff19\uff41\uff5a\uff21\uff3a")
  661. assert_match(/\A\s+\z/, "\r\n\v\f\r\s")
  662. assert_no_match(/\s/, "\u0085")
  663. end
  664. def test_posix_bracket
  665. check(/\A[[:alpha:]0]\z/, %w(0 a), %w(1 .))
  666. check(/\A[[:^alpha:]0]\z/, %w(0 1 .), "a")
  667. check(/\A[[:alpha\:]]\z/, %w(a l p h a :), %w(b 0 1 .))
  668. check(/\A[[:alpha:foo]0]\z/, %w(0 a), %w(1 .))
  669. check(/\A[[:xdigit:]&&[:alpha:]]\z/, "a", %w(g 0))
  670. check('\A[[:abcdefghijklmnopqrstu:]]+\z', "[]")
  671. failcheck('[[:alpha')
  672. failcheck('[[:alpha:')
  673. failcheck('[[:alp:]]')
  674. assert_match(/\A[[:digit:]]+\z/, "\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19")
  675. assert_match(/\A[[:alnum:]]+\z/, "\uff10\uff19\uff41\uff5a\uff21\uff3a")
  676. assert_match(/\A[[:space:]]+\z/, "\r\n\v\f\r\s\u0085")
  677. assert_match(/\A[[:ascii:]]+\z/, "\x00\x7F")
  678. assert_no_match(/[[:ascii:]]/, "\x80\xFF")
  679. end
  680. def test_backward
  681. assert_equal(3, "foobar".rindex(/b.r/i))
  682. assert_equal(nil, "foovar".rindex(/b.r/i))
  683. assert_equal(3, ("foo" + "bar" * 1000).rindex(/#{"bar"*1000}/))
  684. assert_equal(4, ("foo\nbar\nbaz\n").rindex(/bar/i))
  685. end
  686. def test_uninitialized
  687. assert_raise(TypeError) { Regexp.allocate.hash }
  688. assert_raise(TypeError) { Regexp.allocate.eql? Regexp.allocate }
  689. assert_raise(TypeError) { Regexp.allocate == Regexp.allocate }
  690. assert_raise(TypeError) { Regexp.allocate =~ "" }
  691. assert_equal(false, Regexp.allocate === Regexp.allocate)
  692. assert_nil(~Regexp.allocate)
  693. assert_raise(TypeError) { Regexp.allocate.match("") }
  694. assert_raise(TypeError) { Regexp.allocate.to_s }
  695. assert_match(/^#<Regexp:.*>$/, Regexp.allocate.inspect)
  696. assert_raise(TypeError) { Regexp.allocate.source }
  697. assert_raise(TypeError) { Regexp.allocate.casefold? }
  698. assert_raise(TypeError) { Regexp.allocate.options }
  699. assert_equal(Encoding.find("ASCII-8BIT"), Regexp.allocate.encoding)
  700. assert_equal(false, Regexp.allocate.fixed_encoding?)
  701. assert_raise(TypeError) { Regexp.allocate.names }
  702. assert_raise(TypeError) { Regexp.allocate.named_captures }
  703. assert_raise(TypeError) { MatchData.allocate.regexp }
  704. assert_raise(TypeError) { MatchData.allocate.names }
  705. assert_raise(TypeError) { MatchData.allocate.size }
  706. assert_raise(TypeError) { MatchData.allocate.length }
  707. assert_raise(TypeError) { MatchData.allocate.offset(0) }
  708. assert_raise(TypeError) { MatchData.allocate.begin(0) }
  709. assert_raise(TypeError) { MatchData.allocate.end(0) }
  710. assert_raise(TypeError) { MatchData.allocate.to_a }
  711. assert_raise(TypeError) { MatchData.allocate[:foo] }
  712. assert_raise(TypeError) { MatchData.allocate.captures }
  713. assert_raise(TypeError) { MatchData.allocate.values_at }
  714. assert_raise(TypeError) { MatchData.allocate.pre_match }
  715. assert_raise(TypeError) { MatchData.allocate.post_match }
  716. assert_raise(TypeError) { MatchData.allocate.to_s }
  717. assert_match(/^#<MatchData:.*>$/, MatchData.allocate.inspect)
  718. assert_raise(TypeError) { MatchData.allocate.string }
  719. $~ = MatchData.allocate
  720. assert_raise(TypeError) { $& }
  721. assert_raise(TypeError) { $` }
  722. assert_raise(TypeError) { $' }
  723. assert_raise(TypeError) { $+ }
  724. end
  725. def test_unicode
  726. assert_match(/^\u3042{0}\p{Any}$/, "a")
  727. assert_match(/^\u3042{0}\p{Any}$/, "\u3041")
  728. assert_match(/^\u3042{0}\p{Any}$/, "\0")
  729. assert_match(/^\p{Lo}{4}$/u, "\u3401\u4E01\u{20001}\u{2A701}")
  730. assert_no_match(/^\u3042{0}\p{Any}$/, "\0\0")
  731. assert_no_match(/^\u3042{0}\p{Any}$/, "")
  732. assert_raise(SyntaxError) { eval('/^\u3042{0}\p{' + "\u3042" + '}$/') }
  733. assert_raise(SyntaxError) { eval('/^\u3042{0}\p{' + 'a' * 1000 + '}$/') }
  734. assert_raise(SyntaxError) { eval('/^\u3042{0}\p{foobarbazqux}$/') }
  735. assert_match(/^(\uff21)(a)\1\2$/i, "\uff21A\uff41a")
  736. assert_no_match(/^(\uff21)\1$/i, "\uff21A")
  737. assert_no_match(/^(\uff41)\1$/i, "\uff41a")
  738. assert_match(/^\u00df$/i, "\u00df")
  739. assert_match(/^\u00df$/i, "ss")
  740. #assert_match(/^(\u00df)\1$/i, "\u00dfss") # this must be bug...
  741. assert_match(/^\u00df{2}$/i, "\u00dfss")
  742. assert_match(/^\u00c5$/i, "\u00c5")
  743. assert_match(/^\u00c5$/i, "\u00e5")
  744. assert_match(/^\u00c5$/i, "\u212b")
  745. assert_match(/^(\u00c5)\1\1$/i, "\u00c5\u00e5\u212b")
  746. assert_match(/^\u0149$/i, "\u0149")
  747. assert_match(/^\u0149$/i, "\u02bcn")
  748. #assert_match(/^(\u0149)\1$/i, "\u0149\u02bcn") # this must be bug...
  749. assert_match(/^\u0149{2}$/i, "\u0149\u02bcn")
  750. assert_match(/^\u0390$/i, "\u0390")
  751. assert_match(/^\u0390$/i, "\u03b9\u0308\u0301")
  752. #assert_match(/^(\u0390)\1$/i, "\u0390\u03b9\u0308\u0301") # this must be bug...
  753. assert_match(/^\u0390{2}$/i, "\u0390\u03b9\u0308\u0301")
  754. assert_match(/^\ufb05$/i, "\ufb05")
  755. assert_match(/^\ufb05$/i, "\ufb06")
  756. assert_match(/^\ufb05$/i, "st")
  757. #assert_match(/^(\ufb05)\1\1$/i, "\ufb05\ufb06st") # this must be bug...
  758. assert_match(/^\ufb05{3}$/i, "\ufb05\ufb06st")
  759. assert_match(/^\u03b9\u0308\u0301$/i, "\u0390")
  760. end
  761. def test_unicode_age
  762. assert_match(/^\p{Age=6.0}$/u, "\u261c")
  763. assert_match(/^\p{Age=1.1}$/u, "\u261c")
  764. assert_no_match(/^\P{age=6.0}$/u, "\u261c")
  765. assert_match(/^\p{age=6.0}$/u, "\u31f6")
  766. assert_match(/^\p{age=3.2}$/u, "\u31f6")
  767. assert_no_match(/^\p{age=3.1}$/u, "\u31f6")
  768. assert_no_match(/^\p{age=3.0}$/u, "\u31f6")
  769. assert_no_match(/^\p{age=1.1}$/u, "\u31f6")
  770. assert_match(/^\p{age=6.0}$/u, "\u2754")
  771. assert_no_match(/^\p{age=5.0}$/u, "\u2754")
  772. assert_no_match(/^\p{age=4.0}$/u, "\u2754")
  773. assert_no_match(/^\p{age=3.0}$/u, "\u2754")
  774. assert_no_match(/^\p{age=2.0}$/u, "\u2754")
  775. assert_no_match(/^\p{age=1.1}$/u, "\u2754")
  776. end
  777. def test_matchdata
  778. a = "haystack".match(/hay/)
  779. b = "haystack".match(/hay/)
  780. assert_equal(a, b, '[ruby-core:24748]')
  781. h = {a => 42}
  782. assert_equal(42, h[b], '[ruby-core:24748]')
  783. end
  784. def test_regexp_poped
  785. assert_nothing_raised { eval("a = 1; /\#{ a }/; a") }
  786. assert_nothing_raised { eval("a = 1; /\#{ a }/o; a") }
  787. end
  788. def test_invalid_fragment
  789. bug2547 = '[ruby-core:27374]'
  790. assert_raise(SyntaxError, bug2547) {eval('/#{"\\\\"}y/')}
  791. end
  792. def test_dup_warn
  793. assert_warning(/duplicated/) { Regexp.new('[\u3042\u3043\u3042]') }
  794. assert_warning(/duplicated/) { Regexp.new('[\u3042\u3043\u3043]') }
  795. assert_warning(/\A\z/) { Regexp.new('[\u3042\u3044\u3043]') }
  796. assert_warning(/\A\z/) { Regexp.new('[\u3042\u3045\u3043]') }
  797. assert_warning(/\A\z/) { Regexp.new('[\u3042\u3045\u3044]') }
  798. assert_warning(/\A\z/) { Regexp.new('[\u3042\u3045\u3043-\u3044]') }
  799. assert_warning(/duplicated/) { Regexp.new('[\u3042\u3045\u3042-\u3043]') }
  800. assert_warning(/duplicated/) { Regexp.new('[\u3042\u3045\u3044-\u3045]') }
  801. assert_warning(/\A\z/) { Regexp.new('[\u3042\u3046\u3044]') }
  802. assert_warning(/duplicated/) { Regexp.new('[\u1000-\u2000\u3042-\u3046\u3044]') }
  803. assert_warning(/duplicated/) { Regexp.new('[\u3044\u3041-\u3047]') }
  804. assert_warning(/duplicated/) { Regexp.new('[\u3042\u3044\u3046\u3041-\u3047]') }
  805. bug7471 = '[ruby-core:50344]'
  806. assert_warning('', bug7471) { Regexp.new('[\D]') =~ "\u3042" }
  807. bug8151 = '[ruby-core:53649]'
  808. assert_warning(/\A\z/, bug8151) { Regexp.new('(?:[\u{33}])').to_s }
  809. end
  810. def test_property_warn
  811. assert_in_out_err('-w', 'x=/\p%s/', [], %r"warning: invalid Unicode Property \\p: /\\p%s/")
  812. end
  813. def test_invalid_escape_error
  814. bug3539 = '[ruby-core:31048]'
  815. error = assert_raise(SyntaxError) {eval('/\x/', nil, bug3539)}
  816. assert_match(/invalid hex escape/, error.message)
  817. assert_equal(1, error.message.scan(/.*invalid .*escape.*/i).size, bug3539)
  818. end
  819. def test_raw_hyphen_and_tk_char_type_after_range
  820. bug6853 = '[ruby-core:47115]'
  821. # use Regexp.new instead of literal to ignore a parser warning.
  822. check(Regexp.new('[0-1-\\s]'), [' ', '-'], ['2', 'a'], bug6853)
  823. end
  824. def test_error_message_on_failed_conversion
  825. bug7539 = '[ruby-core:50733]'
  826. assert_equal false, /x/=== 42
  827. err = assert_raise(TypeError){ Regexp.quote(42) }
  828. assert_equal 'no implicit conversion of Fixnum into String', err.message, bug7539
  829. end
  830. end