1256a93a4Safresh1# -*- mode: perl; -*-
2b8851fccSafresh1
3b8851fccSafresh1use strict;
4b8851fccSafresh1use warnings;
5b8851fccSafresh1
6b8851fccSafresh1# Test 2 levels of upgrade classes. This used to cause a segv.
7b8851fccSafresh1
8*3d61058aSafresh1use Test::More tests => 9;
9b8851fccSafresh1
10b8851fccSafresh1use Math::BigInt upgrade => 'Math::BigFloat';
11b8851fccSafresh1use Math::BigFloat upgrade => 'Math::BigMouse';
12b8851fccSafresh1
13b8851fccSafresh1no warnings 'once';
14b8851fccSafresh1@Math::BigMouse::ISA = 'Math::BigFloat';
15e0680481Safresh1sub Math::BigMouse::bsqrt {};
16b8851fccSafresh1
17b8851fccSafresh1() = sqrt Math::BigInt->new(2);
18b8851fccSafresh1pass('sqrt on a big int does not segv if there are 2 upgrade levels');
19*3d61058aSafresh1
20*3d61058aSafresh1# Math::BigRat inherits from Math::BigFloat, which inherits from Math::BigInt.
21*3d61058aSafresh1# Typically, methods call the upgrade version if upgrading is defined and the
22*3d61058aSafresh1# argument is an unknown type. This will call infinite recursion for methods
23*3d61058aSafresh1# that are not implemented in the upgrade class.
24*3d61058aSafresh1
25*3d61058aSafresh1use Math::BigRat;
26*3d61058aSafresh1
27*3d61058aSafresh1Math::BigFloat -> upgrade("Math::BigRat");
28*3d61058aSafresh1Math::BigFloat -> downgrade(undef);
29*3d61058aSafresh1
30*3d61058aSafresh1Math::BigRat   -> upgrade(undef);
31*3d61058aSafresh1Math::BigRat   -> downgrade(undef);
32*3d61058aSafresh1
33*3d61058aSafresh1# Input is a scalar.
34*3d61058aSafresh1
35*3d61058aSafresh1note 'Math::BigRat -> babs("2");';
36*3d61058aSafresh1()  = Math::BigRat -> babs("2");
37*3d61058aSafresh1pass(qq|no 'Deep recursion on subroutine ...'|);
38*3d61058aSafresh1
39*3d61058aSafresh1note 'Math::BigRat -> bsgn("2");';
40*3d61058aSafresh1()  = Math::BigRat -> bsgn("2");
41*3d61058aSafresh1pass(qq|no 'Deep recursion on subroutine ...'|);
42*3d61058aSafresh1
43*3d61058aSafresh1# Input is a Math::BigInt.
44*3d61058aSafresh1
45*3d61058aSafresh1note 'Math::BigRat -> babs(Math::BigInt -> new("2"));';
46*3d61058aSafresh1()  = Math::BigRat -> babs(Math::BigInt -> new("2"));
47*3d61058aSafresh1pass(qq|no 'Deep recursion on subroutine ...'|);
48*3d61058aSafresh1
49*3d61058aSafresh1note 'Math::BigRat -> bsgn(Math::BigInt -> new("2"));';
50*3d61058aSafresh1()  = Math::BigRat -> bsgn(Math::BigInt -> new("2"));
51*3d61058aSafresh1pass(qq|no 'Deep recursion on subroutine ...'|);
52*3d61058aSafresh1
53*3d61058aSafresh1# Input is a Math::BigFloat.
54*3d61058aSafresh1
55*3d61058aSafresh1note 'Math::BigRat -> babs(Math::BigFloat -> new("2"));';
56*3d61058aSafresh1()  = Math::BigRat -> babs(Math::BigFloat -> new("2"));
57*3d61058aSafresh1pass(qq|no 'Deep recursion on subroutine ...'|);
58*3d61058aSafresh1
59*3d61058aSafresh1note 'Math::BigRat -> bsgn(Math::BigFloat -> new("2"));';
60*3d61058aSafresh1()  = Math::BigRat -> bsgn(Math::BigFloat -> new("2"));
61*3d61058aSafresh1pass(qq|no 'Deep recursion on subroutine ...'|);
62*3d61058aSafresh1
63*3d61058aSafresh1# Input is a Math::BigRat.
64*3d61058aSafresh1
65*3d61058aSafresh1note 'Math::BigRat -> babs(Math::BigRat -> new("2"));';
66*3d61058aSafresh1()  = Math::BigRat -> babs(Math::BigRat -> new("2"));
67*3d61058aSafresh1pass(qq|no 'Deep recursion on subroutine ...'|);
68*3d61058aSafresh1
69*3d61058aSafresh1note 'Math::BigRat -> bsgn(Math::BigRat -> new("2"));';
70*3d61058aSafresh1()  = Math::BigRat -> bsgn(Math::BigRat -> new("2"));
71*3d61058aSafresh1pass(qq|no 'Deep recursion on subroutine ...'|);
72