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

use Gtk2::TestHelper
	tests => 28,
	at_least_version => [2, 4, 0, "GtkComboBox is new in 2.4"],
	;

my $combo_box;

## convenience -- text
$combo_box = Gtk2::ComboBox->new_text;
isa_ok ($combo_box, 'Gtk2::ComboBox');
ginterfaces_ok($combo_box);

$combo_box->append_text ("some text");
$combo_box->append_text ("more text");
$combo_box->prepend_text ("more text");
$combo_box->prepend_text ("more text");
$combo_box->insert_text (1, "even more text");
$combo_box->insert_text (5, "even more text");
$combo_box->remove_text (0);
$combo_box->remove_text (2);

$combo_box->set_active (2);
is ($combo_box->get_active, 2);

my $model = $combo_box->get_model;
isa_ok ($model, 'Gtk2::TreeModel');

is ($model->get_path ($combo_box->get_active_iter)->to_string,
    $combo_box->get_active);

my $iter = $model->get_iter_first;
$combo_box->set_active_iter ($iter);
is ($model->get_path ($combo_box->get_active_iter)->to_string,
    $model->get_path ($iter)->to_string);

$combo_box->set_active_iter (undef);
is ($combo_box->get_active, -1);
is ($combo_box->get_active_iter, undef);

$combo_box = Gtk2::ComboBox->new;
isa_ok ($combo_box, 'Gtk2::ComboBox');
# set a model to avoid a nastygram when destroying; some versions of gtk+
# do not check for NULL before unreffing the model.
$combo_box->set_model ($model);

$combo_box = Gtk2::ComboBox->new ($model);
isa_ok ($combo_box, 'Gtk2::ComboBox');

$combo_box = Gtk2::ComboBox->new_with_model ($model);
isa_ok ($combo_box, 'Gtk2::ComboBox');

## getters and setters

$model = Gtk2::ListStore->new ('Glib::String', 'Glib::Int');
$combo_box->set_model ($model);
is ($combo_box->get_model, $model);

# get active returns -1 when nothing is selected
is ($combo_box->get_active, -1);

foreach my $t (qw(fee fie foe fum)) {
	$model->set ($model->append, 0, $t, 1, 1);
}

$combo_box->set_active (1);
is ($combo_box->get_active, 1, 'set and get active');

SKIP: {
	skip "new api in gtk+ 2.6", 12
		unless Gtk2->CHECK_VERSION (2, 6, 0);

	my $active_path = Gtk2::TreePath->new_from_string
				("".$combo_box->get_active."");
	is ($combo_box->get_active_text,
	    $model->get ($model->get_iter ($active_path), 0),
	    'get active text');

	$combo_box->set_add_tearoffs (TRUE);
	ok ($combo_box->get_add_tearoffs, 'tearoff accessors');
	$combo_box->set_add_tearoffs (FALSE);
	ok (!$combo_box->get_add_tearoffs, 'tearoff accessors');

	$combo_box->set_focus_on_click (TRUE);
	ok ($combo_box->get_focus_on_click, 'focus-on-click accessors');
	$combo_box->set_focus_on_click (FALSE);
	ok (!$combo_box->get_focus_on_click, 'focus-on-click accessors');

	$combo_box->set_row_separator_func (sub {
		my ($model, $iter, $data) = @_;

		my $been_here = 0 if 0;
		return if $been_here++;

		isa_ok ($model, 'Gtk2::ListStore');
		isa_ok ($iter, 'Gtk2::TreeIter');
		is_deeply ($data, { something => 'else' });
	}, { something => 'else'});

	# make sure the widget is parented, realized and sized, or popup
	# and popdown will assert when they try to use combo_box's GdkWindow.
	# er, also make sure there's stuff in it.
	my $cell = Gtk2::CellRendererText->new;
	$combo_box->pack_start ($cell, TRUE);
	$combo_box->set_attributes ($cell, text => 0);
	my $window = Gtk2::Window->new;
	$window->add ($combo_box);
	$combo_box->show;
	$window->show;

	$combo_box->popup;
	$combo_box->popdown;

	$combo_box->set_wrap_width (1);
	$combo_box->set_row_span_column (1);
	$combo_box->set_column_span_column (1);

	is ($combo_box->get_wrap_width, 1);
	is ($combo_box->get_row_span_column, 1);
	is ($combo_box->get_column_span_column, 1);

	# setting undef for no model is allowed
	$combo_box->set_model (undef);
	is ($combo_box->get_model, undef, 'set_model() of undef giving undef');
}

SKIP: {
	skip "new api in gtk+ 2.10", 1
		unless Gtk2->CHECK_VERSION (2, 10, 0);

	$combo_box->set_title ("whee");
	is ($combo_box->get_title, "whee");
}

SKIP: {
	skip 'new 2.14 stuff', 1
		unless Gtk2->CHECK_VERSION(2, 14, 0);

	my $combo_box = Gtk2::ComboBox->new;
	$combo_box->set_button_sensitivity ('auto');
	is ($combo_box->get_button_sensitivity, 'auto');
}

__END__

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

vim: set ft=perl :