3 class ComplexRational_Test < Test::Unit::TestCase
6 return unless defined?(Rational)
11 assert_kind_of(Numeric, c)
12 assert_kind_of(Numeric, cc)
14 assert_instance_of(SimpleRat, c)
15 assert_instance_of(Rational, cc)
17 assert_equal(SimpleRat(1,3), +c)
18 assert_equal(SimpleRat(-1,3), -c)
20 assert_equal(SimpleRat(7,3), c + 2)
21 assert_equal(SimpleRat(-5,3), c - 2)
22 assert_equal(SimpleRat(2,3), c * 2)
23 assert_equal(SimpleRat(1,6), c / 2)
24 assert_equal(SimpleRat(1,9), c ** 2)
25 assert_equal(-1, c <=> 2)
27 assert_equal(SimpleRat(7,3), 2 + c)
28 assert_equal(SimpleRat(5,3), 2 - c)
29 assert_equal(SimpleRat(2,3), 2 * c)
30 assert_equal(SimpleRat(6,1), 2 / c)
31 assert_in_delta(1.2599, 2 ** c, 0.001)
32 assert_equal(1, 2 <=> c)
34 assert_equal(SimpleRat(11,6), c + cc)
35 assert_equal(SimpleRat(-7,6), c - cc)
36 assert_equal(SimpleRat(1,2), c * cc)
37 assert_equal(SimpleRat(2,9), c / cc)
38 assert_in_delta(0.1924, c ** cc, 0.001)
39 assert_equal(-1, c <=> cc)
41 assert_equal(SimpleRat(11,6), cc + c)
42 assert_equal(SimpleRat(7,6), cc - c)
43 assert_equal(SimpleRat(1,2), cc * c)
44 assert_equal(SimpleRat(9,2), cc / c)
45 assert_in_delta(1.1447, cc ** c, 0.001)
46 assert_equal(1, cc <=> c)
48 assert_equal(SimpleRat, (+c).class)
49 assert_equal(SimpleRat, (-c).class)
51 assert_equal(SimpleRat, (c + 2).class)
52 assert_equal(SimpleRat, (c - 2).class)
53 assert_equal(SimpleRat, (c * 2).class)
54 assert_equal(SimpleRat, (c / 2).class)
55 assert_equal(SimpleRat, (c ** 2).class)
57 assert_equal(SimpleRat, (2 + c).class)
58 assert_equal(SimpleRat, (2 - c).class)
59 assert_equal(SimpleRat, (2 * c).class)
60 assert_equal(SimpleRat, (2 / c).class)
61 assert_equal(Float, (2 ** c).class)
63 assert_equal(SimpleRat, (c + cc).class)
64 assert_equal(SimpleRat, (c - cc).class)
65 assert_equal(SimpleRat, (c * cc).class)
66 assert_equal(SimpleRat, (c / cc).class)
67 assert_equal(Float, (c ** cc).class)
69 assert_equal(SimpleRat, (cc + c).class)
70 assert_equal(SimpleRat, (cc - c).class)
71 assert_equal(SimpleRat, (cc * c).class)
72 assert_equal(SimpleRat, (cc / c).class)
73 assert_equal(Float, (cc ** c).class)
75 assert_equal(0, Rational(2,3) <=> SimpleRat(2,3))
76 assert_equal(0, SimpleRat(2,3) <=> Rational(2,3))
77 assert(Rational(2,3) == SimpleRat(2,3))
78 assert(SimpleRat(2,3) == Rational(2,3))
80 assert_equal(SimpleRat, (c + 0).class)
81 assert_equal(SimpleRat, (c - 0).class)
82 assert_equal(SimpleRat, (c * 0).class)
83 assert_equal(SimpleRat, (c * 1).class)
84 assert_equal(SimpleRat, (0 + c).class)
85 assert_equal(SimpleRat, (0 - c).class)
86 assert_equal(SimpleRat, (0 * c).class)
87 assert_equal(SimpleRat, (1 * c).class)
91 return unless defined?(Rational)
93 c = Complex(SimpleRat(2,3),SimpleRat(1,2))
94 cc = Complex(Rational(3,2),Rational(2,1))
96 assert_equal(Complex(SimpleRat(2,3),SimpleRat(1,2)), +c)
97 assert_equal(Complex(SimpleRat(-2,3),SimpleRat(-1,2)), -c)
99 assert_equal(Complex(SimpleRat(8,3),SimpleRat(1,2)), c + 2)
100 assert_equal(Complex(SimpleRat(-4,3),SimpleRat(1,2)), c - 2)
101 assert_equal(Complex(SimpleRat(4,3),SimpleRat(1,1)), c * 2)
102 assert_equal(Complex(SimpleRat(1,3),SimpleRat(1,4)), c / 2)
103 assert_equal(Complex(SimpleRat(7,36),SimpleRat(2,3)), c ** 2)
104 assert_raise(NoMethodError){c <=> 2}
106 assert_equal(Complex(SimpleRat(8,3),SimpleRat(1,2)), 2 + c)
107 assert_equal(Complex(SimpleRat(4,3),SimpleRat(-1,2)), 2 - c)
108 assert_equal(Complex(SimpleRat(4,3),SimpleRat(1,1)), 2 * c)
109 assert_equal(Complex(SimpleRat(48,25),SimpleRat(-36,25)), 2 / c)
111 assert_in_delta(1.4940, r.real, 0.001)
112 assert_in_delta(0.5392, r.imag, 0.001)
113 assert_raise(NoMethodError){2 <=> c}
115 assert_equal(Complex(SimpleRat(13,6),SimpleRat(5,2)), c + cc)
116 assert_equal(Complex(SimpleRat(-5,6),SimpleRat(-3,2)), c - cc)
117 assert_equal(Complex(SimpleRat(0,1),SimpleRat(25,12)), c * cc)
118 assert_equal(Complex(SimpleRat(8,25),SimpleRat(-7,75)), c / cc)
120 assert_in_delta(0.1732, r.real, 0.001)
121 assert_in_delta(0.1186, r.imag, 0.001)
122 assert_raise(NoMethodError){c <=> cc}
124 assert_equal(Complex(SimpleRat(13,6),SimpleRat(5,2)), cc + c)
125 assert_equal(Complex(SimpleRat(5,6),SimpleRat(3,2)), cc - c)
126 assert_equal(Complex(SimpleRat(0,1),SimpleRat(25,12)), cc * c)
127 assert_equal(Complex(SimpleRat(72,25),SimpleRat(21,25)), cc / c)
129 assert_in_delta(0.5498, r.real, 0.001)
130 assert_in_delta(1.0198, r.imag, 0.001)
131 assert_raise(NoMethodError){cc <=> c}
133 assert_equal([SimpleRat,SimpleRat],
134 (+c).instance_eval{[real.class, imag.class]})
135 assert_equal([SimpleRat,SimpleRat],
136 (-c).instance_eval{[real.class, imag.class]})
138 assert_equal([SimpleRat,SimpleRat],
139 (c + 2).instance_eval{[real.class, imag.class]})
140 assert_equal([SimpleRat,SimpleRat],
141 (c - 2).instance_eval{[real.class, imag.class]})
142 assert_equal([SimpleRat,SimpleRat],
143 (c * 2).instance_eval{[real.class, imag.class]})
144 assert_equal([SimpleRat,SimpleRat],
145 (c / 2).instance_eval{[real.class, imag.class]})
146 assert_equal([SimpleRat,SimpleRat],
147 (c ** 2).instance_eval{[real.class, imag.class]})
149 assert_equal([SimpleRat,SimpleRat],
150 (c + cc).instance_eval{[real.class, imag.class]})
151 assert_equal([SimpleRat,SimpleRat],
152 (c - cc).instance_eval{[real.class, imag.class]})
153 assert_equal([SimpleRat,SimpleRat],
154 (c * cc).instance_eval{[real.class, imag.class]})
155 assert_equal([SimpleRat,SimpleRat],
156 (c / cc).instance_eval{[real.class, imag.class]})
157 assert_equal([Float,Float],
158 (c ** cc).instance_eval{[real.class, imag.class]})
160 assert_equal([SimpleRat,SimpleRat],
161 (cc + c).instance_eval{[real.class, imag.class]})
162 assert_equal([SimpleRat,SimpleRat],
163 (cc - c).instance_eval{[real.class, imag.class]})
164 assert_equal([SimpleRat,SimpleRat],
165 (cc * c).instance_eval{[real.class, imag.class]})
166 assert_equal([SimpleRat,SimpleRat],
167 (cc / c).instance_eval{[real.class, imag.class]})
168 assert_equal([Float,Float],
169 (cc ** c).instance_eval{[real.class, imag.class]})
171 assert(Complex(SimpleRat(2,3),SimpleRat(3,2)) ==
172 Complex(Rational(2,3),Rational(3,2)))
173 assert(Complex(Rational(2,3),Rational(3,2)) ==
174 Complex(SimpleRat(2,3),SimpleRat(3,2)))
176 assert_equal([SimpleRat,SimpleRat],
177 (c + 0).instance_eval{[real.class, imag.class]})
178 assert_equal([SimpleRat,SimpleRat],
179 (c - 0).instance_eval{[real.class, imag.class]})
180 assert_equal([SimpleRat,SimpleRat],
181 (c * 0).instance_eval{[real.class, imag.class]})
182 assert_equal([SimpleRat,SimpleRat],
183 (c * 1).instance_eval{[real.class, imag.class]})
184 assert_equal([SimpleRat,SimpleRat],
185 (0 + c).instance_eval{[real.class, imag.class]})
186 assert_equal([SimpleRat,SimpleRat],
187 (0 - c).instance_eval{[real.class, imag.class]})
188 assert_equal([SimpleRat,SimpleRat],
189 (0 * c).instance_eval{[real.class, imag.class]})
190 assert_equal([SimpleRat,SimpleRat],
191 (1 * c).instance_eval{[real.class, imag.class]})
196 def SimpleRat(*a) SimpleRat.new(*a) end
198 class SimpleRat < Numeric
200 def initialize(num, den = 1)
202 raise ZeroDivisionError, "divided by zero"
213 def numerator() @num end
214 def denominator() @den end
217 def -@ () self.class.new(-@num, @den) end
221 when SimpleRat, Rational
222 a = @num * o.denominator
223 b = o.numerator * @den
224 self.class.new(a + b, @den * o.denominator)
226 self + self.class.new(o)
230 x, y = o.coerce(self)
237 when SimpleRat, Rational
238 a = @num * o.denominator
239 b = o.numerator * @den
240 self.class.new(a - b, @den * o.denominator)
242 self - self.class.new(o)
246 x, y = o.coerce(self)
253 when SimpleRat, Rational
254 a = @num * o.numerator
255 b = @den * o.denominator
258 self * self.class.new(o)
262 x, y = o.coerce(self)
269 when SimpleRat, Rational
270 a = @num * o.denominator
271 b = @den * o.numerator
275 raise raise ZeroDivisionError, "divided by zero"
277 self.quo(self.class.new(o))
281 x, y = o.coerce(self)
298 return -((-@num).div(@den))
312 num = @num * 2 + @den
318 def div(o) (self / o).floor end
319 def quot(o) (self / o).truncate end
333 def divmod(o) [div(o), modulo(o)] end
334 def quotrem(o) [quot(o), remainder(o)] end
338 when SimpleRat, Rational
354 x, y = o.coerce(self)
361 when SimpleRat, Rational
362 a = @num * o.denominator
363 b = o.numerator * @den
366 self <=> self.class.new(o)
370 x, y = o.coerce(self)
386 [self.class.new(o.numerator, o.denominator), self]
388 [self.class.new(o), self]
396 def hash() @num.hash ^ @den.hash end
398 def to_f() @num.to_f / @den.to_f end
400 def to_s() format('%s/%s', @num, @den) end
402 def inspect() format('#SR(%s)', to_s) end
404 def marshal_dump() [@num, @den] end
405 def marshal_load(a) @num, @den = a end