test singleton neighborhood

function test_suite = test_singleton_neighborhood
    % tests for test_singleton_neighborhood
    %
    % #   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 i = randint()
    i = ceil(rand() * 10 + 10);

function s = randstr()
    s = char(ceil(rand(1, 10) * 26 + 64));

function test_singleton_neighborhood_basics
    nf = randint();
    ns = randint();

    ds = struct();
    ds.samples = rand(ns, nf);

    ds.a.(randstr()) = randstr();
    ds.fa.(randstr()) = rand(randint(), nf);
    ds.sa.(randstr()) = rand(ns, randint());

    expected_nh = struct();
    expected_nh.neighbors = num2cell((1:nf)');
    expected_nh.fa = ds.fa;
    expected_nh.a = ds.a;
    expected_nh.origin.fa = expected_nh.fa;
    expected_nh.origin.a = expected_nh.a;
    expected_nh.fa.sizes = ones(1, nf);

    nh = cosmo_singleton_neighborhood(ds);
    assertEqual(nh, expected_nh);

function test_singleton_neighborhood_tiny()
    nf = randint();

    ds = struct();
    ds.samples = rand(1, nf);

    expected_nh = struct();
    expected_nh.neighbors = num2cell((1:nf)');
    expected_nh.origin = struct();
    expected_nh.fa.sizes = ones(1, nf);
    expected_nh.a = struct();

    nh = cosmo_singleton_neighborhood(ds);
    assertEqual(nh, expected_nh);

function test_singleton_neighborhood_exceptions()
    aet = @(varargin)assertExceptionThrown(@() ...
                                           cosmo_singleton_neighborhood(varargin{:}), '');
    ds = cosmo_synthetic_dataset();

    % not a dataset
    ds_bad = struct();
    aet(ds_bad);

    % missing .fa field
    ds_bad = ds;
    ds_bad.fa = rmfield(ds_bad.fa, 'i');
    aet(ds_bad);