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

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

use Test::More tests => 42;
BEGIN { use_ok('Image::PBMlib') };
use Data::Dumper;

use strict;

use vars qw( $set $val $wantval @pix %report
             $error $deep $width $height $pixels $bytes $encode $type );

# does 2 or 9 tests
sub checkset {
  if(defined($wantval)) {
    ok($val == $wantval, "$set: pixel count");
  } else {
    ok(!defined($val), "$set: undef pixel count");
  }

  if(defined($error)) {
    ok($report{error} eq $error, "$set: expected error message");
    return;
  } else {
    ok( ( (!exists($report{error})) or
          (! defined( $report{error})) or
          (0 == length($report{error})) ), "$set: no error expected" ); 
  }

  ok($report{deep} eq $deep, "$set: array depth");

  ok($report{type} eq $type, "$set: output $report{type}");

  if(defined($width)) {
    ok($report{width} == $width, "$set: width");
  } else {
    ok(!defined($report{width}), "$set: undef width");
  }

  if(defined($height)) {
    ok($report{height} == $height, "$set: height");
  } else {
    ok(!defined($report{height}), "$set: undef height");
  }

  ok($report{pixels} == $pixels, "$set: pixels");

  ok($report{bytes} == $bytes, "$set: bytes");

  ok($report{encode} eq $encode, "$set: encode");

}

# failures: 2 tests each
# tests 2..3
$set = 'inspectpixels undef000';
@pix = ( [ undef, 0, 0, 0],);
$val = inspectpixels('RAW', 1, \@pix, \%report);
  $wantval = undef;
  $error = 'first pixel undef';
checkset();

# tests 4..5
$set = 'inspectpixels 00undef0';
@pix = ( '0:', '0:', undef, '0:',);
$val = inspectpixels('ASCII', 3700, \@pix, \%report);
  $wantval = undef;
  $error = 'pixel undef';
checkset();

# tests 6..7
$set = 'inspectpixels 00001';
@pix = ( [ '0:', '0:'], ['0:', '0/', 1] );
$val = inspectpixels('float', 3700, \@pix, \%report);
  $wantval = undef;
  $error = 'invalid format';
checkset();

# tests 8..9
$val = inspectpixels('raw', 3700, \@pix, \%report);
  $wantval = undef;
  $error = 'gray pixel encoded wrong';
checkset();

# tests 10..11
$set = 'inspectpixels 0:0:0,0/0/0';
@pix = ( [ '0:0:0', '0/0/0'], );
$val = inspectpixels('raw', 3700, \@pix, \%report);
  $wantval = undef;
  $error = 'rgb pixel encoded wrong';
checkset();

# tests 12..13
$set = 'inspectpixels 0:,0:,0,0:,0:,0';
@pix = ( [ [ '0:', '0:', '0'] , [ '0:', '0:', '0:' ], ] );
$val = inspectpixels('raw', 3700, \@pix, \%report);
  $wantval = undef;
  $error = 'rgb pixel array encoded wrong';
checkset();

# tests 14..15
$set = 'inspectpixels 0:,0:,0:,0:0:0';
@pix = ( [ [ '0:', '0:', '0:'] , '0:0:0' ] );
$val = inspectpixels('raw', 3700, \@pix, \%report);
  $wantval = undef;
  $error = 'rgb pixel not array';
checkset();

# successes: 9 tests each
# tests 16..24
$set = 'inspectpixels 0:0:0,0:0:0...';
@pix = ( [ '0:0:0', '0:0:0', '0:0:0', ], [ '0:0:0', '0:0:0', '0:0:0', ] );
$val = inspectpixels('raw', 3700, \@pix, \%report);
  $wantval = 6;
  $error = undef;
  $width = 3;
  $height = 2;
  $pixels = $width * $height;
  $type = 6;
  $bytes = 2;
  $deep = '2d';
  $encode = 'dec';
checkset();

# tests 25..33
$set = 'inspectpixels [0/ 0/ 0/] ...';
@pix = ( [ [ '0/', '0/', '0/' ], [ '0/', '0/', '0/' ], ],
	 [ [ '0/', '0/', '0/' ], [ '0/', '0/', '0/' ], ],
	 [ [ '0/', '0/', '0/' ], [ '0/', '0/', '0/' ], ],
	 [ [ '0/', '0/', '0/' ], [ '0/', '0/', '0/' ], ], );
$val = inspectpixels('ascii', 37, \@pix, \%report);
  $wantval = 8;
  $error = undef;
  $width = 2;
  $height = 4;
  $pixels = $width * $height;
  $type = 3;
  $bytes = 1;
  $deep = '3d';
  $encode = 'hex';
checkset();

# tests 34..42
$set = 'inspectpixels 0.1, 0.1,  ...';
@pix = ( '0.1,', '0.1,', '0.1,', '0.1,', '0.1,', '0.1,', '0.1,', );
$val = inspectpixels('raw', 37, \@pix, \%report);
  $wantval = 7;
  $error = undef;
  $width = undef;
  $height = undef;
  $pixels = $wantval;
  $type = 5;
  $bytes = 1;
  $deep = '1d';
  $encode = 'float';
checkset();