1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Move spec/rubyspec to spec/ruby for consistency

* Other ruby implementations use the spec/ruby directory.
  [Misc #13792] [ruby-core:82287]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59979 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
eregon 2017-09-20 20:18:52 +00:00
parent 75bfc6440d
commit 1d15d5f080
4370 changed files with 0 additions and 0 deletions

View file

@ -0,0 +1,5 @@
require File.expand_path('../shared/abs', __FILE__)
describe "Float#abs" do
it_behaves_like(:float_abs, :abs)
end

View file

@ -0,0 +1,5 @@
require File.expand_path('../../../shared/complex/float/arg', __FILE__)
describe "Float#angle" do
it_behaves_like :float_arg, :angle
end

View file

@ -0,0 +1,5 @@
require File.expand_path('../../../shared/complex/float/arg', __FILE__)
describe "Float#arg" do
it_behaves_like :float_arg, :arg
end

View file

@ -0,0 +1,6 @@
require File.expand_path('../../../spec_helper', __FILE__)
require File.expand_path('../shared/equal', __FILE__)
describe "Float#===" do
it_behaves_like :float_equal, :===
end

View file

@ -0,0 +1,13 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#ceil" do
it "returns the smallest Integer greater than or equal to self" do
-1.2.ceil.should eql( -1)
-1.0.ceil.should eql( -1)
0.0.ceil.should eql( 0 )
1.3.ceil.should eql( 2 )
3.0.ceil.should eql( 3 )
-9223372036854775808.1.ceil.should eql(-9223372036854775808)
+9223372036854775808.1.ceil.should eql(+9223372036854775808)
end
end

View file

@ -0,0 +1,18 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#coerce" do
it "returns [other, self] both as Floats" do
1.2.coerce(1).should == [1.0, 1.2]
5.28.coerce(1.0).should == [1.0, 5.28]
1.0.coerce(1).should == [1.0, 1.0]
1.0.coerce("2.5").should == [2.5, 1.0]
1.0.coerce(3.14).should == [3.14, 1.0]
a, b = -0.0.coerce(bignum_value)
a.should be_close(9223372036854775808.0, TOLERANCE)
b.should be_close(-0.0, TOLERANCE)
a, b = 1.0.coerce(bignum_value)
a.should be_close(9223372036854775808.0, TOLERANCE)
b.should be_close(1.0, TOLERANCE)
end
end

View file

@ -0,0 +1,36 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#<=>" do
it "returns -1, 0, 1 when self is less than, equal, or greater than other" do
(1.5 <=> 5).should == -1
(2.45 <=> 2.45).should == 0
((bignum_value*1.1) <=> bignum_value).should == 1
end
it "returns nil when either argument is NaN" do
(nan_value <=> 71.2).should be_nil
(1771.176 <=> nan_value).should be_nil
end
it "returns nil when the given argument is not a Float" do
(1.0 <=> "1").should be_nil
end
# The 4 tests below are taken from matz's revision 23730 for Ruby trunk
#
it "returns 1 when self is Infinity and other is a Bignum" do
(infinity_value <=> Float::MAX.to_i*2).should == 1
end
it "returns -1 when self is negative and other is Infinty" do
(-Float::MAX.to_i*2 <=> infinity_value).should == -1
end
it "returns -1 when self is -Infinity and other is negative" do
(-infinity_value <=> -Float::MAX.to_i*2).should == -1
end
it "returns 1 when self is negative and other is -Infinity" do
(-Float::MAX.to_i*2 <=> -infinity_value).should == 1
end
end

View file

@ -0,0 +1,55 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float constant" do
it "DIG is 15" do
Float::DIG.should == 15
end
it "EPSILON is 2.220446049250313e-16" do
Float::EPSILON.should == 2.0 ** -52
Float::EPSILON.should == 2.220446049250313e-16
end
it "MANT_DIG is 53" do
Float::MANT_DIG.should == 53
end
it "MAX_10_EXP is 308" do
Float::MAX_10_EXP.should == 308
end
it "MIN_10_EXP is -308" do
Float::MIN_10_EXP.should == -307
end
it "MAX_EXP is 1024" do
Float::MAX_EXP.should == 1024
end
it "MIN_EXP is -1021" do
Float::MIN_EXP.should == -1021
end
it "MAX is 1.7976931348623157e+308" do
# See https://en.wikipedia.org/wiki/Double-precision_floating-point_format#Double-precision_examples
Float::MAX.should == (1 + (1 - (2 ** -52))) * (2.0 ** 1023)
Float::MAX.should == 1.7976931348623157e+308
end
it "MIN is 2.2250738585072014e-308" do
Float::MIN.should == (2.0 ** -1022)
Float::MIN.should == 2.2250738585072014e-308
end
it "RADIX is 2" do
Float::RADIX.should == 2
end
it "INFINITY is the positive infinity" do
Float::INFINITY.infinite?.should == 1
end
it "NAN is 'not a number'" do
Float::NAN.nan?.should be_true
end
end

View file

@ -0,0 +1,29 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#denominator" do
before :each do
@numbers = [
0.0,
29871.22736282,
7772222663.0,
1.4592,
].map {|n| [0-n, n]}.flatten
end
it "returns an Integer" do
@numbers.each do |number|
number.denominator.should be_kind_of(Integer)
end
end
it "converts self to a Rational and returns the denominator" do
@numbers.each do |number|
number.denominator.should == Rational(number).denominator
end
end
it "returns 1 for NaN and Infinity" do
nan_value.denominator.should == 1
infinity_value.denominator.should == 1
end
end

View file

@ -0,0 +1,36 @@
require File.expand_path('../../../spec_helper', __FILE__)
require File.expand_path('../fixtures/coerce.rb', __FILE__)
describe "Float#/" do
it "returns self divided by other" do
(5.75 / -2).should be_close(-2.875,TOLERANCE)
(451.0 / 9.3).should be_close(48.494623655914,TOLERANCE)
(91.1 / -0xffffffff).should be_close(-2.12108716418061e-08, TOLERANCE)
end
it "properly coerces objects" do
(5.0 / FloatSpecs::CanCoerce.new(5)).should be_close(0, TOLERANCE)
end
it "returns +Infinity when dividing non-zero by zero of the same sign" do
(1.0 / 0.0).should be_positive_infinity
(-1.0 / -0.0).should be_positive_infinity
end
it "returns -Infinity when dividing non-zero by zero of opposite sign" do
(-1.0 / 0.0).should be_negative_infinity
(1.0 / -0.0).should be_negative_infinity
end
it "returns NaN when dividing zero by zero" do
(0.0 / 0.0).should be_nan
(-0.0 / 0.0).should be_nan
(0.0 / -0.0).should be_nan
(-0.0 / -0.0).should be_nan
end
it "raises a TypeError when given a non-Numeric" do
lambda { 13.0 / "10" }.should raise_error(TypeError)
lambda { 13.0 / :symbol }.should raise_error(TypeError)
end
end

View file

@ -0,0 +1,43 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#divmod" do
it "returns an [quotient, modulus] from dividing self by other" do
values = 3.14.divmod(2)
values[0].should eql(1)
values[1].should be_close(1.14, TOLERANCE)
values = 2.8284.divmod(3.1415)
values[0].should eql(0)
values[1].should be_close(2.8284, TOLERANCE)
values = -1.0.divmod(bignum_value)
values[0].should eql(-1)
values[1].should be_close(9223372036854775808.000, TOLERANCE)
values = -1.0.divmod(1)
values[0].should eql(-1)
values[1].should eql(0.0)
end
# Behaviour established as correct in r23953
it "raises a FloatDomainError if self is NaN" do
lambda { nan_value.divmod(1) }.should raise_error(FloatDomainError)
end
# Behaviour established as correct in r23953
it "raises a FloatDomainError if other is NaN" do
lambda { 1.divmod(nan_value) }.should raise_error(FloatDomainError)
end
# Behaviour established as correct in r23953
it "raises a FloatDomainError if self is Infinity" do
lambda { infinity_value.divmod(1) }.should raise_error(FloatDomainError)
end
it "raises a ZeroDivisionError if other is zero" do
lambda { 1.0.divmod(0) }.should raise_error(ZeroDivisionError)
lambda { 1.0.divmod(0.0) }.should raise_error(ZeroDivisionError)
end
# redmine #5276"
it "returns the correct [quotient, modulus] even for large quotient" do
0.59.divmod(7.761021455128987e-11).first.should eql(7602092113)
end
end

View file

@ -0,0 +1,16 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#eql?" do
it "returns true if other is a Float equal to self" do
0.0.eql?(0.0).should be_true
end
it "returns false if other is a Float not equal to self" do
1.0.eql?(1.1).should be_false
end
it "returns false if other is not a Float" do
1.0.eql?(1).should be_false
1.0.eql?(:one).should be_false
end
end

View file

@ -0,0 +1,6 @@
require File.expand_path('../../../spec_helper', __FILE__)
require File.expand_path('../shared/equal', __FILE__)
describe "Float#==" do
it_behaves_like :float_equal, :==
end

View file

@ -0,0 +1,15 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#**" do
it "returns self raise to the other power" do
(2.3 ** 3).should be_close(12.167,TOLERANCE)
(5.2 ** -1).should be_close(0.192307692307692,TOLERANCE)
(9.5 ** 0.5).should be_close(3.08220700148449, TOLERANCE)
(9.5 ** 0xffffffff).to_s.should == 'Infinity'
end
it "returns a complex number when negative and raised to a fractional power" do
((-8.0) ** (1.0/3)) .should be_close(Complex(1, 1.73205), TOLERANCE)
((-8.0) ** Rational(1,3)).should be_close(Complex(1, 1.73205), TOLERANCE)
end
end

View file

@ -0,0 +1,6 @@
require File.expand_path('../../../spec_helper', __FILE__)
require File.expand_path('../shared/quo', __FILE__)
describe "Float#fdiv" do
it_behaves_like :float_quo, :fdiv
end

View file

@ -0,0 +1,19 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#finite?" do
it "returns true for finite values" do
3.14159.finite?.should == true
end
it "returns false for positive infinity" do
infinity_value.finite?.should == false
end
it "returns false for negative infinity" do
(-infinity_value).finite?.should == false
end
it "returns false for NaN" do
nan_value.finite?.should == false
end
end

View file

@ -0,0 +1,15 @@
module FloatSpecs
class CanCoerce
def initialize(a)
@a = a
end
def coerce(b)
[self.class.new(b), @a]
end
def /(b)
@a.to_i % b.to_i
end
end
end

View file

@ -0,0 +1,19 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float" do
it "includes Comparable" do
Float.include?(Comparable).should == true
end
it ".allocate raises a TypeError" do
lambda do
Float.allocate
end.should raise_error(TypeError)
end
it ".new is undefined" do
lambda do
Float.new
end.should raise_error(NoMethodError)
end
end

View file

@ -0,0 +1,13 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#floor" do
it "returns the largest Integer less than or equal to self" do
-1.2.floor.should eql( -2)
-1.0.floor.should eql( -1)
0.0.floor.should eql( 0 )
1.0.floor.should eql( 1 )
5.9.floor.should eql( 5 )
-9223372036854775808.1.floor.should eql(-9223372036854775808)
+9223372036854775808.1.floor.should eql(+9223372036854775808)
end
end

View file

@ -0,0 +1,14 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#>" do
it "returns true if self is greater than other" do
(1.5 > 1).should == true
(2.5 > 3).should == false
(45.91 > bignum_value).should == false
end
it "raises an ArgumentError when given a non-Numeric" do
lambda { 5.0 > "4" }.should raise_error(ArgumentError)
lambda { 5.0 > mock('x') }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,14 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#>=" do
it "returns true if self is greater than or equal to other" do
(5.2 >= 5.2).should == true
(9.71 >= 1).should == true
(5.55382 >= 0xfabdafbafcab).should == false
end
it "raises an ArgumentError when given a non-Numeric" do
lambda { 5.0 >= "4" }.should raise_error(ArgumentError)
lambda { 5.0 >= mock('x') }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,11 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#hash" do
it "is provided" do
0.0.respond_to?(:hash).should == true
end
it "is stable" do
1.0.hash.should == 1.0.hash
end
end

View file

@ -0,0 +1,19 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#infinite?" do
it "returns nil for finite values" do
1.0.infinite?.should == nil
end
it "returns 1 for positive infinity" do
infinity_value.infinite?.should == 1
end
it "returns -1 for negative infinity" do
(-infinity_value).infinite?.should == -1
end
it "returns nil for NaN" do
nan_value.infinite?.should == nil
end
end

View file

@ -0,0 +1,14 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#<" do
it "returns true if self is less than other" do
(71.3 < 91.8).should == true
(192.6 < -500).should == false
(-0.12 < 0x4fffffff).should == true
end
it "raises an ArgumentError when given a non-Numeric" do
lambda { 5.0 < "4" }.should raise_error(ArgumentError)
lambda { 5.0 < mock('x') }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,15 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#<=" do
it "returns true if self is less than or equal to other" do
(2.0 <= 3.14159).should == true
(-2.7183 <= -24).should == false
(0.0 <= 0.0).should == true
(9_235.9 <= bignum_value).should == true
end
it "raises an ArgumentError when given a non-Numeric" do
lambda { 5.0 <= "4" }.should raise_error(ArgumentError)
lambda { 5.0 <= mock('x') }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,5 @@
require File.expand_path('../shared/abs', __FILE__)
describe "Float#magnitude" do
it_behaves_like(:float_abs, :magnitude)
end

View file

@ -0,0 +1,9 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#-" do
it "returns self minus other" do
(9_237_212.5280 - 5_280).should be_close(9231932.528, TOLERANCE)
(2_560_496.1691 - bignum_value).should be_close(-9223372036852215808.000, TOLERANCE)
(5.5 - 5.5).should be_close(0.0,TOLERANCE)
end
end

View file

@ -0,0 +1,10 @@
require File.expand_path('../../../spec_helper', __FILE__)
require File.expand_path('../shared/modulo', __FILE__)
describe "Float#%" do
it_behaves_like(:float_modulo, :%)
end
describe "Float#modulo" do
it_behaves_like(:float_modulo, :modulo)
end

View file

@ -0,0 +1,14 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#*" do
it "returns self multiplied by other" do
(4923.98221 * 2).should be_close(9847.96442, TOLERANCE)
(6712.5 * 0.25).should be_close(1678.125, TOLERANCE)
(256.4096 * bignum_value).should be_close(2364961134621118431232.000, TOLERANCE)
end
it "raises a TypeError when given a non-Numeric" do
lambda { 13.0 * "10" }.should raise_error(TypeError)
lambda { 13.0 * :symbol }.should raise_error(TypeError)
end
end

View file

@ -0,0 +1,9 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#nan?" do
it "returns true if self is not a valid IEEE floating-point number" do
0.0.nan?.should == false
-1.5.nan?.should == false
nan_value.nan?.should == true
end
end

View file

@ -0,0 +1,49 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#next_float" do
it "returns a float the smallest possible step greater than the receiver" do
barely_positive = 0.0.next_float
barely_positive.should == 0.0.next_float
barely_positive.should > 0.0
barely_positive.should < barely_positive.next_float
midpoint = barely_positive / 2
[0.0, barely_positive].should include midpoint
end
it "returns Float::INFINITY for Float::INFINITY" do
Float::INFINITY.next_float.should == Float::INFINITY
end
it "steps directly between MAX and INFINITY" do
(-Float::INFINITY).next_float.should == -Float::MAX
Float::MAX.next_float.should == Float::INFINITY
end
it "steps directly between 1.0 and 1.0 + EPSILON" do
1.0.next_float.should == 1.0 + Float::EPSILON
end
it "steps directly between -1.0 and -1.0 + EPSILON/2" do
(-1.0).next_float.should == -1.0 + Float::EPSILON/2
end
it "reverses the effect of prev_float for all Floats except INFINITY and +0.0" do
num = -rand
num.prev_float.next_float.should == num
end
it "returns negative zero when stepping upward from just below zero" do
x = (-0.0).prev_float.next_float
(1/x).should == -Float::INFINITY
end
it "gives the same result for -0.0 as for +0.0" do
(-0.0).next_float.should == (0.0).next_float
end
it "returns NAN if NAN was the receiver" do
Float::NAN.next_float.nan?.should == true
end
end

View file

@ -0,0 +1,39 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#numerator" do
before :all do
@numbers = [
29871.2722891,
999.1**99.928888,
-72628191273.22,
29282.2827,
-2927.00091,
12.0,
Float::MAX,
]
end
it "converts self to a Rational object then returns its numerator" do
@numbers.each do |number|
number.infinite?.should be_nil
number.numerator.should == Rational(number).numerator
end
end
it "returns 0 for 0.0" do
0.0.numerator.should == 0
end
it "returns NaN for NaN" do
nan_value.numerator.nan?.should be_true
end
it "returns Infinity for Infinity" do
infinity_value.numerator.infinite?.should == 1
end
it "returns -Infinity for -Infinity" do
(-infinity_value).numerator.infinite?.should == -1
end
end

View file

@ -0,0 +1,5 @@
require File.expand_path('../../../shared/complex/float/arg', __FILE__)
describe "Float#phase" do
it_behaves_like :float_arg, :phase
end

View file

@ -0,0 +1,9 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#+" do
it "returns self plus other" do
(491.213 + 2).should be_close(493.213, TOLERANCE)
(9.99 + bignum_value).should be_close(9223372036854775808.000, TOLERANCE)
(1001.99 + 5.219).should be_close(1007.209, TOLERANCE)
end
end

View file

@ -0,0 +1,49 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#prev_float" do
it "returns a float the smallest possible step smaller than the receiver" do
barely_negative = 0.0.prev_float
barely_negative.should == 0.0.prev_float
barely_negative.should < 0.0
barely_negative.should > barely_negative.prev_float
midpoint = barely_negative / 2
[0.0, barely_negative].should include midpoint
end
it "returns -Float::INFINITY for -Float::INFINITY" do
(-Float::INFINITY).prev_float.should == -Float::INFINITY
end
it "steps directly between MAX and INFINITY" do
Float::INFINITY.prev_float.should == Float::MAX
(-Float::MAX).prev_float.should == -Float::INFINITY
end
it "steps directly between 1.0 and 1.0 - EPSILON/2" do
1.0.prev_float.should == 1.0 - Float::EPSILON/2
end
it "steps directly between -1.0 and -1.0 - EPSILON" do
(-1.0).prev_float.should == -1.0 - Float::EPSILON
end
it "reverses the effect of next_float for all Floats except -INFINITY and -0.0" do
num = rand
num.next_float.prev_float.should == num
end
it "returns positive zero when stepping downward from just above zero" do
x = 0.0.next_float.prev_float
(1/x).should == Float::INFINITY
end
it "gives the same result for -0.0 as for +0.0" do
(0.0).prev_float.should == (-0.0).prev_float
end
it "returns NAN if NAN was the receiver" do
Float::NAN.prev_float.nan?.should == true
end
end

View file

@ -0,0 +1,6 @@
require File.expand_path('../../../spec_helper', __FILE__)
require File.expand_path('../shared/quo', __FILE__)
describe "Float#quo" do
it_behaves_like :float_quo, :quo
end

View file

@ -0,0 +1,43 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#rationalize" do
it "returns self as a simplified Rational with no argument" do
(3382729202.92822).rationalize.should == Rational(4806858197361, 1421)
end
# FIXME: These specs need reviewing by somebody familiar with the
# algorithm used by #rationalize
it "simplifies self to the degree specified by a Rational argument" do
f = 0.3
f.rationalize(Rational(1,10)).should == Rational(1,3)
f.rationalize(Rational(-1,10)).should == Rational(1,3)
f = -f
f.rationalize(Rational(1,10)).should == Rational(-1,3)
f.rationalize(Rational(-1,10)).should == Rational(-1,3)
end
it "simplifies self to the degree specified by a Float argument" do
f = 0.3
f.rationalize(0.05).should == Rational(1,3)
f.rationalize(0.001).should == Rational(3, 10)
f = -f
f.rationalize(0.05).should == Rational(-1,3)
f.rationalize(0.001).should == Rational(-3,10)
end
it "raises a FloatDomainError for Infinity" do
lambda {infinity_value.rationalize}.should raise_error(FloatDomainError)
end
it "raises a FloatDomainError for NaN" do
lambda { nan_value.rationalize }.should raise_error(FloatDomainError)
end
it "raises ArgumentError when passed more than one argument" do
lambda { 0.3.rationalize(0.1, 0.1) }.should raise_error(ArgumentError)
lambda { 0.3.rationalize(0.1, 0.1, 2) }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,87 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#round" do
it "returns the nearest Integer" do
5.5.round.should == 6
0.4.round.should == 0
0.6.round.should == 1
-1.4.round.should == -1
-2.8.round.should == -3
0.0.round.should == 0
end
platform_is_not :mingw32 do
it "returns the nearest Integer for Float near the limit" do
0.49999999999999994.round.should == 0
-0.49999999999999994.round.should == 0
end
end
it "raises FloatDomainError for exceptional values" do
lambda { (+infinity_value).round }.should raise_error(FloatDomainError)
lambda { (-infinity_value).round }.should raise_error(FloatDomainError)
lambda { nan_value.round }.should raise_error(FloatDomainError)
end
it "rounds self to an optionally given precision" do
5.5.round(0).should eql(6)
5.7.round(1).should eql(5.7)
1.2345678.round(2).should == 1.23
123456.78.round(-2).should eql(123500) # rounded up
-123456.78.round(-2).should eql(-123500)
12.345678.round(3.999).should == 12.346
end
it "returns zero when passed a negative argument with magitude greater the magitude of the whole number portion of the Float" do
0.8346268.round(-1).should eql(0)
end
it "raises a TypeError when its argument can not be converted to an Integer" do
lambda { 1.0.round("4") }.should raise_error(TypeError)
lambda { 1.0.round(nil) }.should raise_error(TypeError)
end
it "raises FloatDomainError for exceptional values when passed a non-positive precision" do
lambda { Float::INFINITY.round( 0) }.should raise_error(FloatDomainError)
lambda { Float::INFINITY.round(-2) }.should raise_error(FloatDomainError)
lambda { (-Float::INFINITY).round( 0) }.should raise_error(FloatDomainError)
lambda { (-Float::INFINITY).round(-2) }.should raise_error(FloatDomainError)
end
it "raises RangeError for NAN when passed a non-positive precision" do
lambda { Float::NAN.round(0) }.should raise_error(RangeError)
lambda { Float::NAN.round(-2) }.should raise_error(RangeError)
end
it "returns self for exceptional values when passed a non-negative precision" do
Float::INFINITY.round(2).should == Float::INFINITY
(-Float::INFINITY).round(2).should == -Float::INFINITY
Float::NAN.round(2).should be_nan
end
# redmine:5227
it "works for corner cases" do
42.0.round(308).should eql(42.0)
1.0e307.round(2).should eql(1.0e307)
end
# redmine:5271
it "returns rounded values for big argument" do
0.42.round(2.0**30).should == 0.42
end
it "returns big values rounded to nearest" do
+2.5e20.round(-20).should eql( +3 * 10 ** 20 )
-2.5e20.round(-20).should eql( -3 * 10 ** 20 )
end
# redmine #5272
it "returns rounded values for big values" do
+2.4e20.round(-20).should eql( +2 * 10 ** 20 )
-2.4e20.round(-20).should eql( -2 * 10 ** 20 )
+2.5e200.round(-200).should eql( +3 * 10 ** 200 )
+2.4e200.round(-200).should eql( +2 * 10 ** 200 )
-2.5e200.round(-200).should eql( -3 * 10 ** 200 )
-2.4e200.round(-200).should eql( -2 * 10 ** 200 )
end
end

View file

@ -0,0 +1,21 @@
require File.expand_path('../../../../spec_helper', __FILE__)
describe :float_abs, shared: true do
it "returns the absolute value" do
-99.1.send(@method).should be_close(99.1, TOLERANCE)
4.5.send(@method).should be_close(4.5, TOLERANCE)
0.0.send(@method).should be_close(0.0, TOLERANCE)
end
it "returns 0.0 if -0.0" do
(-0.0).send(@method).should be_positive_zero
end
it "returns Infinity if -Infinity" do
(-infinity_value).send(@method).infinite?.should == 1
end
it "returns NaN if NaN" do
nan_value.send(@method).nan?.should be_true
end
end

View file

@ -0,0 +1,17 @@
describe :float_equal, shared: true do
it "returns true if self has the same value as other" do
1.0.send(@method, 1).should == true
2.71828.send(@method, 1.428).should == false
-4.2.send(@method, 4.2).should == false
end
it "calls 'other == self' if coercion fails" do
x = mock('other')
def x.==(other)
2.0 == other
end
1.0.send(@method, x).should == false
2.0.send(@method, x).should == true
end
end

View file

@ -0,0 +1,48 @@
describe :float_modulo, shared: true do
it "returns self modulo other" do
6543.21.send(@method, 137).should be_close(104.21, TOLERANCE)
5667.19.send(@method, bignum_value).should be_close(5667.19, TOLERANCE)
6543.21.send(@method, 137.24).should be_close(92.9299999999996, TOLERANCE)
-1.0.send(@method, 1).should == 0
end
it "returns self when modulus is +Infinity" do
4.2.send(@method, Float::INFINITY).should == 4.2
end
it "returns -Infinity when modulus is -Infinity" do
4.2.send(@method, -Float::INFINITY).should == -Float::INFINITY
end
it "returns NaN when called on NaN or Infinities" do
Float::NAN.send(@method, 42).should be_nan
Float::INFINITY.send(@method, 42).should be_nan
(-Float::INFINITY).send(@method, 42).should be_nan
end
it "returns NaN when modulus is NaN" do
4.2.send(@method, Float::NAN).should be_nan
end
it "returns -0.0 when called on -0.0 with a non zero modulus" do
r = (-0.0).send(@method, 42)
r.should == 0
(1/r).should < 0
r = (-0.0).send(@method, Float::INFINITY)
r.should == 0
(1/r).should < 0
end
it "tries to coerce the modulus" do
obj = mock("modulus")
obj.should_receive(:coerce).with(1.25).and_return([1.25, 0.5])
(1.25 % obj).should == 0.25
end
it "raises a ZeroDivisionError if other is zero" do
lambda { 1.0.send(@method, 0) }.should raise_error(ZeroDivisionError)
lambda { 1.0.send(@method, 0.0) }.should raise_error(ZeroDivisionError)
end
end

View file

@ -0,0 +1,59 @@
describe :float_quo, shared: true do
it "performs floating-point division between self and a Fixnum" do
8.9.send(@method, 7).should == 1.2714285714285716
end
it "performs floating-point division between self and a Bignum" do
8.9.send(@method, 9999999999999**9).should == 8.900000000008011e-117
end
it "performs floating-point division between self and a Float" do
2827.22.send(@method, 872.111111).should == 3.2418116961704433
end
it "returns NaN when the argument is NaN" do
-1819.999999.send(@method, nan_value).nan?.should be_true
11109.1981271.send(@method, nan_value).nan?.should be_true
end
it "returns Infinity when the argument is 0.0" do
2827.22.send(@method, 0.0).infinite?.should == 1
end
it "returns -Infinity when the argument is 0.0 and self is negative" do
-48229.282.send(@method, 0.0).infinite?.should == -1
end
it "returns Infinity when the argument is 0" do
2827.22.send(@method, 0).infinite?.should == 1
end
it "returns -Infinity when the argument is 0 and self is negative" do
-48229.282.send(@method, 0).infinite?.should == -1
end
it "returns 0.0 when the argument is Infinity" do
47292.2821.send(@method, infinity_value).should == 0.0
end
it "returns -0.0 when the argument is -Infinity" do
1.9999918.send(@method, -infinity_value).should == -0.0
end
it "performs floating-point division between self and a Rational" do
74620.09.send(@method, Rational(2,3)).should == 111930.135
end
it "performs floating-point division between self and a Complex" do
74620.09.send(@method, Complex(8,2)).should == Complex(
8778.834117647059, -2194.7085294117646)
end
it "raises a TypeError when argument isn't numeric" do
lambda { 27292.2.send(@method, mock('non-numeric')) }.should raise_error(TypeError)
end
it "raises an ArgumentError when passed multiple arguments" do
lambda { 272.221.send(@method, 6,0.2) }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,10 @@
describe :float_to_i, shared: true do
it "returns self truncated to an Integer" do
899.2.send(@method).should eql(899)
-1.122256e-45.send(@method).should eql(0)
5_213_451.9201.send(@method).should eql(5213451)
1.233450999123389e+12.send(@method).should eql(1233450999123)
-9223372036854775808.1.send(@method).should eql(-9223372036854775808)
9223372036854775808.1.send(@method).should eql(9223372036854775808)
end
end

View file

@ -0,0 +1,9 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#to_f" do
it "returns self" do
-500.3.to_f.should == -500.3
267.51.to_f.should == 267.51
1.1412.to_f.should == 1.1412
end
end

View file

@ -0,0 +1,6 @@
require File.expand_path('../../../spec_helper', __FILE__)
require File.expand_path('../shared/to_i', __FILE__)
describe "Float#to_i" do
it_behaves_like(:float_to_i, :to_i)
end

View file

@ -0,0 +1,6 @@
require File.expand_path('../../../spec_helper', __FILE__)
require File.expand_path('../shared/to_i', __FILE__)
describe "Float#to_int" do
it_behaves_like(:float_to_i, :to_int)
end

View file

@ -0,0 +1,5 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#to_r" do
it "needs to be reviewed for spec completeness"
end

View file

@ -0,0 +1,120 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#to_s" do
it "returns 'NaN' for NaN" do
nan_value().to_s.should == 'NaN'
end
it "returns 'Infinity' for positive infinity" do
infinity_value().to_s.should == 'Infinity'
end
it "returns '-Infinity' for negative infinity" do
(-infinity_value()).to_s.should == '-Infinity'
end
it "returns '0.0' for 0.0" do
0.0.to_s.should == "0.0"
end
platform_is_not :openbsd do
it "emits '-' for -0.0" do
-0.0.to_s.should == "-0.0"
end
end
it "emits a '-' for negative values" do
-3.14.to_s.should == "-3.14"
end
it "emits a trailing '.0' for a whole number" do
50.0.to_s.should == "50.0"
end
it "emits a trailing '.0' for the mantissa in e format" do
1.0e20.to_s.should == "1.0e+20"
end
it "uses non-e format for a positive value with fractional part having 5 significant figures" do
0.0001.to_s.should == "0.0001"
end
it "uses non-e format for a negative value with fractional part having 5 significant figures" do
-0.0001.to_s.should == "-0.0001"
end
it "uses e format for a positive value with fractional part having 6 significant figures" do
0.00001.to_s.should == "1.0e-05"
end
it "uses e format for a negative value with fractional part having 6 significant figures" do
-0.00001.to_s.should == "-1.0e-05"
end
it "uses non-e format for a positive value with whole part having 15 significant figures" do
10000000000000.0.to_s.should == "10000000000000.0"
end
it "uses non-e format for a negative value with whole part having 15 significant figures" do
-10000000000000.0.to_s.should == "-10000000000000.0"
end
it "uses non-e format for a positive value with whole part having 16 significant figures" do
100000000000000.0.to_s.should == "100000000000000.0"
end
it "uses non-e format for a negative value with whole part having 16 significant figures" do
-100000000000000.0.to_s.should == "-100000000000000.0"
end
it "uses e format for a positive value with whole part having 18 significant figures" do
10000000000000000.0.to_s.should == "1.0e+16"
end
it "uses e format for a negative value with whole part having 18 significant figures" do
-10000000000000000.0.to_s.should == "-1.0e+16"
end
it "uses non-e format for a positive value with whole part having 17 significant figures" do
1000000000000000.0.to_s.should == "1.0e+15"
end
it "uses non-e format for a negative value with whole part having 17 significant figures" do
-1000000000000000.0.to_s.should == "-1.0e+15"
end
# #3273
it "outputs the minimal, unique form necessary to recreate the value" do
value = 0.21611564636388508
string = "0.21611564636388508"
value.to_s.should == string
string.to_f.should == value
end
it "outputs the minimal, unique form to represent the value" do
0.56.to_s.should == "0.56"
end
end
with_feature :encoding do
describe "Float#to_s" do
before :each do
@internal = Encoding.default_internal
end
after :each do
Encoding.default_internal = @internal
end
it "returns a String in US-ASCII encoding when Encoding.default_internal is nil" do
Encoding.default_internal = nil
1.23.to_s.encoding.should equal(Encoding::US_ASCII)
end
it "returns a String in US-ASCII encoding when Encoding.default_internal is not nil" do
Encoding.default_internal = Encoding::IBM437
5.47.to_s.encoding.should equal(Encoding::US_ASCII)
end
end
end

View file

@ -0,0 +1,6 @@
require File.expand_path('../../../spec_helper', __FILE__)
require File.expand_path('../shared/to_i', __FILE__)
describe "Float#truncate" do
it_behaves_like(:float_to_i, :truncate)
end

View file

@ -0,0 +1,28 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#-@" do
it "negates self" do
(2.221.send(:-@)).should be_close(-2.221, TOLERANCE)
-2.01.should be_close(-2.01,TOLERANCE)
-2_455_999_221.5512.should be_close(-2455999221.5512, TOLERANCE)
(--5.5).should be_close(5.5, TOLERANCE)
-8.551.send(:-@).should be_close(8.551, TOLERANCE)
end
it "negates self at Float boundaries" do
Float::MAX.send(:-@).should be_close(0.0 - Float::MAX, TOLERANCE)
Float::MIN.send(:-@).should be_close(0.0 - Float::MIN, TOLERANCE)
end
it "returns negative infinity for positive infinity" do
infinity_value.send(:-@).infinite?.should == -1
end
it "returns positive infinity for negative infinity" do
(-infinity_value).send(:-@).infinite?.should == 1
end
it "returns NaN for NaN" do
nan_value.send(:-@).nan?.should == true
end
end

View file

@ -0,0 +1,9 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#+@" do
it "returns the same value with same sign (twos complement)" do
34.56.send(:+@).should == 34.56
-34.56.send(:+@).should == -34.56
0.0.send(:+@).should eql(0.0)
end
end

View file

@ -0,0 +1,9 @@
require File.expand_path('../../../spec_helper', __FILE__)
describe "Float#zero?" do
it "returns true if self is 0.0" do
0.0.zero?.should == true
1.0.zero?.should == false
-1.0.zero?.should == false
end
end