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

# ------------------------------------------------------------
# double cvGetReal1D(const CvArr* arr, int idx0)
# double cvGetReal2D(const CvArr* arr, int idx0, int idx1)
# double cvGetReal3D(const CvArr* arr, int idx0, int idx1, int idx2)
# double cvGetRealND(const CvArr* arr, int* idx)
# ------------------------------------------------------------

if (1) {
	my $Xs = 'GetRealND';
	(my $xs = $Xs) =~ s/^[A-Z]+/\L$&/;

	my $src = Cv::MatND->new([ 320, 240, 2 ], CV_64FC1);

	no warnings 'redefine';
	no strict 'refs';

	my $idx0 = int rand $src->rows;
	my $idx1 = int rand $src->cols;

	my @got = ();
	local *{"Cv::core::cv$Xs"} = sub { @got = @_ };
	&{"Cv::core::cv$Xs"}($src, [$idx0, $idx1]);
	is(scalar @got, 2, "cv$Xs: scalar \@got");
	is($got[0], $src, "cv$Xs: src");
	is($got[1]->[0], $idx0, "cv$Xs: idx0");
	is($got[1]->[1], $idx1, "cv$Xs: idx1");

	local *{"Cv::Arr::cv$Xs"} = *{"Cv::core::cv$Xs"};
	# local *{"Cv::cv$Xs"} = *{"Cv::core::cv$Xs"};
	foreach my $fn ("GetReal", "getReal") {
		@got = ();
		$src->$fn($idx0, $idx1);
		is(scalar @got, 2, "cv$Xs: scalar \@got");
		is($got[0], $src, "cv$Xs: src");
		is(@{$got[1]}, $src->dims, "cv$Xs: src.dims");
		is($got[1]->[0], $idx0, "cv$Xs: idx0");
		is($got[1]->[1], $idx1, "cv$Xs: idx1");
		is($got[1]->[2], 0, "cv$Xs: idx1");

		@got = ();
		$src->$fn([$idx0, $idx1]);
		is(scalar @got, 2, "cv$Xs: scalar \@got");
		is($got[0], $src, "cv$Xs: src");
		is(@{$got[1]}, $src->dims, "cv$Xs: src.dims");
		is($got[1]->[0], $idx0, "cv$Xs: idx0");
		is($got[1]->[1], $idx1, "cv$Xs: idx1");
		is($got[1]->[2], 0, "cv$Xs: idx1");
	}
}

for my $n (1..4) {
	my $m = Cv::Mat->new([240, 320], CV_64FC($n));
	my $v = cvScalar(map { rand 1 } 1..$n);
	my $i = [map { int rand $_ } @{$m->sizes}];
	$m->set($i, $v);
	if ($n == 1) {
		is($m->getReal($i), $v->[0]);
	} else {
		throws_ok { $m->getReal($i) } qr/OpenCV Error:/;
	}
}