function test_suite=test_check_external()
% tests for cosmo_check_external
%
% #   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_check_external_nifti()
    % nifti comes with CoSMoMVPA, so should always be available if the path
    % is set properly

    warning_state=cosmo_warning();
    orig_path=path();

    warning_state_resetter=onCleanup(@()cosmo_warning(warning_state));
    path_resetter=onCleanup(@()path(orig_path));

    % ensure path is set; disable warnings by cosmo_set_path
    cosmo_warning('off');
    cosmo_set_path();

    assertTrue(cosmo_check_external('nifti'))
    assertEqual(cosmo_check_external({'nifti','nifti'}),[true;true]);

    % test list
    externals=cosmo_check_external('-list');
    assert(~isempty(strmatch('nifti',externals,'exact')));

    % test tic/toc
    cosmo_check_external('-tic');
    assert(isempty(cosmo_check_external('-toc')));

    % must cite CoSMoMVPA, but not NIFTI
    c=cosmo_check_external('-cite');
    assert(~isempty(findstr(c,'N. N. Oosterhof')));
    assert(~isempty(findstr(c,'CoSMoMVPA')));
    assert(isempty(findstr(c,'NIFTI toolbox')));

    % after checking for nifti it must be present
    cosmo_check_external('nifti');
    assertEqual(cosmo_check_external('-toc'),{'nifti'});
    c=cosmo_check_external('-cite');
    assert(~isempty(findstr(c,'NIFTI toolbox')));

    % removing nifti from the path makes it absent
    rmpath(fileparts(which('load_nii')));
    assertFalse(cosmo_check_external('nifti',false));

    % throws exception when second argument is true or absent
    assertExceptionThrown(@()cosmo_check_external('nifti',true),'');
    assertExceptionThrown(@()cosmo_check_external('nifti'),'');




function test_check_external_mocov()
    has_mocov=~isempty(which('mocov'));
    assertEqual(has_mocov,cosmo_check_external('mocov',false));


function test_check_external_command()
    commands={'foo','basdfds','disp'};
    n=numel(commands);
    for k=1:n
        command=commands{k};
        has_command=~isempty(which(command));

        arg=['!' command];
        if has_command
            assertTrue(cosmo_check_external(arg));
            assertTrue(cosmo_check_external(arg,true));
            assertTrue(cosmo_check_external(arg,false));
        else
            assertExceptionThrown(@()cosmo_check_external(arg),'');
            assertExceptionThrown(@()cosmo_check_external(arg,true),'');
            assertFalse(cosmo_check_external(arg,false));
        end
    end





function test_check_external_exceptions()
    aet=@(varargin)assertExceptionThrown(@()...
                    cosmo_check_external(varargin{:}),'');
    aet('unknown package');