function test_suite = test_statcode()
% tests for cosmo_statcode
%
% # 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_statcode_self()
stats=get_test_stats();
assertEqual(cosmo_statcode(stats),stats);
ds=struct();
ds.samples=[];
assertEqual(cosmo_statcode(ds),[]);
ds.sa.stats=stats;
assertEqual(cosmo_statcode(ds),stats);
aet=@(varargin)assertExceptionThrown(@()...
cosmo_statcode(varargin{:}),'');
% store warning state
warning_state=cosmo_warning();
cleaner=onCleanup(@()cosmo_warning(warning_state));
cosmo_warning('off');
% test illegal input
aet({'()'});
aet({'foo(;)'});
aet({'Zscore()'},'foo');
aet('Zscore');
% unknown input
s=cosmo_statcode({'foo'},'afni');
assertEqual(s.BRICK_STATAUX,[]);
s=cosmo_statcode({'foo'},'nifti');
assertEqual(s.intent_code,0);
assertEqual(s.intent_p1,0);
assertEqual(s.intent_p1,0);
assertEqual(s.intent_p1,0);
% empty input
assertEqual(cosmo_statcode({}),cell(0,1));
assertEqual(cosmo_statcode({},'bv'),cell(0,1));
assertEqual(cosmo_statcode({},'nifti'),struct());
assertEqual(cosmo_statcode({},'afni'),...
cosmo_structjoin('BRICK_STATAUX',[]));
function test_statcode_bv()
[stats,stats_proper]=get_test_stats();
bv_statcode=cosmo_statcode(stats,'bv');
bv_values={[],[1 5],[4 2 3],5,5,[]};
nvalues=numel(bv_values);
assertEqual(nvalues,numel(bv_statcode))
for j=1:numel(bv_values)
bv_value=bv_values{j};
s=struct();
nv=numel(bv_value);
if nv==0
s.Type=0;
else
s.Type=bv_value(1);
for k=1:(nv-1)
label=sprintf('DF%d',k);
s.(label)=bv_value(k+1);
end
end
assertEqual(s,bv_statcode{j});
end
bv_map=struct();
bv_map.VMRDimX=[];
bv_map.VMRDimX=[];
map_cell=cell(nvalues,1);
for k=1:numel(map_cell)
m=struct();
m.DF1=0;
m.DF2=0;
m.DF3=0;
m.Type=0;
if ~isempty(bv_statcode{k})
m=cosmo_structjoin(m,bv_statcode{k});
end
map_cell{k}=m;
end
bv_map.Map=cat(1,map_cell{:});
assertEqual(cosmo_statcode(bv_map),stats_proper);
function test_statcode_afni()
[stats,stats_proper]=get_test_stats();
afni_statcode=cosmo_statcode(stats,'afni');
afni_struct=struct();
afni_struct.BRICK_STATAUX=[1 3 1 5 2 4 2 2 3 3 5 0 4 5 0];
assertEqual(afni_statcode,afni_struct);
afni_struct.DATASET_RANK=[NaN numel(stats)];
assertEqual(cosmo_statcode(afni_struct),stats_proper);
% error for too many elements
afni_struct.BRICK_STATAUX(end+1)=0;
afni_struct.BRICK_STATAUX(end+1)=0;
assertExceptionThrown(@()cosmo_statcode(afni_struct),'');
afni_struct.BRICK_STATAUX=afni_struct.BRICK_STATAUX(1:(end-3));
assertExceptionThrown(@()cosmo_statcode(afni_struct),'');
afni_struct.BRICK_STATAUX=afni_struct.BRICK_STATAUX(1:(end-6));
assertExceptionThrown(@()cosmo_statcode(afni_struct),'');
function test_statcode_nifti()
stats=get_test_stats();
% NIFTI does not support multiple stats
% silence warning
warning_state=cosmo_warning();
cleaner=onCleanup(@()cosmo_warning(warning_state));
cosmo_warning('off');
assertEqual(cosmo_statcode(stats,'nifti'),struct());
stats=repmat(stats(3),6,1);
stats_proper=stats;
nifti_statcode=cosmo_statcode(stats,'nifti');
nifti_dime=struct();
nifti_dime.intent_code=4;
nifti_dime.intent_p1=2;
nifti_dime.intent_p2=3;
nifti_dime.intent_p3=0;
assertEqual(nifti_statcode,nifti_dime);
nifti_hdr=struct();
nifti_hdr.dime=nifti_dime;
nifti_hdr.dime.dim=[NaN NaN NaN NaN 1 numel(stats) 1];
assertEqual(cosmo_statcode(nifti_hdr),stats_proper);
function [stats,stats_proper]=get_test_stats()
stats={'none';'Ttest(5)';'Ftest(2,3)';'Zscore';'Zscore()';''};
stats_proper=stats;
stats_proper{1}='';
stats_proper{4}='Zscore()';
stats_proper{6}='';