function test_suite = test_vol_grid_convert
% tests for cosmo_vol_grid_convert
%
% # 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_vol_grid_convert_basics
aet = @(varargin)assertExceptionThrown(@() ...
cosmo_vol_grid_convert(varargin{:}), '');
ds_orig = cosmo_synthetic_dataset('size', 'normal');
ds_orig.a.vol = rmfield(ds_orig.a.vol, 'xform');
nfeatures = size(ds_orig.samples, 2);
nfeatures2 = round(nfeatures / 2);
while true
rp = randperm(nfeatures);
ds = cosmo_slice(ds_orig, repmat(rp(1:nfeatures2), 1, 2), 2);
ijk = [ds.fa.i; ds.fa.j; ds.fa.k];
no_missing_features = true;
for dim = 1:3
no_missing_features = no_missing_features && ...
isequal(unique(ijk(dim, :)), ...
1:ds.a.vol.dim(dim));
end
if no_missing_features
break
end
end
ds2 = cosmo_vol_grid_convert(ds);
assert(all(~cosmo_isfield(ds2.fa, {'i', 'j', 'k'})));
assertEqual(ds2.a.fdim.labels, {'pos'});
assertEqual(numel(ds2.a.fdim.values), 1);
assertFalse(isfield(ds2.a, 'vol'));
assert(isfield(ds2.fa, 'pos'));
pos = ds2.a.fdim.values{1}(:, ds2.fa.pos);
assertEqual(pos, cosmo_vol_coordinates(ds));
ds3 = cosmo_vol_grid_convert(ds, 'togrid');
assertEqual(ds2, ds3);
ds4 = cosmo_vol_grid_convert(ds3, 'tovol');
assertEqual(ds4, ds);
ds4same = cosmo_vol_grid_convert(ds4, 'tovol');
assertEqual(ds4, ds4same);
aet(ds4, 'foo');
ds4 = cosmo_vol_grid_convert(ds2);
assertEqual(ds4, ds);
ds4 = cosmo_vol_grid_convert(ds2);
assertEqual(ds4, ds);
ds5 = cosmo_vol_grid_convert(ds2, 'tovol');
assertEqual(ds5, ds4);
ds.fa = rmfield(ds.fa, 'j');
aet(ds);
% irregular grid
ds3.a.fdim.values{1}(1) = .5;
aet(ds3);
% should not work for datasets with missing pos and vol
ds6 = cosmo_synthetic_dataset('type', 'timelock');
aet(ds6, 'tovol');
aet(ds6, 'togrid');
aet(ds6);
aet(ds6, 'tovol', 'togrid');