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');