The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
#
# $Id$
#

#########################
# GtkImage Tests
# 	- rm
#########################

use Data::Dumper;
use Gtk2::TestHelper tests => 45;

# get some things ready to use below ###########################################

# borrowed from xsane-icons.c
my @pixbuf_data =
(
	"    20    20        4            1",
	"  none",
	". c #000000",
	"+ c #208020",
	"a c #ffffff",
	"                    ",
	" .................  ",
	" .+++++++++++++++.  ",
	" .+      .      +.  ",
	" .+     ...     +.  ",
	" .+    . . .    +.  ",
	" .+      .      +.  ",
	" .+      .      +.  ",
	" .+  .   .   .  +.  ",
	" .+ .    .    . +.  ",
	" .+.............+.  ",
	" .+ .    .    . +.  ",
	" .+  .   .   .  +.  ",
	" .+      .      +.  ",
	" .+    . . .    +.  ",
	" .+     ...     +.  ",
	" .+      .      +.  ",
	" .+++++++++++++++.  ",
	" .................  ",
	"                    ",
);

my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_xpm_data (@pixbuf_data);

my ($pixmap, $mask) = $pixbuf->render_pixmap_and_mask (255);

my $iconset = Gtk2::IconSet->new_from_pixbuf ($pixbuf);

# Plain old new ################################################################

ok (my $img = Gtk2::Image->new, 'Gtk2::Image->new');

ok (eq_array ([$img->get_icon_set], [undef, 'button']), 'get_icon_set empty');
is ($img->get_image, undef, 'get_image empty');
is ($img->get_pixbuf, undef, 'get_pixbuf empty');
is ($img->get_pixmap, undef, 'get_pixmap empty');
ok (eq_array ([$img->get_stock ()], [undef, 'button']), 'get_stock empty');
is ($img->get_animation, undef, 'get_animation empty');
is ($img->get_storage_type, 'empty', 'get_storage_type empty');

# new from stock ###############################################################

ok ($img = Gtk2::Image->new_from_stock ('gtk-cancel', 'menu'),
    'Gtk2::Image->new_from_stock');
is ($img->get_storage_type, 'stock', 'new_from_stock get_storage_type');
ok (eq_array ([$img->get_stock ()], ['gtk-cancel', 'menu']),
    'new_from_stock get_stock');

# new from icon set ############################################################

ok ($img = Gtk2::Image->new_from_icon_set ($iconset, 'small-toolbar'),
    'Gtk2::Image->new_from_icon_set');
my @ret = $img->get_icon_set;
is (scalar (@ret), 2, 'new_from_icon_set get_icon_set num rets');
isa_ok ($ret[0], 'Gtk2::IconSet', 'new_from_icon_set get_icon_set icon_set');
is ($ret[1], 'small-toolbar', 'new_from_icon_set get_icon_set size');

# new from image ###############################################################

ok ($img = Gtk2::Image->new_from_image (undef, undef),
    'Gtk2::Image->new_from_pixbuf undef');
is ($img->get_image, undef, 'new_from_image get_image empty');
# TODO: from a valid image

# new from pixbuf ##############################################################

ok ($img = Gtk2::Image->new_from_pixbuf ($pixbuf),
    'Gtk2::Image->new_from_pixbuf');
isa_ok ($img->get_pixbuf, 'Gtk2::Gdk::Pixbuf', 'new_from_pixbuf get_pixbuf');

# new from pixmap ##############################################################

ok ($img = Gtk2::Image->new_from_pixmap (undef, undef),
    'Gtk2::Image->new_from_pixbuf');
ok ($img = Gtk2::Image->new_from_pixmap ($pixmap, $mask),
    'Gtk2::Image->new_from_pixbuf');
@ret = $img->get_pixmap;
is (scalar(@ret), 2, 'new_from_pixmap get_pixmap num rets');
isa_ok ($ret[0], 'Gtk2::Gdk::Pixmap', 'new_from_pixmap get_pixbuf pixmap');
isa_ok ($ret[1], 'Gtk2::Gdk::Bitmap', 'new_from_pixmap get_pixbuf mask');

# set from stock ###############################################################

$img->set_from_stock ('gtk-quit', 'dialog');
is ($img->get_storage_type, 'stock', 'set_from_stock get_storage_type');
ok (eq_array ([$img->get_stock ()], ['gtk-quit', 'dialog']),
    'set_from_stock get_stock');

# set from icon set ############################################################

$img->set_from_icon_set ($iconset, 'small-toolbar');
@ret = $img->get_icon_set;
is (scalar (@ret), 2, 'set_from_icon_set get_icon_set num rets');
isa_ok ($ret[0], 'Gtk2::IconSet', 'set_from_icon_set get_icon_set icon_set');
is ($ret[1], 'small-toolbar', 'set_from_icon_set get_icon_set size');

# set from image ###############################################################

$img->set_from_image (undef, undef);
is ($img->get_image, undef, 'set_from_image get_image empty');
# TODO: from a valid image

# set from pixbuf ##############################################################

$img->set_from_pixbuf (undef);
$img->set_from_pixbuf ($pixbuf);
isa_ok ($img->get_pixbuf, 'Gtk2::Gdk::Pixbuf', 'set_from_pixbuf get_pixbuf');

# set from pixmap ##############################################################

$img->set_from_pixmap (undef, undef);
$img->set_from_pixmap ($pixmap, $mask);
@ret = $img->get_pixmap;
is (scalar(@ret), 2, 'set_from_pixmap get_pixmap num rets');
isa_ok ($ret[0], 'Gtk2::Gdk::Pixmap', 'set_from_pixmap get_pixbuf pixmap');
isa_ok ($ret[1], 'Gtk2::Gdk::Bitmap', 'set_from_pixmap get_pixbuf mask');

# These require access to a file, so they may be skipped

my $testfile = './gtk-demo/gnome-foot.png';

SKIP:
{
	skip "unable to find test file, $testfile", 1
		unless (-R $testfile);

	my $animation = Gtk2::Gdk::PixbufAnimation->new_from_file ($testfile);

# new from file ################################################################

	ok ($img = Gtk2::Image->new_from_file (undef),
	    'Gtk2::Image->new_from_file undef');
	ok ($img = Gtk2::Image->new_from_file ($testfile),
	    'Gtk2::Image->new_from_file');
	isa_ok ($img->get_pixbuf, 'Gtk2::Gdk::Pixbuf',
		'new_from_file get_pixbuf');

# new from animation ###########################################################

	ok ($img = Gtk2::Image->new_from_animation ($animation),
	    'Gtk2::Image->new_from_animation');
	isa_ok ($img->get_animation, 'Gtk2::Gdk::PixbufAnimation',
		'new_from_animation get_animationf');

# set from file ################################################################

	$img->set_from_file (undef);
	$img->set_from_file ($testfile);
	isa_ok ($img->get_pixbuf, 'Gtk2::Gdk::Pixbuf',
		'set_from_file get_pixbuf');

# set from animation ###########################################################

	$img->set_from_animation ($animation);
	isa_ok ($img->get_animation, 'Gtk2::Gdk::PixbufAnimation',
		'set_from_animation get_animationf');
}

SKIP: {
	skip 'new stuff in 2.6', 4
		unless Gtk2->CHECK_VERSION (2, 6, 0);

	$img = Gtk2::Image->new_from_icon_name ('gtk-ok', 'button');
	isa_ok ($img, 'Gtk2::Image');
	is_deeply ([$img->get_icon_name], ['gtk-ok', 'button']);

	$img->set_from_icon_name ('gtk-cancel', 'menu');
	is_deeply ([$img->get_icon_name], ['gtk-cancel', 'menu']);

	$img->set_pixel_size (23);
	is ($img->get_pixel_size, 23);
}

SKIP: {
	skip 'new stuff in 2.8', 0
		unless Gtk2->CHECK_VERSION (2, 8, 0);

	$img->clear;
}

__END__

Copyright (C) 2003-2005 by the gtk2-perl team (see the file AUTHORS for the
full list).  See LICENSE for more information.