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 Tk-GraphItems-TextBox.t'.


use Test::More tests => 34;

BEGIN {use_ok ('Tk')};
require_ok ('Tk::GraphItems::TextBox');
require_ok ('Tk::GraphItems::Connector');


use strict;
use warnings;


SKIP:{

my $mw = eval{ tkinit()};
skip 'Tk::MainWindow instantiation failed - skipping Tk-GraphItems-TextBox.t',
      31 if $@;

my $s_can = $mw -> Scrolled('Canvas',
			    -scrollregion=>[0,0,200,700],
			)->pack(-fill  =>'both',
				-expand=>1);
my $can = $s_can->Subwidget('scrolled');

my @node;
my $conn;
my $conn_weak;
sub create{ 
    my ($x,$y) = (50,20);
    for my $n (0..1) {
	$node[$n] = Tk::GraphItems::TextBox->new(canvas=>$can,
						text=>"object $n",
						'x'=>$x+=20,
						'y'=>$y+=20);
    }



    $conn= Tk::GraphItems::Connector->new(
					  source=>$node[0],
					  target=>$node[1],
				      );
    $conn_weak = Tk::GraphItems::Connector->new(
					  source      => $node[1],
					  target      => $node[0],
                                          autodestroy => 1,
				      );

}


sub get_set_c{
    my($x,$y) = @_;
    if (@_){
        $node[1]->set_coords($x,$y);
    }
    return $node[1]->get_coords;
}

sub move{
    my @delta = @_;
    $node[1]->move(@delta);
    return $node[1]->get_coords;
}


sub set_text{
    my $text = shift;
    my $node = $node[0];
    if (defined $text){
        $node->text($text);
    }
    $mw->update;
    return $node->text;
}

sub set_color{
    my $color = shift;
    $node[0]->colour($color);
    return $node[0]->colour;
}



sub conn_arrow{
    my $arrow = shift;
    if ($arrow){
        $conn->arrow($arrow);
    }
    return $conn->arrow;
}

sub conn_color{
    my $color = shift;
    $conn->colour($color);
    return $conn->colour;
}

sub conn_width{
    my $width = shift;
    $conn->width($width);
    return $conn->width;
}

$mw->update;

eval{create()};
ok( !$@,"instantiation $@");
ok($node[0]->isa('Tk::GraphItems::TextBox'), 'node 1');
ok($node[1]->isa('Tk::GraphItems::TextBox'), 'node 2');
ok($conn->isa('Tk::GraphItems::Connector'), 'connector');
$mw->update;


$mw->update;
{
    my @coords = (42,42);
    my $ret;
    eval{$ret = get_set_c(@coords)};
    ok( !$@,"method get_set_coords $@");
    is_deeply($ret, \@coords, 'get_set_coords result_ok');
    eval{$ret = get_set_c(1,'foo')};
    ok( $@," invalid args to set_coords(): $@");
}


$mw->update;

{
    my @delta = (10,10);
    my $ret ;
    eval{
        get_set_c(90,90);
        move(@delta);
        $ret = get_set_c();
    };
    ok( !$@,"method move $@");
    is_deeply($ret,[100,100], 'move result_ok');
    eval{
        move('foo','bar');
    };
    ok($@, " invalid args to move(): $@");
}
$mw->update;

{
    my $color = 'red';
    my $ret;
    eval{$ret = set_color($color)};
    ok( !$@, "method color $@");
    is($ret, $color, 'color set correctly');
    $color = 'foo';
    eval{$ret = set_color($color)};
    ok( $@, "invalid args to TextBox->colour $@");
    $mw->update;
}
$mw->update;
{
    my $text = 'new text';
    my $ret;
    eval{$ret = set_text($text)};
    ok( !$@, "method set_text $@");
    is($ret, $text, 'text set correctly');
    $mw->update;
}

{
    my $color = 'red';
    my $ret;
    eval{$ret = conn_color($color)};
    ok( !$@, "method Connector->color $@");
    is($ret, $color, 'color set correctly');
    $color = 'foo';
    eval{$ret = conn_color($color)};
    ok( $@, "invalid args to Connector->color $@");
    $mw->update;
}



{
    my $arrow = 'last';
    my $ret;
    eval{$ret = conn_arrow($arrow)};
    ok( !$@,"connector arrow $@");
    is($ret, $arrow, 'arrow set correctly');
    $arrow = 'zzz';
    eval{$ret = conn_arrow($arrow)};
    ok( $@,"invalid args to connector->arrow $@");
}
    $mw->update;


{
    my $width = 3;
    my $ret;
    eval{$ret = conn_width($width)};
    ok(!$@, 'connector width');
    is($ret, $width, 'connector->width set correctly');
    $width = 'foo';
    eval{$ret = conn_width($width)};
    ok($@, "invalid args to connector->width(): $@");

}

$mw->update;

$node[0]->bind_class('<<TestEvent>>', sub{});
my $ret = $can->bind('TextBoxBind','<<TestEvent>>');
is (substr("$ret",0,12),'Tk::Callback','TextBox binding created');
$node[0]->bind_class('<<TestEvent>>', '');
$ret = $can->bind('TextBoxBind','<<TestEvent>>');
is ($ret,undef,'TextBox binding deleted');


$conn->bind_class('<<TestEvent>>', sub{});
$ret = $can->bind('ConnectorBind','<<TestEvent>>');
is (substr("$ret",0,12),'Tk::Callback','Connector binding created');
$conn->bind_class('<<TestEvent>>', '');
$ret = $can->bind('ConnectorBind','<<TestEvent>>');
is ($ret,undef,'Connector binding deleted');

my $canvas_item = $conn_weak->canvas_items;
my $found = $can->find('withtag',$canvas_item);
is ($found->[0], $canvas_item, 'Connector CanvasItem exists');
undef $conn_weak;
$found = $can->find('withtag',$canvas_item);
isnt ($found, $canvas_item, 'Connector CanvasItem destroyed');




$node[0] = $node[1] = $conn=  undef;

my @items = $can->find('all');
is( @items, 3, 'Canvas items destroyed');

} #end SKIP

__END__