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:
parent
75bfc6440d
commit
1d15d5f080
4370 changed files with 0 additions and 0 deletions
133
spec/ruby/shared/complex/Complex.rb
Normal file
133
spec/ruby/shared/complex/Complex.rb
Normal file
|
@ -0,0 +1,133 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :kernel_Complex, shared: true do
|
||||
describe "when passed [Complex, Complex]" do
|
||||
it "returns a new Complex number based on the two given numbers" do
|
||||
Complex(Complex(3, 4), Complex(5, 6)).should == Complex(3 - 6, 4 + 5)
|
||||
Complex(Complex(1.5, 2), Complex(-5, 6.3)).should == Complex(1.5 - 6.3, 2 - 5)
|
||||
end
|
||||
end
|
||||
|
||||
describe "when passed [Complex]" do
|
||||
it "returns the passed Complex number" do
|
||||
Complex(Complex(1, 2)).should == Complex(1, 2)
|
||||
Complex(Complex(-3.4, bignum_value)).should == Complex(-3.4, bignum_value)
|
||||
end
|
||||
end
|
||||
|
||||
describe "when passed [Integer, Integer]" do
|
||||
it "returns a new Complex number" do
|
||||
Complex(1, 2).should be_an_instance_of(Complex)
|
||||
Complex(1, 2).real.should == 1
|
||||
Complex(1, 2).imag.should == 2
|
||||
|
||||
Complex(-3, -5).should be_an_instance_of(Complex)
|
||||
Complex(-3, -5).real.should == -3
|
||||
Complex(-3, -5).imag.should == -5
|
||||
|
||||
Complex(3.5, -4.5).should be_an_instance_of(Complex)
|
||||
Complex(3.5, -4.5).real.should == 3.5
|
||||
Complex(3.5, -4.5).imag.should == -4.5
|
||||
|
||||
Complex(bignum_value, 30).should be_an_instance_of(Complex)
|
||||
Complex(bignum_value, 30).real.should == bignum_value
|
||||
Complex(bignum_value, 30).imag.should == 30
|
||||
end
|
||||
end
|
||||
|
||||
describe "when passed [Integer]" do
|
||||
it "returns a new Complex number with 0 as the imaginary component" do
|
||||
# Guard against the Mathn library
|
||||
conflicts_with :Prime do
|
||||
Complex(1).should be_an_instance_of(Complex)
|
||||
Complex(1).imag.should == 0
|
||||
Complex(1).real.should == 1
|
||||
|
||||
Complex(-3).should be_an_instance_of(Complex)
|
||||
Complex(-3).imag.should == 0
|
||||
Complex(-3).real.should == -3
|
||||
|
||||
Complex(-4.5).should be_an_instance_of(Complex)
|
||||
Complex(-4.5).imag.should == 0
|
||||
Complex(-4.5).real.should == -4.5
|
||||
|
||||
Complex(bignum_value).should be_an_instance_of(Complex)
|
||||
Complex(bignum_value).imag.should == 0
|
||||
Complex(bignum_value).real.should == bignum_value
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "when passed a String" do
|
||||
it "needs to be reviewed for spec completeness"
|
||||
end
|
||||
|
||||
describe "when passed an Objectc which responds to #to_c" do
|
||||
it "returns the passed argument" do
|
||||
obj = Object.new; def obj.to_c; 1i end
|
||||
Complex(obj).should == Complex(0, 1)
|
||||
end
|
||||
end
|
||||
|
||||
describe "when passed a Numeric which responds to #real? with false" do
|
||||
it "returns the passed argument" do
|
||||
n = mock_numeric("unreal")
|
||||
n.should_receive(:real?).and_return(false)
|
||||
Complex(n).should equal(n)
|
||||
end
|
||||
end
|
||||
|
||||
describe "when passed a Numeric which responds to #real? with true" do
|
||||
it "returns a Complex with the passed argument as the real component and 0 as the imaginary component" do
|
||||
n = mock_numeric("real")
|
||||
n.should_receive(:real?).any_number_of_times.and_return(true)
|
||||
result = Complex(n)
|
||||
result.real.should equal(n)
|
||||
result.imag.should equal(0)
|
||||
end
|
||||
end
|
||||
|
||||
describe "when passed Numerics n1 and n2 and at least one responds to #real? with false" do
|
||||
[[false, false], [false, true], [true, false]].each do |r1, r2|
|
||||
it "returns n1 + n2 * Complex(0, 1)" do
|
||||
n1 = mock_numeric("n1")
|
||||
n2 = mock_numeric("n2")
|
||||
n3 = mock_numeric("n3")
|
||||
n4 = mock_numeric("n4")
|
||||
n1.should_receive(:real?).any_number_of_times.and_return(r1)
|
||||
n2.should_receive(:real?).any_number_of_times.and_return(r2)
|
||||
n2.should_receive(:*).with(Complex(0, 1)).and_return(n3)
|
||||
n1.should_receive(:+).with(n3).and_return(n4)
|
||||
Complex(n1, n2).should equal(n4)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "when passed two Numerics and both respond to #real? with true" do
|
||||
it "returns a Complex with the passed arguments as real and imaginary components respectively" do
|
||||
n1 = mock_numeric("n1")
|
||||
n2 = mock_numeric("n2")
|
||||
n1.should_receive(:real?).any_number_of_times.and_return(true)
|
||||
n2.should_receive(:real?).any_number_of_times.and_return(true)
|
||||
result = Complex(n1, n2)
|
||||
result.real.should equal(n1)
|
||||
result.imag.should equal(n2)
|
||||
end
|
||||
end
|
||||
|
||||
describe "when passed a single non-Numeric" do
|
||||
it "coerces the passed argument using #to_c" do
|
||||
n = mock("n")
|
||||
c = Complex(0, 0)
|
||||
n.should_receive(:to_c).and_return(c)
|
||||
Complex(n).should equal(c)
|
||||
end
|
||||
end
|
||||
|
||||
describe "when passed a non-Numeric second argument" do
|
||||
it "raises TypeError" do
|
||||
lambda { Complex.send(@method, :sym, :sym) }.should raise_error(TypeError)
|
||||
lambda { Complex.send(@method, 0, :sym) }.should raise_error(TypeError)
|
||||
end
|
||||
end
|
||||
end
|
12
spec/ruby/shared/complex/abs.rb
Normal file
12
spec/ruby/shared/complex/abs.rb
Normal file
|
@ -0,0 +1,12 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_abs, shared: true do
|
||||
it "returns the modulus: |a + bi| = sqrt((a ^ 2) + (b ^ 2))" do
|
||||
Complex(0, 0).send(@method).should == 0
|
||||
Complex(3, 4).send(@method).should == 5 # well-known integer case
|
||||
Complex(-3, 4).send(@method).should == 5
|
||||
Complex(1, -1).send(@method).should be_close(Math.sqrt(2), TOLERANCE)
|
||||
Complex(6.5, 0).send(@method).should be_close(6.5, TOLERANCE)
|
||||
Complex(0, -7.2).send(@method).should be_close(7.2, TOLERANCE)
|
||||
end
|
||||
end
|
12
spec/ruby/shared/complex/abs2.rb
Normal file
12
spec/ruby/shared/complex/abs2.rb
Normal file
|
@ -0,0 +1,12 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_abs2, shared: true do
|
||||
it "returns the sum of the squares of the real and imaginary parts" do
|
||||
Complex(1, -2).abs2.should == 1 + 4
|
||||
Complex(-0.1, 0.2).abs2.should be_close(0.01 + 0.04, TOLERANCE)
|
||||
# Guard against Mathn library
|
||||
conflicts_with :Prime do
|
||||
Complex(0).abs2.should == 0
|
||||
end
|
||||
end
|
||||
end
|
9
spec/ruby/shared/complex/arg.rb
Normal file
9
spec/ruby/shared/complex/arg.rb
Normal file
|
@ -0,0 +1,9 @@
|
|||
describe :complex_arg, shared: true do
|
||||
it "returns the argument -- i.e., the angle from (1, 0) in the complex plane" do
|
||||
two_pi = 2 * Math::PI
|
||||
(Complex(1, 0).send(@method) % two_pi).should be_close(0, TOLERANCE)
|
||||
(Complex(0, 2).send(@method) % two_pi).should be_close(Math::PI * 0.5, TOLERANCE)
|
||||
(Complex(-100, 0).send(@method) % two_pi).should be_close(Math::PI, TOLERANCE)
|
||||
(Complex(0, -75.3).send(@method) % two_pi).should be_close(Math::PI * 1.5, TOLERANCE)
|
||||
end
|
||||
end
|
70
spec/ruby/shared/complex/coerce.rb
Normal file
70
spec/ruby/shared/complex/coerce.rb
Normal file
|
@ -0,0 +1,70 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_coerce, shared: true do
|
||||
before :each do
|
||||
@one = Complex(1)
|
||||
end
|
||||
|
||||
it "returns an array containing other and self as Complex when other is an Integer" do
|
||||
result = @one.coerce(2)
|
||||
result.should == [2, 1]
|
||||
result.first.should be_kind_of(Complex)
|
||||
result.last.should be_kind_of(Complex)
|
||||
end
|
||||
|
||||
it "returns an array containing other and self as Complex when other is a Float" do
|
||||
result = @one.coerce(20.5)
|
||||
result.should == [20.5, 1]
|
||||
result.first.should be_kind_of(Complex)
|
||||
result.last.should be_kind_of(Complex)
|
||||
end
|
||||
|
||||
it "returns an array containing other and self as Complex when other is a Bignum" do
|
||||
result = @one.coerce(4294967296)
|
||||
result.should == [4294967296, 1]
|
||||
result.first.should be_kind_of(Complex)
|
||||
result.last.should be_kind_of(Complex)
|
||||
end
|
||||
|
||||
it "returns an array containing other and self as Complex when other is a Rational" do
|
||||
result = @one.coerce(Rational(5,6))
|
||||
result.should == [Rational(5,6), 1]
|
||||
result.first.should be_kind_of(Complex)
|
||||
result.last.should be_kind_of(Complex)
|
||||
end
|
||||
|
||||
it "returns an array containing other and self when other is a Complex" do
|
||||
other = Complex(2)
|
||||
result = @one.coerce(other)
|
||||
result.should == [other, @one]
|
||||
result.first.should equal(other)
|
||||
result.last.should equal(@one)
|
||||
end
|
||||
|
||||
it "returns an array containing other as Complex and self when other is a Numeric which responds to #real? with true" do
|
||||
other = mock_numeric('other')
|
||||
other.should_receive(:real?).any_number_of_times.and_return(true)
|
||||
result = @one.coerce(other)
|
||||
result.should == [other, @one]
|
||||
result.first.should eql(Complex(other))
|
||||
result.last.should equal(@one)
|
||||
end
|
||||
|
||||
it "raises TypeError when other is a Numeric which responds to #real? with false" do
|
||||
other = mock_numeric('other')
|
||||
other.should_receive(:real?).any_number_of_times.and_return(false)
|
||||
lambda { @one.coerce(other) }.should raise_error(TypeError)
|
||||
end
|
||||
|
||||
it "raises a TypeError when other is a String" do
|
||||
lambda { @one.coerce("20") }.should raise_error(TypeError)
|
||||
end
|
||||
|
||||
it "raises a TypeError when other is nil" do
|
||||
lambda { @one.coerce(nil) }.should raise_error(TypeError)
|
||||
end
|
||||
|
||||
it "raises a TypeError when other is false" do
|
||||
lambda { @one.coerce(false) }.should raise_error(TypeError)
|
||||
end
|
||||
end
|
8
spec/ruby/shared/complex/conjugate.rb
Normal file
8
spec/ruby/shared/complex/conjugate.rb
Normal file
|
@ -0,0 +1,8 @@
|
|||
describe :complex_conjugate, shared: true do
|
||||
it "returns the complex conjugate: conj a + bi = a - bi" do
|
||||
Complex(3, 5).send(@method).should == Complex(3, -5)
|
||||
Complex(3, -5).send(@method).should == Complex(3, 5)
|
||||
Complex(-3.0, 5.2).send(@method).should be_close(Complex(-3.0, -5.2), TOLERANCE)
|
||||
Complex(3.0, -5.2).send(@method).should be_close(Complex(3.0, 5.2), TOLERANCE)
|
||||
end
|
||||
end
|
7
spec/ruby/shared/complex/constants.rb
Normal file
7
spec/ruby/shared/complex/constants.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_I, shared: true do
|
||||
it "is Complex(0, 1)" do
|
||||
Complex::I.should eql(Complex(0, 1))
|
||||
end
|
||||
end
|
13
spec/ruby/shared/complex/denominator.rb
Normal file
13
spec/ruby/shared/complex/denominator.rb
Normal file
|
@ -0,0 +1,13 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_denominator, shared: true do
|
||||
it "returns the least common multiple denominator of the real and imaginary parts" do
|
||||
Complex(3, 4).denominator.should == 1
|
||||
Complex(3, bignum_value).denominator.should == 1
|
||||
|
||||
Complex(3, Rational(3,4)).denominator.should == 4
|
||||
|
||||
Complex(Rational(4,8), Rational(3,4)).denominator.should == 4
|
||||
Complex(Rational(3,8), Rational(3,4)).denominator.should == 8
|
||||
end
|
||||
end
|
84
spec/ruby/shared/complex/divide.rb
Normal file
84
spec/ruby/shared/complex/divide.rb
Normal file
|
@ -0,0 +1,84 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_divide, shared: true do
|
||||
describe "with Complex" do
|
||||
it "divides according to the usual rule for complex numbers" do
|
||||
a = Complex((1 * 10) - (2 * 20), (1 * 20) + (2 * 10))
|
||||
b = Complex(1, 2)
|
||||
a.send(@method, b).should == Complex(10, 20)
|
||||
|
||||
c = Complex((1.5 * 100.2) - (2.1 * -30.3), (1.5 * -30.3) + (2.1 * 100.2))
|
||||
d = Complex(1.5, 2.1)
|
||||
# remember the floating-point arithmetic
|
||||
c.send(@method, d).should be_close(Complex(100.2, -30.3), TOLERANCE)
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Fixnum" do
|
||||
it "divides both parts of the Complex number" do
|
||||
Complex(20, 40).send(@method, 2).should == Complex(10, 20)
|
||||
Complex(30, 30).send(@method, 10).should == Complex(3, 3)
|
||||
end
|
||||
|
||||
it "raises a ZeroDivisionError when given zero" do
|
||||
lambda { Complex(20, 40).send(@method, 0) }.should raise_error(ZeroDivisionError)
|
||||
end
|
||||
|
||||
it "produces Rational parts" do
|
||||
Complex(5, 9).send(@method, 2).should eql(Complex(Rational(5,2), Rational(9,2)))
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Bignum" do
|
||||
it "divides both parts of the Complex number" do
|
||||
Complex(20, 40).send(@method, 2).should == Complex(10, 20)
|
||||
Complex(15, 16).send(@method, 2.0).should be_close(Complex(7.5, 8), TOLERANCE)
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Float" do
|
||||
it "divides both parts of the Complex number" do
|
||||
Complex(3, 9).send(@method, 1.5).should == Complex(2, 6)
|
||||
Complex(15, 16).send(@method, 2.0).should be_close(Complex(7.5, 8), TOLERANCE)
|
||||
end
|
||||
|
||||
it "returns Complex(Infinity, Infinity) when given zero" do
|
||||
Complex(20, 40).send(@method, 0.0).real.infinite?.should == 1
|
||||
Complex(20, 40).send(@method, 0.0).imag.infinite?.should == 1
|
||||
Complex(-20, 40).send(@method, 0.0).real.infinite?.should == -1
|
||||
Complex(-20, 40).send(@method, 0.0).imag.infinite?.should == 1
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Object" do
|
||||
it "tries to coerce self into other" do
|
||||
value = Complex(3, 9)
|
||||
|
||||
obj = mock("Object")
|
||||
obj.should_receive(:coerce).with(value).and_return([4, 2])
|
||||
value.send(@method, obj).should == 2
|
||||
end
|
||||
end
|
||||
|
||||
describe "with a Numeric which responds to #real? with true" do
|
||||
it "returns Complex(real.quo(other), imag.quo(other))" do
|
||||
other = mock_numeric('other')
|
||||
real = mock_numeric('real')
|
||||
imag = mock_numeric('imag')
|
||||
other.should_receive(:real?).and_return(true)
|
||||
real.should_receive(:quo).with(other).and_return(1)
|
||||
imag.should_receive(:quo).with(other).and_return(2)
|
||||
Complex(real, imag).send(@method, other).should == Complex(1, 2)
|
||||
end
|
||||
end
|
||||
|
||||
describe "with a Numeric which responds to #real? with false" do
|
||||
it "coerces the passed argument to Complex and divides the resulting elements" do
|
||||
complex = Complex(3, 0)
|
||||
other = mock_numeric('other')
|
||||
other.should_receive(:real?).any_number_of_times.and_return(false)
|
||||
other.should_receive(:coerce).with(complex).and_return([5, 2])
|
||||
complex.send(@method, other).should eql(Rational(5, 2))
|
||||
end
|
||||
end
|
||||
end
|
93
spec/ruby/shared/complex/equal_value.rb
Normal file
93
spec/ruby/shared/complex/equal_value.rb
Normal file
|
@ -0,0 +1,93 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_equal_value, shared: true do
|
||||
describe "with Complex" do
|
||||
it "returns true when self and other have numerical equality" do
|
||||
Complex(1, 2).should == Complex(1, 2)
|
||||
Complex(3, 9).should == Complex(3, 9)
|
||||
Complex(-3, -9).should == Complex(-3, -9)
|
||||
|
||||
Complex(1, 2).should_not == Complex(3, 4)
|
||||
Complex(3, 9).should_not == Complex(9, 3)
|
||||
|
||||
Complex(1.0, 2.0).should == Complex(1, 2)
|
||||
Complex(3.0, 9.0).should_not == Complex(9.0, 3.0)
|
||||
|
||||
Complex(1.5, 2.5).should == Complex(1.5, 2.5)
|
||||
Complex(1.5, 2.5).should == Complex(1.5, 2.5)
|
||||
Complex(-1.5, 2.5).should == Complex(-1.5, 2.5)
|
||||
|
||||
Complex(1.5, 2.5).should_not == Complex(2.5, 1.5)
|
||||
Complex(3.75, 2.5).should_not == Complex(1.5, 2.5)
|
||||
|
||||
Complex(bignum_value, 2.5).should == Complex(bignum_value, 2.5)
|
||||
Complex(3.75, bignum_value).should_not == Complex(1.5, bignum_value)
|
||||
|
||||
Complex(nan_value).should_not == Complex(nan_value)
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Numeric" do
|
||||
it "returns true when self's imaginary part is 0 and the real part and other have numerical equality" do
|
||||
Complex(3, 0).should == 3
|
||||
Complex(-3, 0).should == -3
|
||||
|
||||
Complex(3.5, 0).should == 3.5
|
||||
Complex(-3.5, 0).should == -3.5
|
||||
|
||||
Complex(bignum_value, 0).should == bignum_value
|
||||
Complex(-bignum_value, 0).should == -bignum_value
|
||||
|
||||
Complex(3.0, 0).should == 3
|
||||
Complex(-3.0, 0).should == -3
|
||||
|
||||
Complex(3, 0).should_not == 4
|
||||
Complex(-3, 0).should_not == -4
|
||||
|
||||
Complex(3.5, 0).should_not == -4.5
|
||||
Complex(-3.5, 0).should_not == 2.5
|
||||
|
||||
Complex(bignum_value, 0).should_not == bignum_value(10)
|
||||
Complex(-bignum_value, 0).should_not == -bignum_value(20)
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Object" do
|
||||
# Fixnum#==, Float#== and Bignum#== only return booleans - Bug?
|
||||
it "calls other#== with self" do
|
||||
value = Complex(3, 0)
|
||||
|
||||
obj = mock("Object")
|
||||
obj.should_receive(:==).with(value).and_return(:expected)
|
||||
|
||||
(value == obj).should_not be_false
|
||||
end
|
||||
end
|
||||
|
||||
describe "with a Numeric which responds to #real? with true" do
|
||||
before do
|
||||
@other = mock_numeric('other')
|
||||
@other.should_receive(:real?).any_number_of_times.and_return(true)
|
||||
end
|
||||
|
||||
it "returns real == other when the imaginary part is zero" do
|
||||
real = mock_numeric('real')
|
||||
real.should_receive(:==).with(@other).and_return(true)
|
||||
(Complex(real, 0) == @other).should be_true
|
||||
end
|
||||
|
||||
it "returns false when when the imaginary part is not zero" do
|
||||
(Complex(3, 1) == @other).should be_false
|
||||
end
|
||||
end
|
||||
|
||||
describe "with a Numeric which responds to #real? with false" do
|
||||
it "returns other == self" do
|
||||
complex = Complex(3, 0)
|
||||
other = mock_numeric('other')
|
||||
other.should_receive(:real?).any_number_of_times.and_return(false)
|
||||
other.should_receive(:==).with(complex).and_return(true)
|
||||
(complex == other).should be_true
|
||||
end
|
||||
end
|
||||
end
|
61
spec/ruby/shared/complex/exponent.rb
Normal file
61
spec/ruby/shared/complex/exponent.rb
Normal file
|
@ -0,0 +1,61 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_exponent, shared: true do
|
||||
describe "with Fixnum 0" do
|
||||
it "returns Complex(1)" do
|
||||
(Complex(3, 4) ** 0).should eql(Complex(1))
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Float 0.0" do
|
||||
it "returns Complex(1.0, 0.0)" do
|
||||
(Complex(3, 4) ** 0.0).should eql(Complex(1.0, 0.0))
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Complex" do
|
||||
it "returns self raised to the given power" do
|
||||
(Complex(2, 1) ** Complex(2, 1)).should be_close(Complex(-0.504824688978319, 3.10414407699553), TOLERANCE)
|
||||
(Complex(2, 1) ** Complex(3, 4)).should be_close(Complex(-0.179174656916581, -1.74071656397662), TOLERANCE)
|
||||
|
||||
(Complex(2, 1) ** Complex(-2, -1)).should be_close(Complex(-0.051041070450869, -0.313849223270419), TOLERANCE)
|
||||
(Complex(-2, -1) ** Complex(2, 1)).should be_close(Complex(-11.6819929610857, 71.8320439736158), TOLERANCE)
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Integer" do
|
||||
it "returns self raised to the given power" do
|
||||
(Complex(2, 1) ** 2).should == Complex(3, 4)
|
||||
(Complex(3, 4) ** 2).should == Complex(-7, 24)
|
||||
(Complex(3, 4) ** -2).should be_close(Complex(-0.0112, -0.0384), TOLERANCE)
|
||||
|
||||
|
||||
(Complex(2, 1) ** 2.5).should be_close(Complex(2.99179707178602, 6.85206901006896), TOLERANCE)
|
||||
(Complex(3, 4) ** 2.5).should be_close(Complex(-38.0, 41.0), TOLERANCE)
|
||||
(Complex(3, 4) ** -2.5).should be_close(Complex(-0.01216, -0.01312), TOLERANCE)
|
||||
|
||||
(Complex(1) ** 1).should == Complex(1)
|
||||
|
||||
# NOTE: Takes way too long...
|
||||
#(Complex(2, 1) ** bignum_value)
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Rational" do
|
||||
it "returns self raised to the given power" do
|
||||
(Complex(2, 1) ** Rational(3, 4)).should be_close(Complex(1.71913265276568, 0.623124744394697), TOLERANCE)
|
||||
(Complex(2, 1) ** Rational(4, 3)).should be_close(Complex(2.3828547125173, 1.69466313833091), TOLERANCE)
|
||||
(Complex(2, 1) ** Rational(-4, 3)).should be_close(Complex(0.278700377879388, -0.198209003071003), TOLERANCE)
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Object" do
|
||||
it "tries to coerce self into other" do
|
||||
value = Complex(3, 9)
|
||||
|
||||
obj = mock("Object")
|
||||
obj.should_receive(:coerce).with(value).and_return([2, 5])
|
||||
(value ** obj).should == 2 ** 5
|
||||
end
|
||||
end
|
||||
end
|
38
spec/ruby/shared/complex/float/arg.rb
Normal file
38
spec/ruby/shared/complex/float/arg.rb
Normal file
|
@ -0,0 +1,38 @@
|
|||
require File.expand_path('../../../../spec_helper', __FILE__)
|
||||
|
||||
describe :float_arg, shared: true do
|
||||
it "returns NaN if NaN" do
|
||||
f = nan_value
|
||||
f.send(@method).nan?.should be_true
|
||||
end
|
||||
|
||||
it "returns self if NaN" do
|
||||
f = nan_value
|
||||
f.send(@method).should equal(f)
|
||||
end
|
||||
|
||||
it "returns 0 if positive" do
|
||||
1.0.send(@method).should == 0
|
||||
end
|
||||
|
||||
it "returns 0 if +0.0" do
|
||||
0.0.send(@method).should == 0
|
||||
end
|
||||
|
||||
it "returns 0 if +Infinity" do
|
||||
infinity_value.send(@method).should == 0
|
||||
end
|
||||
|
||||
it "returns Pi if negative" do
|
||||
(-1.0).send(@method).should == Math::PI
|
||||
end
|
||||
|
||||
# This was established in r23960
|
||||
it "returns Pi if -0.0" do
|
||||
(-0.0).send(@method).should == Math::PI
|
||||
end
|
||||
|
||||
it "returns Pi if -Infinity" do
|
||||
(-infinity_value).send(@method).should == Math::PI
|
||||
end
|
||||
end
|
16
spec/ruby/shared/complex/hash.rb
Normal file
16
spec/ruby/shared/complex/hash.rb
Normal file
|
@ -0,0 +1,16 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_hash, shared: true do
|
||||
it "is static" do
|
||||
Complex(1).hash.should == Complex(1).hash
|
||||
Complex(1, 0).hash.should == Complex(1).hash
|
||||
Complex(1, 1).hash.should == Complex(1, 1).hash
|
||||
end
|
||||
|
||||
it "is different for different instances" do
|
||||
Complex(1, 2).hash.should_not == Complex(1, 1).hash
|
||||
Complex(2, 1).hash.should_not == Complex(1, 1).hash
|
||||
|
||||
Complex(1, 2).hash.should_not == Complex(2, 1).hash
|
||||
end
|
||||
end
|
10
spec/ruby/shared/complex/image.rb
Normal file
10
spec/ruby/shared/complex/image.rb
Normal file
|
@ -0,0 +1,10 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_image, shared: true do
|
||||
it "returns the imaginary part of self" do
|
||||
Complex(1, 0).send(@method).should == 0
|
||||
Complex(2, 1).send(@method).should == 1
|
||||
Complex(6.7, 8.9).send(@method).should == 8.9
|
||||
Complex(1, bignum_value).send(@method).should == bignum_value
|
||||
end
|
||||
end
|
14
spec/ruby/shared/complex/inspect.rb
Normal file
14
spec/ruby/shared/complex/inspect.rb
Normal file
|
@ -0,0 +1,14 @@
|
|||
describe :complex_inspect, shared: true do
|
||||
it "returns (${real}+${image}i) for positive imaginary parts" do
|
||||
Complex(1).inspect.should == "(1+0i)"
|
||||
Complex(7).inspect.should == "(7+0i)"
|
||||
Complex(-1, 4).inspect.should == "(-1+4i)"
|
||||
Complex(-7, 6.7).inspect.should == "(-7+6.7i)"
|
||||
end
|
||||
|
||||
it "returns (${real}-${image}i) for negative imaginary parts" do
|
||||
Complex(0, -1).inspect.should == "(0-1i)"
|
||||
Complex(-1, -4).inspect.should == "(-1-4i)"
|
||||
Complex(-7, -6.7).inspect.should == "(-7-6.7i)"
|
||||
end
|
||||
end
|
45
spec/ruby/shared/complex/minus.rb
Normal file
45
spec/ruby/shared/complex/minus.rb
Normal file
|
@ -0,0 +1,45 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_minus, shared: true do
|
||||
describe "with Complex" do
|
||||
it "subtracts both the real and imaginary components" do
|
||||
(Complex(1, 2) - Complex(10, 20)).should == Complex(1 - 10, 2 - 20)
|
||||
(Complex(1.5, 2.1) - Complex(100.2, -30.3)).should == Complex(1.5 - 100.2, 2.1 - (-30.3))
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Integer" do
|
||||
it "subtracts the real number from the real component of self" do
|
||||
(Complex(1, 2) - 50).should == Complex(-49, 2)
|
||||
(Complex(1, 2) - 50.5).should == Complex(-49.5, 2)
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Object" do
|
||||
it "tries to coerce self into other" do
|
||||
value = Complex(3, 9)
|
||||
|
||||
obj = mock("Object")
|
||||
obj.should_receive(:coerce).with(value).and_return([2, 5])
|
||||
(value - obj).should == 2 - 5
|
||||
end
|
||||
end
|
||||
|
||||
describe "passed Numeric which responds to #real? with true" do
|
||||
it "coerces the passed argument to the type of the real part and subtracts the resulting elements" do
|
||||
n = mock_numeric('n')
|
||||
n.should_receive(:real?).and_return(true)
|
||||
n.should_receive(:coerce).with(1).and_return([1, 4])
|
||||
(Complex(1, 2) - n).should == Complex(-3, 2)
|
||||
end
|
||||
end
|
||||
|
||||
describe "passed Numeric which responds to #real? with false" do
|
||||
it "coerces the passed argument to Complex and subtracts the resulting elements" do
|
||||
n = mock_numeric('n')
|
||||
n.should_receive(:real?).and_return(false)
|
||||
n.should_receive(:coerce).with(Complex(1, 2)).and_return([Complex(1, 2), Complex(3, 4)])
|
||||
(Complex(1, 2) - n).should == Complex(-2, -2)
|
||||
end
|
||||
end
|
||||
end
|
49
spec/ruby/shared/complex/multiply.rb
Normal file
49
spec/ruby/shared/complex/multiply.rb
Normal file
|
@ -0,0 +1,49 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_multiply, shared: true do
|
||||
describe "with Complex" do
|
||||
it "multiplies according to the usual rule for complex numbers: (a + bi) * (c + di) = ac - bd + (ad + bc)i" do
|
||||
(Complex(1, 2) * Complex(10, 20)).should == Complex((1 * 10) - (2 * 20), (1 * 20) + (2 * 10))
|
||||
(Complex(1.5, 2.1) * Complex(100.2, -30.3)).should == Complex((1.5 * 100.2) - (2.1 * -30.3), (1.5 * -30.3) + (2.1 * 100.2))
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Integer" do
|
||||
it "multiplies both parts of self by the given Integer" do
|
||||
(Complex(3, 2) * 50).should == Complex(150, 100)
|
||||
(Complex(-3, 2) * 50.5).should == Complex(-151.5, 101)
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Object" do
|
||||
it "tries to coerce self into other" do
|
||||
value = Complex(3, 9)
|
||||
|
||||
obj = mock("Object")
|
||||
obj.should_receive(:coerce).with(value).and_return([2, 5])
|
||||
(value * obj).should == 2 * 5
|
||||
end
|
||||
end
|
||||
|
||||
describe "with a Numeric which responds to #real? with true" do
|
||||
it "multiples both parts of self by other" do
|
||||
other = mock_numeric('other')
|
||||
real = mock_numeric('real')
|
||||
imag = mock_numeric('imag')
|
||||
other.should_receive(:real?).and_return(true)
|
||||
real.should_receive(:*).with(other).and_return(1)
|
||||
imag.should_receive(:*).with(other).and_return(2)
|
||||
(Complex(real, imag) * other).should == Complex(1, 2)
|
||||
end
|
||||
|
||||
describe "with a Numeric which responds to #real? with false" do
|
||||
it "coerces the passed argument to Complex and multiplies the resulting elements" do
|
||||
complex = Complex(3, 0)
|
||||
other = mock_numeric('other')
|
||||
other.should_receive(:real?).any_number_of_times.and_return(false)
|
||||
other.should_receive(:coerce).with(complex).and_return([5, 2])
|
||||
(complex * other).should == 10
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
19
spec/ruby/shared/complex/numerator.rb
Normal file
19
spec/ruby/shared/complex/numerator.rb
Normal file
|
@ -0,0 +1,19 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_numerator, shared: true do
|
||||
it "returns self's numerator" do
|
||||
Complex(2).numerator.should == Complex(2)
|
||||
Complex(3, 4).numerator.should == Complex(3, 4)
|
||||
|
||||
Complex(Rational(3, 4), Rational(3, 4)).numerator.should == Complex(3, 3)
|
||||
Complex(Rational(7, 4), Rational(8, 4)).numerator.should == Complex(7, 8)
|
||||
|
||||
Complex(Rational(7, 8), Rational(8, 4)).numerator.should == Complex(7, 16)
|
||||
Complex(Rational(7, 4), Rational(8, 8)).numerator.should == Complex(7, 4)
|
||||
|
||||
# NOTE:
|
||||
# Bug? - Fails with a MethodMissingError
|
||||
# (undefined method `denominator' for 3.5:Float)
|
||||
# Complex(3.5, 3.7).numerator
|
||||
end
|
||||
end
|
38
spec/ruby/shared/complex/numeric/arg.rb
Normal file
38
spec/ruby/shared/complex/numeric/arg.rb
Normal file
|
@ -0,0 +1,38 @@
|
|||
require File.expand_path('../../../../spec_helper', __FILE__)
|
||||
|
||||
describe :numeric_arg, shared: true do
|
||||
before :each do
|
||||
@numbers = [
|
||||
20,
|
||||
Rational(3, 4),
|
||||
bignum_value,
|
||||
infinity_value
|
||||
]
|
||||
end
|
||||
|
||||
it "returns 0 if positive" do
|
||||
@numbers.each do |number|
|
||||
number.send(@method).should == 0
|
||||
end
|
||||
end
|
||||
|
||||
it "returns Pi if negative" do
|
||||
@numbers.each do |number|
|
||||
(0-number).send(@method).should == Math::PI
|
||||
end
|
||||
end
|
||||
|
||||
describe "with a Numeric subclass" do
|
||||
it "returns 0 if self#<(0) returns false" do
|
||||
numeric = mock_numeric('positive')
|
||||
numeric.should_receive(:<).with(0).and_return(false)
|
||||
numeric.send(@method).should == 0
|
||||
end
|
||||
|
||||
it "returns Pi if self#<(0) returns true" do
|
||||
numeric = mock_numeric('positive')
|
||||
numeric.should_receive(:<).with(0).and_return(true)
|
||||
numeric.send(@method).should == Math::PI
|
||||
end
|
||||
end
|
||||
end
|
20
spec/ruby/shared/complex/numeric/conj.rb
Normal file
20
spec/ruby/shared/complex/numeric/conj.rb
Normal file
|
@ -0,0 +1,20 @@
|
|||
require File.expand_path('../../../../spec_helper', __FILE__)
|
||||
|
||||
describe :numeric_conj, shared: true do
|
||||
before :each do
|
||||
@numbers = [
|
||||
20, # Integer
|
||||
398.72, # Float
|
||||
Rational(3, 4), # Rational
|
||||
bignum_value,
|
||||
infinity_value,
|
||||
nan_value
|
||||
]
|
||||
end
|
||||
|
||||
it "returns self" do
|
||||
@numbers.each do |number|
|
||||
number.send(@method).should equal(number)
|
||||
end
|
||||
end
|
||||
end
|
26
spec/ruby/shared/complex/numeric/imag.rb
Normal file
26
spec/ruby/shared/complex/numeric/imag.rb
Normal file
|
@ -0,0 +1,26 @@
|
|||
require File.expand_path('../../../../spec_helper', __FILE__)
|
||||
|
||||
describe :numeric_imag, shared: true do
|
||||
before :each do
|
||||
@numbers = [
|
||||
20, # Integer
|
||||
398.72, # Float
|
||||
Rational(3, 4), # Rational
|
||||
bignum_value, # Bignum
|
||||
infinity_value,
|
||||
nan_value
|
||||
].map{|n| [n,-n]}.flatten
|
||||
end
|
||||
|
||||
it "returns 0" do
|
||||
@numbers.each do |number|
|
||||
number.send(@method).should == 0
|
||||
end
|
||||
end
|
||||
|
||||
it "raises an ArgumentError if given any arguments" do
|
||||
@numbers.each do |number|
|
||||
lambda { number.send(@method, number) }.should raise_error(ArgumentError)
|
||||
end
|
||||
end
|
||||
end
|
50
spec/ruby/shared/complex/numeric/polar.rb
Normal file
50
spec/ruby/shared/complex/numeric/polar.rb
Normal file
|
@ -0,0 +1,50 @@
|
|||
require File.expand_path('../../../../spec_helper', __FILE__)
|
||||
|
||||
describe :numeric_polar, shared: true do
|
||||
before :each do
|
||||
@pos_numbers = [
|
||||
1,
|
||||
3898172610**9,
|
||||
987.18273,
|
||||
Float::MAX,
|
||||
Rational(13,7),
|
||||
infinity_value,
|
||||
]
|
||||
@neg_numbers = @pos_numbers.map {|n| -n}
|
||||
@numbers = @pos_numbers + @neg_numbers
|
||||
@numbers.push(0, 0.0)
|
||||
end
|
||||
|
||||
it "returns a two-element Array" do
|
||||
@numbers.each do |number|
|
||||
number.polar.should be_an_instance_of(Array)
|
||||
number.polar.size.should == 2
|
||||
end
|
||||
end
|
||||
|
||||
it "sets the first value to the absolute value of self" do
|
||||
@numbers.each do |number|
|
||||
number.polar.first.should == number.abs
|
||||
end
|
||||
end
|
||||
|
||||
it "sets the last value to 0 if self is positive" do
|
||||
(@numbers - @neg_numbers).each do |number|
|
||||
number.should >= 0
|
||||
number.polar.last.should == 0
|
||||
end
|
||||
end
|
||||
|
||||
it "sets the last value to Pi if self is negative" do
|
||||
@neg_numbers.each do |number|
|
||||
number.should < 0
|
||||
number.polar.last.should == Math::PI
|
||||
end
|
||||
end
|
||||
|
||||
it "returns [NaN, NaN] if self is NaN" do
|
||||
nan_value.polar.size.should == 2
|
||||
nan_value.polar.first.nan?.should be_true
|
||||
nan_value.polar.last.nan?.should be_true
|
||||
end
|
||||
end
|
30
spec/ruby/shared/complex/numeric/real.rb
Normal file
30
spec/ruby/shared/complex/numeric/real.rb
Normal file
|
@ -0,0 +1,30 @@
|
|||
require File.expand_path('../../../../spec_helper', __FILE__)
|
||||
|
||||
describe :numeric_real, shared: true do
|
||||
before :each do
|
||||
@numbers = [
|
||||
20, # Integer
|
||||
398.72, # Float
|
||||
Rational(3, 4), # Rational
|
||||
bignum_value, # Bignum
|
||||
infinity_value,
|
||||
nan_value
|
||||
].map{|n| [n,-n]}.flatten
|
||||
end
|
||||
|
||||
it "returns self" do
|
||||
@numbers.each do |number|
|
||||
if number.to_f.nan?
|
||||
number.real.nan?.should be_true
|
||||
else
|
||||
number.real.should == number
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "raises an ArgumentError if given any arguments" do
|
||||
@numbers.each do |number|
|
||||
lambda { number.real(number) }.should raise_error(ArgumentError)
|
||||
end
|
||||
end
|
||||
end
|
45
spec/ruby/shared/complex/plus.rb
Normal file
45
spec/ruby/shared/complex/plus.rb
Normal file
|
@ -0,0 +1,45 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_plus, shared: true do
|
||||
describe "with Complex" do
|
||||
it "adds both the real and imaginary components" do
|
||||
(Complex(1, 2) + Complex(10, 20)).should == Complex(1 + 10, 2 + 20)
|
||||
(Complex(1.5, 2.1) + Complex(100.2, -30.3)).should == Complex(1.5 + 100.2, 2.1 + (-30.3))
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Integer" do
|
||||
it "adds the real number to the real component of self" do
|
||||
(Complex(1, 2) + 50).should == Complex(51, 2)
|
||||
(Complex(1, 2) + 50.5).should == Complex(51.5, 2)
|
||||
end
|
||||
end
|
||||
|
||||
describe "with Object" do
|
||||
it "tries to coerce self into other" do
|
||||
value = Complex(3, 9)
|
||||
|
||||
obj = mock("Object")
|
||||
obj.should_receive(:coerce).with(value).and_return([2, 5])
|
||||
(value + obj).should == 2 + 5
|
||||
end
|
||||
end
|
||||
|
||||
describe "passed Numeric which responds to #real? with true" do
|
||||
it "coerces the passed argument to the type of the real part and adds the resulting elements" do
|
||||
n = mock_numeric('n')
|
||||
n.should_receive(:real?).and_return(true)
|
||||
n.should_receive(:coerce).with(1).and_return([1, 4])
|
||||
(Complex(1, 2) + n).should == Complex(5, 2)
|
||||
end
|
||||
end
|
||||
|
||||
describe "passed Numeric which responds to #real? with false" do
|
||||
it "coerces the passed argument to Complex and adds the resulting elements" do
|
||||
n = mock_numeric('n')
|
||||
n.should_receive(:real?).and_return(false)
|
||||
n.should_receive(:coerce).with(Complex(1, 2)).and_return([Complex(1, 2), Complex(3, 4)])
|
||||
(Complex(1, 2) + n).should == Complex(4, 6)
|
||||
end
|
||||
end
|
||||
end
|
22
spec/ruby/shared/complex/polar.rb
Normal file
22
spec/ruby/shared/complex/polar.rb
Normal file
|
@ -0,0 +1,22 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_polar_class, shared: true do
|
||||
it "returns a complex number in terms of radius and angle" do
|
||||
Complex.polar(50, 60).should be_close(Complex(-47.6206490207578, -15.2405310551108), TOLERANCE)
|
||||
Complex.polar(-10, -20).should be_close(Complex(-4.08082061813392, 9.12945250727628), TOLERANCE)
|
||||
end
|
||||
end
|
||||
|
||||
describe :complex_polar, shared: true do
|
||||
it "returns the absolute value and the argument" do
|
||||
a = Complex(3, 4)
|
||||
a.polar.size.should == 2
|
||||
a.polar.first.should == 5.0
|
||||
a.polar.last.should be_close(0.927295218001612, TOLERANCE)
|
||||
|
||||
b = Complex(-3.5, 4.7)
|
||||
b.polar.size.should == 2
|
||||
b.polar.first.should be_close(5.86003412959345, TOLERANCE)
|
||||
b.polar.last.should be_close(2.21088447955664, TOLERANCE)
|
||||
end
|
||||
end
|
8
spec/ruby/shared/complex/real.rb
Normal file
8
spec/ruby/shared/complex/real.rb
Normal file
|
@ -0,0 +1,8 @@
|
|||
describe :complex_real, shared: true do
|
||||
it "returns the real part of self" do
|
||||
Complex(1, 0).real.should == 1
|
||||
Complex(2, 1).real.should == 2
|
||||
Complex(6.7, 8.9).real.should == 6.7
|
||||
Complex(bignum_value, 3).real.should == bignum_value
|
||||
end
|
||||
end
|
96
spec/ruby/shared/complex/rect.rb
Normal file
96
spec/ruby/shared/complex/rect.rb
Normal file
|
@ -0,0 +1,96 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_rect, shared: true do
|
||||
before :each do
|
||||
@numbers = [
|
||||
Complex(1),
|
||||
Complex(0, 20),
|
||||
Complex(0, 0),
|
||||
Complex(0.0),
|
||||
Complex(9999999**99),
|
||||
Complex(-20),
|
||||
Complex.polar(76, 10)
|
||||
]
|
||||
end
|
||||
|
||||
it "returns an Array" do
|
||||
@numbers.each do |number|
|
||||
number.send(@method).should be_an_instance_of(Array)
|
||||
end
|
||||
end
|
||||
|
||||
it "returns a two-element Array" do
|
||||
@numbers.each do |number|
|
||||
number.send(@method).size.should == 2
|
||||
end
|
||||
end
|
||||
|
||||
it "returns the real part of self as the first element" do
|
||||
@numbers.each do |number|
|
||||
number.send(@method).first.should == number.real
|
||||
end
|
||||
end
|
||||
|
||||
it "returns the imaginary part of self as the last element" do
|
||||
@numbers.each do |number|
|
||||
number.send(@method).last.should == number.imaginary
|
||||
end
|
||||
end
|
||||
|
||||
it "raises an ArgumentError if given any arguments" do
|
||||
@numbers.each do |number|
|
||||
lambda { number.send(@method, number) }.should raise_error(ArgumentError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe :complex_rect_class, shared: true do
|
||||
describe "passed a Numeric n which responds to #real? with true" do
|
||||
it "returns a Complex with real part n and imaginary part 0" do
|
||||
n = mock_numeric('n')
|
||||
n.should_receive(:real?).any_number_of_times.and_return(true)
|
||||
result = Complex.send(@method, n)
|
||||
result.real.should == n
|
||||
result.imag.should == 0
|
||||
end
|
||||
end
|
||||
|
||||
describe "passed a Numeric which responds to #real? with false" do
|
||||
it "raises TypeError" do
|
||||
n = mock_numeric('n')
|
||||
n.should_receive(:real?).any_number_of_times.and_return(false)
|
||||
lambda { Complex.send(@method, n) }.should raise_error(TypeError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "passed Numerics n1 and n2 and at least one responds to #real? with false" do
|
||||
[[false, false], [false, true], [true, false]].each do |r1, r2|
|
||||
it "raises TypeError" do
|
||||
n1 = mock_numeric('n1')
|
||||
n2 = mock_numeric('n2')
|
||||
n1.should_receive(:real?).any_number_of_times.and_return(r1)
|
||||
n2.should_receive(:real?).any_number_of_times.and_return(r2)
|
||||
lambda { Complex.send(@method, n1, n2) }.should raise_error(TypeError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "passed Numerics n1 and n2 and both respond to #real? with true" do
|
||||
it "returns a Complex with real part n1 and imaginary part n2" do
|
||||
n1 = mock_numeric('n1')
|
||||
n2 = mock_numeric('n2')
|
||||
n1.should_receive(:real?).any_number_of_times.and_return(true)
|
||||
n2.should_receive(:real?).any_number_of_times.and_return(true)
|
||||
result = Complex.send(@method, n1, n2)
|
||||
result.real.should == n1
|
||||
result.imag.should == n2
|
||||
end
|
||||
end
|
||||
|
||||
describe "passed a non-Numeric" do
|
||||
it "raises TypeError" do
|
||||
lambda { Complex.send(@method, :sym) }.should raise_error(TypeError)
|
||||
lambda { Complex.send(@method, 0, :sym) }.should raise_error(TypeError)
|
||||
end
|
||||
end
|
||||
end
|
44
spec/ruby/shared/complex/to_s.rb
Normal file
44
spec/ruby/shared/complex/to_s.rb
Normal file
|
@ -0,0 +1,44 @@
|
|||
require File.expand_path('../../../spec_helper', __FILE__)
|
||||
|
||||
describe :complex_to_s, shared: true do
|
||||
describe "when self's real component is 0" do
|
||||
it "returns both the real and imaginary component even when the real is 0" do
|
||||
Complex(0, 5).to_s.should == "0+5i"
|
||||
Complex(0, -3.2).to_s.should == "0-3.2i"
|
||||
end
|
||||
end
|
||||
|
||||
it "returns self as String" do
|
||||
Complex(1, 5).to_s.should == "1+5i"
|
||||
Complex(-2.5, 1.5).to_s.should == "-2.5+1.5i"
|
||||
|
||||
Complex(1, -5).to_s.should == "1-5i"
|
||||
Complex(-2.5, -1.5).to_s.should == "-2.5-1.5i"
|
||||
|
||||
# Guard against the Mathn library
|
||||
conflicts_with :Prime do
|
||||
Complex(1, 0).to_s.should == "1+0i"
|
||||
Complex(1, -0).to_s.should == "1+0i"
|
||||
end
|
||||
end
|
||||
|
||||
it "returns 1+0.0i for Complex(1, 0.0)" do
|
||||
Complex(1, 0.0).to_s.should == "1+0.0i"
|
||||
end
|
||||
|
||||
it "returns 1-0.0i for Complex(1, -0.0)" do
|
||||
Complex(1, -0.0).to_s.should == "1-0.0i"
|
||||
end
|
||||
|
||||
it "returns 1+Infinity*i for Complex(1, Infinity)" do
|
||||
Complex(1, infinity_value).to_s.should == "1+Infinity*i"
|
||||
end
|
||||
|
||||
it "returns 1-Infinity*i for Complex(1, -Infinity)" do
|
||||
Complex(1, -infinity_value).to_s.should == "1-Infinity*i"
|
||||
end
|
||||
|
||||
it "returns 1+NaN*i for Complex(1, NaN)" do
|
||||
Complex(1, nan_value).to_s.should == "1+NaN*i"
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue