From 9d58f70da96a631f18615fe833083901ce68a121 Mon Sep 17 00:00:00 2001 From: mario Date: Wed, 6 Oct 2021 09:41:20 +0200 Subject: [PATCH 1/3] add spec for Array can be sliced with Enumerator::ArithmeticSequence --- core/array/shared/slice.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/core/array/shared/slice.rb b/core/array/shared/slice.rb index 19e1a3ee2b..2856bb3030 100644 --- a/core/array/shared/slice.rb +++ b/core/array/shared/slice.rb @@ -533,6 +533,25 @@ def to.to_int() -2 end a.send(@method, eval("(-9...)")).should == nil end + ruby_version_is "3.0" do + it "can be sliced with Enumerator::ArithmeticSequence" do + a = [0, 1, 2, 3, 4, 5] + a.send(@method, eval("(0..).step(2)")).should == [0, 2, 4] + a.send(@method, eval("(0..).step(3)")).should == [0, 3] + a.send(@method, eval("(0..).step(10)")).should == [0] + a.send(@method, eval("(0..1).step(2)")).should == [0] + a.send(@method, eval("(..0).step(1)")).should == [0] + a.send(@method, eval("(...0).step(1)")).should == [] + a.send(@method, eval("(2..).step(2)")).should == [2, 4] + a.send(@method, eval("(2..-2).step(2)")).should == [2, 4] + a.send(@method, eval("(2...-2).step(2)")).should == [2] + a.send(@method, eval("(2..).step(-2)")).should == [2, 0] + a.send(@method, eval("(2..).step(-3)")).should == [2] + a.send(@method, eval("(..-2).step(2)")).should == [0, 2, 4] + a.send(@method, eval("(...-2).step(2)")).should == [0, 2] + end + end + ruby_version_is "2.7" do it "can accept beginless ranges" do a = [0, 1, 2, 3, 4, 5] From b5c2c20657df674b3e64a5a1198b6e8251540ced Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Wed, 6 Oct 2021 13:56:05 +0200 Subject: [PATCH 2/3] Add example with step 1 --- core/array/shared/slice.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/core/array/shared/slice.rb b/core/array/shared/slice.rb index 2856bb3030..18742a2613 100644 --- a/core/array/shared/slice.rb +++ b/core/array/shared/slice.rb @@ -536,6 +536,7 @@ def to.to_int() -2 end ruby_version_is "3.0" do it "can be sliced with Enumerator::ArithmeticSequence" do a = [0, 1, 2, 3, 4, 5] + a.send(@method, eval("(0..).step(1)")).should == [0, 1, 2, 3, 4, 5] a.send(@method, eval("(0..).step(2)")).should == [0, 2, 4] a.send(@method, eval("(0..).step(3)")).should == [0, 3] a.send(@method, eval("(0..).step(10)")).should == [0] From a3b33a862f95289c345dc66c283ae817a5a8766a Mon Sep 17 00:00:00 2001 From: mario Date: Wed, 6 Oct 2021 16:25:34 +0200 Subject: [PATCH 3/3] regroup Array#split specs using Enumerator::ArithmeticSequence --- core/array/shared/slice.rb | 224 ++++++++++++++++++++++++++++++++++--- 1 file changed, 208 insertions(+), 16 deletions(-) diff --git a/core/array/shared/slice.rb b/core/array/shared/slice.rb index 18742a2613..ce9f32911d 100644 --- a/core/array/shared/slice.rb +++ b/core/array/shared/slice.rb @@ -534,22 +534,214 @@ def to.to_int() -2 end end ruby_version_is "3.0" do - it "can be sliced with Enumerator::ArithmeticSequence" do - a = [0, 1, 2, 3, 4, 5] - a.send(@method, eval("(0..).step(1)")).should == [0, 1, 2, 3, 4, 5] - a.send(@method, eval("(0..).step(2)")).should == [0, 2, 4] - a.send(@method, eval("(0..).step(3)")).should == [0, 3] - a.send(@method, eval("(0..).step(10)")).should == [0] - a.send(@method, eval("(0..1).step(2)")).should == [0] - a.send(@method, eval("(..0).step(1)")).should == [0] - a.send(@method, eval("(...0).step(1)")).should == [] - a.send(@method, eval("(2..).step(2)")).should == [2, 4] - a.send(@method, eval("(2..-2).step(2)")).should == [2, 4] - a.send(@method, eval("(2...-2).step(2)")).should == [2] - a.send(@method, eval("(2..).step(-2)")).should == [2, 0] - a.send(@method, eval("(2..).step(-3)")).should == [2] - a.send(@method, eval("(..-2).step(2)")).should == [0, 2, 4] - a.send(@method, eval("(...-2).step(2)")).should == [0, 2] + describe "can be sliced with Enumerator::ArithmeticSequence" do + before :each do + @array = [0, 1, 2, 3, 4, 5] + end + + it "has endless range and positive steps" do + @array.send(@method, eval("(0..).step(1)")).should == [0, 1, 2, 3, 4, 5] + @array.send(@method, eval("(0..).step(2)")).should == [0, 2, 4] + @array.send(@method, eval("(0..).step(10)")).should == [0] + + @array.send(@method, eval("(2..).step(1)")).should == [2, 3, 4, 5] + @array.send(@method, eval("(2..).step(2)")).should == [2, 4] + @array.send(@method, eval("(2..).step(10)")).should == [2] + + @array.send(@method, eval("(-3..).step(1)")).should == [3, 4, 5] + @array.send(@method, eval("(-3..).step(2)")).should == [3, 5] + @array.send(@method, eval("(-3..).step(10)")).should == [3] + end + + it "has beginless range and positive steps" do + # end with zero index + @array.send(@method, eval("(..0).step(1)")).should == [0] + @array.send(@method, eval("(...0).step(1)")).should == [] + + @array.send(@method, eval("(..0).step(2)")).should == [0] + @array.send(@method, eval("(...0).step(2)")).should == [] + + @array.send(@method, eval("(..0).step(10)")).should == [0] + @array.send(@method, eval("(...0).step(10)")).should == [] + + # end with positive index + @array.send(@method, eval("(..3).step(1)")).should == [0, 1, 2, 3] + @array.send(@method, eval("(...3).step(1)")).should == [0, 1, 2] + + @array.send(@method, eval("(..3).step(2)")).should == [0, 2] + @array.send(@method, eval("(...3).step(2)")).should == [0, 2] + + @array.send(@method, eval("(..3).step(10)")).should == [0] + @array.send(@method, eval("(...3).step(10)")).should == [0] + + # end with negative index + @array.send(@method, eval("(..-2).step(1)")).should == [0, 1, 2, 3, 4,] + @array.send(@method, eval("(...-2).step(1)")).should == [0, 1, 2, 3] + + @array.send(@method, eval("(..-2).step(2)")).should == [0, 2, 4] + @array.send(@method, eval("(...-2).step(2)")).should == [0, 2] + + @array.send(@method, eval("(..-2).step(10)")).should == [0] + @array.send(@method, eval("(...-2).step(10)")).should == [0] + end + + it "has endless range and negative steps" do + @array.send(@method, eval("(0..).step(-1)")).should == [0] + @array.send(@method, eval("(0..).step(-2)")).should == [0] + @array.send(@method, eval("(0..).step(-10)")).should == [0] + + @array.send(@method, eval("(2..).step(-1)")).should == [2, 1, 0] + @array.send(@method, eval("(2..).step(-2)")).should == [2, 0] + + @array.send(@method, eval("(-3..).step(-1)")).should == [3, 2, 1, 0] + @array.send(@method, eval("(-3..).step(-2)")).should == [3, 1] + end + + it "has closed range and positive steps" do + # start and end with 0 + @array.send(@method, eval("(0..0).step(1)")).should == [0] + @array.send(@method, eval("(0...0).step(1)")).should == [] + + @array.send(@method, eval("(0..0).step(2)")).should == [0] + @array.send(@method, eval("(0...0).step(2)")).should == [] + + @array.send(@method, eval("(0..0).step(10)")).should == [0] + @array.send(@method, eval("(0...0).step(10)")).should == [] + + # start and end with positive index + @array.send(@method, eval("(1..3).step(1)")).should == [1, 2, 3] + @array.send(@method, eval("(1...3).step(1)")).should == [1, 2] + + @array.send(@method, eval("(1..3).step(2)")).should == [1, 3] + @array.send(@method, eval("(1...3).step(2)")).should == [1] + + @array.send(@method, eval("(1..3).step(10)")).should == [1] + @array.send(@method, eval("(1...3).step(10)")).should == [1] + + # start with positive index, end with negative index + @array.send(@method, eval("(1..-2).step(1)")).should == [1, 2, 3, 4] + @array.send(@method, eval("(1...-2).step(1)")).should == [1, 2, 3] + + @array.send(@method, eval("(1..-2).step(2)")).should == [1, 3] + @array.send(@method, eval("(1...-2).step(2)")).should == [1, 3] + + @array.send(@method, eval("(1..-2).step(10)")).should == [1] + @array.send(@method, eval("(1...-2).step(10)")).should == [1] + + # start with negative index, end with positive index + @array.send(@method, eval("(-4..4).step(1)")).should == [2, 3, 4] + @array.send(@method, eval("(-4...4).step(1)")).should == [2, 3] + + @array.send(@method, eval("(-4..4).step(2)")).should == [2, 4] + @array.send(@method, eval("(-4...4).step(2)")).should == [2] + + @array.send(@method, eval("(-4..4).step(10)")).should == [2] + @array.send(@method, eval("(-4...4).step(10)")).should == [2] + + # start with negative index, end with negative index + @array.send(@method, eval("(-4..-2).step(1)")).should == [2, 3, 4] + @array.send(@method, eval("(-4...-2).step(1)")).should == [2, 3] + + @array.send(@method, eval("(-4..-2).step(2)")).should == [2, 4] + @array.send(@method, eval("(-4...-2).step(2)")).should == [2] + + @array.send(@method, eval("(-4..-2).step(10)")).should == [2] + @array.send(@method, eval("(-4...-2).step(10)")).should == [2] + end + + it "has closed range and negative steps" do + # start and end with 0 + @array.send(@method, eval("(0..0).step(-1)")).should == [0] + @array.send(@method, eval("(0...0).step(-1)")).should == [] + + @array.send(@method, eval("(0..0).step(-2)")).should == [0] + @array.send(@method, eval("(0...0).step(-2)")).should == [] + + @array.send(@method, eval("(0..0).step(-10)")).should == [0] + @array.send(@method, eval("(0...0).step(-10)")).should == [] + + # start and end with positive index + @array.send(@method, eval("(1..3).step(-1)")).should == [] + @array.send(@method, eval("(1...3).step(-1)")).should == [] + + @array.send(@method, eval("(1..3).step(-2)")).should == [] + @array.send(@method, eval("(1...3).step(-2)")).should == [] + + @array.send(@method, eval("(1..3).step(-10)")).should == [] + @array.send(@method, eval("(1...3).step(-10)")).should == [] + + # start with positive index, end with negative index + @array.send(@method, eval("(1..-2).step(-1)")).should == [] + @array.send(@method, eval("(1...-2).step(-1)")).should == [] + + @array.send(@method, eval("(1..-2).step(-2)")).should == [] + @array.send(@method, eval("(1...-2).step(-2)")).should == [] + + @array.send(@method, eval("(1..-2).step(-10)")).should == [] + @array.send(@method, eval("(1...-2).step(-10)")).should == [] + + # start with negative index, end with positive index + @array.send(@method, eval("(-4..4).step(-1)")).should == [] + @array.send(@method, eval("(-4...4).step(-1)")).should == [] + + @array.send(@method, eval("(-4..4).step(-2)")).should == [] + @array.send(@method, eval("(-4...4).step(-2)")).should == [] + + @array.send(@method, eval("(-4..4).step(-10)")).should == [] + @array.send(@method, eval("(-4...4).step(-10)")).should == [] + + # start with negative index, end with negative index + @array.send(@method, eval("(-4..-2).step(-1)")).should == [] + @array.send(@method, eval("(-4...-2).step(-1)")).should == [] + + @array.send(@method, eval("(-4..-2).step(-2)")).should == [] + @array.send(@method, eval("(-4...-2).step(-2)")).should == [] + + @array.send(@method, eval("(-4..-2).step(-10)")).should == [] + @array.send(@method, eval("(-4...-2).step(-10)")).should == [] + end + + it "has inverted closed range and positive steps" do + # start and end with positive index + @array.send(@method, eval("(3..1).step(1)")).should == [] + @array.send(@method, eval("(3...1).step(1)")).should == [] + + @array.send(@method, eval("(3..1).step(2)")).should == [] + @array.send(@method, eval("(3...1).step(2)")).should == [] + + @array.send(@method, eval("(3..1).step(10)")).should == [] + @array.send(@method, eval("(3...1).step(10)")).should == [] + + # start with negative index, end with positive index + @array.send(@method, eval("(-2..1).step(1)")).should == [] + @array.send(@method, eval("(-2...1).step(1)")).should == [] + + @array.send(@method, eval("(-2..1).step(2)")).should == [] + @array.send(@method, eval("(-2...1).step(2)")).should == [] + + @array.send(@method, eval("(-2..1).step(10)")).should == [] + @array.send(@method, eval("(-2...1).step(10)")).should == [] + + # start with positive index, end with negative index + @array.send(@method, eval("(4..-4).step(1)")).should == [] + @array.send(@method, eval("(4...-4).step(1)")).should == [] + + @array.send(@method, eval("(4..-4).step(2)")).should == [] + @array.send(@method, eval("(4...-4).step(2)")).should == [] + + @array.send(@method, eval("(4..-4).step(10)")).should == [] + @array.send(@method, eval("(4...-4).step(10)")).should == [] + + # start with negative index, end with negative index + @array.send(@method, eval("(-2..-4).step(1)")).should == [] + @array.send(@method, eval("(-2...-4).step(1)")).should == [] + + @array.send(@method, eval("(-2..-4).step(2)")).should == [] + @array.send(@method, eval("(-2...-4).step(2)")).should == [] + + @array.send(@method, eval("(-2..-4).step(10)")).should == [] + @array.send(@method, eval("(-2...-4).step(10)")).should == [] + end end end