summaryrefslogtreecommitdiff
path: root/spec/ruby/core/matchdata
diff options
context:
space:
mode:
authoreregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-12-29 00:22:52 +0000
committereregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-12-29 00:22:52 +0000
commit2076c2c3c401d9ab9324468818bbc46d4e4b870a (patch)
tree1697bf7d3f434e49cafd8a8c1579f2d065a7de56 /spec/ruby/core/matchdata
parent548defb608847973e78462a38c8418f90dce9911 (diff)
Update to ruby/spec@944ea57
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66622 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'spec/ruby/core/matchdata')
-rw-r--r--spec/ruby/core/matchdata/begin_spec.rb108
-rw-r--r--spec/ruby/core/matchdata/end_spec.rb108
-rw-r--r--spec/ruby/core/matchdata/named_captures_spec.rb4
3 files changed, 186 insertions, 34 deletions
diff --git a/spec/ruby/core/matchdata/begin_spec.rb b/spec/ruby/core/matchdata/begin_spec.rb
index b791018633..85c454da56 100644
--- a/spec/ruby/core/matchdata/begin_spec.rb
+++ b/spec/ruby/core/matchdata/begin_spec.rb
@@ -3,28 +3,102 @@
require_relative '../../spec_helper'
describe "MatchData#begin" do
- it "returns the offset of the start of the nth element" do
- match_data = /(.)(.)(\d+)(\d)/.match("THX1138.")
- match_data.begin(0).should == 1
- match_data.begin(2).should == 2
- end
+ context "when passed an integer argument" do
+ it "returns the character offset of the start of the nth element" do
+ match_data = /(.)(.)(\d+)(\d)/.match("THX1138.")
+ match_data.begin(0).should == 1
+ match_data.begin(2).should == 2
+ end
- it "returns nil when the nth match isn't found" do
- match_data = /something is( not)? (right)/.match("something is right")
- match_data.begin(1).should be_nil
+ it "returns nil when the nth match isn't found" do
+ match_data = /something is( not)? (right)/.match("something is right")
+ match_data.begin(1).should be_nil
+ end
+
+ it "returns the character offset for multi-byte strings" do
+ match_data = /(.)(.)(\d+)(\d)/.match("TñX1138.")
+ match_data.begin(0).should == 1
+ match_data.begin(2).should == 2
+ end
+
+ not_supported_on :opal do
+ it "returns the character offset for multi-byte strings with unicode regexp" do
+ match_data = /(.)(.)(\d+)(\d)/u.match("TñX1138.")
+ match_data.begin(0).should == 1
+ match_data.begin(2).should == 2
+ end
+ end
+
+ it "tries to convert the passed argument to an Integer using #to_int" do
+ obj = mock('to_int')
+ obj.should_receive(:to_int).and_return(2)
+
+ match_data = /(.)(.)(\d+)(\d)/.match("THX1138.")
+ match_data.begin(obj).should == 2
+ end
end
- it "returns the offset for multi byte strings" do
- match_data = /(.)(.)(\d+)(\d)/.match("TñX1138.")
- match_data.begin(0).should == 1
- match_data.begin(2).should == 2
+ context "when passed a String argument" do
+ it "return the character offset of the start of the named capture" do
+ match_data = /(?<a>.)(.)(?<b>\d+)(\d)/.match("THX1138.")
+ match_data.begin("a").should == 1
+ match_data.begin("b").should == 3
+ end
+
+ it "returns the character offset for multi byte strings" do
+ match_data = /(?<a>.)(.)(?<b>\d+)(\d)/.match("TñX1138.")
+ match_data.begin("a").should == 1
+ match_data.begin("b").should == 3
+ end
+
+ not_supported_on :opal do
+ it "returns the character offset for multi byte strings with unicode regexp" do
+ match_data = /(?<a>.)(.)(?<b>\d+)(\d)/u.match("TñX1138.")
+ match_data.begin("a").should == 1
+ match_data.begin("b").should == 3
+ end
+ end
+
+ it "returns the character offset for the farthest match when multiple named captures use the same name" do
+ match_data = /(?<a>.)(.)(?<a>\d+)(\d)/.match("THX1138.")
+ match_data.begin("a").should == 3
+ end
+
+ it "returns the character offset for multi-byte names" do
+ match_data = /(?<æ>.)(.)(?<b>\d+)(\d)/.match("THX1138.")
+ match_data.begin("æ").should == 1
+ end
end
- not_supported_on :opal do
- it "returns the offset for multi byte strings with unicode regexp" do
- match_data = /(.)(.)(\d+)(\d)/u.match("TñX1138.")
- match_data.begin(0).should == 1
- match_data.begin(2).should == 2
+ context "when passed a Symbol argument" do
+ it "return the character offset of the start of the named capture" do
+ match_data = /(?<a>.)(.)(?<b>\d+)(\d)/.match("THX1138.")
+ match_data.begin(:a).should == 1
+ match_data.begin(:b).should == 3
+ end
+
+ it "returns the character offset for multi byte strings" do
+ match_data = /(?<a>.)(.)(?<b>\d+)(\d)/.match("TñX1138.")
+ match_data.begin(:a).should == 1
+ match_data.begin(:b).should == 3
+ end
+
+ not_supported_on :opal do
+ it "returns the character offset for multi byte strings with unicode regexp" do
+ match_data = /(?<a>.)(.)(?<b>\d+)(\d)/u.match("TñX1138.")
+ match_data.begin(:a).should == 1
+ match_data.begin(:b).should == 3
+ end
+ end
+
+ it "returns the character offset for the farthest match when multiple named captures use the same name" do
+ match_data = /(?<a>.)(.)(?<a>\d+)(\d)/.match("THX1138.")
+ match_data.begin(:a).should == 3
+ end
+
+ it "returns the character offset for multi-byte names" do
+ match_data = /(?<æ>.)(.)(?<b>\d+)(\d)/.match("THX1138.")
+ match_data.begin(:æ).should == 1
end
end
end
diff --git a/spec/ruby/core/matchdata/end_spec.rb b/spec/ruby/core/matchdata/end_spec.rb
index f6f3e1a281..d01b0a8b30 100644
--- a/spec/ruby/core/matchdata/end_spec.rb
+++ b/spec/ruby/core/matchdata/end_spec.rb
@@ -3,28 +3,102 @@
require_relative '../../spec_helper'
describe "MatchData#end" do
- it "returns the offset of the end of the nth element" do
- match_data = /(.)(.)(\d+)(\d)/.match("THX1138.")
- match_data.end(0).should == 7
- match_data.end(2).should == 3
- end
+ context "when passed an integer argument" do
+ it "returns the character offset of the end of the nth element" do
+ match_data = /(.)(.)(\d+)(\d)/.match("THX1138.")
+ match_data.end(0).should == 7
+ match_data.end(2).should == 3
+ end
- it "returns nil when the nth match isn't found" do
- match_data = /something is( not)? (right)/.match("something is right")
- match_data.end(1).should be_nil
+ it "returns nil when the nth match isn't found" do
+ match_data = /something is( not)? (right)/.match("something is right")
+ match_data.end(1).should be_nil
+ end
+
+ it "returns the character offset for multi-byte strings" do
+ match_data = /(.)(.)(\d+)(\d)/.match("TñX1138.")
+ match_data.end(0).should == 7
+ match_data.end(2).should == 3
+ end
+
+ not_supported_on :opal do
+ it "returns the character offset for multi-byte strings with unicode regexp" do
+ match_data = /(.)(.)(\d+)(\d)/u.match("TñX1138.")
+ match_data.end(0).should == 7
+ match_data.end(2).should == 3
+ end
+ end
+
+ it "tries to convert the passed argument to an Integer using #to_int" do
+ obj = mock('to_int')
+ obj.should_receive(:to_int).and_return(2)
+
+ match_data = /(.)(.)(\d+)(\d)/.match("THX1138.")
+ match_data.end(obj).should == 3
+ end
end
- it "returns the offset for multi byte strings" do
- match_data = /(.)(.)(\d+)(\d)/.match("TñX1138.")
- match_data.end(0).should == 7
- match_data.end(2).should == 3
+ context "when passed a String argument" do
+ it "return the character offset of the start of the named capture" do
+ match_data = /(?<a>.)(.)(?<b>\d+)(\d)/.match("THX1138.")
+ match_data.end("a").should == 2
+ match_data.end("b").should == 6
+ end
+
+ it "returns the character offset for multi byte strings" do
+ match_data = /(?<a>.)(.)(?<b>\d+)(\d)/.match("TñX1138.")
+ match_data.end("a").should == 2
+ match_data.end("b").should == 6
+ end
+
+ not_supported_on :opal do
+ it "returns the character offset for multi byte strings with unicode regexp" do
+ match_data = /(?<a>.)(.)(?<b>\d+)(\d)/u.match("TñX1138.")
+ match_data.end("a").should == 2
+ match_data.end("b").should == 6
+ end
+ end
+
+ it "returns the character offset for the farthest match when multiple named captures use the same name" do
+ match_data = /(?<a>.)(.)(?<a>\d+)(\d)/.match("THX1138.")
+ match_data.end("a").should == 6
+ end
+
+ it "returns the character offset for multi-byte names" do
+ match_data = /(?<æ>.)(.)(?<b>\d+)(\d)/.match("THX1138.")
+ match_data.end("æ").should == 2
+ end
end
- not_supported_on :opal do
- it "returns the offset for multi byte strings with unicode regexp" do
- match_data = /(.)(.)(\d+)(\d)/u.match("TñX1138.")
- match_data.end(0).should == 7
- match_data.end(2).should == 3
+ context "when passed a Symbol argument" do
+ it "return the character offset of the start of the named capture" do
+ match_data = /(?<a>.)(.)(?<b>\d+)(\d)/.match("THX1138.")
+ match_data.end(:a).should == 2
+ match_data.end(:b).should == 6
+ end
+
+ it "returns the character offset for multi byte strings" do
+ match_data = /(?<a>.)(.)(?<b>\d+)(\d)/.match("TñX1138.")
+ match_data.end(:a).should == 2
+ match_data.end(:b).should == 6
+ end
+
+ not_supported_on :opal do
+ it "returns the character offset for multi byte strings with unicode regexp" do
+ match_data = /(?<a>.)(.)(?<b>\d+)(\d)/u.match("TñX1138.")
+ match_data.end(:a).should == 2
+ match_data.end(:b).should == 6
+ end
+ end
+
+ it "returns the character offset for the farthest match when multiple named captures use the same name" do
+ match_data = /(?<a>.)(.)(?<a>\d+)(\d)/.match("THX1138.")
+ match_data.end(:a).should == 6
+ end
+
+ it "returns the character offset for multi-byte names" do
+ match_data = /(?<æ>.)(.)(?<b>\d+)(\d)/.match("THX1138.")
+ match_data.end(:æ).should == 2
end
end
end
diff --git a/spec/ruby/core/matchdata/named_captures_spec.rb b/spec/ruby/core/matchdata/named_captures_spec.rb
index 588b607a44..0b0771355f 100644
--- a/spec/ruby/core/matchdata/named_captures_spec.rb
+++ b/spec/ruby/core/matchdata/named_captures_spec.rb
@@ -9,5 +9,9 @@ ruby_version_is '2.4' do
it 'prefers later captures' do
/\A(?<a>.)(?<b>.)(?<b>.)(?<a>.)\z/.match('0123').named_captures.should == { 'a' => '3', 'b' => '2' }
end
+
+ it 'returns the latest matched capture, even if a later one that does not match exists' do
+ /\A(?<a>.)(?<b>.)(?<b>.)(?<a>.)?\z/.match('012').named_captures.should == { 'a' => '0', 'b' => '2' }
+ end
end
end