test warning

function test_suite=test_warning
% tests for cosmo_warning
%
% #   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_warning_basics
    state=cosmo_warning();
    state_resetter=onCleanup(@()cosmo_warning(state));

    cosmo_warning('reset');
    cosmo_warning('off');

    % test simple message
    msg='foo';
    cosmo_warning(msg);
    assert_in_shown_warnings(msg);

    % test formatting a message
    args={'bar%d-%d_%d',randn(1,3)};
    cosmo_warning(args{:});
    assert_in_shown_warnings(args);

    % test with identifier
    args={'msg:id','foo%s-%d','baz',3};
    cosmo_warning(args{:});
    assert_in_shown_warnings(args(2:end));

    % test with identifier '%' (ascii code 65)
    args={'bar%d',65};
    cosmo_warning(args{:});
    assert_in_shown_warnings(args);


function assert_in_shown_warnings(msg)
    state=cosmo_warning();
    shown_warnings=state.shown_warnings;
    assert(~isempty(shown_warnings));

    if iscell(msg)
        msg=sprintf(msg{:});
    end
    assert(any(cosmo_match(shown_warnings,msg)));