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 => 11;
use Test::Number::Delta within => 1e-1;
use Test::Exception;
BEGIN { use_ok('Cv', -nomore) }

my $verbose = Cv->hasGUI;

# ------------------------------------------------------------
#  CvRNG* cvRNG(int64 seed = -1)
#  void cvRandArr(CvRNG* rng, CvArr* arr, int distType, CvScalar param1, CvScalar param2)
# ------------------------------------------------------------

if (1) {
	my $rng = Cv->RNG(-1);
	ok($rng);
	ok($rng->isa("Cv::RNG"));
}

if (2) {
	my $rng = Cv->RNG;
	my ($p1, $p2) = (127, 64);
	my $ch = 3;
	my $retval = $rng->arr(
		my $arr = Cv::Image->new([240, 320], CV_8UC($ch)),
		CV_RAND_NORMAL,
		cvScalarAll($p1),
		cvScalarAll($p2)
		);
	is($retval, $arr);
	if ($verbose) {
		$arr->Show("rng");
		Cv->WaitKey(1000);
	}
	$arr->avgSdv(my $mean, my $stdDev);
	my @mean = map { $_ / $p1 } @{$mean}[0 .. $ch - 1];
	my @stdDev = map { $_ / $p2 } @{$stdDev}[0 .. $ch - 1];
	delta_ok(\@mean, [ (1.0) x $ch ]);
	delta_ok(\@stdDev, [ (1.0) x $ch ]);
}

if (2) {
	my $rng = Cv->RNG;
	my ($p1, $p2) = (1, 1);
	my $ch = 4;
	my $retval = $rng->arr(
		my $arr = Cv::Image->new([240, 320], CV_32FC($ch)),
		CV_RAND_NORMAL,
		cvScalarAll($p1),
		cvScalarAll($p2)
		);
	is($retval, $arr);
	if ($verbose) {
		$arr->Show("rng");
		Cv->WaitKey(1000);
	}
	$arr->avgSdv(my $mean, my $stdDev);
	my @mean = map { $_ / $p1 } @{$mean}[0 .. $ch - 1];
	my @stdDev = map { $_ / $p2 } @{$stdDev}[0 .. $ch - 1];
	delta_ok(\@mean, [ (1.0) x $ch ]);
	delta_ok(\@stdDev, [ (1.0) x $ch ]);
}

if (10) {
	my $rng = Cv->RNG;
	throws_ok { $rng->arr } qr/Usage: Cv::RNG::cvArr\(rng, arr, distType, param1, param2\) at $0/;
}

if (11) {
	my $rng = Cv->RNG;
	throws_ok { $rng->arr(1,2,3,4) } qr/arr is not of type CvArr \* in Cv::RNG::cvRandArr at $0/;
}