Skip to content

Commit

Permalink
Merge pull request #295 from timcraft/integer-upto
Browse files Browse the repository at this point in the history
  • Loading branch information
seven1m authored Dec 15, 2021
2 parents 65023af + c9e8d92 commit fe8f9ae
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 0 deletions.
69 changes: 69 additions & 0 deletions spec/core/integer/upto_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
require_relative '../../spec_helper'

describe "Integer#upto [stop] when self and stop are Integers" do
it "does not yield when stop is less than self" do
result = []
5.upto(4) { |x| result << x }
result.should == []
end

it "yields once when stop equals self" do
result = []
5.upto(5) { |x| result << x }
result.should == [5]
end

it "yields while increasing self until it is less than stop" do
result = []
2.upto(5) { |x| result << x }
result.should == [2, 3, 4, 5]
end

it "yields while increasing self until it is greater than floor of a Float endpoint" do
result = []
9.upto(13.3) {|i| result << i}
-5.upto(-1.3) {|i| result << i}
result.should == [9,10,11,12,13,-5,-4,-3,-2]
end

it "raises an ArgumentError for non-numeric endpoints" do
-> { 1.upto("A") {|x| p x} }.should raise_error(ArgumentError)
-> { 1.upto(nil) {|x| p x} }.should raise_error(ArgumentError)
end

describe "when no block is given" do
it "returns an Enumerator" do
result = []

enum = 2.upto(5)
enum.each { |i| result << i }

result.should == [2, 3, 4, 5]
end

describe "returned Enumerator" do
describe "size" do
it "raises an ArgumentError for non-numeric endpoints" do
enum = 1.upto("A")
-> { enum.size }.should raise_error(ArgumentError)
enum = 1.upto(nil)
-> { enum.size }.should raise_error(ArgumentError)
end

it "returns stop - self + 1" do
5.upto(10).size.should == 6
1.upto(10).size.should == 10
0.upto(10).size.should == 11
0.upto(0).size.should == 1
-5.upto(-3).size.should == 3
end

it "returns 0 when stop < self" do
5.upto(4).size.should == 0
0.upto(-5).size.should == 0
-3.upto(-5).size.should == 0
end
end
end
end
end
12 changes: 12 additions & 0 deletions src/integer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,18 @@ def downto(n)
end
end

def upto(n)
unless block_given?
return enum_for(:upto, n) { self <= n ? (n - self + 1) : 0 }
end

i = self
until i > n
yield i
i += 1
end
end

def allbits?(mask)
unless mask.respond_to?(:to_int)
raise TypeError, "No implicit conversion of #{mask.class} into Integer"
Expand Down

0 comments on commit fe8f9ae

Please sign in to comment.