function test_suite = test_dim_remove()
% tests for cosmo_dim_remove
%
% #   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_dim_remove_basics()
    ds_orig=cosmo_synthetic_dataset();
    prefixes='sf';
    for dim=1:2
        prefix=prefixes(dim);
        attr_name=[prefix 'a'];
        dim_name=[prefix 'dim'];


        if dim==1
            ds=cosmo_dim_transpose(ds_orig,{'i','j','k'});
        else
            ds=ds_orig;
        end

        [ds2,fa,values]=cosmo_dim_remove(ds,'j');
        assertEqual(ds2.a.(dim_name).labels,ds.a.(dim_name).labels([1 3]));
        assertEqual(ds2.a.(dim_name).values,ds.a.(dim_name).values([1 3]));
        assert_has_fields_diff(ds2.fa,ds.fa,{'j'});
        assertEqual(fa,copy_fields(ds.(attr_name),{'j'}));
        assertEqual(values,ds.a.(dim_name).values{2});

        [ds3,fa,values]=cosmo_dim_remove(ds,{'j','i'});
        assertEqual(ds3.a.(dim_name).labels,ds.a.(dim_name).labels(3));
        assertEqual(ds3.a.(dim_name).values,ds.a.(dim_name).values(3));
        assertEqual(fa,copy_fields(ds.(attr_name),{'j','i'}));
        assert_has_fields_diff(ds3.fa,ds.fa,{'j','i'});
        assertEqual(values,ds.a.(dim_name).values([2 1]));

        [ds4,fa,values]=cosmo_dim_remove(ds,{'j','i','k'});
        assertFalse(isfield(ds4.a,dim_name));
        assertFalse(any(cosmo_isfield(ds4.(attr_name),{'j','i','k'})));
        assertEqual(fa,copy_fields(ds.(attr_name),{'j','i','k'}));
        assert_has_fields_diff(ds4.fa,ds.fa,{'j','i','k'});
        assertEqual(values,ds.a.(dim_name).values([2 1 3]));

    end

function assert_has_fields_diff(new_struct, orig_struct, removed)
    kept=sort(fieldnames(new_struct));
    expected_kept=sort(setdiff(fieldnames(orig_struct),removed));
    assertEqual(kept(:),expected_kept(:));


function y=copy_fields(x, keys)
    y=struct();
    for k=1:numel(keys)
        key=keys{k};
        y.(key)=x.(key);
    end
