The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Math::MPFI qw(:mpfi);
use Math::MPFR qw(:mpfr);
use warnings;
use strict;

print "1..4\n";

my $mpfiui = Math::MPFI->new(17);
my $mpfisi = Math::MPFI->new(-23);
my $rop = Math::MPFI->new();
my $mt = 1;
my $fr = Math::MPFR->new();
my $ok;
my($have_gmp, $have_gmpz, $have_gmpq) = (0, 0, 0);

eval {require Math::GMP;};
if(!$@) {$have_gmp = 1}

eval {require Math::GMPz;};
if(!$@) {$have_gmpz = 1}

eval {require Math::GMPq;};
if(!$@) {$have_gmpq = 1}

Rmpfi_intersect($rop, $mpfiui, $mpfisi);

if(Rmpfi_is_empty($rop)) {print "ok 1\n"}
else {
  warn "\$rop is not empty\n";
  $mt = 0;
  print "not ok 1\n";
}

if($mt) {
  my $ret = Rmpfi_revert_if_needed($rop);
  if($ret) {$ok .= 'a'}
  else {warn "1a: Reversion failed\n"}

  Rmpfi_get_left($fr, $rop);
  if($fr == -23) {$ok .= 'b'}
  else {warn "2: Left value: $fr\n"}

  Rmpfi_get_right($fr, $rop);
  if($fr == 17) {$ok .= 'c'}
  else {warn "2: Right value: $fr\n"}

  if($ok eq 'abc') {print "ok 2\n"}
  else {
    warn "\$ok: $ok\n";
    print "not ok 2\n";
  }
}
else {
  warn "Skipping Test 2 because Test 1 failed\n";
  print "ok 2\n";
}

# $rop is [-23, 17]

$ok = '';

my $op = Math::MPFI->new(0);

Rmpfi_put_ui($op, 50);
Rmpfi_put_si($op, -50);

Rmpfi_get_left($fr, $op);
if($fr == -50) {$ok .= 'a'}
else {warn "3a: \$fr: $fr\n"}

Rmpfi_get_right($fr, $op);
if($fr == 50) {$ok .= 'b'}
else {warn "3b: \$fr: $fr\n"}

Rmpfi_put($rop, $op);

Rmpfi_get_left($fr, $rop);
if($fr == -50) {$ok .= 'c'}
else {warn "3c: \$fr: $fr\n"}

Rmpfi_get_right($fr, $rop);
if($fr == 50) {$ok .= 'd'}
else {warn "3d: \$fr: $fr\n"}

Rmpfi_put_d($rop, -100.25);

Rmpfi_get_left($fr, $rop);
if($fr == -100.25) {$ok .= 'e'}
else {warn "3e: \$fr: $fr\n"}

Rmpfi_get_right($fr, $rop);
if($fr == 50) {$ok .= 'f'}
else {warn "3f: \$fr: $fr\n"}

Rmpfi_put_d($rop, 100.25);

Rmpfi_get_left($fr, $rop);
if($fr == -100.25) {$ok .= 'g'}
else {warn "3g: \$fr: $fr\n"}

Rmpfi_get_right($fr, $rop);
if($fr == 100.25) {$ok .= 'h'}
else {warn "3h: \$fr: $fr\n"}

Rmpfi_put_fr($rop, Math::MPFR->new(-200.75));

Rmpfi_get_left($fr, $rop);
if($fr == -200.75) {$ok .= 'i'}
else {warn "3i: \$fr: $fr\n"}

Rmpfi_get_right($fr, $rop);
if($fr == 100.25) {$ok .= 'j'}
else {warn "3j: \$fr: $fr\n"}

Rmpfi_put_fr($rop, Math::MPFR->new(200.75));

Rmpfi_get_left($fr, $rop);
if($fr == -200.75) {$ok .= 'k'}
else {warn "3k: \$fr: $fr\n"}

Rmpfi_get_right($fr, $rop);
if($fr == 200.75) {$ok .= 'l'}
else {warn "3l: \$fr: $fr\n"}

if($have_gmp) {
  Rmpfi_put_z($rop, Math::GMP->new(-500));

  Rmpfi_get_left($fr, $rop);
  if($fr == -500) {$ok .= 'm'}
  else {warn "3m: \$fr: $fr\n"}

  Rmpfi_get_right($fr, $rop);
  if($fr == 200.75) {$ok .= 'n'}
  else {warn "3n: \$fr: $fr\n"}

  Rmpfi_put_z($rop, Math::GMP->new(500));

  Rmpfi_get_left($fr, $rop);
  if($fr == -500) {$ok .= 'o'}
  else {warn "3o: \$fr: $fr\n"}

  Rmpfi_get_right($fr, $rop);
  if($fr == 500) {$ok .= 'p'}
  else {warn "3p: \$fr: $fr\n"}
}
else {
  warn "Skipping tests 3m, 3n, 3o & 3p - no Math::GMP\n";
  $ok .= 'mnop';
}

if($have_gmpz) {
  Rmpfi_put_z($rop, Math::GMPz->new(-700));

  Rmpfi_get_left($fr, $rop);
  if($fr == -700) {$ok .= 'q'}
  else {warn "3q: \$fr: $fr\n"}

  Rmpfi_put_z($rop, Math::GMPz->new(700));

  Rmpfi_get_right($fr, $rop);
  if($fr == 700) {$ok .= 'r'}
  else {warn "3r: \$fr: $fr\n"}
}
else {
  warn "Skipping tests 3q and 3r - no Math::GMPz\n";
  $ok .= 'qr';
}

if($have_gmpq) {
  Rmpfi_put_q($rop, Math::GMPq->new(-900.25));

  Rmpfi_get_left($fr, $rop);
  if($fr == -900.25) {$ok .= 's'}
  else {warn "3s: \$fr: $fr\n"}

  Rmpfi_put_q($rop, Math::GMPq->new(700.25));

  Rmpfi_get_right($fr, $rop);
  if($fr == 700.25) {$ok .= 't'}
  else {warn "3t: \$fr: $fr\n"}
}
else {
  warn "Skipping tests 3s and 3t - no Math::GMPq\n";
  $ok .= 'st';
}

if($ok eq 'abcdefghijklmnopqrst') {print "ok 3\n"}
else {
  warn "\$ok: $ok\n";
  print "not ok 3\n";
}

$ok = '';

Rmpfi_interv_d($rop, -3.25, 15.5);

Rmpfi_get_left($fr, $rop);
if($fr == -3.25) {$ok .= 'a'}
else {warn "4a: \$fr: $fr\n"}

Rmpfi_get_right($fr, $rop);
if($fr == 15.5) {$ok .= 'b'}
else {warn "4b: \$fr: $fr\n"}

Rmpfi_interv_ui($rop, 100, 200);

Rmpfi_get_left($fr, $rop);
if($fr == 100) {$ok .= 'c'}
else {warn "4c: \$fr: $fr\n"}

Rmpfi_get_right($fr, $rop);
if($fr == 200) {$ok .= 'd'}
else {warn "4d: \$fr: $fr\n"}

Rmpfi_interv_si($rop, -100, 300);

Rmpfi_get_left($fr, $rop);
if($fr == -100) {$ok .= 'e'}
else {warn "4e: \$fr: $fr\n"}

Rmpfi_get_right($fr, $rop);
if($fr == 300) {$ok .= 'f'}
else {warn "4f: \$fr: $fr\n"}

Rmpfi_interv_fr($rop, Math::MPFR->new(-500), Math::MPFR->new(500));

Rmpfi_get_left($fr, $rop);
if($fr == -500) {$ok .= 'g'}
else {warn "4g: \$fr: $fr\n"}

Rmpfi_get_right($fr, $rop);
if($fr == 500) {$ok .= 'h'}
else {warn "4h: \$fr: $fr\n"}

if($have_gmp) {
  Rmpfi_interv_z($rop, Math::GMP->new(-600), Math::GMP->new(600));

  Rmpfi_get_left($fr, $rop);
  if($fr == -600) {$ok .= 'i'}
  else {warn "4i: \$fr: $fr\n"}

  Rmpfi_get_right($fr, $rop);
  if($fr == 600) {$ok .= 'j'}
  else {warn "4j: \$fr: $fr\n"}
}
else {
  warn "Skipping tests 4i and 4j - no Math::GMP\n";
  $ok .= 'ij';
}

if($have_gmpz) {
  Rmpfi_interv_z($rop, Math::GMPz->new(-700), Math::GMPz->new(700));

  Rmpfi_get_left($fr, $rop);
  if($fr == -700) {$ok .= 'k'}
  else {warn "4k: \$fr: $fr\n"}

  Rmpfi_get_right($fr, $rop);
  if($fr == 700) {$ok .= 'l'}
  else {warn "4l: \$fr: $fr\n"}
}
else {
  warn "Skipping tests 4k and 4l - no Math::GMPz\n";
  $ok .= 'kl';
}

if($have_gmpq) {
  Rmpfi_interv_q($rop, Math::GMPq->new(-800), Math::GMPq->new(800));

  Rmpfi_get_left($fr, $rop);
  if($fr == -800) {$ok .= 'm'}
  else {warn "4m: \$fr: $fr\n"}

  Rmpfi_get_right($fr, $rop);
  if($fr == 800) {$ok .= 'n'}
  else {warn "4n: \$fr: $fr\n"}
}
else {
  warn "Skipping tests 4m and 4n - no Math::GMPq\n";
  $ok .= 'mn';
}


if($ok eq 'abcdefghijklmn') {print "ok 4\n"}
else {
  warn "\$ok: $ok\n";
  print "not ok 4\n";
}