The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use warnings;
use strict;
use Gtk2::TestHelper tests => 6;

# Gtk2::Widget's size-request
{
  package TestSizeRequestChain::Base;
  use strict;
  use warnings;
  use Gtk2;
  use Glib::Object::Subclass
    'Gtk2::Widget',
      signals => { size_request => \&_do_size_request };

  our $size_request_runs = 0;
  sub _do_size_request {
    my ($self, $req) = @_;
    $size_request_runs = 1;
    $req->width (123);
    $req->height (456);
  }

  package TestSizeRequestChain::Sub;
  use strict;
  use warnings;
  use Gtk2;

  use Glib::Object::Subclass
    'TestSizeRequestChain::Base',
      signals => { size_request => \&_do_size_request };

  our $size_request_runs = 0;
  sub _do_size_request {
    my ($self, $req) = @_;
    $size_request_runs = 1;

    $self->signal_chain_from_overridden ($req);
  }

  package main;
  my $widget = TestSizeRequestChain::Sub->new;
  my $req = $widget->size_request;
  ok ($TestSizeRequestChain::Sub::size_request_runs,
      'TestSizeRequestChain::Sub size_request() runs');
  ok ($TestSizeRequestChain::Base::size_request_runs,
      'TestSizeRequestChain::Base size_request() runs');
  is ($req->width, 123,
      'TestSizeRequestChain width');
  is ($req->height, 456,
      'TestSizeRequestChain width');
}

# Gtk2::TextBuffer's insert-text
{
  package TestInsertTextChain;
  use strict;
  use warnings;
  use Gtk2;
  use Glib::Object::Subclass
    'Gtk2::TextBuffer',
      signals => { insert_text => \&_do_insert_text };

  our $insert_text_runs = 0;
  sub _do_insert_text {
    my ($self, $iter, $text, $length) = @_;
    $insert_text_runs++;
    $text =~ s/bla/blub/g;
    $self->signal_chain_from_overridden ($iter, $text, length($text));
  }

  package main;

  my $tb = TestInsertTextChain->new;
  my $iter = $tb->get_start_iter;
  for (my $i = 0; $i < 10; $i++) {
    # reuse $iter here to test whether it is correctly updated by the custom
    # insert-text handler
    $tb->insert ($iter, 'bla');
  }
  is ($TestInsertTextChain::insert_text_runs, 10,
      'TestInsertTextChain insert_text() runs');
  is ($tb->get_text ($tb->get_start_iter, $tb->get_end_iter, TRUE),
      'blub' x 10,
      'TestInsertTextChain buffer contents');
}