function test_suite = test_disp
% tests for cosmo_disp
%
% # 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_disp_array()
if ~has_evalc()
cosmo_notify_test_skipped('No support for ''evalc''');
return
end
aeq = @(s, y) assertEqual([s repmat(sprintf('\n'), size(s, 1), 1)], ...
evalc('cosmo_disp(y)'));
aeq(['[ 1 2 3 ... '...
'8 9 10 ]@1x10'], 1:10);
function test_disp_struct()
if ~has_evalc()
cosmo_notify_test_skipped('No support for ''evalc''');
return
end
aeq = @(s, y) assertEqual([s repmat(sprintf('\n'), size(s, 1), 1)], ...
evalc('cosmo_disp(y)'));
x = struct();
x.a_cell = {[], {'cell in cell', [1 2; 3 4]}};
x.a_matrix = [10 11 12; 13 14 15];
x.a_string = 'hello world';
x.a_struct.another_struct.name = 'me';
s = sprintf(['.a_cell \n'...
' { [ ] { ''cell in cell'' [ 1 2 \n'...
' 3 4 ] } }\n'...
'.a_matrix \n'...
' [ 10 11 12 \n'...
' 13 14 15 ] \n'...
'.a_string \n'...
' ''hello world'' \n'...
'.a_struct \n'...
' .another_struct \n'...
' .name \n'...
' ''me'' ']);
aeq(s, x);
function test_disp_cases
if ~has_evalc
cosmo_notify_test_skipped('No support for ''evalc''');
return
end
x = 1:5;
assert_equal_disp(x, 'threshold', Inf, ...
'[ 1 2 3 4 5 ]\n' ...
);
x = 1:5;
assert_equal_disp(x, 'edgeitems', 2, 'threshold', 1, ...
'[ 1 2 ... 4 5 ]@1x5\n' ...
);
x = 1:5;
assert_equal_disp(x, 'edgeitems', 1, 'threshold', 2, ...
'[ 1 ... 5 ]@1x5\n' ...
);
x = 1:5;
assert_equal_disp(x, 'edgeitems', 3, ...
'[ 1 2 3 4 5 ]\n' ...
);
x = 'a':'z';
assert_equal_disp(x, ...
'''abcdefg ... tuvwxyz''\n' ...
);
x = @abs;
assert_equal_disp(x, ...
'@abs\n' ...
);
x = {{1, 2}};
assert_equal_disp(x, 'depth', 1, ...
'{ <cell>@1x2 }\n' ...
);
x = [13e-20, pi(), 13e20];
assert_equal_disp(x, ...
'[ 1.3e-19 3.14 1.3e+21 ]\n' ...
);
x = [13e-20, pi(), 13e20];
assert_equal_disp(x, 'precision', 5, ...
'[ 1.3e-19 3.1416 1.3e+21 ]\n' ...
);
x = struct();
y = x([]);
assert_equal_disp(y, ...
'struct (empty)\n' ...
);
x = struct('x', 1);
assert_equal_disp(x, ...
['.x \n'...
' [ 1 ]\n' ...
]);
x = struct('x', {1 2; 3 4});
assert_equal_disp(x, ...
['<struct>@2x2 \n'...
' (1,1).x \n'...
' [ 1 ]\n'...
' (2,1).x \n'...
' [ 3 ]\n'...
' (1,2).x \n'...
' [ 2 ]\n'...
' (2,2).x \n'...
' [ 4 ]\n' ...
]);
x = struct('x', {1 2; 3 4});
x3 = cat(3, x, x, x);
assert_equal_disp(x3, ...
['<struct>@2x2x3 \n'...
' (1,1,1).x \n'...
' [ 1 ]\n'...
' (2,1,1).x \n'...
' [ 3 ]\n'...
' (1,2,1).x \n'...
' [ 2 ]\n'...
' : : \n'...
' (2,1,3).x \n'...
' [ 3 ]\n'...
' (1,2,3).x \n'...
' [ 2 ]\n'...
' (2,2,3).x \n'...
' [ 4 ]\n' ...
]);
x = struct('x', {1 2; 3 4});
y = repmat({x}, 10, 10);
x3 = cat(3, y{:});
assert_equal_disp(x3, ...
['<struct>@2x2x100 \n'...
' (1,1,1) .x \n'...
' [ 1 ]\n'...
' (2,1,1) .x \n'...
' [ 3 ]\n'...
' (1,2,1) .x \n'...
' [ 2 ]\n'...
' : : \n'...
' (2,1,100).x \n'...
' [ 3 ]\n'...
' (1,2,100).x \n'...
' [ 2 ]\n'...
' (2,2,100).x \n'...
' [ 4 ]\n' ...
]);
x = zeros([2 2 1 2 3]);
x(:) = 2 * (1:numel(x));
assert_equal_disp(x, ...
['<double>@2x2x1x2x3 \n'...
' (:,:,1,1,1) = [ 2 6 \n'...
' 4 8 ] \n'...
' (:,:,1,2,1) = [ 10 14 \n'...
' 12 16 ]\n'...
' (:,:,1,1,2) = [ 18 22 \n'...
' 20 24 ]\n'...
' (:,:,1,2,2) = [ 26 30 \n'...
' 28 32 ]\n'...
' (:,:,1,1,3) = [ 34 38 \n'...
' 36 40 ]\n'...
' (:,:,1,2,3) = [ 42 46 \n'...
' 44 48 ]\n' ...
]);
x = num2cell(1:10);
assert_equal_disp(x, ...
'{ [ 1 ] [ 2 ] [ 3 ] ... [ 8 ] [ 9 ] [ 10 ] }@1x10\n' ...
);
x = reshape(num2cell(1:100), 10, 10);
assert_equal_disp(x, ...
['{ [ 1 ] [ 11 ] [ 21 ] ... [ 71 ] [ 81 ] [ 91 ] \n'...
' [ 2 ] [ 12 ] [ 22 ] ... [ 72 ] [ 82 ] [ 92 ] \n'...
' [ 3 ] [ 13 ] [ 23 ] ... [ 73 ] [ 83 ] [ 93 ] \n'...
' : : : : : : \n'...
' [ 8 ] [ 18 ] [ 28 ] ... [ 78 ] [ 88 ] [ 98 ] \n'...
' [ 9 ] [ 19 ] [ 29 ] ... [ 79 ] [ 89 ] [ 99 ] \n'...
' [ 10 ] [ 20 ] [ 30 ] ... [ 80 ] [ 90 ] [ 100 ] }@10x10\n' ...
]);
x = reshape(1:100, 10, 10);
assert_equal_disp(x, ...
['[ 1 11 21 ... 71 81 91 \n'...
' 2 12 22 ... 72 82 92 \n'...
' 3 13 23 ... 73 83 93 \n'...
' : : : : : : \n'...
' 8 18 28 ... 78 88 98 \n'...
' 9 19 29 ... 79 89 99 \n'...
' 10 20 30 ... 80 90 100 ]@10x10\n' ...
]);
function test_disp_nosize()
if ~has_evalc() || cosmo_wtf('is_octave')
cosmo_notify_test_skipped(['No support for testing evalc '...
'on data with no size']);
return
end
orig_pwd = pwd();
pwd_resetter = onCleanup(@()cd(orig_pwd));
temp_dir = fullfile(orig_pwd, cosmo_make_temp_filename());
dir_cleaner = onCleanup(@()remove_dir_helper(temp_dir));
% override 'size' method for double
mkdir(temp_dir);
temp_double_dir = fullfile(temp_dir, '@double');
mkdir(temp_double_dir);
size_fn = fullfile(temp_double_dir, 'size.m');
fid = fopen(size_fn, 'w');
fprintf(fid, 'function size(varargin)\nerror(''undefined'');');
fclose(fid);
cd(temp_dir);
assert_equal_disp(1, '<double>\n');
function tf = has_evalc()
tf = exist('evalc', 'builtin') || ~isempty(which('evalc'));
function remove_dir_helper(tmp_dir)
if cosmo_wtf('is_octave')
rmdir_state = confirm_recursive_rmdir();
state_resetter = onCleanup(@()confirm_recursive_rmdir(rmdir_state));
confirm_recursive_rmdir(false, 'local');
end
rmdir(tmp_dir, 's');
function assert_equal_disp(varargin)
args = varargin(1:(end - 1));
str = varargin{end};
cmd = 'cosmo_disp(args{:})';
assertEqual(evalc(cmd), sprintf(str));