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