function test_suite = test_rand()
% tests for cosmo_rand
%
% # For CoSMoMVPA's copyright information and license terms, #
% # see the COPYING file distributed with CoSMoMVPA. #
try % assignment of 'localfunctions' is necessary in Matlab >= 2016
test_functions = localfunctions();
catch % no problem; early Matlab versions can use initTestSuite fine
end
initTestSuite;
function test_rand_basics
x1 = cosmo_rand();
x2 = cosmo_rand();
assert(x1 ~= x2);
x3 = cosmo_rand('seed', 217);
x4 = cosmo_rand('seed', 217);
assert(x1 ~= x3);
assert(x2 ~= x3);
assert(x3 == x4);
x5 = cosmo_rand('seed', 218);
assert(x3 ~= x5);
assert(isscalar(x5));
x6 = cosmo_rand(1);
assert(isscalar(x6));
assertEqual(size(cosmo_rand(3)), [3 3]);
assertEqual(size(cosmo_rand(3, 'seed', 2)), [3 3]);
assertEqual(size(cosmo_rand(3, 3)), [3 3]);
assertEqual(size(cosmo_rand(1, 2, 3)), [1, 2, 3]);
assertEqual(size(cosmo_rand([1, 2, 3])), [1, 2, 3]);
assertEqual(size(cosmo_rand([1, 2, 3])), [1, 2, 3]);
x7 = cosmo_rand('single');
assertEqual(class(x7), 'single');
seed = ceil(rand() * 1e5);
sz = ceil(3 * rand(1, 4));
x8 = cosmo_rand(sz, 'single', 'seed', seed);
x8b = cosmo_rand(sz, 'single', 'seed', seed);
assertEqual(x8, x8b);
assertEqual(class(x8), 'single');
x9 = cosmo_rand(sz, 'double', 'seed', seed);
x9b = cosmo_rand(sz, 'double', 'seed', seed);
assertEqual(x8, x8b);
assertEqual(class(x8), 'single');
assertElementsAlmostEqual(x8, single(x9));
function test_rand_exceptions
aet = @(varargin) assertExceptionThrown(@()cosmo_rand(varargin{:}), '');
aet(2, 2, 'foo');
aet(2, 2, 'foo', 2);
aet(2, 2, 'single', 2);
aet(2, 2, 'double', 2);
aet(2, 2, 'single', 'double');
aet(2, 2, 'double', 'single');
aet(2, 2, 'double', 'double');
aet(2, 2, 'signle', 'single');
aet(2, 2, 'seed', [1 2]);
aet(2, 2, 'seed', -1);
aet(2, 2, 'seed', NaN);
aet(-2, 2);
aet(NaN, 2);