function test_suite = test_remove_useless_data
% tests for cosmo_remove_useless_data
%
% #   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_remove_useless_data_basics
    ds=cosmo_synthetic_dataset();
    ds.samples(2,3)=NaN;
    ds.samples(3,4)=Inf;
    ds.samples(5,:)=1;
    ds.samples(:,6)=1;

    assert_equal_sliced(ds,[1 2 5],2);
    assert_equal_sliced(ds,[1 2 5],2,[]);
    assert_equal_sliced(ds,[1 2 5],2,1);
    assert_equal_sliced(ds,[1 4 6],1,2);
    assert_equal_sliced(ds,[1 2 5],2,1,'all');
    assert_equal_sliced(ds,[1 4 6],1,2,'all');
    assert_equal_sliced(ds,[1 2 5],2,[],[]);
    assert_equal_sliced(ds,[1 2 5],2,1,[]);
    assert_equal_sliced(ds,[1 4 6],1,2,[]);

    assert_equal_sliced(ds,[1 2 4 5],2,1,'variable');
    assert_equal_sliced(ds,[1 3 4 6],1,2,'variable');

    assert_equal_sliced(ds,[1 2 5 6],2,1,'finite');
    assert_equal_sliced(ds,[1 4 5 6],1,2,'finite');

function test_remove_useless_data_vec
    ds=cosmo_synthetic_dataset();
    ds1=cosmo_slice(ds,1);
    ds1.samples(2)=NaN;
    ds1.samples(4)=Inf;

    assert_equal_sliced(ds1,[1 3 5 6],2);
    assert_equal_sliced(ds1,[1 3 5 6],2,1,'all');
    assert_equal_sliced(ds1,[1 3 4 5 6],2,1,'variable');
    assert_equal_sliced(ds1,[1 3 5 6],2,1,'finite');

    ds2=cosmo_slice(ds,1,2);
    ds2.samples(2)=NaN;
    ds2.samples(4)=Inf;

    assert_equal_sliced(ds2,[1 3 5 6],1,2);
    assert_equal_sliced(ds2,[1 3 5 6],1,2,'all');
    assert_equal_sliced(ds2,[1 3 4 5 6],1,2,'variable');
    assert_equal_sliced(ds2,[1 3 5 6],1,2,'finite');

function test_remove_useless_data_exceptions
    aet=@(varargin)assertExceptionThrown(@()...
                    cosmo_remove_useless_data(varargin{:}),'');
    aet(struct);
    aet({});

    % must have samples
    ds=struct();
    ds.foo=[];
    aet(ds);

    % input must be matrix
    data=randn([2,3,2]);
    aet(data);
    ds=struct();
    ds.samples=data;

    % last argument must be kosher
    data=randn(2,3);
    aet(data,'foo');
    aet(data,1,'foo');
    aet(data,2,'foo');
    aet(data,2,struct());
    aet(data,3);
    aet(data,3,'variable');

    ds.samples=data;
    aet(ds,'foo');
    aet(ds,1,'foo');
    aet(ds,2,'foo');
    aet(ds,2,struct());
    aet(ds,3);
    aet(ds,3,'variable');






function assert_equal_sliced(ds, select, dim, varargin)
    [ds_useful,msk]=cosmo_remove_useless_data(ds, varargin{:});
    assert(islogical(msk));

    assertEqual(cosmo_slice(ds,select,dim),ds_useful);
    assertEqual(cosmo_slice(ds,msk,dim),ds_useful);
