The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- mode: perl; coding: utf-8; tab-width: 4 -*-

use strict;
use warnings;
# use Test::More qw(no_plan);
use Test::More;
use Test::Exception;
use Cv;

eval "use Cv::Qt qw(:all)";
plan skip_all => "Qt required" unless !$@ && cvHasQt();
# plan qw(no_pln);
plan tests => 47;

my $hasGUI = Cv->hasGUI;

if (Cv->GetBuildInformation) {
	like(cvHasQt(), qr/^QT \d\.\w+/);
} else {
	ok(cvHasQt());
}


# ============================================================
#  CvFont cvFontQt(
#     char* nameFont, int pointSize = -1, CvScalar color = cvScalarAll(0),
#     int weight = CV_FONT_NORMAL, int style = CV_STYLE_NORMAL,
#     int spacing = 0)
# ============================================================

can_ok('Cv', 'cvFontQt');
can_ok(__PACKAGE__, 'cvFontQt');

throws_ok { cvFontQt() }
qr/Usage: Cv::Qt::cvFontQt\(nameFont, pointSize= -1, color= cvScalarAll\(0\), weight= CV_FONT_NORMAL, style= CV_STYLE_NORMAL, spacing= 0\)/;

my $huge = cvFontQt('Helvetica', 20);
isa_ok($huge, 'Cv::Font');

my $bold = cvFontQt('Times', 10, cvScalarAll(0), eval "&CV_FONT_BOLD");
isa_ok($bold, 'Cv::Font');

my $normal = Cv->FontQt('Times', 10, cvScalarAll(0), eval "&CV_FONT_NORMAL");
isa_ok($normal, 'Cv::Font');


# ============================================================
#  void cvAddText(CvArr* img, char* text, CvPoint location, CvFont *font)
# ============================================================

can_ok('Cv::Arr', 'cvAddText');
can_ok('Cv', 'cvAddText');
can_ok(__PACKAGE__, 'cvAddText');

my $img = Cv->createImage([480, 240], 8, 3);
$img->fill(cvScalarAll(255));

SKIP: {
	skip "cvAddText() unless DISPLAY", 4 unless $hasGUI;

	Cv->namedWindow('Cv', CV_WINDOW_AUTOSIZE | CV_WINDOW_NORMAL);

	throws_ok { cvAddText() }
	qr/Usage: Cv::Qt::cvAddText\(img, text, location, font\)/;

	my $hi = "Hello, Qt";
	my $az = "The quick brown fox jumps over the lazy dog. 01234567890";

	lives_ok { cvAddText($img, $hi, [ 10, 80 ], $huge) };
	if ($normal) {
		lives_ok { cvAddText($img, $az, [ 10, 100 ], $normal) };
	}
	if ($bold) {
		lives_ok { $img->AddText($az, [ 10, 120 ], $bold) };
	}

	$img->show('Cv');
	Cv->waitKey(1000);
}

# ============================================================
#  void cvDisplayOverlay(const char* name, const char* text, int delay)
# ============================================================

can_ok('Cv', 'cvDisplayOverlay');
can_ok(__PACKAGE__, 'cvDisplayOverlay');

SKIP: {
	skip "cvDisplayOverlay() unless DISPLAY", 2 unless $hasGUI;

	throws_ok { cvDisplayOverlay() } qr/Usage: Cv::Qt::cvDisplayOverlay/;
	lives_ok { cvDisplayOverlay('Cv', 'Overlay', 1000) };

	$img->show('Cv');
	Cv->waitKey(1000);
}

# ============================================================
#  void cvDisplayStatusBar(const char* name, const char* text, int delayms)
# ============================================================

can_ok('Cv', 'cvDisplayStatusBar');
can_ok(__PACKAGE__, 'cvDisplayStatusBar');

SKIP: {
	skip "cvDisplayStatusBar() unless DISPLAY", 2 unless $hasGUI;

	throws_ok { cvDisplayStatusBar() } qr/Usage: Cv::Qt::cvDisplayStatusBar/;
	lives_ok { cvDisplayStatusBar('Cv', 'StatusBar', 1000) };

	$img->show('Cv');
	Cv->waitKey(1000);
}

# ============================================================
#  void cvGetWindowProperty(const char* name, int prop_id)
#  void cvSetWindowProperty(const char* name, int prop_id, double prop_value)
# ============================================================

can_ok('Cv', 'cvGetWindowProperty');
can_ok(__PACKAGE__, 'cvGetWindowProperty');

can_ok('Cv', 'cvSetWindowProperty');
can_ok(__PACKAGE__, 'cvSetWindowProperty');

SKIP: {
	skip "cv(Get|Set)WindowProperty() unless DISPLAY", 9 unless $hasGUI;

	throws_ok { cvGetWindowProperty() } qr/Usage: Cv::Qt::cvGetWindowProperty/;
	lives_ok { cvGetWindowProperty('Cv', CV_WND_PROP_FULLSCREEN) };

	my $auto;

	throws_ok { cvSetWindowProperty() } qr/Usage: Cv::Qt::cvSetWindowProperty/;
	lives_ok { cvSetWindowProperty('Cv', CV_WND_PROP_AUTOSIZE, 1) };
	lives_ok { $auto = cvGetWindowProperty('Cv', CV_WND_PROP_AUTOSIZE) };
	ok($auto, 'cvGetWindowProperty');

	$img->show('Cv');
	Cv->waitKey(1000);

	lives_ok { cvSetWindowProperty('Cv', CV_WND_PROP_AUTOSIZE, 0) };
	lives_ok { $auto = cvGetWindowProperty('Cv', CV_WND_PROP_AUTOSIZE) };
	ok(!$auto, 'cvGetWindowProperty');

	$img->show('Cv');
	Cv->waitKey(1000);
}

# ============================================================
#  void cvLoadWindowParameters(const char* name)
#  void cvSaveWindowParameters(const char* name)
# ============================================================

can_ok('Cv', 'cvLoadWindowParameters');
can_ok(__PACKAGE__, 'cvLoadWindowParameters');

can_ok('Cv', 'cvSaveWindowParameters');
can_ok(__PACKAGE__, 'cvSaveWindowParameters');

SKIP: {
	skip "cvLoad/SaveWindowParameters() unless DISPLAY", 4 unless $hasGUI;

	throws_ok { cvLoadWindowParameters() } qr/Usage: Cv::Qt::cvLoadWindowParameters/;
	lives_ok { cvLoadWindowParameters('Cv') };

	throws_ok { cvSaveWindowParameters() } qr/Usage: Cv::Qt::cvSaveWindowParameters/;
	lives_ok { cvSaveWindowParameters('Cv') };

	Cv->moveWindow('Cv', 100, 100);
	Cv->saveWindowParameters('Cv');

	my ($x, $y) = (0, 0);
	for (1 .. 10) {
		Cv->moveWindow('Cv', $x, $y);
		Cv->waitKey(100);
		$x += 10;
	}
	for (1 .. 10) {
		Cv->moveWindow('Cv', $x, $y);
		Cv->waitKey(100);
		$y += 10;
	}

	Cv->loadWindowParameters('Cv');

	$img->show;
	Cv->waitKey(1000);

}

# ============================================================
#  int cvCreateButton(
#    const char* button_name=NULL,
#    CvButtonCallback on_change = NULL,
#    VOID* userdata = NULL,
#    int button_type = CV_PUSH_BUTTON,
#    int initial_button_state = 0)
# ============================================================

can_ok('Cv', 'cvCreateButton');
can_ok(__PACKAGE__, 'cvCreateButton');

SKIP: {
	skip "cvCreateButton() unless DISPLAY", 2 unless $hasGUI;

	my $state;
	lives_ok { Cv->createButton(\0, sub { $state = shift }) };
	lives_ok { Cv->createButton("button", sub { $state = shift }) };

	$img->show;
	Cv->waitKey(1000);

}

# ============================================================
#  void cvCreateOpenGLCallback(
#    const char* window_name,
#    CvOpenGLCallback callbackOpenGL,
#    VOID* userdata = NULL,
#    double angle = -1,
#    double zmin = -1,
#    double zmax = -1)
# ============================================================