diff options
Diffstat (limited to 'spec/ruby/core/kernel/rand_spec.rb')
| -rw-r--r-- | spec/ruby/core/kernel/rand_spec.rb | 116 |
1 files changed, 79 insertions, 37 deletions
diff --git a/spec/ruby/core/kernel/rand_spec.rb b/spec/ruby/core/kernel/rand_spec.rb index a82b4fba74..1bf5e225d9 100644 --- a/spec/ruby/core/kernel/rand_spec.rb +++ b/spec/ruby/core/kernel/rand_spec.rb @@ -1,44 +1,44 @@ require_relative '../../spec_helper' require_relative 'fixtures/classes' -describe "Kernel.rand" do +describe "Kernel#rand" do it "is a private method" do - Kernel.should have_private_instance_method(:rand) + Kernel.private_instance_methods(false).should.include?(:rand) end it "returns a float if no argument is passed" do - rand.should be_kind_of(Float) + rand.should.is_a?(Float) end it "returns an integer for an integer argument" do - rand(77).should be_kind_of(Integer) + rand(77).should.is_a?(Integer) end it "returns an integer for a float argument greater than 1" do - rand(1.3).should be_kind_of(Integer) + rand(1.3).should.is_a?(Integer) end it "returns a float for an argument between -1 and 1" do - rand(-0.999).should be_kind_of(Float) - rand(-0.01).should be_kind_of(Float) - rand(0).should be_kind_of(Float) - rand(0.01).should be_kind_of(Float) - rand(0.999).should be_kind_of(Float) + rand(-0.999).should.is_a?(Float) + rand(-0.01).should.is_a?(Float) + rand(0).should.is_a?(Float) + rand(0.01).should.is_a?(Float) + rand(0.999).should.is_a?(Float) end it "ignores the sign of the argument" do - [0, 1, 2, 3].should include(rand(-4)) + [0, 1, 2, 3].should.include?(rand(-4)) end it "never returns a value greater or equal to 1.0 with no arguments" do 1000.times do - (0...1.0).should include(rand) + (0...1.0).should.include?(rand) end end it "never returns a value greater or equal to any passed in max argument" do 1000.times do - (0...100).to_a.should include(rand(100)) + (0...100).to_a.should.include?(rand(100)) end end @@ -53,32 +53,32 @@ describe "Kernel.rand" do it "returns an Integer between the two Integers" do 1000.times do x = rand(4...6) - x.should be_kind_of(Integer) - (4...6).should include(x) + x.should.is_a?(Integer) + (4...6).should.include?(x) end end it "returns a Float between the given Integer and Float" do 1000.times do x = rand(4...6.5) - x.should be_kind_of(Float) - (4...6.5).should include(x) + x.should.is_a?(Float) + (4...6.5).should.include?(x) end end it "returns a Float between the given Float and Integer" do 1000.times do x = rand(3.5...6) - x.should be_kind_of(Float) - (3.5...6).should include(x) + x.should.is_a?(Float) + (3.5...6).should.include?(x) end end it "returns a Float between the two given Floats" do 1000.times do x = rand(3.5...6.5) - x.should be_kind_of(Float) - (3.5...6.5).should include(x) + x.should.is_a?(Float) + (3.5...6.5).should.include?(x) end end end @@ -87,56 +87,98 @@ describe "Kernel.rand" do it "returns an Integer between the two Integers" do 1000.times do x = rand(4..6) - x.should be_kind_of(Integer) - (4..6).should include(x) + x.should.is_a?(Integer) + (4..6).should.include?(x) end end it "returns a Float between the given Integer and Float" do 1000.times do x = rand(4..6.5) - x.should be_kind_of(Float) - (4..6.5).should include(x) + x.should.is_a?(Float) + (4..6.5).should.include?(x) end end it "returns a Float between the given Float and Integer" do 1000.times do x = rand(3.5..6) - x.should be_kind_of(Float) - (3.5..6).should include(x) + x.should.is_a?(Float) + (3.5..6).should.include?(x) end end it "returns a Float between the two given Floats" do 1000.times do x = rand(3.5..6.5) - x.should be_kind_of(Float) - (3.5..6.5).should include(x) + x.should.is_a?(Float) + (3.5..6.5).should.include?(x) end end end + context "given an inclusive range between 0 and 1" do + it "returns an Integer between the two Integers" do + x = rand(0..1) + x.should.is_a?(Integer) + (0..1).should.include?(x) + end + + it "returns a Float if at least one side is Float" do + seed = 42 + x1 = Random.new(seed).rand(0..1.0) + x2 = Random.new(seed).rand(0.0..1.0) + x3 = Random.new(seed).rand(0.0..1) + + x3.should.is_a?(Float) + x1.should.eql?(x3) + x2.should.eql?(x3) + + (0.0..1.0).should.include?(x3) + end + end + + context "given an exclusive range between 0 and 1" do + it "returns zero as an Integer" do + x = rand(0...1) + x.should.is_a?(Integer) + x.should.eql?(0) + end + + it "returns a Float if at least one side is Float" do + seed = 42 + x1 = Random.new(seed).rand(0...1.0) + x2 = Random.new(seed).rand(0.0...1.0) + x3 = Random.new(seed).rand(0.0...1) + + x3.should.is_a?(Float) + x1.should.eql?(x3) + x2.should.eql?(x3) + + (0.0...1.0).should.include?(x3) + end + end + it "returns a numeric for an range argument where max is < 1" do - rand(0.25..0.75).should be_kind_of(Numeric) + rand(0.25..0.75).should.is_a?(Numeric) end it "returns nil when range is backwards" do - rand(1..0).should be_nil + rand(1..0).should == nil end it "returns the range start/end when Float range is 0" do - rand(1.0..1.0).should eql(1.0) + rand(1.0..1.0).should.eql?(1.0) end it "returns the range start/end when Integer range is 0" do - rand(42..42).should eql(42) + rand(42..42).should.eql?(42) end it "supports custom object types" do - rand(KernelSpecs::CustomRangeInteger.new(1)..KernelSpecs::CustomRangeInteger.new(42)).should be_an_instance_of(KernelSpecs::CustomRangeInteger) - rand(KernelSpecs::CustomRangeFloat.new(1.0)..KernelSpecs::CustomRangeFloat.new(42.0)).should be_an_instance_of(KernelSpecs::CustomRangeFloat) - rand(Time.now..Time.now).should be_an_instance_of(Time) + rand(KernelSpecs::CustomRangeInteger.new(1)..KernelSpecs::CustomRangeInteger.new(42)).should.instance_of?(KernelSpecs::CustomRangeInteger) + rand(KernelSpecs::CustomRangeFloat.new(1.0)..KernelSpecs::CustomRangeFloat.new(42.0)).should.instance_of?(KernelSpecs::CustomRangeFloat) + rand(Time.now..Time.now).should.instance_of?(Time) end it "is random on boot" do @@ -150,6 +192,6 @@ describe "Kernel.rand" do end end -describe "Kernel#rand" do +describe "Kernel.rand" do it "needs to be reviewed for spec completeness" end |
