test isfield

function test_suite=test_isfield
% tests for cosmo_isfield
%
% #   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_isfield_basics
    a=struct();
    a.foo=1;
    a.bar.baz=2;

    assertTrue(cosmo_isfield(a,'foo'));
    assertTrue(cosmo_isfield(a,'bar.baz'));
    assertFalse(cosmo_isfield(a,'baz'));
    assertFalse(cosmo_isfield(a,'foo.bar'));
    assertEqual(cosmo_isfield(a,{'bar','baz','foo','bar','bar.baz'}),...
                                    [true false true true true]);

    a2=cat(1,a,a);
    assertTrue(cosmo_isfield(a2,'foo'));
    assertTrue(cosmo_isfield(a2,'bar'));
    assertFalse(cosmo_isfield(a2,'baz'));
    assertFalse(cosmo_isfield(a2,'bar.bar.baz'));
    assertEqual(cosmo_isfield(a2,{'bar','baz','foo','bar'}),...
                                    [true false true true]);
    a_a2=a;
    a_a2.bar=a2;
    assertTrue(cosmo_isfield(a_a2,'bar.bar'));
    assertTrue(cosmo_isfield(a_a2,'bar.foo'));
    assertFalse(cosmo_isfield(a_a2,'bar.baz'));


    assertExceptionThrown(@()cosmo_isfield(a2,'baz',true),'');
    assertExceptionThrown(@()cosmo_isfield(a2,'bar.baz',true),'');
    assertExceptionThrown(@()cosmo_isfield(a2,'bar.bar.baz',true),'');

    assertExceptionThrown(@()cosmo_isfield(a2,struct(),true),'');
    assertExceptionThrown(@()cosmo_isfield(a2,{1},true),'');
    assertExceptionThrown(@()cosmo_isfield(a2,a2,true),'');
    assertExceptionThrown(@()cosmo_isfield(a2,a2,false),'');

    assertExceptionThrown(@()cosmo_isfield('foo','baz',true),'');
    assertExceptionThrown(@()cosmo_isfield(a,'foo.bar',true),'');