# re2 (http://github.com/mudge/re2) # Ruby bindings to re2, an "efficient, principled regular expression library" # # Copyright (c) 2010, Paul Mucur (http://mucur.name) # Released under the BSD Licence, please see LICENSE.txt $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) require "re2" require "test/unit" class RE2Test < Test::Unit::TestCase def test_interface assert_respond_to RE2, :Replace assert_respond_to RE2, :GlobalReplace assert_respond_to RE2, :QuoteMeta assert_respond_to RE2::Regexp, :escape assert_respond_to RE2::Regexp, :quote assert_respond_to RE2::Regexp, :new assert_respond_to RE2::Regexp, :compile r = RE2::Regexp.new('woo') assert_respond_to r, :ok? assert_respond_to r, :options assert_respond_to r, :error assert_respond_to r, :error_arg assert_respond_to r, :program_size assert_respond_to r, :to_s assert_respond_to r, :to_str assert_respond_to r, :pattern assert_respond_to r, :inspect assert_respond_to r, :match assert_respond_to r, :match? assert_respond_to r, :=~ assert_respond_to r, :=== assert_respond_to r, :number_of_capturing_groups assert_respond_to r, :utf8? assert_respond_to r, :posix_syntax? assert_respond_to r, :longest_match? assert_respond_to r, :log_errors? assert_respond_to r, :max_mem assert_respond_to r, :literal? assert_respond_to r, :never_nl? assert_respond_to r, :case_sensitive? assert_respond_to r, :case_insensitive? assert_respond_to r, :casefold? assert_respond_to r, :perl_classes? assert_respond_to r, :word_boundary? assert_respond_to r, :one_line? assert_respond_to Kernel, :RE2 end def test_global_re2 r = RE2('w(o)(o)') assert_kind_of RE2::Regexp, r assert_respond_to r, :ok? end def test_re2_compile r = RE2::Regexp.compile('w(o)(o)') assert_kind_of RE2::Regexp, r assert_respond_to r, :ok? end def test_replace assert_equal "wao", RE2::Replace("woo", "o", "a") assert_equal "hoo", RE2::Replace("woo", "w", "h") assert_equal "we", RE2::Replace("woo", "o+", "e") assert_equal "Good morning", RE2::Replace("hi", "hih?", "Good morning") assert_equal "hi", RE2::Replace("Good morning", "(?i)gOOD MORNING", "hi") name = "Robert" name_id = name.object_id assert_equal "Crobert", RE2::Replace(name, "R", "Cr") assert_equal "Crobert", name assert_equal name_id, name.object_id end def test_global_replace assert_equal "waa", RE2::GlobalReplace("woo", "o", "a") assert_equal "hoo", RE2::GlobalReplace("woo", "w", "h") assert_equal "we", RE2::GlobalReplace("woo", "o+", "e") name = "Robert" name_id = name.object_id assert_equal "wobewt", RE2::GlobalReplace(name, "(?i)R", "w") assert_equal "wobewt", name assert_equal name_id, name.object_id end def test_compiling r = RE2::Regexp.new("woo") assert r.ok? assert_equal "#", r.inspect assert_equal "woo", r.to_s end def test_number_of_capturing_groups assert_equal 3, RE2('(a)(b)(c)').number_of_capturing_groups assert_equal 0, RE2('abc').number_of_capturing_groups assert_equal 2, RE2('a((b)c)').number_of_capturing_groups end def test_matching_all_subpatterns assert_equal ["woo", "o", "o"], RE2('w(o)(o)').match('woo').to_a assert_equal ["ab", nil, "a", "b"], RE2('(\d?)(a)(b)').match('ab').to_a end def test_matchdata r = RE2('(\d+)') text = "bob 123" m = r.match(text) assert_kind_of RE2::MatchData, m assert_respond_to m, :string assert_respond_to m, :size assert_respond_to m, :length assert_respond_to m, :regexp assert_respond_to m, :to_a assert_respond_to m, :[] assert_equal r, m.regexp assert_equal text, m.string assert !text.frozen? assert m.string.frozen? assert_not_equal m.string.object_id, text.object_id assert_equal '#', m.inspect assert_equal "123", m.to_s assert_equal "123", m[0] assert_equal "123", m[1] assert_equal ["123"], m[0, 1] assert_equal ["123", "123"], m[0, 2] assert_equal ["123"], m[0...1] assert_equal ["123", "123"], m[0..1] m1, m2 = *r.match(text) assert_equal "123", m1 assert_equal "123", m2 end def test_matching_no_subpatterns assert RE2('woo').match('woo', 0) assert !RE2('bob').match('woo', 0) assert RE2('woo').match?('woo') assert !RE2('bob').match?('woo') assert RE2('woo') =~ 'woo' assert !(RE2('bob') =~ 'woo') assert !(RE2('woo') !~ 'woo') assert RE2('bob') !~ 'woo' assert RE2('woo') === 'woo' assert !(RE2('bob') === 'woo') end def test_matching_some_sub_patterns assert_equal ["woo", "o"], RE2('w(o)(o)').match('woo', 1).to_a assert_equal ["woo", "o", "o"], RE2('w(o)(o)').match('woo', 2).to_a assert_equal ["woo", "o", "o", nil], RE2('w(o)(o)').match('woo', 3).to_a assert_equal ["w", nil], RE2('w(o)?(o)?').match('w', 1).to_a assert_equal ["w", nil, nil], RE2('w(o)?(o)?').match('w', 2).to_a assert_equal ["w", nil, nil, nil], RE2('w(o)?(o)?').match('w', 3).to_a end def test_compiling_with_options r = RE2("woo", :case_sensitive => false) assert r.ok? assert r =~ "woo" assert r =~ "WOO" assert !r.options[:case_sensitive] assert r.case_insensitive? assert r.casefold? assert !r.case_sensitive? assert r.utf8? assert r.options[:utf8] end def test_replace_with_re2 r = RE2("wo{2}") assert_equal "miaow", RE2::Replace("woo", r, "miaow") assert_equal "wao", RE2::Replace("woo", RE2("o"), "a") assert_equal "hoo", RE2::Replace("woo", RE2("w"), "h") assert_equal "we", RE2::Replace("woo", RE2("o+"), "e") assert_equal "Good morning", RE2::Replace("hi", RE2("hih?"), "Good morning") assert_equal "hi", RE2::Replace("Good morning", RE2("gOOD MORNING", :case_sensitive => false), "hi") end def test_global_replace_with_re2 r = RE2("o") assert_equal "wii", RE2::GlobalReplace("woo", r, "i") assert_equal "waa", RE2::GlobalReplace("woo", RE2("o"), "a") assert_equal "hoo", RE2::GlobalReplace("woo", RE2("w"), "h") assert_equal "we", RE2::GlobalReplace("woo", RE2("o+"), "e") end def test_quote_meta assert_equal "1\\.5\\-2\\.0\\?", RE2::QuoteMeta("1.5-2.0?") assert_equal "1\\.5\\-2\\.0\\?", RE2::Regexp.escape("1.5-2.0?") assert_equal "1\\.5\\-2\\.0\\?", RE2::Regexp.quote("1.5-2.0?") end def test_re2_error r = RE2("woo") assert_equal "", r.error assert_equal "", r.error_arg end def test_re2_error_with_error r = RE2("wo(o", :log_errors => false) assert !r.ok? assert_equal "missing ): wo(o", r.error assert_equal "wo(o", r.error_arg end end