#!/usr/bin/perl -w

# Copyright 2011 Kevin Ryde

# This file is part of Image-Base-Tk.
#
# Image-Base-Tk is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 3, or (at your option) any later
# version.
#
# Image-Base-Tk is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License along
# with Image-Base-Tk.  If not, see <http://www.gnu.org/licenses/>.

use 5.006;
use strict;
use warnings;
use Test::More;
use Tk;

use lib 't';
use MyTestHelpers;
BEGIN { MyTestHelpers::nowarnings() }

diag "Tk version ", Tk->VERSION;
require Image::Base::Tk::Canvas;
diag "Image::Base version ", Image::Base->VERSION;

my $mw;
eval { $mw = MainWindow->new }
  or plan skip_all => "due to no display -- $@";

plan tests => 1930;

sub my_bounding_box {
  my ($image, $x1,$y1, $x2,$y2, $black, $white) = @_;
  my ($width, $height) = $image->get('-width','-height');

  my @bad;
  foreach my $y ($y1-1, $y2+1) {
    next if $y < 0 || $y >= $height;
    foreach my $x ($x1-1 .. $x2-1) {
      my $got = $image->xy($x,$y);
      if ($got ne $black) {
        push @bad, "$x,$y=$got";
      }
    }
  }
  foreach my $x ($x1-1, $x2+1) {
    next if $x < 0 || $x >= $width;
    foreach my $y ($y1 .. $y2) {
      my $got = $image->xy($x,$y);
      if ($got ne $black) {
        push @bad, "$x,$y=$got";
      }
    }
  }

  my $found_set;
 Y_SET: foreach my $y ($y1, $y2) {
    next if $y < 0 || $y >= $height;
    foreach my $x ($x1 .. $x2) {
      my $got = $image->xy($x,$y);
      if ($got ne $black) {
        $found_set = 1;
        last Y_SET;
      }
    }
  }
 X_SET: foreach my $x ($x1, $x2) {
    next if $x < 0 || $x >= $width;
    foreach my $y ($y1+1 .. $y2-1) {
      next if $y < $y1 || $y > $y2;
      my $got = $image->xy($x,$y);
      if ($got ne $black) {
        $found_set = 1;
        last X_SET;
      }
    }
  }

  if (! $found_set) {
    push @bad, 'nothing set within';
  }

  return join("\n", @bad);
}

sub my_bounding_box_and_sides {
  my ($image, $x1,$y1, $x2,$y2, $black, $white) = @_;

  my @bad = my_bounding_box(@_);
  if ($bad[0] eq '') {
    pop @bad;
  }

  foreach my $x ($x1, ($x1 == $x2 ? () : ($x2))) {
    my $found = 0;
    foreach my $y ($y1 .. $y2) {
      my $got = $image->xy($x,$y);
      if ($got ne $black) {
        $found = 1;
        last;
      }
    }
    if (! $found) {
    push @bad, "nothing in column x=$x";
    }
  }

  foreach my $y ($y1, ($y1 == $y2 ? () : ($y2))) {
    my $found = 0;
    foreach my $x ($x1 .. $x2) {
      my $got = $image->xy($x,$y);
      if ($got ne $black) {
        $found = 1;
        last;
      }
    }
    if (! $found) {
    push @bad, "nothing in row y=$y";
    }
  }

  return join("\n", @bad);
}


#------------------------------------------------------------------------------
# VERSION

{
  my $want_version = 1;
  is ($Image::Base::Tk::Canvas::VERSION, $want_version, 'VERSION variable');
  is (Image::Base::Tk::Canvas->VERSION,  $want_version, 'VERSION class method');

  is (eval { Image::Base::Tk::Canvas->VERSION($want_version); 1 },
      1,
      "VERSION class check $want_version");
  my $check_version = $want_version + 1000;
  is (! eval { Image::Base::Tk::Canvas->VERSION($check_version); 1 },
      1,
      "VERSION class check $check_version");

  my $image = Image::Base::Tk::Canvas->new (-tkcanvas => 'dummy');
  is ($image->VERSION,  $want_version, 'VERSION object method');

  is (eval { $image->VERSION($want_version); 1 },
      1,
      "VERSION object check $want_version");
  is (! eval { $image->VERSION($check_version); 1 },
      1,
      "VERSION object check $check_version");
}

#------------------------------------------------------------------------------
# new()

{
  my $image = Image::Base::Tk::Canvas->new (-for_widget => $mw,
                                            -width => 6,
                                            -height => 7);
  is ($image->get('-file'), undef);
  is ($image->get('-file_format'), "eps");
  is ($image->get('-width'), 6);
  is ($image->get('-height'), 7);
  is (defined $image && $image->isa('Image::Base') && 1,
      1,
      'isa Image::Base');
  is (defined $image && $image->isa('Image::Base::Tk::Canvas') && 1,
      1,
      'isa Image::Base::Tk::Canvas');
}

# cannot clone yet
# {
#   my $image = Image::Base::Tk::Canvas->new (-for_widget => $mw,
#                                                            -width => 6,
#                                                            -height => 7);
#   my $i2 = $image->new;
#   is (defined $i2 && $i2->isa('Image::Base') && 1,
#       1,
#       'isa Image::Base');
#   is (defined $i2 && $i2->isa('Image::Base::Tk::Canvas') && 1,
#       1,
#       'isa Image::Base::Tk::Canvas');
#   is ($i2->get('-width'),  6, 'copy object -width');
#   is ($i2->get('-height'), 7, 'copy object -height');
#   is ($i2->get('-tkcanvas') != $image->get('-tkcanvas'),
#       1,
#       'copy object different -tkcanvas');
# }

#------------------------------------------------------------------------------
# save() default eps

my $test_filename = 'testfile.tmp';

{
  my $image = Image::Base::Tk::Canvas->new (-for_widget => $mw,
                                            -width  => 2,
                                            -height => 1);
  $image->xy (0,0, '#FFFFFF');
  $image->xy (1,0, '#000000');
  unlink $test_filename;
  $image->save($test_filename);

  ok (-e $test_filename, "save() target file exists");
  cmp_ok (-s $test_filename, '>', 0, "save() target file not empty");
  is ($image->get('-file'), $test_filename, "save() sets -file");
}


#------------------------------------------------------------------------------
# save() to no such dir

{
  my $bad_filename = 'no/such/directory/testfile.tmp';
  unlink $test_filename;

  my $image = Image::Base::Tk::Canvas->new (-for_widget => $mw,
                                            -width  => 2,
                                            -height => 1);
  $image->xy (0,0, '#FFFFFF');
  my $eval = eval {
    $image->save($bad_filename);
    1;
  };
  is ($eval, undef,
      "save() bad filename throw error");
  is ($image->get('-file'), $bad_filename,
      "save() bad filename still sets -file");
}


#------------------------------------------------------------------------------

{
  require MyTestImageBase;
  my $canvas = $mw->Canvas (-background => 'black',
                            -width => 21,
                            -height => 10);
  my $image = Image::Base::Tk::Canvas->new
    (-tkcanvas => $canvas);
  MyTestImageBase::check_image ($image,
                                image_clear_func => sub {
                                  $canvas->delete($canvas->find('all'));
                                  if ($canvas->find('all')) {
                                    die "oops, canvas not cleared";
                                  }
                                });
}

unlink $test_filename;
exit 0;
