function test_suite = test_norminv
% tests for cosmo_norminv
%
% # 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_norminv_stats_correspondence
if cosmo_skip_test_if_no_external('!norminv')
return
end
helper_test_norminv_same(rand());
helper_test_norminv_same(1 + rand());
helper_test_norminv_same(rand(10, 200));
helper_test_norminv_same(rand(2, 3, 5) * 2 - .5);
sz = ceil(2 + rand(1, 3) * 2);
helper_test_norminv_same(rand(sz), rand(), rand());
helper_test_norminv_same(rand(sz), rand(sz), rand(sz));
helper_test_norminv_same(NaN);
helper_test_norminv_same(0);
helper_test_norminv_same(1);
helper_test_norminv_same(-inf);
helper_test_norminv_same(+inf);
function test_norminv_stats_non_scalar_mu_sd_correspondence
if cosmo_skip_test_if_no_external('!norminv')
return
end
if cosmo_wtf('is_octave')
reason = 'Octave''s norminv cannot use bsxfun-like inputs';
cosmo_notify_test_skipped(reason);
return
end
v = cosmo_wtf('version_number');
if v(1) <= 8 || v(2) <= 0
% before 2016b
reason = 'Older matlab''s norminv cannot use bsxfun-like inputs';
cosmo_notify_test_skipped(reason);
return
end
helper_test_norminv_same(rand(10, 5), rand(1, 5), rand(10, 1));
helper_test_norminv_same(2 * rand(10, 5, 2), rand(1, 5, 2), rand(10, 1, 1));
function test_norminv_regression
x = [0.8287 0.8471 0.0660 0 1 -1 3 NaN -Inf Inf];
y = [0.9490 1.0241 -1.5063 -Inf Inf NaN NaN NaN NaN NaN];
assertElementsAlmostEqual(cosmo_norminv(x), y, 'absolute', 1e-4);
function helper_test_norminv_same(varargin)
y1 = norminv(varargin{:});
y2 = cosmo_norminv(varargin{:});
assertElementsAlmostEqual(y1, y2);