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