function test_suite=test_structjoin
% tests for cosmo_structjoin
%
% # 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_structjoin_
% test a few cell structures
sj=@cosmo_structjoin;
xa={'a',{1;2},'b',{1,2}};
x_=struct();
x_.a={1;2};
x_.b={1,2};
assertEqual(sj(xa),x_);
assertEqual(sj(xa{:}),x_);
ya={x_,'a',3,'x',x_,{'c','hello'}};
y_=struct();
y_.a=3;
y_.b=x_.b;
y_.x=x_;
y_.c='hello';
assertEqual(sj(ya),y_);
assertEqual(sj(ya{:}),y_);
% can override subfield
x=struct();
x.a.foo=1;
x.b.bar=2;
y=struct();
y.a.foo=3;
y.c.baz=3;
z=struct();
z.a.foo=3;
z.b.bar=2;
z.c.baz=3;
assertEqual(sj(x,y),z);
% deal with empty struct fine
assertEqual(sj(struct),struct);
assertEqual(sj(cell(0)),struct);
% check exceptions
aet=@(varargin) assertExceptionThrown(@()...
cosmo_structjoin(varargin{:}),'');
aet('a');
aet(struct,'a');
aet(1);
aet(aet);
aet([]);
s=struct();
s.a=2;
s.b=3;
s2=cat(1,s,s);
aet(s2);
% verify overriding field
s=struct();
s.a.b=2;
s.c=4;
sa=struct();
sa.b=3;
s2=struct();
s2.a.b=3;
s2.c=4;
assertEqual(sj(s,'a',sa),s2);