PageRenderTime 32ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/jruby-1.7.3/test/externals/ruby1.9/ruby/test_rational.rb

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