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