function test_suite = test_external_neuroelf()
% regression tests for external "neuroelf" toolbox
%
% # 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_xff_map2fmri_map_no_increased_memory_usage()
helper_test_xff_no_increased_memory_usage('map');
function test_xff_fmri_io_no_increased_memory_usage()
helper_test_xff_no_increased_memory_usage('file');
function test_xff_map2fmri_object_no_increased_memory_usage()
helper_test_xff_no_increased_memory_usage('object');
function helper_test_xff_no_increased_memory_usage(method)
if cosmo_skip_test_if_no_external('neuroelf')
return
end
n_orig = helper_count_xff_objects();
ds = cosmo_synthetic_dataset();
ext = 'vmp';
switch method
case 'file'
fn = sprintf('%s.%s', tempname(), ext);
cleaner = onCleanup(@()delete(fn));
cosmo_map2fmri(ds, fn);
n_new = helper_count_xff_objects();
assert(n_new == n_orig, sprintf('count increased by %d', ...
n_new - n_orig));
ds_again = cosmo_fmri_dataset(fn);
assertElementsAlmostEqual(sort(ds.samples(:)), ...
sort(ds_again.samples(:)), 1e-5);
case 'map'
cosmo_map2fmri(ds, ['-bv_' ext]);
case 'object'
obj = cosmo_map2fmri(ds, ['-bv_' ext]);
ds_again = cosmo_fmri_dataset(obj);
% obj should not be cleared when mapping it
assert(isfield(obj, 'XStart'));
% cleanup
clear ds_again;
obj.ClearObject();
clear obj;
otherwise
assert(false);
end
n_new = helper_count_xff_objects();
assert(n_new == n_orig, sprintf('count increased by %d', n_new - n_orig));
function count = helper_count_xff_objects
if cosmo_skip_test_if_no_external('!evalc')
return
end
xff_str = evalc('xff()');
lines = cosmo_strsplit(xff_str, '\n');
pre_idx = strmatch(' # | Type | ', lines);
line_idxs = strmatch('------------------', lines);
if isempty(pre_idx)
% Neuroelf < v1.1, no objects
assert(isempty(line_idxs));
count = 0;
return
end
post_idx = line_idxs(line_idxs > (pre_idx + 2));
assert(numel(pre_idx) == 1);
if numel(post_idx) == 0
count = 0;
return
end
assert(numel(post_idx) == 1);
offset = 2;
count = post_idx - pre_idx - offset;