PageRenderTime 29ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/test/ruby/test_rational.rb

http://github.com/ruby/ruby
Ruby | 1062 lines | 846 code | 211 blank | 5 comment | 6 complexity | acd67d082276104e0bfef272164ca44f MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, AGPL-3.0
  1. # frozen_string_literal: false
  2. require 'test/unit'
  3. class RationalSub < Rational; end
  4. class Rational_Test < Test::Unit::TestCase
  5. def test_ratsub
  6. c = RationalSub.__send__(:convert, 1)
  7. assert_kind_of(Numeric, c)
  8. assert_instance_of(RationalSub, c)
  9. c2 = c + 1
  10. assert_instance_of(RationalSub, c2)
  11. c2 = c - 1
  12. assert_instance_of(RationalSub, c2)
  13. c3 = c - c2
  14. assert_instance_of(RationalSub, c3)
  15. s = Marshal.dump(c)
  16. c5 = Marshal.load(s)
  17. assert_equal(c, c5)
  18. assert_instance_of(RationalSub, c5)
  19. c1 = Rational(1)
  20. assert_equal(c1.hash, c.hash, '[ruby-dev:38850]')
  21. assert_equal([true, true], [c.eql?(c1), c1.eql?(c)])
  22. end
  23. def test_eql_p
  24. c = Rational(0)
  25. c2 = Rational(0)
  26. c3 = Rational(1)
  27. assert_operator(c, :eql?, c2)
  28. assert_not_operator(c, :eql?, c3)
  29. assert_not_operator(c, :eql?, 0)
  30. end
  31. def test_hash
  32. h = Rational(1,2).hash
  33. assert_kind_of(Integer, h)
  34. assert_nothing_raised {h.to_s}
  35. h = {}
  36. h[Rational(0)] = 0
  37. h[Rational(1,1)] = 1
  38. h[Rational(2,1)] = 2
  39. h[Rational(3,1)] = 3
  40. assert_equal(4, h.size)
  41. assert_equal(2, h[Rational(2,1)])
  42. h[Rational(0,1)] = 9
  43. assert_equal(4, h.size)
  44. end
  45. def test_freeze
  46. c = Rational(1)
  47. assert_predicate(c, :frozen?)
  48. assert_instance_of(String, c.to_s)
  49. end
  50. def test_conv
  51. c = Rational(0,1)
  52. assert_equal(Rational(0,1), c)
  53. c = Rational(2**32, 2**32)
  54. assert_equal(Rational(2**32,2**32), c)
  55. assert_equal([1,1], [c.numerator,c.denominator])
  56. c = Rational(-2**32, 2**32)
  57. assert_equal(Rational(-2**32,2**32), c)
  58. assert_equal([-1,1], [c.numerator,c.denominator])
  59. c = Rational(2**32, -2**32)
  60. assert_equal(Rational(2**32,-2**32), c)
  61. assert_equal([-1,1], [c.numerator,c.denominator])
  62. c = Rational(-2**32, -2**32)
  63. assert_equal(Rational(-2**32,-2**32), c)
  64. assert_equal([1,1], [c.numerator,c.denominator])
  65. c = Rational(Rational(1,2),2)
  66. assert_equal(Rational(1,4), c)
  67. c = Rational(2,Rational(1,2))
  68. assert_equal(Rational(4), c)
  69. c = Rational(Rational(1,2),Rational(1,2))
  70. assert_equal(Rational(1), c)
  71. c = Rational(Complex(1,2),2)
  72. assert_equal(Complex(Rational(1,2),1), c)
  73. c = Rational(2,Complex(1,2))
  74. assert_equal(Complex(Rational(2,5),Rational(-4,5)), c)
  75. c = Rational(Complex(1,2),Complex(1,2))
  76. assert_equal(Rational(1), c)
  77. assert_equal(Rational(3),Rational(3))
  78. assert_equal(Rational(1),Rational(3,3))
  79. assert_equal(3.3.to_r,Rational(3.3))
  80. assert_equal(1,Rational(3.3,3.3))
  81. assert_equal(Rational(3),Rational('3'))
  82. assert_equal(Rational(1),Rational('3.0','3.0'))
  83. assert_equal(Rational(1),Rational('3/3','3/3'))
  84. assert_equal(Rational(111, 1), Rational('1.11e+2'))
  85. assert_equal(Rational(111, 10), Rational('1.11e+1'))
  86. assert_equal(Rational(111, 10), Rational('1.11e1'))
  87. assert_equal(Rational(111, 100), Rational('1.11e0'))
  88. assert_equal(Rational(111, 1000), Rational('1.11e-1'))
  89. assert_raise(TypeError){Rational(nil)}
  90. assert_raise(ArgumentError){Rational('')}
  91. assert_raise_with_message(ArgumentError, /\u{221a 2668}/) {
  92. Rational("\u{221a 2668}")
  93. }
  94. assert_warning('') {
  95. assert_predicate(Rational('1e-99999999999999999999'), :zero?)
  96. }
  97. assert_raise(TypeError){Rational(Object.new)}
  98. assert_raise(TypeError){Rational(Object.new, Object.new)}
  99. assert_raise(TypeError){Rational(1, Object.new)}
  100. o = Object.new
  101. def o.to_r; 1/42r; end
  102. assert_equal(1/42r, Rational(o))
  103. assert_equal(1/84r, Rational(o, 2))
  104. assert_equal(42, Rational(1, o))
  105. assert_equal(1, Rational(o, o))
  106. o = Object.new
  107. def o.to_r; nil; end
  108. assert_raise(TypeError) { Rational(o) }
  109. assert_raise(TypeError) { Rational(o, 2) }
  110. assert_raise(TypeError) { Rational(1, o) }
  111. assert_raise(TypeError) { Rational(o, o) }
  112. o = Object.new
  113. def o.to_r; raise; end
  114. assert_raise(RuntimeError) { Rational(o) }
  115. assert_raise(RuntimeError) { Rational(o, 2) }
  116. assert_raise(RuntimeError) { Rational(1, o) }
  117. assert_raise(RuntimeError) { Rational(o, o) }
  118. assert_raise(ArgumentError){Rational()}
  119. assert_raise(ArgumentError){Rational(1,2,3)}
  120. if (0.0/0).nan?
  121. assert_raise(FloatDomainError){Rational(0.0/0)}
  122. end
  123. if (1.0/0).infinite?
  124. assert_raise(FloatDomainError){Rational(1.0/0)}
  125. end
  126. end
  127. def test_attr
  128. c = Rational(4)
  129. assert_equal(4, c.numerator)
  130. assert_equal(1, c.denominator)
  131. c = Rational(4,5)
  132. assert_equal(4, c.numerator)
  133. assert_equal(5, c.denominator)
  134. c = Rational(4)
  135. assert_equal(4, c.numerator)
  136. assert_equal(1, c.denominator)
  137. c = Rational(4,5)
  138. assert_equal(4, c.numerator)
  139. assert_equal(5, c.denominator)
  140. c = Rational(4)
  141. assert_equal(4, c.numerator)
  142. assert_equal(1, c.denominator)
  143. c = Rational(4,5)
  144. assert_equal(4, c.numerator)
  145. assert_equal(5, c.denominator)
  146. end
  147. def test_attr2
  148. c = Rational(1)
  149. assert_not_predicate(c, :integer?)
  150. assert_predicate(c, :real?)
  151. assert_predicate(Rational(0), :zero?)
  152. assert_predicate(Rational(0,1), :zero?)
  153. assert_not_predicate(Rational(1,1), :zero?)
  154. assert_nil(Rational(0).nonzero?)
  155. assert_nil(Rational(0,1).nonzero?)
  156. assert_equal(Rational(1,1), Rational(1,1).nonzero?)
  157. end
  158. def test_uplus
  159. assert_equal(Rational(1), +Rational(1))
  160. assert_equal(Rational(-1), +Rational(-1))
  161. assert_equal(Rational(1,1), +Rational(1,1))
  162. assert_equal(Rational(-1,1), +Rational(-1,1))
  163. assert_equal(Rational(-1,1), +Rational(1,-1))
  164. assert_equal(Rational(1,1), +Rational(-1,-1))
  165. end
  166. def test_negate
  167. assert_equal(Rational(-1), -Rational(1))
  168. assert_equal(Rational(1), -Rational(-1))
  169. assert_equal(Rational(-1,1), -Rational(1,1))
  170. assert_equal(Rational(1,1), -Rational(-1,1))
  171. assert_equal(Rational(1,1), -Rational(1,-1))
  172. assert_equal(Rational(-1,1), -Rational(-1,-1))
  173. end
  174. def test_add
  175. c = Rational(1,2)
  176. c2 = Rational(2,3)
  177. assert_equal(Rational(7,6), c + c2)
  178. assert_equal(Rational(5,2), c + 2)
  179. assert_equal(2.5, c + 2.0)
  180. end
  181. def test_sub
  182. c = Rational(1,2)
  183. c2 = Rational(2,3)
  184. assert_equal(Rational(-1,6), c - c2)
  185. assert_equal(Rational(-3,2), c - 2)
  186. assert_equal(-1.5, c - 2.0)
  187. end
  188. def test_mul
  189. c = Rational(1,2)
  190. c2 = Rational(2,3)
  191. assert_equal(Rational(1,3), c * c2)
  192. assert_equal(Rational(1,1), c * 2)
  193. assert_equal(1.0, c * 2.0)
  194. end
  195. def test_div
  196. c = Rational(1,2)
  197. c2 = Rational(2,3)
  198. assert_equal(Rational(3,4), c / c2)
  199. assert_equal(Rational(1,4), c / 2)
  200. assert_equal(0.25, c / 2.0)
  201. assert_raise(ZeroDivisionError){Rational(1, 3) / 0}
  202. assert_raise(ZeroDivisionError){Rational(1, 3) / Rational(0)}
  203. assert_equal(0, Rational(1, 3) / Float::INFINITY)
  204. assert_predicate(Rational(1, 3) / 0.0, :infinite?, '[ruby-core:31626]')
  205. end
  206. def assert_eql(exp, act, *args)
  207. unless Array === exp
  208. exp = [exp]
  209. end
  210. unless Array === act
  211. act = [act]
  212. end
  213. exp.zip(act).each do |e, a|
  214. na = [e, a] + args
  215. assert_equal(*na)
  216. na = [e.class, a] + args
  217. assert_instance_of(*na)
  218. end
  219. end
  220. def test_idiv
  221. c = Rational(1,2)
  222. c2 = Rational(2,3)
  223. assert_eql(0, c.div(c2))
  224. assert_eql(0, c.div(2))
  225. assert_eql(0, c.div(2.0))
  226. c = Rational(301,100)
  227. c2 = Rational(7,5)
  228. assert_equal(2, c.div(c2))
  229. assert_equal(-3, c.div(-c2))
  230. assert_equal(-3, (-c).div(c2))
  231. assert_equal(2, (-c).div(-c2))
  232. c = Rational(301,100)
  233. c2 = Rational(2)
  234. assert_equal(1, c.div(c2))
  235. assert_equal(-2, c.div(-c2))
  236. assert_equal(-2, (-c).div(c2))
  237. assert_equal(1, (-c).div(-c2))
  238. c = Rational(11)
  239. c2 = Rational(3)
  240. assert_equal(3, c.div(c2))
  241. assert_equal(-4, c.div(-c2))
  242. assert_equal(-4, (-c).div(c2))
  243. assert_equal(3, (-c).div(-c2))
  244. end
  245. def test_modulo
  246. c = Rational(1,2)
  247. c2 = Rational(2,3)
  248. assert_eql(Rational(1,2), c.modulo(c2))
  249. assert_eql(Rational(1,2), c.modulo(2))
  250. assert_eql(0.5, c.modulo(2.0))
  251. c = Rational(301,100)
  252. c2 = Rational(7,5)
  253. assert_equal(Rational(21,100), c.modulo(c2))
  254. assert_equal(Rational(-119,100), c.modulo(-c2))
  255. assert_equal(Rational(119,100), (-c).modulo(c2))
  256. assert_equal(Rational(-21,100), (-c).modulo(-c2))
  257. c = Rational(301,100)
  258. c2 = Rational(2)
  259. assert_equal(Rational(101,100), c.modulo(c2))
  260. assert_equal(Rational(-99,100), c.modulo(-c2))
  261. assert_equal(Rational(99,100), (-c).modulo(c2))
  262. assert_equal(Rational(-101,100), (-c).modulo(-c2))
  263. c = Rational(11)
  264. c2 = Rational(3)
  265. assert_equal(2, c.modulo(c2))
  266. assert_equal(-1, c.modulo(-c2))
  267. assert_equal(1, (-c).modulo(c2))
  268. assert_equal(-2, (-c).modulo(-c2))
  269. end
  270. def test_divmod
  271. c = Rational(1,2)
  272. c2 = Rational(2,3)
  273. assert_eql([0, Rational(1,2)], c.divmod(c2))
  274. assert_eql([0, Rational(1,2)], c.divmod(2))
  275. assert_eql([0, 0.5], c.divmod(2.0))
  276. c = Rational(301,100)
  277. c2 = Rational(7,5)
  278. assert_equal([2, Rational(21,100)], c.divmod(c2))
  279. assert_equal([-3, Rational(-119,100)], c.divmod(-c2))
  280. assert_equal([-3, Rational(119,100)], (-c).divmod(c2))
  281. assert_equal([2, Rational(-21,100)], (-c).divmod(-c2))
  282. c = Rational(301,100)
  283. c2 = Rational(2)
  284. assert_equal([1, Rational(101,100)], c.divmod(c2))
  285. assert_equal([-2, Rational(-99,100)], c.divmod(-c2))
  286. assert_equal([-2, Rational(99,100)], (-c).divmod(c2))
  287. assert_equal([1, Rational(-101,100)], (-c).divmod(-c2))
  288. c = Rational(11)
  289. c2 = Rational(3)
  290. assert_equal([3,2], c.divmod(c2))
  291. assert_equal([-4,-1], c.divmod(-c2))
  292. assert_equal([-4,1], (-c).divmod(c2))
  293. assert_equal([3,-2], (-c).divmod(-c2))
  294. end
  295. def test_remainder
  296. c = Rational(1,2)
  297. c2 = Rational(2,3)
  298. assert_eql(Rational(1,2), c.remainder(c2))
  299. assert_eql(Rational(1,2), c.remainder(2))
  300. assert_eql(0.5, c.remainder(2.0))
  301. c = Rational(301,100)
  302. c2 = Rational(7,5)
  303. assert_equal(Rational(21,100), c.remainder(c2))
  304. assert_equal(Rational(21,100), c.remainder(-c2))
  305. assert_equal(Rational(-21,100), (-c).remainder(c2))
  306. assert_equal(Rational(-21,100), (-c).remainder(-c2))
  307. c = Rational(301,100)
  308. c2 = Rational(2)
  309. assert_equal(Rational(101,100), c.remainder(c2))
  310. assert_equal(Rational(101,100), c.remainder(-c2))
  311. assert_equal(Rational(-101,100), (-c).remainder(c2))
  312. assert_equal(Rational(-101,100), (-c).remainder(-c2))
  313. c = Rational(11)
  314. c2 = Rational(3)
  315. assert_equal(2, c.remainder(c2))
  316. assert_equal(2, c.remainder(-c2))
  317. assert_equal(-2, (-c).remainder(c2))
  318. assert_equal(-2, (-c).remainder(-c2))
  319. end
  320. def test_quo
  321. c = Rational(1,2)
  322. c2 = Rational(2,3)
  323. assert_equal(Rational(3,4), c.quo(c2))
  324. assert_equal(Rational(1,4), c.quo(2))
  325. assert_equal(0.25, c.quo(2.0))
  326. end
  327. def test_fdiv
  328. c = Rational(1,2)
  329. c2 = Rational(2,3)
  330. assert_equal(0.75, c.fdiv(c2))
  331. assert_equal(0.25, c.fdiv(2))
  332. assert_equal(0.25, c.fdiv(2.0))
  333. assert_equal(0, c.fdiv(Float::INFINITY))
  334. assert_predicate(c.fdiv(0), :infinite?, '[ruby-core:31626]')
  335. end
  336. def test_expt
  337. c = Rational(1,2)
  338. c2 = Rational(2,3)
  339. r = c ** c2
  340. assert_in_delta(0.6299, r, 0.001)
  341. assert_equal(Rational(1,4), c ** 2)
  342. assert_equal(Rational(4), c ** -2)
  343. assert_equal(Rational(1,4), (-c) ** 2)
  344. assert_equal(Rational(4), (-c) ** -2)
  345. assert_equal(0.25, c ** 2.0)
  346. assert_equal(4.0, c ** -2.0)
  347. assert_equal(Rational(1,4), c ** Rational(2))
  348. assert_equal(Rational(4), c ** Rational(-2))
  349. assert_equal(Rational(1), 0 ** Rational(0))
  350. assert_equal(Rational(1), Rational(0) ** 0)
  351. assert_equal(Rational(1), Rational(0) ** Rational(0))
  352. # p ** p
  353. x = 2 ** Rational(2)
  354. assert_equal(Rational(4), x)
  355. assert_instance_of(Rational, x)
  356. assert_equal(4, x.numerator)
  357. assert_equal(1, x.denominator)
  358. x = Rational(2) ** 2
  359. assert_equal(Rational(4), x)
  360. assert_instance_of(Rational, x)
  361. assert_equal(4, x.numerator)
  362. assert_equal(1, x.denominator)
  363. x = Rational(2) ** Rational(2)
  364. assert_equal(Rational(4), x)
  365. assert_instance_of(Rational, x)
  366. assert_equal(4, x.numerator)
  367. assert_equal(1, x.denominator)
  368. # -p ** p
  369. x = (-2) ** Rational(2)
  370. assert_equal(Rational(4), x)
  371. assert_instance_of(Rational, x)
  372. assert_equal(4, x.numerator)
  373. assert_equal(1, x.denominator)
  374. x = Rational(-2) ** 2
  375. assert_equal(Rational(4), x)
  376. assert_instance_of(Rational, x)
  377. assert_equal(4, x.numerator)
  378. assert_equal(1, x.denominator)
  379. x = Rational(-2) ** Rational(2)
  380. assert_equal(Rational(4), x)
  381. assert_instance_of(Rational, x)
  382. assert_equal(4, x.numerator)
  383. assert_equal(1, x.denominator)
  384. # p ** -p
  385. x = 2 ** Rational(-2)
  386. assert_equal(Rational(1,4), x)
  387. assert_instance_of(Rational, x)
  388. assert_equal(1, x.numerator)
  389. assert_equal(4, x.denominator)
  390. x = Rational(2) ** -2
  391. assert_equal(Rational(1,4), x)
  392. assert_instance_of(Rational, x)
  393. assert_equal(1, x.numerator)
  394. assert_equal(4, x.denominator)
  395. x = Rational(2) ** Rational(-2)
  396. assert_equal(Rational(1,4), x)
  397. assert_instance_of(Rational, x)
  398. assert_equal(1, x.numerator)
  399. assert_equal(4, x.denominator)
  400. # -p ** -p
  401. x = (-2) ** Rational(-2)
  402. assert_equal(Rational(1,4), x)
  403. assert_instance_of(Rational, x)
  404. assert_equal(1, x.numerator)
  405. assert_equal(4, x.denominator)
  406. x = Rational(-2) ** -2
  407. assert_equal(Rational(1,4), x)
  408. assert_instance_of(Rational, x)
  409. assert_equal(1, x.numerator)
  410. assert_equal(4, x.denominator)
  411. x = Rational(-2) ** Rational(-2)
  412. assert_equal(Rational(1,4), x)
  413. assert_instance_of(Rational, x)
  414. assert_equal(1, x.numerator)
  415. assert_equal(4, x.denominator)
  416. assert_raise(ZeroDivisionError){0 ** -1}
  417. end
  418. def test_cmp
  419. assert_equal(-1, Rational(-1) <=> Rational(0))
  420. assert_equal(0, Rational(0) <=> Rational(0))
  421. assert_equal(+1, Rational(+1) <=> Rational(0))
  422. assert_equal(-1, Rational(-1) <=> 0)
  423. assert_equal(0, Rational(0) <=> 0)
  424. assert_equal(+1, Rational(+1) <=> 0)
  425. assert_equal(-1, Rational(-1) <=> 0.0)
  426. assert_equal(0, Rational(0) <=> 0.0)
  427. assert_equal(+1, Rational(+1) <=> 0.0)
  428. assert_equal(-1, Rational(1,2) <=> Rational(2,3))
  429. assert_equal(0, Rational(2,3) <=> Rational(2,3))
  430. assert_equal(+1, Rational(2,3) <=> Rational(1,2))
  431. f = 2**30-1
  432. b = 2**30
  433. assert_equal(0, Rational(f) <=> Rational(f))
  434. assert_equal(-1, Rational(f) <=> Rational(b))
  435. assert_equal(+1, Rational(b) <=> Rational(f))
  436. assert_equal(0, Rational(b) <=> Rational(b))
  437. assert_equal(-1, Rational(f-1) <=> Rational(f))
  438. assert_equal(+1, Rational(f) <=> Rational(f-1))
  439. assert_equal(-1, Rational(b-1) <=> Rational(b))
  440. assert_equal(+1, Rational(b) <=> Rational(b-1))
  441. assert_not_operator(Rational(0), :<, Rational(0))
  442. assert_operator(Rational(0), :<=, Rational(0))
  443. assert_operator(Rational(0), :>=, Rational(0))
  444. assert_not_operator(Rational(0), :>, Rational(0))
  445. assert_nil(Rational(0) <=> nil)
  446. assert_nil(Rational(0) <=> 'foo')
  447. end
  448. def test_eqeq
  449. assert_equal(Rational(1,1), Rational(1))
  450. assert_equal(Rational(-1,1), Rational(-1))
  451. assert_not_operator(Rational(2,1), :==, Rational(1))
  452. assert_operator(Rational(2,1), :!=, Rational(1))
  453. assert_not_operator(Rational(1), :==, nil)
  454. assert_not_operator(Rational(1), :==, '')
  455. end
  456. def test_coerce
  457. assert_equal([Rational(2),Rational(1)], Rational(1).coerce(2))
  458. assert_equal([Rational(2.2),Rational(1)], Rational(1).coerce(2.2))
  459. assert_equal([Rational(2),Rational(1)], Rational(1).coerce(Rational(2)))
  460. assert_nothing_raised(TypeError, '[Bug #5020] [ruby-dev:44088]') do
  461. Rational(1,2).coerce(Complex(1,1))
  462. end
  463. end
  464. class ObjectX
  465. def +(x) Rational(1) end
  466. alias - +
  467. alias * +
  468. alias / +
  469. alias quo +
  470. alias div +
  471. alias % +
  472. alias remainder +
  473. alias ** +
  474. def coerce(x) [x, Rational(1)] end
  475. end
  476. def test_coerce2
  477. x = ObjectX.new
  478. %w(+ - * / quo div % remainder **).each do |op|
  479. assert_kind_of(Numeric, Rational(1).__send__(op, x))
  480. end
  481. end
  482. def test_math
  483. assert_equal(Rational(1,2), Rational(1,2).abs)
  484. assert_equal(Rational(1,2), Rational(-1,2).abs)
  485. assert_equal(Rational(1,2), Rational(1,2).magnitude)
  486. assert_equal(Rational(1,2), Rational(-1,2).magnitude)
  487. assert_equal(1, Rational(1,2).numerator)
  488. assert_equal(2, Rational(1,2).denominator)
  489. end
  490. def test_trunc
  491. [[Rational(13, 5), [ 2, 3, 2, 3, 3, 3, 3]], # 2.6
  492. [Rational(5, 2), [ 2, 3, 2, 3, 2, 3, 2]], # 2.5
  493. [Rational(12, 5), [ 2, 3, 2, 2, 2, 2, 2]], # 2.4
  494. [Rational(-12,5), [-3, -2, -2, -2, -2, -2, -2]], # -2.4
  495. [Rational(-5, 2), [-3, -2, -2, -3, -2, -3, -2]], # -2.5
  496. [Rational(-13, 5), [-3, -2, -2, -3, -3, -3, -3]], # -2.6
  497. ].each do |i, a|
  498. s = proc {i.inspect}
  499. assert_equal(a[0], i.floor, s)
  500. assert_equal(a[1], i.ceil, s)
  501. assert_equal(a[2], i.truncate, s)
  502. assert_equal(a[3], i.round, s)
  503. assert_equal(a[4], i.round(half: :even), s)
  504. assert_equal(a[5], i.round(half: :up), s)
  505. assert_equal(a[6], i.round(half: :down), s)
  506. end
  507. end
  508. def test_to_s
  509. c = Rational(1,2)
  510. assert_instance_of(String, c.to_s)
  511. assert_equal('1/2', c.to_s)
  512. assert_equal('0/1', Rational(0,2).to_s)
  513. assert_equal('0/1', Rational(0,-2).to_s)
  514. assert_equal('1/2', Rational(1,2).to_s)
  515. assert_equal('-1/2', Rational(-1,2).to_s)
  516. assert_equal('1/2', Rational(-1,-2).to_s)
  517. assert_equal('-1/2', Rational(1,-2).to_s)
  518. assert_equal('1/2', Rational(-1,-2).to_s)
  519. end
  520. def test_inspect
  521. c = Rational(1,2)
  522. assert_instance_of(String, c.inspect)
  523. assert_equal('(1/2)', c.inspect)
  524. end
  525. def test_marshal
  526. c = Rational(1,2)
  527. s = Marshal.dump(c)
  528. c2 = Marshal.load(s)
  529. assert_equal(c, c2)
  530. assert_instance_of(Rational, c2)
  531. assert_raise(TypeError){
  532. Marshal.load("\x04\bU:\rRational[\ai\x060")
  533. }
  534. assert_raise(ZeroDivisionError){
  535. Marshal.load("\x04\bU:\rRational[\ai\x06i\x05")
  536. }
  537. bug3656 = '[ruby-core:31622]'
  538. c = Rational(1,2)
  539. assert_predicate(c, :frozen?)
  540. result = c.marshal_load([2,3]) rescue :fail
  541. assert_equal(:fail, result, bug3656)
  542. end
  543. def test_marshal_compatibility
  544. bug6625 = '[ruby-core:45775]'
  545. dump = "\x04\x08o:\x0dRational\x07:\x11@denominatori\x07:\x0f@numeratori\x06"
  546. assert_nothing_raised(bug6625) do
  547. assert_equal(Rational(1, 2), Marshal.load(dump), bug6625)
  548. end
  549. dump = "\x04\x08o:\x0dRational\x07:\x11@denominatori\x07:\x0f@numerator0"
  550. assert_raise(TypeError) do
  551. Marshal.load(dump)
  552. end
  553. end
  554. def assert_valid_rational(n, d, r)
  555. x = Rational(n, d)
  556. assert_equal(x, r.to_r, "#{r.dump}.to_r")
  557. assert_equal(x, Rational(r), "Rational(#{r.dump})")
  558. end
  559. def assert_invalid_rational(n, d, r)
  560. x = Rational(n, d)
  561. assert_equal(x, r.to_r, "#{r.dump}.to_r")
  562. assert_raise(ArgumentError, "Rational(#{r.dump})") {Rational(r)}
  563. end
  564. def test_parse
  565. ok = method(:assert_valid_rational)
  566. ng = method(:assert_invalid_rational)
  567. ok[ 5, 1, '5']
  568. ok[-5, 1, '-5']
  569. ok[ 5, 3, '5/3']
  570. ok[-5, 3, '-5/3']
  571. ok[ 5, 3, '5_5/33']
  572. ok[ 5,33, '5/3_3']
  573. ng[ 5, 1, '5__5/33']
  574. ng[ 5, 3, '5/3__3']
  575. ok[ 5, 1, '5.0']
  576. ok[-5, 1, '-5.0']
  577. ok[ 5, 3, '5.0/3']
  578. ok[-5, 3, '-5.0/3']
  579. ok[ 501,100, '5.0_1']
  580. ok[ 501,300, '5.0_1/3']
  581. ok[ 5,33, '5.0/3_3']
  582. ng[ 5, 1, '5.0__1/3']
  583. ng[ 5, 3, '5.0/3__3']
  584. ok[ 5, 1, '5e0']
  585. ok[-5, 1, '-5e0']
  586. ok[ 5, 3, '5e0/3']
  587. ok[-5, 3, '-5e0/3']
  588. ok[550, 1, '5_5e1']
  589. ng[ 5, 1, '5_e1']
  590. ok[ 5e1, 1, '5e1']
  591. ok[-5e2, 1, '-5e2']
  592. ok[ 5e3, 3, '5e003/3']
  593. ok[-5e4, 3, '-5e004/3']
  594. ok[ 5e3, 1, '5e0_3']
  595. ok[ 5e1,33, '5e1/3_3']
  596. ng[ 5e0, 1, '5e0__3/3']
  597. ng[ 5e1, 3, '5e1/3__3']
  598. ok[ 33, 100, '.33']
  599. ok[ 33, 100, '0.33']
  600. ok[-33, 100, '-.33']
  601. ok[-33, 100, '-0.33']
  602. ok[-33, 100, '-0.3_3']
  603. ng[ -3, 10, '-0.3__3']
  604. ok[ 1, 2, '5e-1']
  605. ok[50, 1, '5e+1']
  606. ok[ 1, 2, '5.0e-1']
  607. ok[50, 1, '5.0e+1']
  608. ok[50, 1, '5e1']
  609. ok[50, 1, '5E1']
  610. ok[500, 1, '5e2']
  611. ok[5000, 1, '5e3']
  612. ok[500000000000, 1, '5e1_1']
  613. ng[ 5, 1, '5e']
  614. ng[ 5, 1, '5e_']
  615. ng[ 5, 1, '5e_1']
  616. ng[50, 1, '5e1_']
  617. ok[ 50, 33, '5/3.3']
  618. ok[ 5, 3, '5/3e0']
  619. ok[ 5, 30, '5/3e1']
  620. ng[ 5, 3, '5/3._3']
  621. ng[ 50, 33, '5/3.3_']
  622. ok[500,333, '5/3.3_3']
  623. ng[ 5, 3, '5/3e']
  624. ng[ 5, 3, '5/3_e']
  625. ng[ 5, 3, '5/3e_']
  626. ng[ 5, 3, '5/3e_1']
  627. ng[ 5, 30, '5/3e1_']
  628. ok[ 5, 300000000000, '5/3e1_1']
  629. ng[0, 1, '']
  630. ng[0, 1, ' ']
  631. ng[5, 1, "\f\n\r\t\v5\0"]
  632. ng[0, 1, '_']
  633. ng[0, 1, '_5']
  634. ng[5, 1, '5_']
  635. ng[5, 1, '5x']
  636. ng[5, 1, '5/_3']
  637. ng[5, 3, '5/3_']
  638. ng[5, 3, '5/3x']
  639. end
  640. def test_parse_zero_denominator
  641. assert_raise(ZeroDivisionError) {"1/0".to_r}
  642. assert_raise(ZeroDivisionError) {Rational("1/0")}
  643. end
  644. def test_Rational_with_invalid_exception
  645. assert_raise(ArgumentError) {
  646. Rational("1/1", exception: 1)
  647. }
  648. end
  649. def test_Rational_without_exception
  650. assert_nothing_raised(ArgumentError) {
  651. assert_equal(nil, Rational("5/3x", exception: false))
  652. }
  653. assert_nothing_raised(ZeroDivisionError) {
  654. assert_equal(nil, Rational("1/0", exception: false))
  655. }
  656. assert_nothing_raised(TypeError) {
  657. assert_equal(nil, Rational(nil, exception: false))
  658. }
  659. assert_nothing_raised(TypeError) {
  660. assert_equal(nil, Rational(Object.new, exception: false))
  661. }
  662. assert_nothing_raised(TypeError) {
  663. assert_equal(nil, Rational(1, nil, exception: false))
  664. }
  665. assert_nothing_raised(TypeError) {
  666. assert_equal(nil, Rational(1, Object.new, exception: false))
  667. }
  668. o = Object.new;
  669. def o.to_r; raise; end
  670. assert_nothing_raised(RuntimeError) {
  671. assert_equal(nil, Rational(o, exception: false))
  672. }
  673. assert_nothing_raised(TypeError) {
  674. assert_equal(nil, Rational(1, o, exception: false))
  675. }
  676. end
  677. def test_to_i
  678. assert_equal(1, Rational(3,2).to_i)
  679. assert_equal(1, Integer(Rational(3,2)))
  680. end
  681. def test_to_f
  682. assert_equal(1.5, Rational(3,2).to_f)
  683. assert_equal(1.5, Float(Rational(3,2)))
  684. assert_equal(1e-23, Rational(1, 10**23).to_f, "Bug #14637")
  685. end
  686. def test_to_c
  687. assert_equal(Complex(Rational(3,2)), Rational(3,2).to_c)
  688. assert_equal(Complex(Rational(3,2)), Complex(Rational(3,2)))
  689. end
  690. def test_to_r
  691. c = nil.to_r
  692. assert_equal([0,1], [c.numerator, c.denominator])
  693. c = 0.to_r
  694. assert_equal([0,1], [c.numerator, c.denominator])
  695. c = 1.to_r
  696. assert_equal([1,1], [c.numerator, c.denominator])
  697. c = 1.1.to_r
  698. assert_equal([2476979795053773, 2251799813685248],
  699. [c.numerator, c.denominator])
  700. c = Rational(1,2).to_r
  701. assert_equal([1,2], [c.numerator, c.denominator])
  702. assert_raise(RangeError){Complex(1,2).to_r}
  703. if (0.0/0).nan?
  704. assert_raise(FloatDomainError){(0.0/0).to_r}
  705. end
  706. if (1.0/0).infinite?
  707. assert_raise(FloatDomainError){(1.0/0).to_r}
  708. end
  709. end
  710. def test_rationalize
  711. c = nil.rationalize
  712. assert_equal([0,1], [c.numerator, c.denominator])
  713. c = 0.rationalize
  714. assert_equal([0,1], [c.numerator, c.denominator])
  715. c = 1.rationalize
  716. assert_equal([1,1], [c.numerator, c.denominator])
  717. c = 1.1.rationalize
  718. assert_equal([11, 10], [c.numerator, c.denominator])
  719. c = Rational(1,2).rationalize
  720. assert_equal([1,2], [c.numerator, c.denominator])
  721. assert_equal(nil.rationalize(Rational(1,10)), Rational(0))
  722. assert_equal(0.rationalize(Rational(1,10)), Rational(0))
  723. assert_equal(10.rationalize(Rational(1,10)), Rational(10))
  724. r = 0.3333
  725. assert_equal(r.rationalize, Rational(3333, 10000))
  726. assert_equal(r.rationalize(Rational(1,10)), Rational(1,3))
  727. assert_equal(r.rationalize(Rational(-1,10)), Rational(1,3))
  728. r = Rational(5404319552844595,18014398509481984)
  729. assert_equal(r.rationalize, r)
  730. assert_equal(r.rationalize(Rational(1,10)), Rational(1,3))
  731. assert_equal(r.rationalize(Rational(-1,10)), Rational(1,3))
  732. r = -0.3333
  733. assert_equal(r.rationalize, Rational(-3333, 10000))
  734. assert_equal(r.rationalize(Rational(1,10)), Rational(-1,3))
  735. assert_equal(r.rationalize(Rational(-1,10)), Rational(-1,3))
  736. r = Rational(-5404319552844595,18014398509481984)
  737. assert_equal(r.rationalize, r)
  738. assert_equal(r.rationalize(Rational(1,10)), Rational(-1,3))
  739. assert_equal(r.rationalize(Rational(-1,10)), Rational(-1,3))
  740. assert_raise(RangeError){Complex(1,2).rationalize}
  741. if (0.0/0).nan?
  742. assert_raise(FloatDomainError){(0.0/0).rationalize}
  743. end
  744. if (1.0/0).infinite?
  745. assert_raise(FloatDomainError){(1.0/0).rationalize}
  746. end
  747. end
  748. def test_gcdlcm
  749. assert_equal(7, 91.gcd(-49))
  750. assert_equal(5, 5.gcd(0))
  751. assert_equal(5, 0.gcd(5))
  752. assert_equal(70, 14.lcm(35))
  753. assert_equal(0, 5.lcm(0))
  754. assert_equal(0, 0.lcm(5))
  755. assert_equal([5,0], 0.gcdlcm(5))
  756. assert_equal([5,0], 5.gcdlcm(0))
  757. assert_equal(1, 1073741827.gcd(1073741789))
  758. assert_equal(1152921470247108503, 1073741827.lcm(1073741789))
  759. assert_equal(1, 1073741789.gcd(1073741827))
  760. assert_equal(1152921470247108503, 1073741789.lcm(1073741827))
  761. end
  762. def test_gcd_no_memory_leak
  763. assert_no_memory_leak([], "#{<<-"begin;"}", "#{<<-"end;"}", limit: 1.2, rss: true)
  764. x = (1<<121) + 1
  765. y = (1<<99) + 1
  766. 1000.times{x.gcd(y)}
  767. begin;
  768. 100.times {1000.times{x.gcd(y)}}
  769. end;
  770. end
  771. def test_supp
  772. assert_predicate(1, :real?)
  773. assert_predicate(1.1, :real?)
  774. assert_equal(1, 1.numerator)
  775. assert_equal(9, 9.numerator)
  776. assert_equal(1, 1.denominator)
  777. assert_equal(1, 9.denominator)
  778. assert_equal(1.0, 1.0.numerator)
  779. assert_equal(9.0, 9.0.numerator)
  780. assert_equal(1.0, 1.0.denominator)
  781. assert_equal(1.0, 9.0.denominator)
  782. assert_equal(Rational(1,2), 1.quo(2))
  783. assert_equal(Rational(5000000000), 10000000000.quo(2))
  784. assert_equal(0.5, 1.0.quo(2))
  785. assert_equal(Rational(1,4), Rational(1,2).quo(2))
  786. assert_equal(0, Rational(1,2).quo(Float::INFINITY))
  787. assert_predicate(Rational(1,2).quo(0.0), :infinite?, '[ruby-core:31626]')
  788. assert_equal(0.5, 1.fdiv(2))
  789. assert_equal(5000000000.0, 10000000000.fdiv(2))
  790. assert_equal(0.5, 1.0.fdiv(2))
  791. assert_equal(0.25, Rational(1,2).fdiv(2))
  792. a = 0xa42fcabf_c51ce400_00001000_00000000_00000000_00000000_00000000_00000000
  793. b = 1<<1074
  794. assert_equal(Rational(a, b).to_f, a.fdiv(b))
  795. a = 3
  796. b = 0x20_0000_0000_0001
  797. assert_equal(Rational(a, b).to_f, a.fdiv(b))
  798. end
  799. def test_ruby19
  800. assert_raise(NoMethodError){ Rational.new(1) }
  801. assert_raise(NoMethodError){ Rational.new!(1) }
  802. end
  803. def test_fixed_bug
  804. n = Float::MAX.to_i * 2
  805. x = EnvUtil.suppress_warning {Rational(n + 2, n + 1).to_f}
  806. assert_equal(1.0, x, '[ruby-dev:33852]')
  807. end
  808. def test_power_of_1_and_minus_1
  809. bug5715 = '[ruby-core:41498]'
  810. big = 1 << 66
  811. one = Rational( 1, 1)
  812. assert_eql one, one ** -big , bug5715
  813. assert_eql one, (-one) ** -big , bug5715
  814. assert_eql (-one), (-one) ** -(big+1) , bug5715
  815. assert_equal Complex, ((-one) ** Rational(1,3)).class
  816. end
  817. def test_power_of_0
  818. bug5713 = '[ruby-core:41494]'
  819. big = 1 << 66
  820. zero = Rational(0, 1)
  821. assert_eql zero, zero ** big
  822. assert_eql zero, zero ** Rational(2, 3)
  823. assert_raise(ZeroDivisionError, bug5713) { Rational(0, 1) ** -big }
  824. assert_raise(ZeroDivisionError, bug5713) { Rational(0, 1) ** Rational(-2,3) }
  825. end
  826. def test_power_overflow
  827. bug = '[ruby-core:79686] [Bug #13242]: Infinity due to overflow'
  828. x = EnvUtil.suppress_warning {4r**40000000}
  829. assert_predicate x, :infinite?, bug
  830. x = EnvUtil.suppress_warning {(1/4r)**40000000}
  831. assert_equal 0, x, bug
  832. end
  833. def test_positive_p
  834. assert_predicate(1/2r, :positive?)
  835. assert_not_predicate(-1/2r, :positive?)
  836. end
  837. def test_negative_p
  838. assert_predicate(-1/2r, :negative?)
  839. assert_not_predicate(1/2r, :negative?)
  840. end
  841. def test_known_bug
  842. end
  843. def test_finite_p
  844. assert_predicate(1/2r, :finite?)
  845. assert_predicate(-1/2r, :finite?)
  846. end
  847. def test_infinite_p
  848. assert_nil((1/2r).infinite?)
  849. assert_nil((-1/2r).infinite?)
  850. end
  851. end