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), '');