1*256a93a4Safresh1# -*- mode: perl; -*-
2*256a93a4Safresh1
3*256a93a4Safresh1use strict;
4*256a93a4Safresh1use warnings;
5*256a93a4Safresh1
6*256a93a4Safresh1use Test::More tests => 14;
7*256a93a4Safresh1
8*256a93a4Safresh1use bignum;
9*256a93a4Safresh1
10*256a93a4Safresh1is(bignum -> downgrade(), "Math::BigInt",
11*256a93a4Safresh1   "bignum's downgrade class is Math::BigInt");
12*256a93a4Safresh1is(bignum -> upgrade(), "Math::BigFloat",
13*256a93a4Safresh1  "bignum's upgrade class is Math::BigFloat");
14*256a93a4Safresh1
15*256a93a4Safresh1is(Math::BigFloat -> downgrade(), "Math::BigInt",
16*256a93a4Safresh1  "Math::BigFloat's downgrade class is Math::BigInt");
17*256a93a4Safresh1is(Math::BigInt -> upgrade(), "Math::BigFloat",
18*256a93a4Safresh1  "Math::BigInt's upgrade class is Math::BigFloat");
19*256a93a4Safresh1
20*256a93a4Safresh1my $i1 = 7;
21*256a93a4Safresh1my $i2 = 2;
22*256a93a4Safresh1my $f1 = 3.75;
23*256a93a4Safresh1my $f2 = 1.25;
24*256a93a4Safresh1
25*256a93a4Safresh1is(ref($i1), "Math::BigInt", "literal $i1 is a Math::BigInt");
26*256a93a4Safresh1is(ref($f1), "Math::BigFloat", "literal $f1 is a Math::BigFloat");
27*256a93a4Safresh1
28*256a93a4Safresh1# Verify that the result is upgraded to a Math::BigFloat.
29*256a93a4Safresh1
30*256a93a4Safresh1cmp_ok($i1/$i2, "==", "3.5", "$i1/$i2 is 3.5");
31*256a93a4Safresh1is(ref($i1/$i2), "Math::BigFloat", "$i1/$i2 is 3.5 as a Math::BigFloat");
32*256a93a4Safresh1
33*256a93a4Safresh1# Verify that the result is downgraded to a Math::BigInt.
34*256a93a4Safresh1
35*256a93a4Safresh1cmp_ok($f1/$f2, "==", "3", "$f1/$f2 is 3");
36*256a93a4Safresh1is(ref($f1/$f2), "Math::BigInt", "$f1/$f2 is 3 as a Math::BigInt");
37*256a93a4Safresh1
38*256a93a4Safresh1# Change the upgrade class during runtime.
39*256a93a4Safresh1
40*256a93a4Safresh1SKIP: {
41*256a93a4Safresh1    eval "use Math::BigRat";
42*256a93a4Safresh1    skip "Math::BigRat not installed", 4 if $@;
43*256a93a4Safresh1
44*256a93a4Safresh1    bignum -> upgrade("Math::BigRat");
45*256a93a4Safresh1
46*256a93a4Safresh1    my $r1 = 3.75;
47*256a93a4Safresh1    my $r2 = 1.25;
48*256a93a4Safresh1
49*256a93a4Safresh1    # Verify that the result is upgraded to a Math::BigRat.
50*256a93a4Safresh1
51*256a93a4Safresh1    cmp_ok($i1/$i2, "==", "3.5", "$i1/$i2 is 3.5");
52*256a93a4Safresh1    is(ref($i1/$i2), "Math::BigRat", "$i1/$i2 is 3.5 as a Math::BigRat");
53*256a93a4Safresh1
54*256a93a4Safresh1    # Verify that the result is downgraded to a Math::BigInt.
55*256a93a4Safresh1
56*256a93a4Safresh1    cmp_ok($r1/$r2, "==", "3", "($r1)/($r2) is 3");
57*256a93a4Safresh1    is(ref($r1/$r2), "Math::BigInt", "($r1)/($r2) is 3 as a Math::BigInt");
58*256a93a4Safresh1};
59