test dir

function test_suite=test_dir
% tests for cosmo_dir
%
% #   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_dir_basics()
    tmp_dir=cosmo_make_temp_filename();
    cleaner=onCleanup(@()remove_directory(tmp_dir));

    files={'foo.m',...          % 1
           'bar/foo.m',...      % 2
           'bar/bar.txt',...    % 3
           'bar/foo/x.m',...    % 4
           'bar/foo/y.m',...    % 5
           'bar/foo/yx.m',...   % 6
           'bar/foo/yy.m',...   % 7
           'foo.txt',...        % 8
           'fop.txt'};          % 9

    files=translate_to_platform(files);

    touch_files(tmp_dir, files);

    assert_dir_equal(files,tmp_dir);
    assert_dir_equal(files,tmp_dir,'*');
    assert_dir_equal([],tmp_dir,'*.x');


    assert_dir_equal(files([1 2 4 5 6 7]),tmp_dir,'*.m');
    assert_dir_equal(files([2 4 5 6 7]),tmp_dir,'bar','*.m');
    assert_dir_equal(files([4 5 6 7]),tmp_dir,'bar/foo','*.m');
    assert_dir_equal(files([4 5]),tmp_dir,'bar','?.m');
    assert_dir_equal(files([6 7]),tmp_dir,'bar','??.m');
    assert_dir_equal(files([3 8 9]),tmp_dir,'???.txt');
    assert_dir_equal(files([8 9]),tmp_dir,'fo?.txt');
    assert_dir_equal([],tmp_dir,'fo??.txt');
    assert_dir_equal([],tmp_dir,'');
    assert_dir_equal([],tmp_dir,'aa');

    % support single argument
    assert_dir_equal(files([2 4 5 6 7]),tmp_dir,'bar/*.m');
    assert_dir_equal(files([4 5 6 7]),tmp_dir,'bar/foo/*.m');
    assert_dir_equal(files([4 5]),tmp_dir,'bar/?.m');
    assert_dir_equal(files([6 7]),tmp_dir,'bar/??.m');


    % test exceptions
    aet=@(varargin)assertExceptionThrown(@()...
                            run_cosmo_dir(varargin{:}),'');

    % directory must exist
    aet(tmp_dir,'','*');
    aet(tmp_dir,'xx','*');

    % arguments must be strings
    aet(tmp_dir,[]);
    aet(tmp_dir,{''});
    aet(tmp_dir,{''},'*');

    % cannot have more than two arguments
    aet(tmp_dir,'bar','*','*');



function result=run_cosmo_dir(in_dir,varargin)
    orig_pwd=pwd();
    cleaner=onCleanup(@()cd(orig_pwd));
    cd(in_dir);
    result=cosmo_dir(varargin{:});

function assert_dir_equal(expected, in_dir, varargin)
    result=run_cosmo_dir(in_dir,varargin{:});
    if isempty(expected)
        assert(isempty(result));
    else
        filenames={result.name};
        assertEqual(sort(filenames(:)),...
                    sort(translate_to_platform(expected(:))));
    end

function result=translate_to_platform(filenames)
    if iscell(filenames)
        result=cellfun(@translate_to_platform,filenames,...
                                            'UniformOutput',false);
    elseif ischar(filenames)
        result=strrep(filenames,'/',filesep);
    end


function touch_files(in_dir,filenames)
    cellfun(@(fn)touch_single_file(in_dir,fn),filenames);

function result=touch_single_file(in_dir,fn)
    pth_fn=fullfile(in_dir,fn);
    pth=fileparts(pth_fn);

    if ~isdir(pth)
        mkdir(pth);
    end

    fid=fopen(pth_fn,'w');
    fprintf(fid,'');
    fclose(fid);
    result=1;


function remove_directory(dir_name)
    is_octave=cosmo_wtf('is_octave');
    if is_octave
        % do not ask for confirmation
        confirm_val=confirm_recursive_rmdir(false);
        cleaner=onCleanup(@()confirm_recursive_rmdir(confirm_val));
    end

    rmdir(dir_name,'s');