function test_suite = test_meeg_read_layout()
% regression tests for meeg_read_layout
%
% # 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_layout_exceptions()
aet = @(varargin)assertExceptionThrown(@() ...
cosmo_meeg_read_layout(varargin{:}), '');
% illegal input type
aet(struct);
aet(1);
% file does not exist
aet(['foobar' rand_str() rand_str() rand_str()]);
% not enough data fields
aet(sprintf('1\n2)'));
% illegal character
for illegal_char = '~!@#$%^&*()[]{};:'
aet(sprintf('1 1 1 1 1 foo%s\n2 2 2 2 2 baz)', illegal_char));
end
function test_layout_labels_with_hyphens()
lay = struct();
lay.label = {'chan-1'; 'chan-2'};
helper_test_with(lay);
function test_layout_labels_with_spaces()
lay = struct();
lay.label = {'chan 1'; 'chan 2'};
helper_test_with(lay);
function test_layout_labels_with_int_pos()
nlabels = ceil(rand() * 10 + 10);
lay = struct();
lay.pos = ceil(rand(nlabels, 2) * 10 + 10);
helper_test_with(lay);
function test_layout_labels_with_float_pos()
nlabels = ceil(rand() * 10 + 10);
lay = struct();
lay.pos = rand(nlabels, 2) * 10 + 10;
helper_test_with(lay);
function helper_test_with(lay)
lay = make_full_lay(lay);
helper_test_with_string(lay);
helper_test_with_file(lay);
function helper_test_with_string(lay)
s = lay2str(lay);
lay_from_s = cosmo_meeg_read_layout(s);
assert_layout_equal(lay, lay_from_s);
function helper_test_with_file(lay)
s = lay2str(lay);
tmp_fn = tempname();
fid = fopen(tmp_fn, 'w');
file_closer = onCleanup(@()fclose(fid));
file_deleter = onCleanup(@()delete(tmp_fn));
fprintf(fid, '%s', s);
clear file_closer;
lay_from_tmp_fn = cosmo_meeg_read_layout(tmp_fn);
assert_layout_equal(lay, lay_from_tmp_fn);
function assert_layout_equal(x, y)
if isfield(x, 'index')
x = rmfield(x, 'index');
end
if isfield(y, 'index')
y = rmfield(y, 'index');
end
fns = sort(fieldnames(x));
assertEqual(fns, sort(fieldnames(y)));
for k = 1:numel(fns)
fn = fns{k};
value_x = x.(fn);
value_y = y.(fn);
if isnumeric(value_x)
assertElementsAlmostEqual(value_x, value_y, 'absolute', 1e-3);
else
assertEqual(value_x, value_y);
end
end
function s = lay2str(lay)
lay = lay_convert_numeric_to_cell(lay);
cell_elems = cat(2, lay.index, lay.pos, lay.width, lay.height, lay.label)';
pat = '%d %.4f %.4f %.4f %.4f %s\n';
s = sprintf(pat, cell_elems{:});
function lay = lay_convert_numeric_to_cell(lay)
fns = fieldnames(lay);
for k = 1:numel(fns)
fn = fns{k};
value = lay.(fn);
if isnumeric(value)
value = num2cell(value);
lay.(fn) = value;
end
end
function lay = make_full_lay(lay)
% get size
fns = fieldnames(lay);
assert(numel(fns) == 1);
fn = fns{1};
value = lay.(fn);
nlabels = size(value, 1);
% add missing values
to_add = {'index', @() (1:nlabels)'; ...
'pos', @() rand(nlabels, 2); ...
'width', @() rand(nlabels, 1); ...
'height', @() rand(nlabels, 1); ...
'label', @() arrayfun(@rand_str, (1:nlabels)', ....
'UniformOutput', false)};
for k = 1:size(to_add, 1)
label = to_add{k, 1};
if isfield(lay, label)
continue
end
func = to_add{k, 2};
value = func();
lay.(label) = value;
end
function s = rand_str(unused)
s = char(ceil(rand(1, 10) * 20 + 65));