diff --git a/core/matchdata/captures_spec.rb b/core/matchdata/captures_spec.rb index 58d4620709..f829a25481 100644 --- a/core/matchdata/captures_spec.rb +++ b/core/matchdata/captures_spec.rb @@ -1,15 +1,6 @@ require_relative '../../spec_helper' -require_relative 'fixtures/classes' +require_relative 'shared/captures' describe "MatchData#captures" do - it "returns an array of the match captures" do - /(.)(.)(\d+)(\d)/.match("THX1138.").captures.should == ["H","X","113","8"] - end - - ruby_version_is "3.0" do - it "returns instances of String when given a String subclass" do - str = MatchDataSpecs::MyString.new("THX1138: The Movie") - /(.)(.)(\d+)(\d)/.match(str).captures.each { |c| c.should be_an_instance_of(String) } - end - end + it_behaves_like :matchdata_captures, :captures end diff --git a/core/matchdata/deconstruct_keys_spec.rb b/core/matchdata/deconstruct_keys_spec.rb new file mode 100644 index 0000000000..ea07987463 --- /dev/null +++ b/core/matchdata/deconstruct_keys_spec.rb @@ -0,0 +1,63 @@ +require_relative '../../spec_helper' + +describe "MatchData#deconstruct_keys" do + ruby_version_is "3.2" do + it "returns whole hash for nil as an argument" do + m = /(?foo)(?bar)/.match("foobar") + + m.deconstruct_keys(nil).should == { f: "foo", b: "bar" } + end + + it "returns only specified keys" do + m = /(?foo)(?bar)/.match("foobar") + + m.deconstruct_keys([:f]).should == { f: "foo" } + end + + it "requires one argument" do + -> { + /l/.match("l").deconstruct_keys + }.should raise_error(ArgumentError) + end + + it "it raises error when argument is neither nil nor array" do + m = /(?foo)(?bar)/.match("foobar") + + -> { m.deconstruct_keys(1) }.should raise_error(TypeError, "wrong argument type Integer (expected Array)") + -> { m.deconstruct_keys("asd") }.should raise_error(TypeError, "wrong argument type String (expected Array)") + -> { m.deconstruct_keys(:x) }.should raise_error(TypeError, "wrong argument type Symbol (expected Array)") + -> { m.deconstruct_keys({}) }.should raise_error(TypeError, "wrong argument type Hash (expected Array)") + end + + it "returns {} when passed []" do + m = /(?foo)(?bar)/.match("foobar") + + m.deconstruct_keys([]).should == {} + end + + it "does not accept non-Symbol keys" do + m = /(?foo)(?bar)/.match("foobar") + + -> { + m.deconstruct_keys(['year', :foo]) + }.should raise_error(TypeError, "wrong argument type String (expected Symbol)") + end + + it "process keys till first non-existing one occurs" do + m = /(?foo)(?bar)(?baz)/.match("foobarbaz") + + m.deconstruct_keys([:f, :a, :b]).should == { f: "foo" } + end + + it "returns {} when there are no named caputred groups at all" do + m = /foo.+/.match("foobar") + + m.deconstruct_keys(nil).should == {} + end + + it "returns {} when passed more keys than named caputed groups" do + m = /(?foo)(?bar)/.match("foobar") + m.deconstruct_keys([:f, :b, :c]).should == {} + end + end +end diff --git a/core/matchdata/deconstruct_spec.rb b/core/matchdata/deconstruct_spec.rb new file mode 100644 index 0000000000..6af55113b6 --- /dev/null +++ b/core/matchdata/deconstruct_spec.rb @@ -0,0 +1,8 @@ +require_relative '../../spec_helper' +require_relative 'shared/captures' + +describe "MatchData#deconstruct" do + ruby_version_is "3.2" do + it_behaves_like :matchdata_captures, :deconstruct + end +end diff --git a/core/matchdata/shared/captures.rb b/core/matchdata/shared/captures.rb new file mode 100644 index 0000000000..b02f10777b --- /dev/null +++ b/core/matchdata/shared/captures.rb @@ -0,0 +1,15 @@ +require_relative '../../../spec_helper' +require_relative '../fixtures/classes' + +describe :matchdata_captures, shared: true do + it "returns an array of the match captures" do + /(.)(.)(\d+)(\d)/.match("THX1138.").captures.should == ["H","X","113","8"] + end + + ruby_version_is "3.0" do + it "returns instances of String when given a String subclass" do + str = MatchDataSpecs::MyString.new("THX1138: The Movie") + /(.)(.)(\d+)(\d)/.match(str).captures.each { |c| c.should be_an_instance_of(String) } + end + end +end