function test_suite = test_measure_clusters()
% tests for cosmo_measure_clusters
%
% # 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_measure_clusters_statfun
samples = [-1 2 1 1 NaN 2 2];
nbrhood_mat = [1 1 2 3 4 5 6
2 2 3 4 5 6 7
0 3 4 5 6 7 0];
m = @(x) cosmo_measure_clusters(samples, nbrhood_mat, x{:});
aoe = @(x, v)assertElementsAlmostEqual(m(x), v, 'relative', 1e-4);
aoe({'tfce', 'dh', .1}, [0 2.7518 0.6668 0.6668 0 3.4931 3.4931]);
aoe({'tfce', 'dh', .05}, [0 2.7935 0.5348 0.5348 0 3.6310 3.6310]);
aoe({'tfce', 'dh', 3}, zeros(1, 7));
aoe({'tfce', 'dh', .05, 'E', 1}, [0 3.1850 0.9263 0.9263 0 5.1350 5.1350]);
aoe({'tfce', 'dh', .05, 'H', 1}, [0 2.2977 0.8227 0.8227 0 2.7577 2.7577]);
aoe({'tfce', 'dh', .05, 'H', 1, 'feature_sizes', 2 * ones(1, 7)}, ...
[0 3.2495 1.1635 1.1635 0 3.9000 3.9000]);
aoe({'max', 'threshold', 1}, [0 2 2 2 0 2 2]);
aoe({'max', 'threshold', 2}, [0 2 0 0 0 2 2]);
aoe({'max', 'threshold', 3}, zeros(1, 7));
aoe({'maxsize', 'threshold', 1}, [0 3 3 3 0 2 2]);
aoe({'maxsize', 'threshold', 2}, [0 1 0 0 0 2 2]);
aoe({'maxsize', 'threshold', 3}, zeros(1, 7));
aoe({'maxsum', 'threshold', 1}, [0 4 4 4 0 4 4]);
aoe({'maxsum', 'threshold', 2}, [0 2 0 0 0 4 4]);
aoe({'maxsum', 'threshold', 3}, zeros(1, 7));
function test_measure_clusters_infinity
samples = [-Inf Inf Inf 1 NaN 2 Inf];
nbrhood_mat = [1 1 2 3 4 5 6
2 2 3 4 5 6 7
0 3 4 5 6 7 0];
m = @(x) cosmo_measure_clusters(samples, nbrhood_mat, x{:});
aoe = @(x, v)assertElementsAlmostEqual(m(x), v, 'relative', 1e-4);
aoe({'tfce', 'dh', .1}, [0 Inf Inf 0.6668 0 3.4931 Inf]);
aoe({'max', 'threshold', 1}, [0 Inf Inf Inf 0 Inf Inf]);
aoe({'max', 'threshold', 2}, [0 Inf Inf 0 0 Inf Inf]);
aoe({'max', 'threshold', 3}, [0 Inf Inf 0 0 0 Inf]);
aoe({'maxsize', 'threshold', 1}, [0 3 3 3 0 2 2]);
aoe({'maxsize', 'threshold', 2}, [0 2 2 0 0 2 2]);
aoe({'maxsize', 'threshold', 3}, [0 2 2 0 0 0 1]);
aoe({'maxsum', 'threshold', 1}, [0 Inf Inf Inf 0 Inf Inf]);
aoe({'maxsum', 'threshold', 2}, [0 Inf Inf 0 0 Inf Inf]);
aoe({'maxsum', 'threshold', 3}, [0 Inf Inf 0 0 0 Inf]);
function test_measure_clusters_exceptions()
aet = @(x)assertExceptionThrown(@()cosmo_measure_clusters(x{:}), '');
aet({ones(1, 3), ones(1, 4), 'tfce', 'dh', .1});
aet({ones(3, 1), ones(1, 3), 'tfce', 'dh', .1});
aet({ones(1, 3), ones(3, 1), 'tfce', 'dh', .1});
aet({struct(), ones(1, 3), 'tfce', 'dh', .1});
aet({ones(1, 3), struct(), 'tfce', 'dh', .1});
samples = [-1 2 1 1 0 2 2];
nbrhood_mat = [1 1 2 3 4 5 6
2 2 3 4 5 6 7
0 3 4 5 6 7 0];
m = @(x) cosmo_measure_clusters(samples, nbrhood_mat, x{:});
aetw = @(x) assertExceptionThrown(@()m(x), '');
aetw({'foo'});
aetw({'tfce'});
aetw({'tfce', 'threshold', 1});
aetw({'tfce', 'dh', -.1});
aetw({'tfce', 'dh', [1 1]});
aetw({'tfce', 'dh', .1, 'E', -.1});
aetw({'tfce', 'dh', .1, 'E', [1 1]});
aetw({'tfce', 'dh', .1, 'H', -.1});
aetw({'tfce', 'dh', .1, 'H', [1 1]});
aetw({'max', 'dh', 1});
aetw({'max', 'dh', 1, 'threshold', 3});
aetw({'max', 'dh', 1, 'feature_sizes', []});
aetw({'max', 'dh', 1, 'feature_sizes', 3});