The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.pl'

######################### We start with some black magic to print on failure.

# Change 1..1 below to 1..last_test_to_print .
# (It may become useful if the test is moved to ./t subdirectory.)


BEGIN { $| = 1; print "1..24\n"; }
END {print "not ok 1\n" unless $loaded;}

my $buggy_giflib_file = "buggy_giflib.txt";

use Imager qw(:all :handy);
$loaded=1;

print "ok 1\n";

Imager::init('log'=>'testout/t70newgif.log');

$green=i_color_new(0,255,0,0);
$blue=i_color_new(0,0,255,0);

$img=Imager->new();
$img->open(file=>'testimg/scale.ppm',type=>'pnm') || print "failed: ",$img->{ERRSTR},"\n";
print "ok 2\n";


if (i_has_format("gif")) {
  $img->write(file=>'testout/t70newgif.gif',type=>'gif',gifplanes=>1,gifquant=>'lm',lmfixed=>[$green,$blue]) || print "failed: ",$img->{ERRSTR},"\nnot ";
  print "ok 3\n";

  # make sure the palette is loaded properly (minimal test)
  my $im2 = Imager->new();
  my $map;
  if ($im2->read(file=>'testimg/bandw.gif', colors=>\$map)) {
    print "ok 4\n";
    # check the palette
    if ($map) {
      print "ok 5\n";
      if (@$map == 2) {
	print "ok 6\n";
	my @sorted = sort { comp_entry($a,$b) } @$map;
	# first entry must be #000000 and second #FFFFFF
	if (comp_entry($sorted[0], NC(0,0,0)) == 0) {
	  print "ok 7\n";
	}
	else {
	  print "not ok 7 # entry should be black\n";
	}
	if (comp_entry($sorted[1], NC(255,255,255)) == 0) {
	  print "ok 8\n";
	}
	else {
	  print "not ok 8 # entry should be white\n";
	}
      } 
      else {
	print "not ok 6 # bad map size\n";
	print "ok 7 # skipped bad map size\n";
	print "ok 8 # skipped bad map size\n";
      }
    } 
    else {
      print "not ok 5 # no map returned\n";
      for (6..8) {
	print "ok $_ # skipped no map returned\n";
      }
    }
  }
  else {
    print "not ok 4 # ",$im2->errstr,"\n";
    print "ok 5 # skipped - couldn't load image\n";
  }

  # test the read_multi interface
  my @imgs = Imager->read_multi();
  @imgs and print "not ";
  print "ok 9\n";
  Imager->errstr =~ /type parameter/ or print "not ";
  print "ok 10 # ",Imager->errstr,"\n";

  @imgs = Imager->read_multi(type=>'gif');
  @imgs and print "not ";
  print "ok 11\n";
  Imager->errstr =~ /file/ or print "not ";
  print "ok 12 # ",Imager->errstr,"\n";
  # kill warning
  *NONESUCH = \20;
  @imgs = Imager->read_multi(type=>'gif', fh=>*NONESUCH);
  @imgs and print "not ";
  print "ok 13\n";
  Imager->errstr =~ /fh option not open/ or print "not ";
  print "ok 14 # ",Imager->errstr,"\n";
  unless (-e $buggy_giflib_file) {
    @imgs = Imager->read_multi(type=>'gif', file=>'testimg/screen2.gif');
    @imgs == 2 or print "not ";
    print "ok 15\n";
    grep(!UNIVERSAL::isa($_, 'Imager'), @imgs) and print "not ";
    print "ok 16\n";
    grep($_->type eq 'direct', @imgs) and print "not ";
    print "ok 17\n";
    (my @left = $imgs[0]->tags(name=>'gif_left')) == 1 or print "not ";
    print "ok 18\n";
    my $left = $imgs[1]->tags(name=>'gif_left') or print "not ";
    print "ok 19\n";
    $left == 3 or print "not ";
    print "ok 20\n";
  }
  else {
    for (15 .. 20) {
      print "ok $_ # skip see $buggy_giflib_file\n";
    }
  }
  if (Imager::i_giflib_version() >= 4.0) {
    unless (-e $buggy_giflib_file) {
      open FH, "< testimg/screen2.gif" 
	or die "Cannot open testimg/screen2.gif: $!";
      binmode FH;
      my $cb = 
	sub {
	  my $tmp;
	  read(FH, $tmp, $_[0]) and $tmp
	};
      @imgs = Imager->read_multi(type=>'gif',
				 callback => $cb) or print "not ";
      print "ok 21\n";
      close FH;
      @imgs == 2 or print "not ";
      print "ok 22\n";
      
      open FH, "< testimg/screen2.gif" 
	or die "Cannot open testimg/screen2.gif: $!";
      binmode FH;
      my $data = do { local $/; <FH>; };
      close FH;
      @imgs = Imager->read_multi(type=>'gif',
				 data=>$data) or print "not ";
      print "ok 23\n";
      @imgs = 2 or print "not ";
      print "ok 24\n";
    }
    else {
      for (21..24) {
	print "ok $_ # skip see $buggy_giflib_file\n";
      }
    }
  }
  else {
    for (21..24) {
      print "ok $_ # skipped - giflib3 doesn't support callbacks\n";
    }
  }
}
else {
  for (3..24) {
    print "ok $_ # skipped: no gif support\n";
  }
}

sub comp_entry {
  my ($l, $r) = @_;
  my @l = $l->rgba;
  my @r = $r->rgba;
  return $l[0] <=> $r[0]
    || $l[1] <=> $r[1]
      || $l[2] <=> $r[2];
}