test check dataset

function test_suite = test_check_dataset()
    % tests for cosmo_check_dataset
    %
    % #   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_check_dataset_exceptions()
    aet = @(varargin)assertExceptionThrown(@() ...
                                           cosmo_check_dataset(varargin{:}), '');
    aeq = @(x, varargin)assertEqual(x, cosmo_check_dataset(varargin{:}));
    % error on empty inputs
    aet([]);
    aet(struct);

    % fine with samples
    aeq(true, struct('samples', zeros(2)));
    aet(struct('illegal', zeros(2), 'samples', zeros(2)));

    % silence error
    aeq(false, struct('illegal', zeros(2)), false);

    % only accept fmri
    ds = cosmo_synthetic_dataset('type', 'fmri');
    aeq(true, ds);
    aeq(true, ds, 'fmri');
    aet(ds, 'meeg');
    aet(ds, 'surface');

    % wrong size
    ds_c = ds;
    ds_c.sa.chunks = [2; 3];
    aet(ds_c);

    % non-numeric chunks
    ds_c = ds;
    ds_c.sa.chunks = {'a', 'b', 'c', 'a', 'b', 'c'}';
    aet(ds_c);

    % non-numeric targets
    ds_c = ds;
    ds_c.sa.targets = {'a', 'b', 'c', 'a', 'b', 'c'}';
    aet(ds_c);

    % destroy fmri info
    ds_c = ds;
    ds_c.a = rmfield(ds_c, 'a');
    aeq(true, ds_c); % not for fmri
    aet(ds_c, 'fmri');

    % illegal dimension value
    ds = cosmo_synthetic_dataset('type', 'meeg');
    ds_c = ds;
    ds_c.a.fdim.values{1} = ds_c.a.fdim.values{1}(1:2);
    aet(ds_c);

    % check meeg
    aeq(true, ds);
    aeq(true, ds, 'meeg');
    aet(ds, 'fmri');
    aet(ds, 'surface');

    % illegal indices
    ds_c = ds;
    ds_c.fa.chan = ds_c.fa.chan + 6;
    aet(ds_c);

    % surface
    ds = cosmo_synthetic_dataset('type', 'surface');
    aeq(true, ds);
    aeq(true, ds, 'surface');
    aet(ds, 'fmri');
    aet(ds, 'meeg');

    % unsupported type
    aet(ds, 'illegal');

    % legacy
    ds_c = ds;
    ds_c.a.dim = ds.a.fdim;

    aet(ds_c);

    % non-2D samples
    ds_c = ds;
    ds_c.samples = zeros([6, 6, 2]);
    aet(ds_c);

    % empty attributes
    ds_c = ds;
    ds_c.sa = struct();
    aeq(true, ds_c);

    % non-2D attributes
    ds_c.sa.foo = zeros([6, 6, 2]);
    aet(ds_c);

    % transposed size
    ds_c = ds;
    ds_c.sa.targets = ds_c.sa.targets';
    aet(ds_c);

    % missing values
    ds_c = ds;
    ds_c.a.fdim = rmfield(ds_c.a.fdim, 'values');
    aet(ds_c);

    % non-cell .fdim.values
    ds_c = ds;
    ds_c.a.fdim.values = 1;
    aet(ds_c);

    % non-cell .fdim.labels
    ds_c = ds;
    ds_c.a.fdim.labels = 1;
    aet(ds_c);

    % different size for labels and values
    ds_c = ds;
    ds_c.a.fdim.values{end + 1} = 1;
    aet(ds_c);

    % missing .fa
    ds_c = ds;
    ds_c.fa = rmfield(ds_c.fa, 'node_indices');
    aet(ds_c);

    % empty .fa is ok
    ds_c = ds;
    ds_c.fa.node_indices = [];
    aeq(true, ds_c);

    % illegal indices
    ds_c = ds;
    ds_c.fa.node_indices = ds_c.fa.node_indices - 1;
    aet(ds_c);
    ds_c.fa.node_indices = ds_c.fa.node_indices + 2;
    aet(ds_c);
    ds_c.fa.node_indices(:) = 0.5;
    aet(ds_c);

    % missing .fa with .fdim present
    ds_c = ds;
    ds_c = rmfield(ds_c, 'fa');
    aet(ds_c);

    % missing .fdim for fmri dataset
    ds_c = ds;
    ds_c.a = rmfield(ds_c.a, 'fdim');
    aeq(false, ds_c, 'fmri', false);
    aet(ds_c, 'fmri');