diff options
Diffstat (limited to 'spec/ruby/core/regexp/match_spec.rb')
-rw-r--r-- | spec/ruby/core/regexp/match_spec.rb | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/spec/ruby/core/regexp/match_spec.rb b/spec/ruby/core/regexp/match_spec.rb new file mode 100644 index 0000000000..872c3ff59e --- /dev/null +++ b/spec/ruby/core/regexp/match_spec.rb @@ -0,0 +1,148 @@ +# -*- encoding: utf-8 -*- +require File.expand_path('../../../spec_helper', __FILE__) + +describe :regexp_match, shared: true do + it "returns nil if there is no match" do + /xyz/.send(@method,"abxyc").should be_nil + end + + it "returns nil if the object is nil" do + /\w+/.send(@method, nil).should be_nil + end +end + +describe "Regexp#=~" do + it_behaves_like(:regexp_match, :=~) + + it "returns the index of the first character of the matching region" do + (/(.)(.)(.)/ =~ "abc").should == 0 + end + + it "returns the index too, when argument is a Symbol" do + (/(.)(.)(.)/ =~ :abc).should == 0 + end +end + +describe "Regexp#match" do + it_behaves_like(:regexp_match, :match) + + it "returns a MatchData object" do + /(.)(.)(.)/.match("abc").should be_kind_of(MatchData) + end + + it "returns a MatchData object, when argument is a Symbol" do + /(.)(.)(.)/.match(:abc).should be_kind_of(MatchData) + end + + it "raises a TypeError on an uninitialized Regexp" do + lambda { Regexp.allocate.match('foo') }.should raise_error(TypeError) + end + + describe "with [string, position]" do + describe "when given a positive position" do + it "matches the input at a given position" do + /(.).(.)/.match("01234", 1).captures.should == ["1", "3"] + end + + with_feature :encoding do + it "uses the start as a character offset" do + /(.).(.)/.match("零一二三四", 1).captures.should == ["一", "三"] + end + + it "raises an ArgumentError for an invalid encoding" do + x96 = ([150].pack('C')).force_encoding('utf-8') + lambda { /(.).(.)/.match("Hello, #{x96} world!", 1) }.should raise_error(ArgumentError) + end + end + end + + describe "when given a negative position" do + it "matches the input at a given position" do + /(.).(.)/.match("01234", -4).captures.should == ["1", "3"] + end + + with_feature :encoding do + it "uses the start as a character offset" do + /(.).(.)/.match("零一二三四", -4).captures.should == ["一", "三"] + end + + it "raises an ArgumentError for an invalid encoding" do + x96 = ([150].pack('C')).force_encoding('utf-8') + lambda { /(.).(.)/.match("Hello, #{x96} world!", -1) }.should raise_error(ArgumentError) + end + end + end + + describe "when passed a block" do + it "yields the MatchData" do + /./.match("abc") {|m| ScratchPad.record m } + ScratchPad.recorded.should be_kind_of(MatchData) + end + + it "returns the block result" do + /./.match("abc") { :result }.should == :result + end + + it "does not yield if there is no match" do + ScratchPad.record [] + /a/.match("b") {|m| ScratchPad << m } + ScratchPad.recorded.should == [] + end + end + end + + it "resets $~ if passed nil" do + # set $~ + /./.match("a") + $~.should be_kind_of(MatchData) + + /1/.match(nil) + $~.should be_nil + end + + it "raises TypeError when the given argument cannot be coarce to String" do + f = 1 + lambda { /foo/.match(f)[0] }.should raise_error(TypeError) + end + + it "raises TypeError when the given argument is an Exception" do + f = Exception.new("foo") + lambda { /foo/.match(f)[0] }.should raise_error(TypeError) + end +end + +ruby_version_is "2.4" do + describe "Regexp#match?" do + before :each do + # Resetting Regexp.last_match + /DONTMATCH/.match '' + end + + context "when matches the given value" do + it "returns true but does not set Regexp.last_match" do + /string/i.match?('string').should be_true + Regexp.last_match.should be_nil + end + end + + it "returns false when does not match the given value" do + /STRING/.match?('string').should be_false + end + + it "takes matching position as the 2nd argument" do + /str/i.match?('string', 0).should be_true + /str/i.match?('string', 1).should be_false + end + + it "returns false when given nil" do + /./.match?(nil).should be_false + end + end +end + +describe "Regexp#~" do + it "matches against the contents of $_" do + $_ = "input data" + (~ /at/).should == 7 + end +end |