test split

function test_suite = test_split
    % tests for cosmo_split
    %
    % #   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_split_()
    ds = cosmo_synthetic_dataset();
    sp1 = cosmo_split(ds, 'chunks');

    for k = 1:numel(sp1)
        s = sp1{k};
        assertEqual(s, cosmo_slice(ds, k * 2 + [-1 0]));
        assert(all(s.sa.chunks == k));
    end

    sp2 = cosmo_split(ds, 'targets');

    for k = 1:numel(sp2)
        s = sp2{k};
        assertEqual(s, cosmo_slice(ds, k + [0 2 4]));
    end

    sp3 = cosmo_split(ds, {'targets'});
    assertEqual(sp2, sp3);

    sp4 = cosmo_split(ds, {'targets'}, 1);
    assertEqual(sp2, sp4);

    sp5 = cosmo_split(ds, 'i', 2);

    for k = 1:numel(sp5)
        s = sp5{k};
        assertEqual(s, cosmo_slice(ds, k + [0 3], 2));
    end

    sp6 = cosmo_split(ds, {'chunks', 'targets'});
    for k = 1:numel(sp5)
        s = sp6{k};
        assertEqual(s, cosmo_slice(ds, k, 1));
    end

    sp7 = cosmo_split(ds, {'j', 'i', 'k'}, 2);
    for k = 1:numel(sp5)
        s = sp7{k};
        assertEqual(s, cosmo_slice(ds, k, 2));
    end

    assertEqual(cosmo_split(ds, [], 1), {ds});
    assertEqual(cosmo_split(ds, [], 2), {ds});

    aet = @(varargin)assertExceptionThrown(@() ...
                                           cosmo_split(varargin{:}), '');
    aet(ds, 'i', 1);
    aet(ds, 'chunks', 2);
    aet(ds, 'chunks', 3);

    ds.sa.targets = [ds.sa.targets ds.sa.targets];
    assertExceptionThrown(@()cosmo_split(ds, 'targets', 1), '');

    x = struct();
    x.samples = randn(4);
    aet(x, 'chunks');
    x.sa = struct();
    aet(x, 'chunks');