use warnings;
use strict;
use InlineX::CPP2XS qw(cpp2xs);

print "1..10\n";

cpp2xs('Math::Geometry::Planar::GPC::Inherit', 'main');

my $ok = 1;
my @rd1;
my $count = 0;


if($ok) {
  if(!open(RD1, '<', 'Inherit.xs')) {
    warn "unable to open Inherit.xs for reading: $!\n";
    print "not ok 1\n";
    $ok = 0;
  }
}


if($ok) {
  @rd1 = <RD1>;
}

close RD1 or warn "Couldn't close Inherit.xs\n";

if($ok) {
  for(@rd1) {
     $count++ if $_ =~ /#include <iostream/;		#2
     $count++ if $_ =~ /class Foo/;			#1
     $count++ if $_ =~ /protected:/;			#1
     $count++ if $_ =~ /class Bar/;			#1
     $count++ if $_ =~ /PACKAGE/;			#3
     $count++ if $_ =~ /Foo::DESTROY/;			#1
     $count++ if $_ =~ /Bar::DESTROY/;			#1
     $count++ if $_ =~ /PROTOTYPES: DISABLE/;		#3
     $count++ if $_ =~ /BOOT/;				#1
     $count++ if $_ =~ /PREINIT:/;			#2
     $count++ if $_ =~ /PPCODE:/;			#2
     $count++ if $_ =~ /set_secret/;			#6
  }
}

if($ok && ($count != 24)) {
  warn "Inherit.xs not as expected\n";
  print "not ok 1\n";
}

elsif($ok) {print "ok 1\n"}

if(!unlink('Inherit.xs')) { warn "Couldn't unlink Inherit.xs\n"}

$ok = 1;

###########################################################################

$count = 0;

if(!open(RD1, '<', 'INLINE.h')) {
  warn "unable to open INLINE.h for reading: $!\n";
  print "not ok 2\n";
  $ok = 0;
}


if($ok) {
  @rd1 = <RD1>;
}

if($ok) {
  for(@rd1) {
     $count++ if $_ =~ /dXSARGS/;	#1
     $count++ if $_ =~ /items/;		#2
     $count++ if $_ =~ /ST\(x\)/;	#1
     $count++ if $_ =~ /sp = mark/;	#1
     $count++ if $_ =~ /XPUSHs\(x\)/;	#1
     $count++ if $_ =~ /PUTBACK/;	#1
     $count++ if $_ =~ /XSRETURN\(x\)/;	#1
     $count++ if $_ =~ /XSRETURN\(0\)/;	#1
  }
}

if($ok && ($count != 9)) {
  warn "INLINE.h not as expected\n";
  print "not ok 2\n";
}

elsif($ok) {print "ok 2\n"}

close(RD1) or warn "Unable to close INLINE.h after reading: $!\n";
if(!unlink('INLINE.h')) { warn "Couldn't unlink INLINE.h\n"}

#############################################################################

$ok = 1;
$count = 0;

if(!open(RD1, "CPP.map")) {
  warn "unable to open CPP.map for reading: $!\n";
  print "not ok 3\n";
  $ok = 0;
}


if($ok) {
  @rd1 = <RD1>;
}

if($ok) {
  for(@rd1) {
     $count++ if $_ =~ /O_Inline_CPP_Class/;	#4
     $count++ if $_ =~ /TYPEMAP/;		#1
     $count++ if $_ =~ /OUTPUT/;		#1
     $count++ if $_ =~ /INPUT/;			#1
     $count++ if $_ =~ /sv_isobject/;		#1
     $count++ if $_ =~ /XSRETURN_UNDEF/;	#1
  }
}

if($ok && ($count != 9)) {
  warn "CPP.map not as expected\n";
  print "not ok 3\n";
}

elsif($ok) {print "ok 3\n"}

close(RD1) or warn "Unable to close CPP.map after reading: $!\n";
if(!unlink('CPP.map')) { warn "Couldn't unlink CPP.map\n"}


eval{cpp2xs('Math::Geometry::Planar::GPC::Inherit', 'main', '.', '');};

if($@ =~ /Fourth arg to cpp2xs/) {print "ok 4\n"}
else {print "not ok 4\n"}

eval{cpp2xs('Math::Geometry::Planar::GPC::Inherit', 'main', {'TYPEMAPS' => ['/foo/non/existent/typemap.txt']});};

if($@ =~ /Couldn't locate the typemap \/foo\/non\/existent\/typemap.txt/) {print "ok 5\n"}
else {print "not ok 5\n"}

eval{cpp2xs('Math::Geometry::Planar::GPC::Polygon', 'Math::Geometry::Planar::GPC::Polygon', '/foo/non/existent/typemap.txt');};

if($@ =~ /\/foo\/non\/existent\/typemap\.txt is not a valid directory/) {print "ok 6\n"}
else {print "not ok 6\n"}

eval{cpp2xs('Math::Geometry::Planar::GPC::Inherit', 'Math::Geometry::Planar::GPC::Inherit', {'typemaps' => ['/foo/non/existent/typemap.txt']});};

if($@ =~ /is an invalid config option/) {print "ok 7\n"}
else {print "not ok 7\n"}

eval{cpp2xs('Math::Geometry::Planar::GPC::Inherit', 'main', {'TYPEMAPS' => ['foo']}, {'TYPEMAPS' => ['foo']});};

if($@ =~ /Incorrect usage \- there should be no arguments/) {print "ok 8\n"}
else {print "not ok 8\n"}

eval{cpp2xs('MyMod', 'main', {'CODE' => 'void foo(){}', 'SRC_LOCATION' => 'C:/file.c'});};

if($@ =~ /You can provide either CODE/) {print "ok 9\n"}
else {
  warn $@, "\n";
  print "not ok 9\n";
}

eval{cpp2xs('MyMod', 'main', {'SRC_LOCATION' => './non_existent.crap'});};

if($@ =~ /Can't open/) {print "ok 10\n"}
else {
  warn $@, "\n";
  print "not ok 10\n";
}