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 => 65;
use Test::Exception;
BEGIN { use_ok('Cv') }

if (1) {
	my $x; lives_ok { $x = Cv::Mat->new([], CV_32FC1) };
	is($x, undef);
}

if (2) {
	my $arr = Cv::Mat->new([], CV_32FC1, [1]);
	ok($arr);
	is($arr->rows, 1);
	is($arr->cols, 1);
	my $x = $arr->sum;
	is_deeply(cvScalar(@$x), cvScalar(1));
}

if (3) {
	my $arr = Cv::Mat->new([], CV_32FC1, [1, 2, 3]);
	ok($arr);
	is($arr->rows, 1);
	is($arr->cols, 3);
	my $x = $arr->sum;
	is_deeply(cvScalar(@$x), cvScalar(1 + 2 + 3));
}

if (4) {
	my $arr = Cv::Mat->new([], CV_32FC1, [[1], [2], [3]]);
	ok($arr);
	is($arr->rows, 1);
	is($arr->cols, 3);
	my $x = $arr->sum;
	is_deeply(cvScalar(@$x), cvScalar(1 + 2 + 3));
}

if (5) {
	my $arr = Cv::Mat->new([], CV_32FC3, [ [1, 2, 3] ]);
	ok($arr);
	is($arr->rows, 1);
	is($arr->cols, 1);
	my $x = $arr->sum;
	is_deeply(cvScalar(@$x), cvScalar(1, 2, 3));
}

if (6) {
	my $arr = Cv::Mat->new([], CV_32FC1,
						   [[1], [2], [3]],
						   [[1], [2], [3]],
		);
	ok($arr);
	is($arr->rows, 2);
	is($arr->cols, 3);
	my $x = $arr->sum;
	is_deeply(cvScalar(@$x), cvScalar((1 + 2 + 3)*2));
}

if (7) {
	my $arr = Cv::Mat->new([], CV_32FC3,
						   [ [1, 2, 3] ],
						   [ [1, 2, 3] ],
		);
	ok($arr);
	is($arr->rows, 2);
	is($arr->cols, 1);
	my $x = $arr->sum;
	is_deeply(cvScalar(@$x), cvScalar(map { $_ * 2 } (1, 2, 3)));
}

if (8) {
	my $arr = Cv::Mat->new([], CV_32FC3,
						   [
							[1, 2, 3],
							[1, 2, 3],
						   ],
		);
	ok($arr);
	is($arr->rows, 1);
	is($arr->cols, 2);
	my $x = $arr->sum;
	is_deeply(cvScalar(@$x), cvScalar(map { $_ * 2 } (1, 2, 3)));
}

if (9) {
	my $arr = Cv::Mat->new([], CV_32FC3,
						   [1, 2, 3],
						   [1, 2, 3],
		);
	ok($arr);
	is($arr->rows, 2);
	is($arr->cols, 1);
	my $x = $arr->sum;
	is_deeply(cvScalar(@$x), cvScalar(map { $_ * 2 } (1, 2, 3)));
}

if (10) {
	my $arr = Cv::Mat->new([ 3, 3 ], CV_16SC2);
	ok($arr);
	is($arr->rows, 3);
	is($arr->cols, 3);

	$arr->set(
		[],
		[ [ [ 0, 0 ], [ 0, 1 ], [ 0, 2 ], ],
		  [ [ 1, 0 ], [ 1, 1 ], [ 1, 2 ], ],
		  [ [ 2, 0 ], [ 2, 1 ], [ 2, 2 ], ], ],
		);
	is_deeply(cvScalar(@{$arr->get([1, 0])}), cvScalar(1, 0));
	is_deeply(cvScalar(@{$arr->get([1, 1])}), cvScalar(1, 1));
	is_deeply(cvScalar(@{$arr->get([1, 2])}), cvScalar(1, 2));

	$arr->set(
		[ 1 ],
		[ [ 11, 10 ], [ 11, 11 ], [ 11, 12 ], ],
		);
	is_deeply(cvScalar(@{$arr->get([0, 0])}), cvScalar( 0,  0));
	is_deeply(cvScalar(@{$arr->get([0, 1])}), cvScalar( 0,  1));
	is_deeply(cvScalar(@{$arr->get([0, 2])}), cvScalar( 0,  2));
	is_deeply(cvScalar(@{$arr->get([1, 0])}), cvScalar(11, 10));
	is_deeply(cvScalar(@{$arr->get([1, 1])}), cvScalar(11, 11));
	is_deeply(cvScalar(@{$arr->get([1, 2])}), cvScalar(11, 12));
	is_deeply(cvScalar(@{$arr->get([2, 0])}), cvScalar( 2,  0));
	is_deeply(cvScalar(@{$arr->get([2, 1])}), cvScalar( 2,  1));
	is_deeply(cvScalar(@{$arr->get([2, 2])}), cvScalar( 2,  2));

	$arr->set([ 1 ], [ 21, 0 ]);
	is_deeply(cvScalar(@{$arr->get([1, 0])}), cvScalar(21,  0));
	is_deeply(cvScalar(@{$arr->get([1, 1])}), cvScalar(11, 11));
	is_deeply(cvScalar(@{$arr->get([1, 2])}), cvScalar(11, 12));

	$arr->set([ 1, 0 ], [ 31, 0 ]);
	$arr->set([ 1, 1 ], [ 31, 1 ]);
	$arr->set([ 1, 2 ], [ 31, 2 ]);
	is_deeply(cvScalar(@{$arr->get([1, 0])}), cvScalar(31,  0));
	is_deeply(cvScalar(@{$arr->get([1, 1])}), cvScalar(31,  1));
	is_deeply(cvScalar(@{$arr->get([1, 2])}), cvScalar(31,  2));
}


# has data
if (12) {
	my $rows = 8;
	my $cols = 8;
	my $cn = 4;
	my $step = $cols * $cn;
	my $data = chr(0) x ($rows * $step);
	substr($data, 0 + $_, 1) = chr(0x41 + $_) for 0 .. $cn - 1;
	my $mat = Cv::Mat->new([ $rows, $cols ], CV_8UC($cn), $data);
	is_deeply(cvScalar(@{$mat->get([0, 0])}),
			  cvScalar(map { 0x41 + $_ } 0 .. $cn - 1),
		);
}

if (13) {
	my $rows = 8;
	my $cols = 8;
	my $cn = 4;
	my $step = $cols * $cn;
	my $data = chr(0) x ($rows * $step);
	substr($data, 0 + $_, 1) = chr(0x41 + $_) for 0 .. $cn - 1;
	my $mat = Cv::Mat->new([ $rows, $cols ], CV_8UC($cn), $data, $step);
	is_deeply(cvScalar(@{$mat->get([0, 0])}),
			  cvScalar(map { 0x41 + $_ } 0 .. $cn - 1),
		);
}

# cover
if (14) {
	my $src = Cv::Mat->new([240, 320], CV_8UC3);
	my ($x0, $y0) = (30, 0);
	my $submat = $src->GetCols(
		$src->new([1, 80], $src->type, undef), $x0, $x0 + 80);
	my ($x1, $y1) = (0, 0);
	$src->set([$y0 + $y1, $x0 + $x1], my $v1 = [1, 2, 3]);
	my $v2 = $submat->get([$y1, $x1]);
	is_deeply(cvScalar(@$v1), cvScalar(@$v2));
}

if (15) {
	my $arr = Cv::Mat->new([240], CV_8UC3);
	ok($arr);
}

if (16) {
	my $arr = Cv::Mat->new([240], CV_8UC3)->new;
	is($arr->type, CV_8UC3);
}

if (17) {
	my $x; lives_ok { $x = Cv::Mat->new([], CV_8UC1, []) };
	is($x, undef);
}

if (21) {
	my $arr = Cv::Mat->new([ 3, 3 ], CV_16SC2);
	throws_ok { $arr->set([ 3, 3 ], [ 1, 2 ]) } qr/OpenCV Error:/;
}

if (22) {
	throws_ok { Cv::Mat->new([], CV_32FC1, [1, 1], [2, 2, 2], [3, 3]) } qr/OpenCV Error:/;
}