test show progress

function test_suite = test_show_progress
    % tests for cosmo_show_progress
    %
    % #   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_show_progress_basics
    if ~has_evalc()
        cosmo_notify_test_skipped('''evalc'' is not available');
        return
    end

    clock_start = clock();

    assert_progress_equal(['\+00:00:00 \[------------'...
                           '--------\] -oo  '], ...
                          [], ...
                          clock_start, 0);
    assert_progress_equal(['\+00:00:00 \[-----------'...
                           '---------\] -oo  foo'], ...
                          [], ...
                          clock_start, 0, 'foo', '');
    pause(.5);
    assert_progress_equal(['\+00:00:01 \[##########'...
                           '----------\] -00:00:01  foo'], ...
                          [], ...
                          clock_start, .5, 'foo', '');
    assert_progress_equal(['\+00:00:01 \[----------'...
                           '----------\] -2d.*  foo'], ...
                          [], ...
                          clock_start, 1 / (60 * 60 * 24) / 5, 'foo', '');
    assert_progress_equal(sprintf(['\\+00:00:01 \\[###########'...
                                   '#########\\] -00:00:00  foo\n']), ...
                          [], ...
                          clock_start, 1, 'foo', '');
    assert_progress_equal(sprintf(['bar\\+00:00:01 \\[###########'...
                                   '#########\\] -00:00:00  foo\n']), ...
                          'barbaz', ...
                          clock_start, 1, 'foo', 'baz');
    assertExceptionThrown(@()cosmo_show_progress(clock_start, -1), '');
    assertExceptionThrown(@()cosmo_show_progress(clock_start, 2), '');

function assert_progress_equal(re, infix, varargin)
    %     if isempty(infix)
    %         cmd='';
    %     else
    %         cmd='fprintf(''%s'',infix);';
    %     end
    %     result=evalc([cmd 'cosmo_show_progress(varargin{:});']);
    expr = 'helper_print_infix_and_show_progress(infix,varargin{:})';
    result = evalc(expr);

    while true
        % replace a backspace character and the preceding character by
        % nothing
        idx = find(result == sprintf('\b'), 1);
        if isempty(idx)
            break
        end
        result = result([1:(idx - 2), (idx + 1):end]);
    end

    assert(~isempty(regexp(result, re, 'once')));

function helper_print_infix_and_show_progress(infix, varargin)
    if ~isempty(infix)
        fprintf('%s', infix);
    end
    cosmo_show_progress(varargin{:});

function tf = has_evalc()
    tf = exist('evalc', 'builtin') || ~isempty(which('evalc'));