function test_suite = test_dim_insert()
% tests for cosmo_dim_insert
%
% # 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_dim_insert_basics()
ds = cosmo_synthetic_dataset();
ds2 = cosmo_dim_remove(ds, 'j');
ds3 = cosmo_dim_insert(ds2, 2, 2, {'j'}, ds.a.fdim.values(2), ds.fa);
assertEqual(ds, ds3);
ds4 = cosmo_dim_insert(ds2, 2, 3, {'j'}, ds.a.fdim.values(2), ds.fa);
assertEqual(ds.samples, ds4.samples);
assertEqual(ds.fa, ds4.fa);
assertEqual(ds.a.fdim.values, ds4.a.fdim.values([1 3 2]));
assertEqual(ds.a.fdim.labels, ds4.a.fdim.labels([1 3 2]));
ds5 = cosmo_dim_insert(ds2, 2, 1, {'j'}, ds.a.fdim.values(2), ds.fa);
assertEqual(ds.samples, ds5.samples);
assertEqual(ds.fa, ds5.fa);
assertEqual(ds.a.fdim.values, ds5.a.fdim.values([2 1 3]));
assertEqual(ds.a.fdim.labels, ds5.a.fdim.labels([2 1 3]));
aet = @(varargin)assertExceptionThrown(@() ...
cosmo_dim_insert(varargin{:}), '');
prefixes = 'sf';
for dim = 1:2
prefix = prefixes(dim);
dim_name = [prefix 'dim'];
ds = cosmo_synthetic_dataset();
dim_labels = ds.a.fdim.labels;
if dim == 1
ds = cosmo_dim_transpose(ds, {'i', 'j', 'k'}, 1);
end
combis = cell2mat(cosmo_cartprod(repmat({[false, true]}, 3, 1)));
for j = 1:size(combis, 1)
msk = combis(j, :);
if ~any(msk)
continue
end
use_struct_attr = sum(msk) == 2 && msk(2);
transpose_dim_labels = msk(1);
if transpose_dim_labels
dim_labels = dim_labels';
end
labels = dim_labels(msk);
[dsr, attr, values] = cosmo_dim_remove(ds, labels);
expected_values = ds.a.(dim_name).values(msk);
assertEqual(values, expected_values);
if ~use_struct_attr
attr = struct2cell(attr);
end
nlabels_keep = numel(dim_labels) - sum(msk);
for pos = 1:(nlabels_keep + 1)
if mod(j, 3) == 0
index = -nlabels_keep + pos - 1;
else
index = pos;
end
ds2 = cosmo_dim_insert(dsr, dim, index, labels, values, attr);
xdim = ds2.a.(dim_name);
ds2.a.(dim_name) = ds.a.(dim_name);
assertEqual(ds, ds2);
trg = pos + (0:numel(labels) - 1);
xdim_labels = xdim.labels(trg);
xdim_values = xdim.values(trg);
assertTrue(isvector(xdim_labels));
assertTrue(isvector(xdim_values));
assertEqual(size(xdim_labels, dim), 1);
assertEqual(size(xdim_values, dim), 1);
assertEqual(xdim_labels(:), labels(:));
assertEqual(xdim_values(:), values(:));
end
end
% test exceptions
aet(dsr, 1, index, 'foo', values, attr);
aet(dsr, 1, index, labels, 'foo', attr);
aet(dsr, dim, index, labels, values, attr(1:2));
aet(dsr, dim, index, labels, values, [1 2]);
aet(dsr, dim, index, labels(1:2), values, attr);
aet(dsr, dim, index, labels, values(1:2), attr);
aet(dsr, dim, 4, labels, values, attr);
aet(dsr, dim, -4, labels, values, attr);
if dim == 1
values{1} = [values{1} values{1}];
else
values{1} = [values{1}; values{1}];
end
% test matrix_labels option
aet(dsr, dim, index, labels, values, attr);
cosmo_dim_insert(dsr, dim, index, labels, values, attr, ...
'matrix_labels', labels(1));
end