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

print "1..10\n";

my $s_nv = Math::Complex_C::_nvsize();
my $s_iv = Math::Complex_C::_ivsize();
my $s_d = Math::Complex_C::_doublesize();
my $s_ld = Math::Complex_C::_longdoublesize();
my $s_d_C = Math::Complex_C::_double_Complexsize();
my $s_ld_C = Math::Complex_C::_longdouble_Complexsize();

warn "  Configuration details:\n",
     "   NV size is $s_nv\n",
     "   IV size is $s_iv\n",
     "   double size is $s_d\n",
     "   long double size is $s_ld\n",
     "   double _Complex size is $s_d_C\n",
     "   long double _Complex size is $s_ld_C\n";

my $c_type = Math::Complex_C::_complex_type();

if($c_type eq 'double _Complex') {print "ok 1\n"}
else {
  warn "\$c_type: $c_type\n";
  print "not ok 1\n";
}

my $d_type = Math::Complex_C::_double_type();

if($d_type eq "double") {print "ok 2\n"}
else {
  warn "\$d_type: $d_type\n";
  print "not ok 2\n";
}

if($Config::Config{nvsize} == $s_nv) {print "ok 3\n"}
else {
  warn "\$Config{nvsize}: $Config::Config{nvsize}\n\$s_nv: $s_nv\n";
  print "not ok 3\n";
}

if($Config::Config{ivsize} == $s_iv) {print "ok 4\n"}
else {
  warn "\$Config{ivsize}: $Config::Config{ivsize}\n\$s_iv: $s_iv\n";
  print "not ok 4\n";
}

my $cc = Math::Complex_C->new(17.3, -18.9);
my $ccl = Math::Complex_C::Long->new(17.3, -18.9);

my $root = sqrt($cc);
my $rootl = sqrt($ccl);

my $rc = real_c($root);
my $rcl = real_cl($rootl);
my $ic = imag_c($root);
my $icl = imag_cl($rootl);

if( 
    $s_ld_C > $s_d_C &&
    $s_ld   > $s_d   &&
    $s_nv   > $s_d
  ) {
  unless($rc == $rcl && $ic == $icl) {print "ok 5\n"}
  else {
    warn "if:\n\$rc: $rc\n\$rcl: $rcl\n\$ic: $ic\n\$icl: $icl\n";
    print "not ok 5\n";
  }
}
elsif(
    $s_ld_C >  $s_d_C      &&
    $s_ld   >  $s_d        &&
    $s_ld   == $s_ld_C / 2 &&
    $s_d    == $s_d_C  / 2 &&
    $s_nv   == $s_d
  ) {
  #if($rc == $rcl && $ic == $icl) {print "ok 5\n"} # this changed with 0.07.
                                                   # $cc and $ccl are equivalent for 0.06 and earlier,
                                                   # but different for 0.07 and later - when Long->new()
                                                   # began using strtold() to assign Long values for
                                                   # perls where _nsize() != _longdouble size().
  unless($rc == $rcl && $ic == $icl) {print "ok 5\n"}
  else {
    warn "elsif:\n\$rc: $rc\n\$rcl: $rcl\n\$ic: $ic\n\$icl: $icl\n";
    print "not ok 5\n";
  } 
}
else {
  warn "Skipping test 5 for this configuration of perl\n";
  print "ok 5\n";  
}

my $cl_type = Math::Complex_C::Long::_complex_type();

if($cl_type eq 'long double _Complex') {print "ok 6\n"}
else {
  warn "\$c_type: $c_type\n";
  print "not ok 6\n";
}

my $dl_type = Math::Complex_C::Long::_double_type();

if($dl_type eq "long double") {print "ok 7\n"}
else {
  warn "\$d_type: $d_type\n";
  print "not ok 7\n";
}

my $p_type = Math::Complex_C::_which_package($cc);

if($p_type eq "Math::Complex_C") {print "ok 8\n"}
else {
  warn "\$p_type: $p_type\n";
  print "not ok 8\n";
}

$p_type = Math::Complex_C::_which_package($ccl);

if($p_type eq "Math::Complex_C::Long") {print "ok 9\n"}
else {
  warn "\$p_type: $p_type\n";
  print "not ok 9\n";
}

$p_type = Math::Complex_C::_which_package($dl_type);

if($p_type eq "Not an object") {print "ok 10\n"}
else {
  warn "\$p_type: $p_type\n";
  print "not ok 10\n";
}

__END__
my $s_nv = Math::Complex_C::_nvsize();
my $s_iv = Math::Complex_C::_ivsize();
my $s_d = Math::Complex_C::_doublesize();
my $s_ld = Math::Complex_C::_longdoublesize();
my $s_d_C = Math::Complex_C::_double_Complexsize();
my $s_ld_C = Math::Complex_C::_longdouble_Complexsize();