test cosmo dataset operations

function test_suite = test_cosmo_dataset_operations
    % tests for slicing and stacking
    %
    %
    % #   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_test_dataset
    ds = cosmo_synthetic_dataset();

    [nsamples, nfeatures] = size(ds.samples);

    assertEqual(nsamples, 6);
    assertEqual(nfeatures, 6);

    fns = fieldnames(ds.sa);
    for k = 1:numel(fns)
        fn = fns{k};
        v = ds.sa.(fn);
        assertTrue(isempty(v) || size(v, 1) == nsamples);
    end

    fns = fieldnames(ds.fa);
    for k = 1:numel(fns)
        fn = fns{k};
        v = ds.fa.(fn);
        assertTrue(isempty(v) || size(v, 2) == nfeatures);
    end

function test_slicing
    ds = cosmo_synthetic_dataset();

    % test features
    es = cosmo_slice(ds, [2 4], 2);
    assertEqual(es.samples, ds.samples(:, [2 4]));
    assertEqual(es.sa, ds.sa);
    assertEqual(es.a, ds.a);

    fs = cosmo_slice(ds, 1:6 == 2 | 1:6 == 4, 2);
    assertEqual(es.samples, fs.samples);
    assertEqual([es.fa.i; es.fa.j; es.fa.k], [2 1; 1 2; 1 1]);

    if cosmo_wtf('is_matlab')
        id_bad_index = 'MATLAB:badsubscript';
    else
        id_bad_index = 'Octave:invalid-index';
    end

    f = @() cosmo_slice(ds, -1, 2);
    assertExceptionThrown(f, id_bad_index);

    f = @() cosmo_slice(ds, [2 4], 3);
    assertExceptionThrown(f, '');

    % test samples
    es = cosmo_slice(ds, [2 4]);
    assertEqual(es.samples, ds.samples([2 4], :));
    assertEqual(es.fa, ds.fa);
    assertEqual(es.a, ds.a);
    assertEqual(es.sa.targets, [2; 2]);

    fs = cosmo_slice(ds, (1:6) == 2 | (1:6) == 4);
    assertEqual(es.samples, fs.samples);

    f = @() cosmo_slice(ds, -1);
    assertExceptionThrown(f, id_bad_index);