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 tests => 35;

BEGIN {
	use_ok('Cv', -more);
}

use Data::Dumper;

sub D (\@) {
	Data::Dumper->Dump([@{$_[0]}], [map { "\$_[$_]" } 0 .. $#{$_[0]}]);
}

our $line;

sub err_is {
	our $line;
	chop(my $a = $@);
	my $b = shift(@_) . " at $0 line $line";
	$b .= '.' if $a =~ m/\.$/;
	unshift(@_, "$a\n", "$b\n");
	goto &is;
}

if (1) {
	my $e = "error";
	$@ = $e;
	is(Cv::cvErrorStr(-2), "Unspecified error");
	is($@, $e);
	is(Cv->ErrorStr(-2), "Unspecified error");
	is($@, $e);
	is(Cv->errorStr(-2), "Unspecified error");
	is($@, $e);
}

if (2) {
	my ($status, $funcName, $errMsg, $fileName);
	eval {
		$line = __LINE__ + 1;
		Cv->error(
			$status = -1,
			$funcName = "funcName",
			$errMsg = "errMsg",
			$fileName = __FILE__,
			$line,
			);
	};
	err_is(join(' ', "OpenCV Error:", Cv->errorStr($status),
				"($errMsg)", "in $funcName"));
}

if (3) {
	Cv->setErrMode(0);
	is(Cv->getErrMode(), 0, "errMode");
	my ($status, $funcName, $errMsg, $fileName);
	my $err;
	sub myError {
		$err = \@_;
		# print STDERR "myerror:\n", D(@_);
	}
	my $prevError = Cv->redirectError(
		\&myError, my $myData = "mydata",
		my $prevData,
		);
	eval {
		$line = __LINE__ + 1;
		Cv->error(
			$status = -1,
			$funcName = "funcName",
			$errMsg = "errMsg0",
			$fileName = __FILE__,
			$line,
			);
	};
	err_is("OpenCV Error: Backtrace ($errMsg) in $funcName");
	is(Cv->getErrStatus(), $status, "errStatus");
	is($err->[0], $status);
	is($err->[1], $funcName);
	is($err->[2], $errMsg);
	is($err->[3], $fileName);
	is($err->[4], $line);
	is($err->[5], $myData);
	my $prevError2 = Cv->redirectError($prevError, $prevData, my $prevData2);
	is($prevError2, \&myError);
	is($prevData2, $myData);
}

if (4) {
	Cv->setErrMode(1);
	is(Cv->getErrMode(), 1, "errMode1");
	my ($status, $funcName, $errMsg, $fileName);
	my $err;
	my $prevError = Cv->redirectError(
		my $myError = sub {
			$err = \@_;
			# print STDERR "myerror1:\n", D(@_);
		},
		my $myData = "mydata1",
		my $prevData,
		);
	eval {
		Cv->error(
			$status = -2,
			$funcName = "funcName1",
			$errMsg = "errMsg1",
			$fileName = __FILE__,
			$line = __LINE__,
			);
	};
	is($@, '');
	is(Cv->getErrStatus(), $status, "errStatus");
	is($err->[0], $status);
	is($err->[1], $funcName);
	is($err->[2], $errMsg);
	is($err->[3], $fileName);
	is($err->[4], $line);
	is($err->[5], $myData);
	my $prevError2 = Cv->redirectError($prevError, $prevData, my $prevData2);
	is($prevError2, $myError);
	is($prevData2, $myData);
}

if (5) {
	Cv->setErrMode(2);
	is(Cv->getErrMode(), 2, "errMode2");
	my ($status, $funcName, $errMsg, $fileName);
	my $err;
	my $prevError = Cv->redirectError(
		sub {
			$err = \@_;
			# print STDERR "myerror1:\n", D(@_);
		},
		my $myData = "mydata2",
		my $prevData,
		);
	eval {
		$line = __LINE__ + 1;
		Cv->error(
			$status = -3,
			$funcName = "funcName2",
			$errMsg = "errMsg2",
			$fileName = __FILE__,
			$line,
			);
	};
	is($@, '');
	is(Cv->getErrStatus(), $status, "errStatus");
	is($err, undef);
	Cv->redirectError($prevError, $prevData);
}

if (6) {
	Cv->setErrMode(0);
	Cv->redirectError(sub { });
	$line = __LINE__ + 1;
	eval { Cv::cvCreateImage([-1, -1], 8, 3); };
	err_is("OpenCV Error: Unknown error code -25 (Bad input roi) in cvInitImageHeader");
}