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