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)