test measure clusters

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});