function test_suite = test_publish_run_scripts()
% smoke tests for publish_run_scripts (using dry-run);
% currently no files are actually generated by this test function
%
% # 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_publish_run_scripts_dry_run_all_files()
if cosmo_skip_test_if_no_external('!publish')
return
end
[srcpat, names_to_publish] = helper_find_files(true);
helper_run_publish_run_scripts(names_to_publish, srcpat, ',''-dry''');
function test_publish_run_scripts_dry_run_single_file()
if cosmo_skip_test_if_no_external('!publish')
return
end
[srcpat, names_to_publish] = helper_find_files(false);
assert(numel(names_to_publish) == 1);
helper_run_publish_run_scripts(names_to_publish, srcpat, ',''-dry''');
function test_publish_run_scripts_run_single_file_pass()
cosmo_notify_test_skipped(['publish functionality tests '...
'currently disabled because coverage '...
'functionality does not work']);
return
result = helper_publish_run_scripts_single_file('disp(''ok'')');
assertTrue(result);
function test_publish_run_scripts_run_single_file_error()
cosmo_notify_test_skipped(['publish functionality tests '...
'currently disabled because coverage '...
'functionality does not work']);
return
result = helper_publish_run_scripts_single_file('error(''wrong'')');
assertFalse(result);
function result = helper_publish_run_scripts_single_file(cmd)
if cosmo_skip_test_if_no_external('!publish')
return
end
warning_state = cosmo_warning();
cleaner_warning = onCleanup(@()cosmo_warning(warning_state));
cosmo_warning('off');
tmp_dir = tempname();
cleaner_tmp = onCleanup(@()remove_dir_helper(tmp_dir));
mkdir(tmp_dir);
fn = cosmo_make_temp_filename(fullfile(tmp_dir, 'run_'), '.m');
fid = fopen(fn, 'w');
cleaner_fid = onCleanup(@()fclose(fid));
fprintf(fid, '%s\n', cmd);
clear cleaner_fid;
[unused, nm, e] = fileparts(fn);
args = sprintf(',''-o'',''%s''', tmp_dir);
result = helper_run_publish_run_scripts({[nm e]}, fn, args);
html_fn = fullfile(tmp_dir, [nm '.html']);
assertTrue(logical(exist(html_fn, 'file')));
function [srcpat, names_to_publish] = helper_find_files(entire_directory)
if cosmo_skip_test_if_no_external('!evalc')
return
end
cosmomvpa_rootdir = fileparts(fileparts(mfilename('fullpath')));
example_dir = fullfile(cosmomvpa_rootdir, 'examples');
to_publish_runs = dir(fullfile(example_dir, 'run_*.m'));
to_publish_demos = dir(fullfile(example_dir, 'demo_*.m'));
to_publish_all = cat(1, to_publish_runs, to_publish_demos);
names_to_publish = {to_publish_all.name};
if entire_directory
srcpat = example_dir;
else
rp = randperm(numel(names_to_publish));
names_to_publish = names_to_publish(rp(1));
srcpat = fullfile(example_dir, names_to_publish{1});
end
function result = helper_run_publish_run_scripts(names_to_publish, ...
srcpat, args)
assertTrue(numel(names_to_publish) > 0, 'example directory not found');
orig_warning_state = cosmo_warning();
warning_state_resetter = onCleanup(@()cosmo_warning(orig_warning_state));
cosmo_warning('off');
expr = sprintf('cosmo_publish_run_scripts(''%s''%s);', ...
srcpat, args);
[s, result] = run_evalc_helper(expr);
lines = cosmo_strsplit(s, '\n');
n_lines = numel(lines);
files_processed = cell(n_lines, 1);
for k = 1:n_lines
sp = cosmo_strsplit(lines{k}, ':');
if numel(sp) == 2
fn_without_whitespace = regexprep(sp{2}, '\s*', '');
mfile_fn = regexprep(fn_without_whitespace, '\.html$', '.m');
files_processed{k} = mfile_fn;
end
end
files_processed_msk = ~cellfun(@isempty, files_processed);
files_processed = files_processed(files_processed_msk);
assert(all(cosmo_match(names_to_publish, files_processed)));
function [s, result] = run_evalc_helper(expr)
orig_path = path();
cleaner = onCleanup(@()path(orig_path));
s = evalc(['result=' expr]);
function remove_dir_helper(tmp_dir)
if cosmo_wtf('is_octave')
rmdir_state = confirm_recursive_rmdir();
state_resetter = onCleanup(@()confirm_recursive_rmdir(rmdir_state));
confirm_recursive_rmdir(false, 'local');
end
rmdir(tmp_dir, 's');