test vol grid convert

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