use strict;
use warnings;

use Test::More;
use Prima::Test;

reset_flag;
my $window = create_window;

$::application->begin_paint;
plan skip_all => "rdesktop" if $^O =~ /win32/i && $::application->pixel(0,0) == cl::Invalid;
$::application->end_paint;

plan tests => 11;

$window-> bring_to_front;
my @rcrect;
my $ww = $window-> insert( Widget => origin => [ 0, 0] => size => [ 8, 8],
                           syncPaint => 0,
                           buffered => 0,
                           cursorSize => [ 30, 30],
                           cursorVisible => 1,
                           onPaint => sub {
                               $_[0]-> on_paint( $_[1]);
                               set_flag;
                               @rcrect = $_[0]-> clipRect;
                           });
ok( wait_flag, "onPaint message" );
reset_flag;

$ww-> repaint;
$ww-> update_view;
ok( get_flag, "update_view" );

reset_flag;
SKIP: {
	my $p = $ww-> scroll( 2, 2);
	skip "Window is still not top-level, obscured by something?", 8 if $p != scr::Expose;

	$ww-> update_view;
	ok( get_flag, "scroll" );
	
	$ww-> invalidate_rect( 0, 0, 2, 2);
	my @cr = $ww-> get_invalid_rect;
	is_deeply( \@cr, [0,0,2,2], "query invalid area" );
	$ww-> update_view;
	is_deeply( \@rcrect, [0,0,1,1], "invalid area consistency" );

	$ww-> buffered(1);
	$ww-> set( onPaint => sub {
		my $x = $_[1];
		$_[0]-> on_paint( $x);
		$x-> pixel( 0,0,cl::White);
		my $white = $x-> pixel(0,0);
		$x-> pixel( 0,0,cl::Black);
		is( $x-> pixel(0,0), 0, "pixel" );
		$x-> color( cl::White);
		$x-> bar( 0, 0, 7, 7);
		$x-> color( cl::Black);
		$x-> clipRect( 2, 2, 3, 3);
		$x-> bar( 1, 1, 2, 2);
		$x-> clipRect( 0, 0, $x-> size);
		is( $x-> pixel( 2,2), 0, "clipRect" );
		is( $x-> pixel( 1,1), $white, "clipRect" );
	
		$x-> color( cl::White);
		$x-> bar( 0, 0, 7, 7);
		$x-> color( cl::Black);
		$x-> translate( -1, 1);
		$x-> bar( 2, 2, 3, 3);
		$x-> translate( 0, 0);
		is( $x-> pixel( 1,4), 0, "translate" );
		is( $x-> pixel( 3,2), $white, "translate" );
	});
	$ww-> repaint;
	$ww-> update_view;
}

$ww-> destroy;

$ww = $window->insert( Widget => onPaint => sub { die "moo" });
eval { $ww->repaint; $ww->update_view; };
ok( $@ =~ /moo/, 'exception in cmPaint');
$ww-> destroy;
