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