1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
require 'bigdecimal'
describe :bigdecimal_modulo, :shared => true do
before(:each) do
@one = BigDecimal("1")
@zero = BigDecimal("0")
@zero_pos = BigDecimal("+0")
@zero_neg = BigDecimal("-0")
@two = BigDecimal("2")
@three = BigDecimal("3")
@mixed = BigDecimal("1.23456789")
@nan = BigDecimal("NaN")
@infinity = BigDecimal("Infinity")
@infinity_minus = BigDecimal("-Infinity")
@one_minus = BigDecimal("-1")
@frac_1 = BigDecimal("1E-9999")
@frac_2 = BigDecimal("0.9E-9999")
end
it "returns self modulo other" do
bd6543 = BigDecimal.new("6543.21")
bd5667 = BigDecimal.new("5667.19")
a = BigDecimal("1.0000000000000000000000000000000000000000005")
b = BigDecimal("1.00000000000000000000000000000000000000000005")
bd6543.send(@method, 137).should == BigDecimal("104.21")
bd5667.send(@method, bignum_value).should == 5667.19
bd6543.send(@method, BigDecimal("137.24")).should == BigDecimal("92.93")
bd6543.send(@method, 137).should be_close(6543.21.%(137), TOLERANCE)
bd6543.send(@method, 137).should == bd6543 % 137
bd5667.send(@method, bignum_value).should be_close(5667.19.%(0xffffffff), TOLERANCE)
bd5667.send(@method, bignum_value).should == bd5667.%(0xffffffff)
bd6543.send(@method, 137.24).should be_close(6543.21.%(137.24), TOLERANCE)
a.send(@method, b).should == BigDecimal("0.45E-42")
@zero.send(@method, @one).should == @zero
@zero.send(@method, @one_minus).should == @zero
@two.send(@method, @one).should == @zero
@one.send(@method, @two).should == @one
@frac_1.send(@method, @one).should == @frac_1
@frac_2.send(@method, @one).should == @frac_2
@one_minus.send(@method, @one_minus).should == @zero
@one_minus.send(@method, @one).should == @zero
@one_minus.send(@method, @two).should == @one
@one.send(@method, -@two).should == -@one
@one_minus.modulo(BigDecimal('0.9')).should == BigDecimal('0.8')
@one.modulo(BigDecimal('-0.9')).should == BigDecimal('-0.8')
@one_minus.modulo(BigDecimal('0.8')).should == BigDecimal('0.6')
@one.modulo(BigDecimal('-0.8')).should == BigDecimal('-0.6')
@one_minus.modulo(BigDecimal('0.6')).should == BigDecimal('0.2')
@one.modulo(BigDecimal('-0.6')).should == BigDecimal('-0.2')
@one_minus.modulo(BigDecimal('0.5')).should == @zero
@one.modulo(BigDecimal('-0.5')).should == @zero
@one_minus.modulo(BigDecimal('-0.5')).should == @zero
@one_minus.modulo(BigDecimal('0.4')).should == BigDecimal('0.2')
@one.modulo(BigDecimal('-0.4')).should == BigDecimal('-0.2')
@one_minus.modulo(BigDecimal('0.3')).should == BigDecimal('0.2')
@one_minus.modulo(BigDecimal('0.2')).should == @zero
end
ruby_bug "#", "1.9.2" do
it "returns a [Float value] when the argument is Float" do
@two.send(@method, 2.0).should == 0.0
@one.send(@method, 2.0).should == 1.0
res = @two.send(@method, 5.0)
res.kind_of?(BigDecimal).should == true
end
end
it "returns NaN if NaN is involved" do
@nan.send(@method, @nan).nan?.should == true
@nan.send(@method, @one).nan?.should == true
@one.send(@method, @nan).nan?.should == true
@infinity.send(@method, @nan).nan?.should == true
@nan.send(@method, @infinity).nan?.should == true
end
it "returns NaN if the dividend is Infinity" do
@infinity.send(@method, @infinity).nan?.should == true
@infinity.send(@method, @one).nan?.should == true
@infinity.send(@method, @mixed).nan?.should == true
@infinity.send(@method, @one_minus).nan?.should == true
@infinity.send(@method, @frac_1).nan?.should == true
@infinity_minus.send(@method, @infinity_minus).nan?.should == true
@infinity_minus.send(@method, @one).nan?.should == true
@infinity.send(@method, @infinity_minus).nan?.should == true
@infinity_minus.send(@method, @infinity).nan?.should == true
end
ruby_version_is "" ... "1.9" do
it "returns NaN if the divisor is Infinity" do
@one.send(@method, @infinity).nan?.should == true
@one.send(@method, @infinity_minus).nan?.should == true
@frac_2.send(@method, @infinity_minus).nan?.should == true
end
end
ruby_version_is "1.9" do
it "returns the dividend if the divisor is Infinity" do
@one.send(@method, @infinity).should == @one
@one.send(@method, @infinity_minus).should == @one
@frac_2.send(@method, @infinity_minus).should == @frac_2
end
end
it "raises TypeError if the argument cannot be coerced to BigDecimal" do
lambda {
@one.send(@method, '2')
}.should raise_error(TypeError)
end
end
describe :bigdecimal_modulo_zerodivisionerror, :shared => true do
ruby_version_is "" ... "1.9" do
it "does NOT raise ZeroDivisionError if other is zero" do
bd6543 = BigDecimal.new("6543.21")
bd5667 = BigDecimal.new("5667.19")
a = BigDecimal("1.0000000000000000000000000000000000000000005")
b = BigDecimal("1.00000000000000000000000000000000000000000005")
bd5667.send(@method, 0).nan?.should == true
bd5667.send(@method, BigDecimal("0")).nan?.should == true
@zero.send(@method, @zero).nan?.should == true
end
end
ruby_version_is "1.9" do
it "raises ZeroDivisionError if other is zero" do
bd6543 = BigDecimal.new("6543.21")
bd5667 = BigDecimal.new("5667.19")
a = BigDecimal("1.0000000000000000000000000000000000000000005")
b = BigDecimal("1.00000000000000000000000000000000000000000005")
lambda { bd5667.send(@method, 0) }.should raise_error(ZeroDivisionError)
lambda { bd5667.send(@method, BigDecimal("0")) }.should raise_error(ZeroDivisionError)
lambda { @zero.send(@method, @zero) }.should raise_error(ZeroDivisionError)
end
end
end
|