Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
This paste will be private.
From 6af7ff8542489d2136509a7f4640c327f7040c51 Mon Sep 17 00:00:00 2001 From: Stuart Halloway <stu@thinkrelevance.com> Date: Fri, 28 Mar 2008 06:09:34 -0400 Subject: [PATCH] Fixes for Range#step. * previously failing specs pass * new spec added to cover float/int difference --- kernel/core/range.rb | 2 +- spec/ruby/1.8/core/range/step_spec.rb | 11 ++++++++++- spec/tags/ruby/1.8/core/range/step_tags.txt | 2 -- 3 files changed, 11 insertions(+), 4 deletions(-) delete mode 100644 spec/tags/ruby/1.8/core/range/step_tags.txt diff --git a/kernel/core/range.rb b/kernel/core/range.rb index 03a95be..c93956c 100644 --- a/kernel/core/range.rb +++ b/kernel/core/range.rb @@ -239,7 +239,7 @@ class Range def step(step_size = 1, &block) # :yields: object first, last = @begin, @end - step_size = step_size.to_f #people might not pass numbers in. This stops them. + step_size = (Float === first) ? Float(step_size) : Integer(step_size) raise ArgumentError, "step can't be negative" if step_size < 0 raise ArgumentError, "step can't be 0" if step_size == 0 diff --git a/spec/ruby/1.8/core/range/step_spec.rb b/spec/ruby/1.8/core/range/step_spec.rb index ccb6715..db883bb 100644 --- a/spec/ruby/1.8/core/range/step_spec.rb +++ b/spec/ruby/1.8/core/range/step_spec.rb @@ -40,8 +40,17 @@ describe "Range#step" do obj = mock("mock") lambda { (1..10).step(obj) }.should raise_error(TypeError) end + + # The behavior for floats and ints is consistent with MRI for the cases shown. + # Add specs as necessary if there are other cases. + it "coerces the argument to float if begin is a float" do + (obj = mock("0.1")).should_receive(:to_f).and_return(0.1) + res = [] + (1.0..1.2).step(obj) {|x| res << x} + res.should == [1.0, 1.1] + end - it "coerces the argument to intger by invoking to_int" do + it "coerces the argument to int if begin is anything other than a float" do (obj = mock("2")).should_receive(:to_int).and_return(2) res = [] (1..10).step(obj) {|x| res << x} diff --git a/spec/tags/ruby/1.8/core/range/step_tags.txt b/spec/tags/ruby/1.8/core/range/step_tags.txt deleted file mode 100644 index 1dd76a9..0000000 --- a/spec/tags/ruby/1.8/core/range/step_tags.txt +++ /dev/null @@ -1,2 +0,0 @@ -fails:Range#step raises TypeError if the argument is non-numeric -fails:Range#step coerces the argument to intger by invoking to_int -- 1.5.4.3
From the Design Piracy series on my blog: