% UTP_PLIST_PLIST2CMDS a set of UTPs for the plist/plist2cmds method
%
% M Hewitson 06-08-08
%
% $Id: utp_plist_plist2cmds.m,v 1.4 2009/08/24 17:23:10 ingo Exp $
%

% <MethodDescription>
%
% The plist2cmds method of the plist class convert a plist to a set of
% commands.
%
% </MethodDescription>

function results = utp_plist_plist2cmds(varargin)
  
  % Check the inputs
  if nargin == 0
    
    % Some keywords
    class   = 'plist';
    mthd    = 'plist2cmds';
    
    results = [];
    disp('******************************************************');
    disp(['****  Running UTPs for ' class '/' mthd]);
    disp('******************************************************');
    
    % Test PLIST objects
    [pl1, pl2, pl3, pl4, plv, plm] = get_test_objects_plist;
    
    % Exception list for the UTPs:
    %     [ple1,ple2,ple3,ple4,ple5,ple6] = get_test_ples();
    
    % Run the tests
    results = [results utp_01];    % getInfo call
    results = [results utp_02];    % Vector input
    results = [results utp_03];    % Matrix input
    results = [results utp_04];    % List input
    results = [results utp_05];    % Test with mixed input
    results = [results utp_06];    % Test different objects for 'val'
    
    disp('Done.');
    disp('******************************************************');
    
  elseif nargin == 1 % Check for UTP functions
    if strcmp(varargin{1}, 'isutp')
      results = 1;
    else
      results = 0;
    end
  else
    error('### Incorrect inputs')
  end
  
end


%% UTP_01

% <TestDescription>
%
% Tests that the getInfo call works for this method.
%
% </TestDescription>
function result = utp_01
  
  
  % <SyntaxDescription>
  %
  % Test that the getInfo call works for no sets, all sets, and each set
  % individually.
  %
  % </SyntaxDescription>
  
  try
    class   = 'plist';
    mthd    = 'plist2cmds';
    
    % <SyntaxCode>
    % Call for no sets
    io(1) = eval([class '.getInfo(''' mthd ''', ''None'')']);
    % Call for all sets
    io(2) = eval([class '.getInfo(''' mthd ''')']);
    % Call for each set
    for kk=1:numel(io(2).sets)
      io(kk+2) = eval([class '.getInfo(''' mthd ''', ''' io(2).sets{kk} ''')']);
    end
    % </SyntaxCode>
    stest = true;
  catch err
    disp(err.message)
    stest = false;
  end
  
  % <AlgoDescription>
  %
  % 1) Check that getInfo call returned an minfo object in all cases.
  % 2) Check that all plists have the correct parameters.
  %
  % </AlgoDescription>
  
  atest = true;
  if stest
    % <AlgoCode>
    % check we have minfo objects
    if isa(io, 'minfo')
      % SET 'None'
      if ~isempty(io(1).sets), atest = false; end
      if ~isempty(io(1).plists), atest = false; end
      % Check all Sets
      if ~any(strcmpi(io(2).sets, 'Default')), atest = false; end
      if numel(io(2).plists) ~= numel(io(2).sets), atest = false; end
      % SET 'Default'
      if io(3).plists.nparams ~= 0, atest = false; end
      % Check key
      % Check default value
      % Check options
    end
    % </AlgoCode>
  else
    atest = false;
  end
  
  % Return a result structure
  result = utp_prepare_result(atest, stest, dbstack, mfilename);
end % END UTP_01

%% UTP_02

% <TestDescription>
%
% Tests that the plist2cmds method works with a vector of PLIST objects as input.
%
% </TestDescription>
function result = utp_02
  
  % <SyntaxDescription>
  %
  % The plist2cmds method doesn't works for a vector of PLIST objects as input.
  %
  % </SyntaxDescription>
  
  try
    % <SyntaxCode>
    % </SyntaxCode>
    stest = true;
  catch err
    disp(err.message)
    stest = false;
  end
  
  % <AlgoDescription>
  %
  % 1) Nothing to test.
  %
  % </AlgoDescription>
  
  atest = true;
  if stest
    % <AlgoCode>
    % </AlgoCode>
  else
    atest = false;
  end
  
  % Return a result structure
  result = utp_prepare_result(atest, stest, dbstack, mfilename);
end % END UTP_02

%% UTP_03

% <TestDescription>
%
% Tests that the plist2cmds method works with a matrix of PLIST objects as input.
%
% </TestDescription>
function result = utp_03
  
  % <SyntaxDescription>
  %
  % The plist2cmds method doesn't works for a matrix of PLIST objects as input.
  %
  % </SyntaxDescription>
  
  try
    % <SyntaxCode>
    % </SyntaxCode>
    stest = true;
  catch err
    disp(err.message)
    stest = false;
  end
  
  % <AlgoDescription>
  %
  % 1) Nothing to test.
  %
  % </AlgoDescription>
  
  atest = true;
  if stest
    % <AlgoCode>
    % </AlgoCode>
  else
    atest = false;
  end
  
  % Return a result structure
  result = utp_prepare_result(atest, stest, dbstack, mfilename);
end % END UTP_03

%% UTP_04

% <TestDescription>
%
% Tests that the plist2cmds method works with a list of PLIST objects as input.
%
% </TestDescription>
function result = utp_04
  
  % <SyntaxDescription>
  %
  % The plist2cmds method doesn't works for a list of PLIST objects as input.
  %
  % </SyntaxDescription>
  
  try
    % <SyntaxCode>
    % </SyntaxCode>
    stest = true;
  catch err
    disp(err.message)
    stest = false;
  end
  
  % <AlgoDescription>
  %
  % 1) Nothing to test.
  %
  % </AlgoDescription>
  
  atest = true;
  if stest
    % <AlgoCode>
    % </AlgoCode>
  else
    atest = false;
  end
  
  % Return a result structure
  result = utp_prepare_result(atest, stest, dbstack, mfilename);
end % END UTP_04

%% UTP_05

% <TestDescription>
%
% Tests that the plist2cmds method works with a mix of different shaped
% PLIST objects as input.
%
% </TestDescription>
function result = utp_05
  
  % <SyntaxDescription>
  %
  % The plist2cmds method doesn't works with an input of matrices and vectors
  % and single PLIST objects.
  %
  % </SyntaxDescription>
  
  try
    % <SyntaxCode>
    % </SyntaxCode>
    stest = true;
  catch err
    disp(err.message)
    stest = false;
  end
  
  % <AlgoDescription>
  %
  % 1) Nothing to test
  %
  % </AlgoDescription>
  
  atest = true;
  if stest
    % <AlgoCode>
    % </AlgoCode>
  else
    atest = false;
  end
  
  % Return a result structure
  result = utp_prepare_result(atest, stest, dbstack, mfilename);
end % END UTP_05

%% UTP_06

% <TestDescription>
%
% Tests that the plist2cmds method accepts different objects for the 'val' property.
%
% </TestDescription>
function result = utp_06
  
  % <SyntaxDescription>
  %
  % Create a plist with all possible objects for the 'val' property.
  %
  % </SyntaxDescription>
  
  [ple1,ple2,ple3,ple4,ple5,ple6] = get_test_ples();
  
  try
    % <SyntaxCode>
    iir = miir(plist('type', 'lowpass'));
    a = 'char';
    b = [1 2i 3; 4i 5 6];
    c = [true false true; false true false];
    d = java.util.TimeZone.getTimeZone('UTC');
    e = sym('[a b c; d e f]');
    f = plist('a', 'char', 'b', ao(8)+ao(9));
    g = iir.resp;
    h = unit('m^-1/2 kg V^3/7');
    ii = [pz(3) pz(1,2) pz(1-2i) pz(-3)];
    j = [time(123) time('14:00:00')];
    k = [specwin('Kaiser', 10, 100) specwin('Hanning', 100)];
    % --- CHAR
    pl1 = plist('key', 'this is a char');
    % --- NUMERIC
    pl2 = plist('key', [1 2i 3; 4i 5 6]);
    % --- LOGICAL
    pl3 = plist('key', [true false true; false true false]);
    % --- JAVA (timezone)
    pl4 = plist('key', java.util.TimeZone.getTimeZone('UTC'));
    % --- SYM
    pl5 = plist('key', sym('[a b c; d e f]'));
    % --- PLIST
    pl6 = plist('key', plist('a', 'char'));
    % --- CELL
    cellval = {a b c d e f g h ii j k (ao(8) + ao(9))};
    pl7 = plist('key', cellval);
    % --- STRUCT
    structval.a = a;
    structval.b = b;
    structval.c = c;
    structval.d = d;
    structval.e = e;
    structval.f = f;
    structval.g = g;
    structval.h = h;
    structval.ii = ii;
    structval.j = j;
    structval.k = k;
    pl8 = plist('key', structval);
    % --- LTPDA_NUO
    % ------ HISTORY
    iir = miir(plist('type', 'lowpass'));
    pl9 = plist('key', iir.hist);
    % ------ UNITS
    pl10 = plist('key', unit('m^-1/2 kg V^3/7'));
    % ------ PARAM
    pl11 = plist('key', param('a', 'char'));
    % ------ PROVENANCE
    pl12 = plist('key', provenance);
    % ------ PZ
    pl13 = plist('key', [pz(3) pz(1,2) pz(1-2i) pz(-3)]);
    % ------ TIME
    pl14 = plist('key', [time(123) time('14:00:00')]);
    % ------ SPECWIN
    pl15 = plist('key', [specwin('Kaiser', 10, 100) specwin('Hanning', 100)]);
    
    pl = plist();
    % Evaluate the commands
    % The result is stored in the variable 'pl'.
    out1 = pl1.plist2cmds;
    eval(out1{1});
    out1 = pl;
    out2 = pl2.plist2cmds;
    eval(out2{1})
    out2 = pl;
    out3 = pl3.plist2cmds;
    eval(out3{1})
    out3 = pl;
    out4 = pl4.plist2cmds;
    eval(out4{1})
    out4 = pl;
    out5 = pl5.plist2cmds;
    eval(out5{1})
    out5 = pl;
    out6 = pl6.plist2cmds;
    eval(out6{1})
    out6 = pl;
    out7 = pl7.plist2cmds;
    for pp = numel(out7):-1:1
      eval(out7{pp})
    end
    out7 = pl;
    out8 = pl8.plist2cmds;
    for pp = numel(out8):-1:1
      eval(out8{pp})
    end
    out8 = pl;
    out9 = pl9.plist2cmds;
    for pp = numel(out9):-1:1
      eval(out9{pp})
    end
    out9 = pl;
    out10 = pl10.plist2cmds;
    eval(out10{1})
    out10 = pl;
    out11 = pl11.plist2cmds;
    eval(out11{1})
    out11 = pl;
    out12 = pl12.plist2cmds;
    eval(out12{1})
    out12 = pl;
    out13 = pl13.plist2cmds;
    eval(out13{1})
    out13 = pl;
    out14 = pl14.plist2cmds;
    eval(out14{1})
    out14 = pl;
    out15 = pl15.plist2cmds;
    eval(out15{1})
    out15 = pl;
    % </SyntaxCode>
    stest = true;
  catch err
    stest = false;
  end
  
  % <AlgoDescription>
  %
  % 1) Check that the output is a executable plist2cmds
  %
  % </AlgoDescription>
  
  atest = true;
  if stest
    % <AlgoCode>
    if ~eq(pl1,  out1,  ple2), atest = false; end
    if ~eq(pl2,  out2,  ple2), atest = false; end
    if ~eq(pl3,  out3,  ple2), atest = false; end
    if ~eq(pl4,  out4,  ple2), atest = false; end
    if ~eq(pl5,  out5,  ple2), atest = false; end
    if ~eq(pl6,  out6,  ple2), atest = false; end
    if ~eq(pl7,  out7,  ple2), atest = false; end
    if ~eq(pl8,  out8,  ple2), atest = false; end
    if ~eq(pl10, out10, ple2), atest = false; end
    if ~eq(pl11, out11, ple2), atest = false; end
    if ~eq(pl12, out12, ple2), atest = false; end
    if ~eq(pl13, out13, ple2), atest = false; end
    if ~eq(pl14, out14, ple2), atest = false; end
    if ~eq(pl15, out15, ple2), atest = false; end
    % </AlgoCode>
  else
    atest = false;
  end
  
  % Return a result structure
  result = utp_prepare_result(atest, stest, dbstack, mfilename);
end % END UTP_06

