]> git.imager.perl.org - imager.git/blobdiff - t/t70newgif.t
skip the loop tests with older (un)giflibs
[imager.git] / t / t70newgif.t
index 5fe1d0c250b2abcc541e60eb17d02a341dac94ba..6b989da17e509879e2c2d54825f61df0658a2f5a 100644 (file)
@@ -1,3 +1,4 @@
+#!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'
 
@@ -7,10 +8,12 @@
 # (It may become useful if the test is moved to ./t subdirectory.)
 
 
-BEGIN { $| = 1; print "1..8\n"; }
+BEGIN { $| = 1; print "1..24\n"; }
 END {print "not ok 1\n" unless $loaded;}
 
-use Imager;
+my $buggy_giflib_file = "buggy_giflib.txt";
+
+use Imager qw(:all :handy);
 $loaded=1;
 
 print "ok 1\n";
@@ -25,55 +28,143 @@ $img->open(file=>'testimg/scale.ppm',type=>'pnm') || print "failed: ",$img->{ERR
 print "ok 2\n";
 
 
-$img->write(file=>'testout/t70newgif.gif',type=>'gif',gifplanes=>1,gifquant=>'lm',lmfixed=>[$green,$blue]) || print "failed: ",$img->{ERRSTR},"\n";
-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], [0,0,0]) == 0) {
-       print "ok 7\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 7 # entry should be black\n";
+       print "not ok 6 # bad map size\n";
+       print "ok 7 # skipped bad map size\n";
+       print "ok 8 # skipped bad map size\n";
       }
-      if (comp_entry($sorted[1], [255,255,255]) == 0) {
-       print "ok 8\n";
-      }
-      else {
-       print "not ok 8 # entry should be white\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 =~ /callback parameter missing/ 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 {
-      print "not ok 6 # bad map size\n";
-      print "ok 7 # skipped bad map size\n";
-      print "ok 8 # skipped bad map size\n";
+      for (21..24) {
+       print "ok $_ # skip see $buggy_giflib_file\n";
+      }
     }
   }
   else {
-    print "not ok 5 # no map returned\n";
-    for (6..8) {
-      print "ok $_ # skipped no map returned\n";
+    for (21..24) {
+      print "ok $_ # skipped - giflib3 doesn't support callbacks\n";
     }
   }
 }
 else {
-  print "not ok 4 # ",$im2->errstr,"\n";
-  print "ok 5 # skipped - couldn't load image\n";
+  for (3..24) {
+    print "ok $_ # skipped: no gif support\n";
+  }
 }
 
 sub comp_entry {
   my ($l, $r) = @_;
-  return $l->[0] <=> $r->[0]
-    || $l->[1] <=> $r->[1]
-      || $l->[2] <=> $r->[2];
+  my @l = $l->rgba;
+  my @r = $r->rgba;
+  return $l[0] <=> $r[0]
+    || $l[1] <=> $r[1]
+      || $l[2] <=> $r[2];
 }