diff testing/utp_1.1/utps/ao/utp_ao_ao.m @ 44:409a22968d5e default

Add unit tests
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Tue, 06 Dec 2011 18:42:11 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testing/utp_1.1/utps/ao/utp_ao_ao.m	Tue Dec 06 18:42:11 2011 +0100
@@ -0,0 +1,1964 @@
+% UTP_AO_AO a set of UTPs for the ao/ao method
+%
+% M Hewitson 06-08-08
+%
+% $Id: utp_ao_ao.m,v 1.73 2011/08/15 10:44:51 hewitson Exp $
+%
+
+% <MethodDescription>
+%
+% The ao method of the ao class constructs AOs.
+%
+% </MethodDescription>
+
+function results = utp_ao_ao(varargin)
+  
+  % Check the inputs
+  if nargin == 0
+    
+    % Some keywords
+    class   = 'ao';
+    mthd    = 'ao';
+    
+    results = [];
+    disp('******************************************************');
+    disp(['****  Running UTPs for ' class '/' mthd]);
+    disp('******************************************************');
+    
+    % Test AOs
+    [at1,at2,at3,at4,at5,at6,atvec,atmat] = eval(['get_test_objects_' class]);
+    
+    % Exception list for the UTPs:
+    [ple1,ple2,ple3,ple4,ple5,ple6] = get_test_ples();
+    
+    % Define THRESHOLD for computing error
+    TOL = 1e-14;
+    
+    % Run the tests
+    results = [results utp_01];    % getInfo call
+    results = [results utp_02(mthd, atvec, [], [], ple3)];    % Vector input
+    results = [results utp_03(mthd, atmat, [], [], ple3)];    % Matrix input
+    results = [results utp_04(mthd, at1, at2, at3, [], [], ple3)];    % List input
+    results = [results utp_05(mthd, at1, atvec, atmat, [], [], ple3)];    % Test with mixed input
+    results = [results utp_06(mthd, at1, [], ple2)];    % Test history is working
+    
+    % Old format
+    results = [results utp_08];    % Test history is working with ASCII file constructor
+    results = [results utp_09];    % Test history is working with complex ASCII file constructor
+    results = [results utp_13];    % Test history is working with vals constructor
+    results = [results utp_15];    % Test history is working with plist(fcn) constructor
+    results = [results utp_16];    % Test history is working with plist(vals) constructor
+    results = [results utp_17];    % Test history is working with plist(x/y-vals) constructor
+    results = [results utp_18];    % Test history is working with plist(tsfcn) constructor
+    results = [results utp_19];    % Test history is working with plist(fsfcn) constructor
+    results = [results utp_20];    % Test history is working with plist(win) constructor
+    results = [results utp_21];    % Test history is working with plist(waveform) constructor
+    results = [results utp_23];    % Test history is working with plist(polynomial) constructor
+    results = [results utp_25];    % Test history is working with specwin constructor
+    results = [results utp_26];    % Test history is working with data-objects constructor
+    results = [results utp_28];    % Test history is working with x-vector, y-vector constructor
+    results = [results utp_29];    % Test history is working with filename + plist constructor
+    results = [results utp_30];    % Test history is working with filename + plist constructor
+    results = [results utp_31];    % Test history is working with filename + plist constructor
+
+    % constructor specific tests
+    results = [results utp_60(class, at3, ple2)];    % Test history is properly handled with MAT file constructor
+    results = [results utp_61(class, at1, ple2)];    % Test history is properly handled with XML file constructor
+    results = [results utp_62(class, at1, at2, ple2)];    % Test history is working with struct constructor
+%     results = [results utp_63(class, ple1)];    % Test history is working with pzmodel-object constructor
+    results = [results utp_64(class, at1, ple1, ple2)]; % Test history is working with plist(filename) constructor
+    results = [results utp_65(class, at1, ple3)]; % Test history is working with plist(hostname) constructor
+    results = [results utp_66(class, ple1)];  % Test history is working with plist(pzmodel) constructor
+    results = [results utp_67(class, ple1)];  % Test history is working with pzmodel + plist constructor
+    results = [results utp_68(class, at1, ple3)];  % Test history is working with conn+Id constructor
+    
+    disp('Done.');
+    disp('******************************************************');
+    
+  elseif nargin == 1 % Check for UTP functions
+    if strcmp(varargin{1}, 'isutp')
+      results = 1;
+    elseif strcmpi(varargin{1}, 'needs repository')
+      results = 2;
+    else
+      results = 0;
+    end
+  else
+    error('### Incorrect inputs')
+  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>
+    
+    msg = '';
+    try
+      % <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)
+      msg = 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')
+        prefs = getappdata(0, 'LTPDApreferences');
+        
+        % SET 'None'
+        if ~isempty(io(1).sets), atest = false; msg = 'Sets ''None'' isn''t empty.'; end
+        if ~isempty(io(1).plists), atest = false; msg = 'First plist for all sets isn''t empty.'; end
+        % Check number of SETS
+        if numel(io(2).sets) ~= 21, atest = false; msg = 'Number of sets is wrong'; end
+        % Check all Sets
+        if ~any(strcmpi(io(2).sets, 'Default')), atest = false; msg = 'Sets array does not contain ''Default'''; end
+        if ~any(strcmpi(io(2).sets, 'From MAT File')), atest = false; msg = 'Sets array does not contain ''From MAT File'''; end
+        if ~any(strcmpi(io(2).sets, 'From XML File')), atest = false; msg = 'Sets array does not contain ''From XML File'''; end
+        if ~any(strcmpi(io(2).sets, 'From Repository')), atest = false; msg = 'Sets array does not contain ''From Repository'''; end
+        if ~any(strcmpi(io(2).sets, 'From Built-in model')), atest = false; msg = 'Sets array does not contain ''From Built-in Model'''; end
+        if ~any(strcmpi(io(2).sets, 'From MAT Data File')), atest = false; msg = 'Sets array does not contain ''From MAT Data File'''; end
+        if ~any(strcmpi(io(2).sets, 'From ASCII File')), atest = false; msg = 'Sets array does not contain ''From ASCII File'''; end
+        if ~any(strcmpi(io(2).sets, 'From Complex ASCII File')), atest = false; msg = 'Sets array does not contain ''From Complex ASCII File'''; end
+        if ~any(strcmpi(io(2).sets, 'From Function')), atest = false; msg = 'Sets array does not contain ''From Function'''; end
+        if ~any(strcmpi(io(2).sets, 'From Values')), atest = false; msg = 'Sets array does not contain ''From Values'''; end
+        if ~any(strcmpi(io(2).sets, 'From XY Values')), atest = false; msg = 'Sets array does not contain ''From XY Values''';end
+        if ~any(strcmpi(io(2).sets, 'From Time-series Function')), atest = false; msg = 'Sets array does not contain ''From Time-series Function'''; end
+        if ~any(strcmpi(io(2).sets, 'From XY Function')), atest = false; msg = 'Sets array does not contain ''From XY Function'''; end
+        if ~any(strcmpi(io(2).sets, 'From Frequency-series Function')), atest = false; msg = 'Sets array does not contain ''From Frequency-series Function'''; end
+        if ~any(strcmpi(io(2).sets, 'From Window')), atest = false; msg = 'Sets array does not contain ''From Window'''; end
+        if ~any(strcmpi(io(2).sets, 'From Waveform')), atest = false; msg = 'Sets array does not contain ''From Waveform''';end
+        if ~any(strcmpi(io(2).sets, 'From Polynomial')), atest = false; msg = 'Sets array does not contain ''From Polynomial''';end
+        if ~any(strcmpi(io(2).sets, 'From Pzmodel')), atest = false; msg = 'Sets array does not contain ''From Pzmodel''';end
+        if ~any(strcmpi(io(2).sets, 'From smodel')), atest = false; msg = 'Sets array does not contain ''From smodel''';end
+        if ~any(strcmpi(io(2).sets, 'From pest')), atest = false; msg = 'Sets array does not contain ''From pest''';end
+        if ~any(strcmpi(io(2).sets, 'From Parameter')), atest = false; msg = 'Sets array does not contain ''From Parameter'''; end
+        if numel(io(2).plists) ~= numel(io(2).sets), atest = false; msg = 'Number of plists does not match number of sets'; end
+        %%%%%%%%%%   SET 'Default'
+        % Check key
+        pn = 3;
+        [atest, msg] = checkParamNumber(io, pn, 3);
+        % Check default value
+        % Check options
+        %%%%%%%%%%   SET 'From MAT File'
+        pn = 4;
+        [atest, msg] = checkParamNumber(io, pn, 1);
+        % Check key
+        if ~io(pn).plists.isparam('filename'), atest = false; end
+        % Check default value
+        if ~isEmptyChar(io(pn).plists.find('filename')), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('filename'), {''}), atest = false; end
+        %%%%%%%%%%   SET 'From XML File'
+        pn = 5;
+        [atest, msg] = checkParamNumber(io, pn, 1);
+        % Check key
+        if ~io(pn).plists.isparam('filename'), atest = false; end
+        % Check default value
+        if ~isEmptyChar(io(pn).plists.find('filename')), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('filename'), {''}), atest = false; end
+        %%%%%%%%%%   SET 'From Repository'
+        pn = 6;
+        [atest, msg] = checkParamNumber(io, pn, 7);
+        % Check key
+        if ~io(pn).plists.isparam('hostname'), atest = false; end
+        if ~io(pn).plists.isparam('id'), atest = false; end
+        if ~io(pn).plists.isparam('cid'), atest = false; end
+        if ~io(pn).plists.isparam('database'), atest = false; end
+        if ~io(pn).plists.isparam('binary'), atest = false; end
+        if ~io(pn).plists.isparam('username'), atest = false; end
+        if ~io(pn).plists.isparam('password'), atest = false; end
+        % Check default value
+        if ~isEmptyDouble(io(pn).plists.find('id')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('cid')), atest = false; end
+        if ~isequal(io(pn).plists.find('binary'), 'yes'), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('id'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('cid'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('binary'), {'yes', 'no'}), atest = false; end
+        %%%%%%%%%%   SET 'From Built-in model'
+        pn = 7;
+        [atest, msg] = checkParamNumber(io, pn, 1);
+        % Check key
+        if ~io(pn).plists.isparam('built-in'), atest = false; end
+        % Check default value
+        if ~isEmptyChar(io(pn).plists.find('built-in')), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('built-in'), {''}), atest = false; end
+        %%%%%%%%%%   SET 'From MAT Data File'
+        pn = 8;
+        [atest, msg] = checkParamNumber(io, pn, 9);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('filename'), atest = false; end
+        if ~io(pn).plists.isparam('type'), atest = false; end
+        if ~io(pn).plists.isparam('columns'), atest = false; end
+        if ~io(pn).plists.isparam('xunits'), atest = false; end
+        if ~io(pn).plists.isparam('yunits'), atest = false; end
+        if ~io(pn).plists.isparam('fs'), atest = false; end
+        % Check default value
+        if ~isEmptyChar(io(pn).plists.find('name')), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('description')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('plotinfo')), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('filename')), atest = false; end
+        if ~isequal(io(pn).plists.find('type'), 'cdata'), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('columns')), atest = false; end
+        if ~isequal(io(pn).plists.find('xunits'), 's'), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('yunits')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('fs')), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('name'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('description'), {''}), atest = false; end
+        % not sure how to test this
+        if ~isequal(io(pn).plists.getOptionsForParam('filename'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('type'), {'tsdata', 'fsdata', 'xydata', 'cdata'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('columns'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('xunits'), {'s'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('yunits'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('fs'), {[]}), atest = false; end
+        %%%%%%%%%%   SET 'From ASCII File'
+        pn = 9;
+        [atest, msg] = checkParamNumber(io, pn, 14);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('filename'), atest = false; end
+        if ~io(pn).plists.isparam('type'), atest = false; end
+        if ~io(pn).plists.isparam('columns'), atest = false; end
+        if ~io(pn).plists.isparam('xunits'), atest = false; end
+        if ~io(pn).plists.isparam('t0'), atest = false; end
+        if ~io(pn).plists.isparam('yunits'), atest = false; end
+        if ~io(pn).plists.isparam('comment_char'), atest = false; end
+        if ~io(pn).plists.isparam('maxlines'), atest = false; end
+        if ~io(pn).plists.isparam('fs'), atest = false; end
+        if ~io(pn).plists.isparam('robust'), atest = false; end
+        if ~io(pn).plists.isparam('delimiter'), atest = false; end
+        % Check default value
+        if ~isequal(io(pn).plists.find('name'), ''), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('description')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('plotinfo')), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('filename')), atest = false; end
+        if ~isequal(io(pn).plists.find('type'), 'cdata'), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('columns')), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('xunits')), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('yunits')), atest = false; end
+        if ~isequal(double(time(io(pn).plists.find('t0'))), 0), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('comment_char')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('maxlines')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('fs')), atest = false; end
+        if ~isequal(io(pn).plists.find('robust'), 'no'), atest = false; end
+        if ~isequal(io(pn).plists.find('delimiter'), ''), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('name'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('description'), {''}), atest = false; end
+        % not sure how to test this
+        if ~isequal(io(pn).plists.getOptionsForParam('filename'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('type'), {'tsdata', 'fsdata', 'xydata', 'cdata'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('columns'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('xunits'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('yunits'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('comment_char'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('maxlines'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('fs'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('robust'), {'yes', 'no'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('delimiter'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('t0'), {'1970-01-01 00:00:00.000'}), atest = false; end
+        %%%%%%%%%%   SET 'From Complex ASCII File'
+        pn = 10;
+        [atest, msg] = checkParamNumber(io, pn, 11);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('filename'), atest = false; end
+        if ~io(pn).plists.isparam('complex_type'), atest = false; end
+        if ~io(pn).plists.isparam('t0'), atest = false; end
+        if ~io(pn).plists.isparam('type'), atest = false; end
+        if ~io(pn).plists.isparam('columns'), atest = false; end
+        if ~io(pn).plists.isparam('xunits'), atest = false; end
+        if ~io(pn).plists.isparam('yunits'), atest = false; end
+        if ~io(pn).plists.isparam('comment_char'), atest = false; end
+        % Check default value
+        if ~isEmptyChar(io(pn).plists.find('filename')), atest = false; end
+        if ~strcmp(io(pn).plists.find('complex_type'), 'real/imag'), atest = false; end
+        if ~strcmp(io(pn).plists.find('type'), 'fsdata'), atest = false; end
+        if ~isequal(io(pn).plists.find('columns'), [1 2 3]), atest = false; end
+        if ~isequal(io(pn).plists.find('xunits'), 'Hz'), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('yunits')), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('comment_char')), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('filename'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('complex_type'), { 'real/imag', 'abs/deg', 'dB/deg', 'abs/rad', 'dB/rad'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('type'), {'tsdata', 'fsdata', 'xydata', 'cdata'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('columns'), {[1 2 3]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('xunits'), {'Hz'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('yunits'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('comment_char'), {''}), atest = false; end
+        %%%%%%%%%%   SET 'From Function'
+        pn = 11;
+        [atest, msg] = checkParamNumber(io, pn, 5);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('fcn'), atest = false; end
+        if ~io(pn).plists.isparam('yunits'), atest = false; end
+        % Check default value
+        if ~isEmptyChar(io(pn).plists.find('fcn')), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('yunits')), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('fcn'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('yunits'), {''}), atest = false; end
+        %%%%%%%%%%   SET 'From Values'
+        pn = 12;
+        [atest, msg] = checkParamNumber(io, pn, 6);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('vals'), atest = false; end
+        if ~io(pn).plists.isparam('n'), atest = false; end
+        if ~io(pn).plists.isparam('yunits'), atest = false; end
+        % Check default value
+        if ~isEmptyDouble(io(pn).plists.find('vals')), atest = false; end
+        if ~isequal(io(pn).plists.find('n'), 1), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('yunits')), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('vals'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('n'), {[1]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('yunits'), {''}), atest = false; end
+        %%%%%%%%%%   SET 'From XY Values'
+        pn = 13;
+        [atest, msg] = checkParamNumber(io, pn, 11);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('type'), atest = false; end
+        if ~io(pn).plists.isparam('fs'), atest = false; end
+        if ~io(pn).plists.isparam('t0'), atest = false; end
+        if ~io(pn).plists.isparam('toffset'), atest = false; end
+        if ~io(pn).plists.isparam('xvals'), atest = false; end
+        if ~io(pn).plists.isparam('yvals'), atest = false; end
+        if ~io(pn).plists.isparam('xunits'), atest = false; end
+        if ~io(pn).plists.isparam('yunits'), atest = false; end
+        if ~io(pn).plists.isparam('t0'), atest = false; end
+        % Check default value
+        if ~isequal(io(pn).plists.find('type'), ''), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('fs')), atest = false; end
+        if ~isequal(double(time(io(pn).plists.find('t0'))), 0), atest = false; end
+        if ~isequal(io(pn).plists.find('toffset'), 0), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('xvals')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('yvals')), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('xunits')), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('yunits')), atest = false; end
+        if ~isequal(io(pn).plists.find('t0'), '1970-01-01 00:00:00.000'), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('type'), {'', 'tsdata', 'fsdata', 'xydata', 'cdata'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('fs'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('xvals'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('yvals'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('xunits'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('yunits'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('t0'), {'1970-01-01 00:00:00.000'}), atest = false; end
+        %%%%%%%%%%   SET 'From Time-series Function'
+        pn = 14;
+        [atest, msg] = checkParamNumber(io, pn, 9);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('tsfcn'), atest = false; end
+        if ~io(pn).plists.isparam('fs'), atest = false; end
+        if ~io(pn).plists.isparam('nsecs'), atest = false; end
+        if ~io(pn).plists.isparam('t0'), atest = false; end
+        if ~io(pn).plists.isparam('xunits'), atest = false; end
+        if ~io(pn).plists.isparam('yunits'), atest = false; end
+        % Check default value
+        if ~isequal(io(pn).plists.find('tsfcn'), 't'), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('fs')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('nsecs')), atest = false; end
+        if ~isequal(double(time(io(pn).plists.find('t0'))), 0), atest = false; end
+        if ~isequal(io(pn).plists.find('xunits'), 's'), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('yunits')), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('tsfcn'), {'t'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('fs'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('nsecs'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('t0'), {'1970-01-01 00:00:00.000'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('xunits'), {'s'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('yunits'), {''}), atest = false; end
+        %%%%%%%%%%   SET 'From XY Function'
+        pn = 15;
+        [atest, msg] = checkParamNumber(io, pn, 7);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('xyfcn'), atest = false; end
+        if ~io(pn).plists.isparam('x'), atest = false; end
+        if ~io(pn).plists.isparam('xunits'), atest = false; end
+        if ~io(pn).plists.isparam('yunits'), atest = false; end
+        % Check default value
+        if ~isequal(io(pn).plists.find('xyfcn'), 'x'), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('x')), atest = false; end
+        if ~isequal(io(pn).plists.find('xunits'), ''), atest = false; end
+        if ~isequal(io(pn).plists.find('yunits'), ''), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('xyfcn'), {'x'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('x'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('xunits'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('yunits'), {''}), atest = false; end
+        %%%%%%%%%%   SET 'From Frequency-series Function'
+        pn = 16;
+        [atest, msg] = checkParamNumber(io, pn, 11);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('fsfcn'), atest = false; end
+        if ~io(pn).plists.isparam('f1'), atest = false; end
+        if ~io(pn).plists.isparam('f2'), atest = false; end
+        if ~io(pn).plists.isparam('nf'), atest = false; end
+        if ~io(pn).plists.isparam('scale'), atest = false; end
+        if ~io(pn).plists.isparam('f'), atest = false; end
+        if ~io(pn).plists.isparam('xunits'), atest = false; end
+        if ~io(pn).plists.isparam('yunits'), atest = false; end
+        % Check default value
+        if ~isequal(io(pn).plists.find('fsfcn'), 'f'), atest = false; end
+        if ~isequal(io(pn).plists.find('f1'), 1e-9), atest = false; end
+        if ~isequal(io(pn).plists.find('f2'), 10000), atest = false; end
+        if ~isequal(io(pn).plists.find('nf'), 1e3), atest = false; end
+        if ~isequal(io(pn).plists.find('scale'), 'log'), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('f')), atest = false; end
+        if ~isequal(io(pn).plists.find('xunits'), 'Hz'), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('yunits')), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('fsfcn'), {'f'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('f1'), {1e-9}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('f2'), {1e4}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('nf'), {1e3}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('scale'), {'lin', 'log'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('f'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('xunits'), {'Hz'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('yunits'), {''}), atest = false; end
+        %%%%%%%%%%   SET 'From Window'
+        pn = 17;
+        [atest, msg] = checkParamNumber(io, pn, 8);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('win'), atest = false; end
+        if ~io(pn).plists.isparam('length'), atest = false; end
+        if ~io(pn).plists.isparam('psll'), atest = false; end
+        if ~io(pn).plists.isparam('levelorder'), atest = false; end
+        if ~io(pn).plists.isparam('yunits'), atest = false; end
+        % Check default value
+        if ~strcmpi(io(pn).plists.find('win'), char(prefs.getMiscPrefs.getDefaultWindow)), atest = false; end
+        if ~isequal(io(pn).plists.find('yunits'), ''), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('win'), specwin.getTypes), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('yunits'), {''}), atest = false; end
+        %%%%%%%%%%   SET 'From Waveform'
+        pn = 18;
+        [atest, msg] = checkParamNumber(io, pn, 22);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('waveform'), atest = false; end
+        if ~io(pn).plists.isparam('a'), atest = false; end
+        if ~io(pn).plists.isparam('f'), atest = false; end
+        if ~io(pn).plists.isparam('phi'), atest = false; end
+        if ~io(pn).plists.isparam('toff'), atest = false; end
+        if ~io(pn).plists.isparam('gaps'), atest = false; end
+        if ~io(pn).plists.isparam('type'), atest = false; end
+        if ~io(pn).plists.isparam('sigma'), atest = false; end
+        if ~io(pn).plists.isparam('f0'), atest = false; end
+        if ~io(pn).plists.isparam('f1'), atest = false; end
+        if ~io(pn).plists.isparam('t1'), atest = false; end
+        if ~io(pn).plists.isparam('bw'), atest = false; end
+        if ~io(pn).plists.isparam('duty'), atest = false; end
+        if ~io(pn).plists.isparam('width'), atest = false; end
+        if ~io(pn).plists.isparam('fs'), atest = false; end
+        if ~io(pn).plists.isparam('nsecs'), atest = false; end
+        if ~io(pn).plists.isparam('t0'), atest = false; end
+        if ~io(pn).plists.isparam('xunits'), atest = false; end
+        if ~io(pn).plists.isparam('yunits'), atest = false; end
+        % Check default value
+        if ~isequal(io(pn).plists.find('waveform'), 'sine wave'), atest = false; end
+        if ~isequal(io(pn).plists.find('a'), 1), atest = false; end
+        if ~isequal(io(pn).plists.find('f'), 1), atest = false; end
+        if ~isequal(io(pn).plists.find('phi'), 0), atest = false; end
+        if ~isequal(io(pn).plists.find('toff'), 0), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('gaps')), atest = false; end
+        if ~isequal(io(pn).plists.find('type'), 'Normal'), atest = false; end
+        if ~isequal(io(pn).plists.find('sigma'), 1), atest = false; end
+        if ~isequal(io(pn).plists.find('f0'), 1), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('f1')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('t1')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('bw')), atest = false; end
+        if ~isequal(io(pn).plists.find('duty'), 50), atest = false; end
+        if ~isequal(io(pn).plists.find('width'), 0.5), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('fs')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('nsecs')), atest = false; end
+        if ~isequal(double(time(io(pn).plists.getOptionsForParam('t0'))), 0), atest = false; end        
+        if ~isequal(io(pn).plists.find('xunits'), 's'), atest = false; end
+        if ~isequal(io(pn).plists.find('yunits'), ''), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('waveform'), {'sine wave', 'noise', 'chirp', 'gaussian pulse', 'square wave', 'sawtooth'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('a'), {1}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('f'), {1}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('phi'), {0}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('toff'), {0}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('gaps'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('type'), {'Normal', 'Uniform'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('sigma'), {1}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('f0'), {1}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('f1'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('t1'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('bw'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('duty'), {50}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('width'), {0.5}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('fs'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('nsecs'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('t0'), {'1970-01-01 00:00:00.000'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('xunits'), {'s'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('yunits'), {''}), atest = false; end
+        %%%%%%%%%%   SET 'From Polynomial'
+        pn = 19;
+        [atest, msg] = checkParamNumber(io, pn, 13);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('polyval'), atest = false; end
+        if ~io(pn).plists.isparam('nsecs'), atest = false; end
+        if ~io(pn).plists.isparam('fs'), atest = false; end
+        if ~io(pn).plists.isparam('t0'), atest = false; end
+        if ~io(pn).plists.isparam('t'), atest = false; end
+        if ~io(pn).plists.isparam('x'), atest = false; end
+        if ~io(pn).plists.isparam('f'), atest = false; end
+        if ~io(pn).plists.isparam('type'), atest = false; end
+        if ~io(pn).plists.isparam('xunits'), atest = false; end
+        if ~io(pn).plists.isparam('yunits'), atest = false; end
+        % Check default value
+        if ~isEmptyDouble(io(pn).plists.find('polyval')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('nsecs')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('fs')), atest = false; end
+        if ~isequal(io(pn).plists.find('t0'), '1970-01-01 00:00:00.000'), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('t')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('x')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('f')), atest = false; end
+        if ~isequal(io(pn).plists.find('type'), 'tsdata'), atest = false; end
+        if ~isequal(io(pn).plists.find('xunits'), 's'), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('yunits')), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('polyval'), {''}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('nsecs'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('fs'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('t0'), {'1970-01-01 00:00:00.000'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('t'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('x'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('f'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('type'), {'tsdata', 'fsdata', 'xydata', 'cdata'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('xunits'), {'s'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('yunits'), {''}), atest = false; end
+        %%%%%%%%%%   SET 'From Pzmodel'
+        pn = 20;
+        [atest, msg] = checkParamNumber(io, pn, 9);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('pzmodel'), atest = false; end
+        if ~io(pn).plists.isparam('nsecs'), atest = false; end
+        if ~io(pn).plists.isparam('fs'), atest = false; end
+        if ~io(pn).plists.isparam('t0'), atest = false; end
+        if ~io(pn).plists.isparam('xunits'), atest = false; end
+        if ~io(pn).plists.isparam('yunits'), atest = false; end
+        % Check default value
+        if ~eq(io(pn).plists.find('pzmodel'), pzmodel(), ple1), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('nsecs')), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('fs')), atest = false; end
+        if ~isequal(io(pn).plists.find('t0'), '1970-01-01 00:00:00.000'), atest = false; end
+        if ~isequal(io(pn).plists.find('xunits'), 's'), atest = false; end
+        if ~isEmptyChar(io(pn).plists.find('yunits')), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('nsecs'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('fs'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('t0'), {'1970-01-01 00:00:00.000'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('xunits'), {'s'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('yunits'), {''}), atest = false; end
+        %%%%%%%%%%   SET 'From smodel'
+        pn = 21;
+        [atest, msg] = checkParamNumber(io, pn, 7);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('model'), atest = false; end
+        if ~io(pn).plists.isparam('xunits'), atest = false; end
+        if ~io(pn).plists.isparam('x'), atest = false; end
+        if ~io(pn).plists.isparam('type'), atest = false; end
+        % Check default value
+        if ~eq(io(pn).plists.find('model'), smodel(), ple1), atest = false; end
+        if ~isequal(io(pn).plists.find('xunits'), 's'), atest = false; end
+        if ~isEmptyDouble(io(pn).plists.find('x')), atest = false; end
+        if ~isequal(io(pn).plists.find('type'), 'tsdata'), atest = false; end
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('xunits'), {'s'}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('x'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('type'), {'tsdata', 'fsdata', 'xydata', 'cdata'}), atest = false; end
+        
+        %%%%%%%%%%   SET 'From pest'        
+        pn = 22;
+        [atest, msg] = checkParamNumber(io, pn, 5);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('pest'), atest = false; end
+        if ~io(pn).plists.isparam('parameter'), atest = false; end                
+        % Check default value
+        if ~eq(io(pn).plists.find('pest'), []), atest = false; end
+        if ~isequal(io(pn).plists.find('parameter'), ''), atest = false; end                
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('pest'), {[]}), atest = false; end
+        if ~isequal(io(pn).plists.getOptionsForParam('parameter'), {''}), atest = false; end        
+        %%%%%%%%%%   SET 'From Parameter'
+        pn = 23;
+        [atest, msg] = checkParamNumber(io, pn, 5);
+        % Check key
+        if ~io(pn).plists.isparam('name'), atest = false; end
+        if ~io(pn).plists.isparam('plotinfo'), atest = false; end
+        if ~io(pn).plists.isparam('description'), atest = false; end
+        if ~io(pn).plists.isparam('parameter'), atest = false; end
+        if ~io(pn).plists.isparam('key'), atest = false; end                
+        % Check default value
+        if ~isEmptyChar(io(pn).plists.find('parameter')), atest = false; end                
+        if ~isEmptyChar(io(pn).plists.find('key')), atest = false; end                
+        % Check options
+        if ~isequal(io(pn).plists.getOptionsForParam('parameter'), {''}), atest = false; end        
+        if ~isequal(io(pn).plists.getOptionsForParam('key'), {''}), atest = false; end        
+      end
+      % </AlgoCode>
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename, msg);
+  end % END UTP_01
+  
+  % check parameter number
+  function [atest, msg] = checkParamNumber(sets, setNum, paramNum)
+    atest = true;
+    msg = '';
+    if sets(setNum).plists.nparams ~= paramNum
+      atest = false; 
+      msg = sprintf('Set %d plist does not have %d parameters', setNum, paramNum); 
+    end
+  end
+  
+  %% UTP_08
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the
+  % ASCII-file constructor.
+  %
+  % </TestDescription>
+  function result = utp_08
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    try
+      % <SyntaxCode>
+      fs    = 5;
+      Nsecs = 2;
+      t     = linspace(0, Nsecs-1/fs, Nsecs*fs);
+      x     = randn(1,Nsecs*fs) + 2*sin(2*pi*45.*t);
+      out   = [t;x].';
+      
+      %---- Save data as ascii file
+      name = 'data';
+      filename1 = sprintf('%s.txt', name);
+      save(filename1, 'out', '-ASCII', '-DOUBLE', '-TABS');
+      filename2 = sprintf('%s.dat', name);
+      save(filename2, 'out', '-ASCII', '-DOUBLE', '-TABS');
+      
+      out1 = ao(filename1);
+      out2 = ao(filename2);
+      mout1 = rebuild(out1);
+      mout2 = rebuild(out2);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    % 2) Check that the rebuilt objects are the same as 'out1' and 'ouit2'
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out1.hist.methodInfo.mname, 'ao'), atest = false; end
+      if ~strcmp(out2.hist.methodInfo.mname, 'ao'), atest = false; end
+      % Check that the data-object is a cdata-object
+      if ~isa(out1.data, 'cdata'), atest = false; end
+      if ~isa(out2.data, 'cdata'), atest = false; end
+      % Check that output contains the right values
+      if ~isequal(out1.data.getY, out), atest = false; end
+      if ~isequal(out2.data.getY, out), atest = false; end
+      % Check the rebuilt object
+      if ~eq(mout1, out1, ple1), atest = false; end
+      if ~eq(mout2, out2, ple1), atest = false; end
+      % </AlgoCode>
+      % delete test file
+      delete(filename1);
+      delete(filename2);
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename);
+  end % END UTP_08
+  
+  
+  %% UTP_09
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the complex
+  % ASCII-file constructor.
+  %
+  % </TestDescription>
+  function result = utp_09
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    try
+      % <SyntaxCode>
+      a1 = ao(1:123, randn(123,1)+randn(123,1)*1i, plist('type', 'fsdata'));
+      filename1 = 'complex1.txt';
+      filename2 = 'complex2.txt';
+      filename3 = 'complex3.txt';
+      filename4 = 'complex4.txt';
+      filename5 = 'complex5.txt';
+      
+      %---- Save: f, real, imag
+      export1 = [a1.x real(a1.y) imag(a1.y)];
+      save(filename1, 'export1', '-ASCII', '-DOUBLE', '-TABS');
+      %---- Save: f, abs, deg
+      export2 = [a1.x abs(a1.y) (180/pi) * (angle(a1.y))];
+      save(filename2, 'export2', '-ASCII', '-DOUBLE', '-TABS');
+      %---- Save: f, abs, rad
+      export3 = [a1.x abs(a1.y) angle(a1.y)];
+      save(filename3, 'export3', '-ASCII', '-DOUBLE', '-TABS');
+      %---- Save: f, dB, deg
+      export4 = [a1.x 20.*log10(abs(a1.y)) (180/pi) * (angle(a1.y))];
+      save(filename4, 'export4', '-ASCII', '-DOUBLE', '-TABS');
+      %---- Save: f, dB, rad
+      export5 = [a1.x angle(a1.y) 20.*log10(abs(a1.y)) angle(a1.y) 20.*log10(abs(a1.y)) angle(a1.y) 20.*log10(abs(a1.y))];
+      save(filename5, 'export5', '-ASCII', '-DOUBLE', '-TABS');
+      
+      out1 = ao(filename1, plist('complex_type', 'real/imag'));
+      out2 = ao(filename2, plist('complex_type', 'abs/deg'));
+      out3 = ao(filename3, plist('complex_type', 'abs/rad'));
+      out4 = ao(filename4, plist('complex_type', 'dB/deg'));
+      out5 = ao(filename5, plist('complex_type', 'dB/rad', 'columns', [1 7 4]));
+      
+      mout1 = rebuild(out1);
+      mout2 = rebuild(out2);
+      mout3 = rebuild(out3);
+      mout4 = rebuild(out4);
+      mout5 = rebuild(out5);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    % 2) Check that the read data are correct
+    % 3) Check that the rebuilt object is the same as in 'out1..5'
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    TOL   = 1e-14;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out1.hist.methodInfo.mname, 'ao'), atest = false; end
+      if ~strcmp(out2.hist.methodInfo.mname, 'ao'), atest = false; end
+      if ~strcmp(out3.hist.methodInfo.mname, 'ao'), atest = false; end
+      if ~strcmp(out4.hist.methodInfo.mname, 'ao'), atest = false; end
+      if ~strcmp(out5.hist.methodInfo.mname, 'ao'), atest = false; end
+      % Check that output contains the correct values
+      % 'out1' -> f, real, imag
+      if ~isequal(out1.x, a1.x), atest = false; end
+      if any(abs(out1.y - a1.y) > TOL), atest = false; end
+      % 'out2' -> f, abs, deg
+      if ~isequal(out2.x, a1.x), atest = false; end
+      if any(abs(out2.y - a1.y) > TOL), atest = false; end
+      % 'out3' -> f, abs, rad
+      if ~isequal(out3.x, a1.x), atest = false; end
+      if any(abs(out3.y - a1.y) > TOL), atest = false; end
+      % 'out4' -> f, dB, deg
+      if ~isequal(out4.x, a1.x), atest = false; end
+      if any(abs(out4.y - a1.y) > TOL), atest = false; end
+      % 'out5' -> f, dB, rad
+      if ~isequal(out5.x, a1.x), atest = false; end
+      if any(abs(out5.y - a1.y) > TOL), atest = false; end
+      % Check the re-built objects
+      if ~eq(mout1, out1, ple2), atest = false; end
+      if ~eq(mout2, out2, ple2), atest = false; end
+      if ~eq(mout3, out3, ple2), atest = false; end
+      if ~eq(mout4, out4, ple2), atest = false; end
+      if ~eq(mout5, out5, ple2), atest = false; end
+      % </AlgoCode>
+      % delete test file
+      delete(filename1);
+      delete(filename2);
+      delete(filename3);
+      delete(filename4);
+      delete(filename5);
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename);
+  end % END UTP_09
+  
+  %% UTP_13
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the vals constructor.
+  %
+  % </TestDescription>
+  function result = utp_13
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    try
+      % <SyntaxCode>
+      vals = [1 2 3 4 5; 1 2 3 4 5];
+      out  = ao(vals);
+      mout = rebuild(out);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    % 2) Check that the rebuilt object is the same as 'out'.
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out.hist.methodInfo.mname, 'ao'), atest = false; end
+      % Check the rebuilt object
+      if ~eq(mout, out, ple1), atest = false; end
+      % </AlgoCode>
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename);
+  end % END UTP_13
+  
+  %% UTP_15
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the plist(fcn) constructor.
+  %
+  % </TestDescription>
+  function result = utp_15
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    try
+      % <SyntaxCode>
+      fcn = 'complex(randn(100,1), randn(100,1))';
+      out = ao(plist('fcn', fcn));
+      mout = rebuild(out);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    % 2) Check that the rebuilt object is the same as 'out'.
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out.hist.methodInfo.mname, 'ao'), atest = false; end
+      % Check values of the AO
+      if isreal(out.data.getY), atest = false; end
+      % Check the rebuilt object
+      if ~eq(mout, out, ple1), atest = false; end
+      % </AlgoCode>
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename);
+  end % END UTP_15
+  
+  
+  %% UTP_16
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the plist(vals) constructor.
+  %
+  % </TestDescription>
+  function result = utp_16
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    try
+      % <SyntaxCode>
+      vals = [1 2 3 4 5; 6 7 8 9 0];
+      out  = ao(plist('vals', vals));
+      mout = rebuild(out);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    % 2) Check that the rebuilt object is the same as 'out'.
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out.hist.methodInfo.mname, 'ao'), atest = false; end
+      % Check values of the AO
+      if ~eq(out.data.getY, vals), atest = false; end
+      % Check the rebuilt object
+      if ~eq(mout, out, ple1), atest = false; end
+      % </AlgoCode>
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename);
+  end % END UTP_16
+  
+  
+  %% UTP_17
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the plist(x/y-vals) constructor.
+  %
+  % </TestDescription>
+  function result = utp_17
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    try
+      % <SyntaxCode>
+      xvals = 0:99;
+      yvals = randn(100,1);
+      out  = ao(plist('xvals', xvals, 'yvals', yvals));
+      mout = rebuild(out);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    % 2) Check that the rebuilt object is the same as 'out'.
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out.hist.methodInfo.mname, 'ao'), atest = false; end
+      % Check values of the AO
+      if ~eq(out.data.getX, xvals'), atest = false; end
+      if ~eq(out.data.getY, yvals),  atest = false; end
+      % Check the rebuilt object
+      if ~eq(mout, out, ple1), atest = false; end
+      % </AlgoCode>
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename);
+  end % END UTP_17
+  
+  
+  %% UTP_18
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the plist(tsfcn) constructor.
+  %
+  % </TestDescription>
+  function result = utp_18
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    try
+      % <SyntaxCode>
+      tsfcn = 'sin(2*pi*7.433*t) + randn(size(t))';
+      out  = ao(plist('tsfcn', tsfcn, 'nsecs', 10, 'fs', 12.3));
+      mout = rebuild(out);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    % 2) Check that the rebuilt object is the same as 'out'.
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out.hist.methodInfo.mname, 'ao'), atest = false; end
+      % Check the rebuilt object
+      if ~eq(mout, out, ple1), atest = false; end
+      % </AlgoCode>
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename);
+  end % END UTP_18
+  
+  
+  %% UTP_19
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the plist(fsfcn) constructor.
+  %
+  % </TestDescription>
+  function result = utp_19
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    try
+      % <SyntaxCode>
+      fsfcn1 = '1e-15.*(1e-3./f.^2 + 1e-10./f.^4)';
+      fsfcn2 = '1./f.^2';
+      out1 = ao(plist('fsfcn', fsfcn1, 'nf', 100));
+      out2 = ao(plist('fsfcn', fsfcn2, 'nf', 100, 'scale', 'lin'));
+      mout1 = rebuild(out1);
+      mout2 = rebuild(out2);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    % 2) Check that the rebuilt objects are the same as 'out1' and 'out2'
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out1.hist.methodInfo.mname, 'ao'), atest = false; end
+      if ~strcmp(out2.hist.methodInfo.mname, 'ao'), atest = false; end
+      % Check the rebuilt object
+      if ~eq(mout1, out1, ple1), atest = false; end
+      if ~eq(mout2, out2, ple1), atest = false; end
+      % </AlgoCode>
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename);
+  end % END UTP_19
+  
+  
+  %% UTP_20
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the plist(win) constructor.
+  %
+  % </TestDescription>
+  function result = utp_20
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    msg = '';
+    try
+      % <SyntaxCode>
+      win  = specwin('Hamming', 10);
+      out1  = ao(plist('win', win));
+      mout1 = rebuild(out1);
+      out2  = ao(plist('win', 'Kaiser', 'length', 53, 'psll', 75));
+      mout2 = rebuild(out2);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      msg = err.message;
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to 'ao'.
+    % 2) Check that the rebuilt object is the same as 'out'.
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out1.hist.methodInfo.mname, 'ao'), atest = false; msg = 'last history step is not an ao constructor'; end
+      if ~strcmp(out2.hist.methodInfo.mname, 'ao'), atest = false; msg = 'last history step is not an ao constructor'; end
+      % Check data values
+      if ~isequal(win.win.', out1.data.getY), atest = false; msg = 'Window values are different when rebuilt'; end
+      % Check the rebuilt object
+      if ~eq(mout1, out1, ple1), atest = false; msg = '1st rebuilt object is different'; end
+      if ~eq(mout2, out2, ple1), atest = false; msg = '2nd rebuilt object is different'; end
+      % </AlgoCode>
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename, msg);
+  end % END UTP_20
+  
+  
+  %% UTP_21
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the plist(waveform) constructor.
+  %
+  % </TestDescription>
+  function result = utp_21
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    try
+      % <SyntaxCode>
+      nsecs = 10;
+      fs    = 10;
+      % Sine wave
+      pl_sin = plist('nsecs', nsecs, 'fs', fs, 'waveform', 'sine wave' , 'phi', 30, 'f', 1.23);
+      % Noise normal
+      pl_noise_norm = plist('nsecs', nsecs, 'fs', fs, 'waveform', 'noise' , 'type', 'Normal');
+      % Noise uniform
+      pl_noise_uni = plist('nsecs', nsecs, 'fs', fs, 'waveform', 'noise' , 'type', 'Uniform');
+      % Chirp
+      pl_chirp = plist('nsecs', nsecs, 'fs', fs, 'waveform', 'chirp' , 'f0', 1, 'f1', 50, 't1', 100);
+      % Gaussian pulse
+      pl_gauss = plist('nsecs', nsecs, 'fs', fs, 'waveform', 'Gaussian pulse' , 'f0', 10, 'bw', 100);
+      % Square wave
+      pl_square = plist('nsecs', nsecs, 'fs', fs, 'waveform', 'Square wave' , 'f', 1, 'duty', 50);
+      % Sawtooth
+      pl_saw = plist('nsecs', nsecs, 'fs', fs, 'waveform', 'Sawtooth' , 'width', 0.5, 'f', 1);
+      out_sin    = ao(pl_sin);
+      out_nn     = ao(pl_noise_norm);
+      out_nu     = ao(pl_noise_uni);
+      out_chirp  = ao(pl_chirp);
+      out_gauss  = ao(pl_gauss);
+      out_square = ao(pl_square);
+      out_saw    = ao(pl_saw);
+      
+      mout_sin    = rebuild(out_sin);
+      mout_nn     = rebuild(out_nn);
+      mout_nu     = rebuild(out_nu);
+      mout_chirp  = rebuild(out_chirp);
+      mout_gauss  = rebuild(out_gauss);
+      mout_square = rebuild(out_square);
+      mout_saw    = rebuild(out_saw);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    % 2) Check that the rebuilt objects are the same as 'out_...'.
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out_sin.hist.methodInfo.mname,    'ao'), atest = false; end
+      if ~strcmp(out_nn.hist.methodInfo.mname,     'ao'), atest = false; end
+      if ~strcmp(out_nu.hist.methodInfo.mname,     'ao'), atest = false; end
+      if ~strcmp(out_chirp.hist.methodInfo.mname,  'ao'), atest = false; end
+      if ~strcmp(out_gauss.hist.methodInfo.mname,  'ao'), atest = false; end
+      if ~strcmp(out_square.hist.methodInfo.mname, 'ao'), atest = false; end
+      if ~strcmp(out_saw.hist.methodInfo.mname,    'ao'), atest = false; end
+      % Check the rebuilt object
+      if ~eq(mout_sin, out_sin,       ple1), atest = false; end
+      if ~eq(mout_nn, out_nn,         ple1), atest = false; end
+      if ~eq(mout_nu, out_nu,         ple1), atest = false; end
+      if ~eq(mout_chirp, out_chirp,   ple1), atest = false; end
+      if ~eq(mout_gauss, out_gauss,   ple1), atest = false; end
+      if ~eq(mout_square, out_square, ple1), atest = false; end
+      if ~eq(mout_saw, out_saw,       ple1), atest = false; end
+      % </AlgoCode>
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename);
+  end % END UTP_21
+  
+  
+  
+  %% UTP_23
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the plist(polynomial) constructor.
+  %
+  % </TestDescription>
+  function result = utp_23
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    try
+      % <SyntaxCode>
+      fs    = 10;
+      Nsecs = 20;
+      coeffs = ao([2 0 1]);
+      out1  = ao(plist('polyval', coeffs, 'fs', fs, 'Nsecs', Nsecs));
+      out2  = ao(plist('polyval', coeffs.y, 'fs', fs, 'Nsecs', Nsecs));
+      mout1 = rebuild(out1);
+      mout2 = rebuild(out2);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    % 2) Check that the rebuilt object is the same as 'out'.
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out1.hist.methodInfo.mname, 'ao'), atest = false; end
+      if ~strcmp(out2.hist.methodInfo.mname, 'ao'), atest = false; end
+      % Check data values
+      t = [0 : 1/fs : Nsecs-1/fs].';
+      y = polyval(coeffs.y,t);
+      if ~isequal(out1.data.getY, y), atest = false; end
+      if ~isequal(out2.data.getY, y), atest = false; end
+      if ~isequal(out1.data.getX, t), atest = false; end
+      if ~isequal(out2.data.getX, t), atest = false; end
+      % Check the rebuilt object
+      if ~eq(mout1, out1, ple1), atest = false; end
+      if ~eq(mout2, out2, ple1), atest = false; end
+      % </AlgoCode>
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename);
+  end % END UTP_23
+  
+  
+  %% UTP_25
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the plist(specwin) constructor.
+  % Tests that the ao method properly uses the specwin values.
+  %
+  % </TestDescription>
+  function result = utp_25
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+
+    stest = true;
+    atest = true;
+    msg = '';
+      
+    % Test Kaiser window
+    try
+      % <SyntaxCode>
+      win  = specwin('kaiser', randi(1000, 1), 10);
+      out  = ao(win);
+      mout = rebuild(out);
+      % </SyntaxCode>
+    catch err
+      disp(err.message)
+      msg = err.message;
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    % 2) Check that the object contains the same data as the window.
+    % 3) Check that the rebuilt object is the same as 'out'.
+    %
+    % </AlgoDescription>
+    
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out.hist.methodInfo.mname, 'ao'), msg = 'last history step is not the ao constructor'; atest = false; end
+      % Check data values
+      if ~isequal(win.win', out.data.getY), msg = 'window values are different in the resulting ao'; atest = false; end
+      % Check the rebuilt object
+      if ~eq(mout, out, ple1), msg = ['the rebuilt object is not the same as the original: ' lastwarn]; atest = false; end
+      % </AlgoCode>
+    else
+      atest = false;
+    end
+    
+    win_list = specwin.getTypes;
+      
+    % Test standard windows
+    for kk = 1:numel(win_list)-2
+      try
+        % <SyntaxCode>
+        win  = specwin(win_list{kk}, randi(1000, 1));
+        out  = ao(win);
+        mout = rebuild(out);
+        % </SyntaxCode>
+        
+      catch err
+        disp(err.message)
+        msg = err.message;
+        stest = false;
+      end
+      
+      % <AlgoDescription>
+      %
+      % 1) Check that the last entry in the history of 'out' corresponds to
+      %    'ao'.
+      % 2) Check that the object contains the same data as the window.
+      % 3) Check that the rebuilt object is the same as 'out'.
+      %
+      % </AlgoDescription>
+      
+      if stest
+        % <AlgoCode>
+        % Check the last step in the history of 'out'
+        if ~strcmp(out.hist.methodInfo.mname, 'ao'), msg = 'last history step is not the ao constructor'; atest = false; end
+        % Check data values
+        if ~isequal(win.win', out.data.getY), msg = 'window values are different in the resulting ao'; atest = false; end
+        % Check the rebuilt object
+        if ~eq(mout, out, ple1), msg = ['the rebuilt object is not the same as the original: ' lastwarn]; atest = false; end
+        % </AlgoCode>
+      else
+        atest = false;
+      end
+      
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename, msg);
+  end % END UTP_25
+  
+  
+  %% UTP_26
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the data-object constructor.
+  %
+  % </TestDescription>
+  function result = utp_26
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    try
+      % <SyntaxCode>
+      y = randn(100,1);
+      m = randn(3,2);
+      
+      out1 = ao(cdata(m));
+      out2 = ao(fsdata(y));
+      out3 = ao(tsdata(y));
+      out4 = ao(xydata(y));
+      out5 = ao(xyzdata);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out1.hist.methodInfo.mname, 'ao'), atest = false; end
+      if ~strcmp(out2.hist.methodInfo.mname, 'ao'), atest = false; end
+      if ~strcmp(out3.hist.methodInfo.mname, 'ao'), atest = false; end
+      if ~strcmp(out4.hist.methodInfo.mname, 'ao'), atest = false; end
+      if ~strcmp(out5.hist.methodInfo.mname, 'ao'), atest = false; end
+      % Check data values
+      if ~isa(out1.data, 'cdata'), atest = false; end
+      if ~isa(out2.data, 'fsdata'), atest = false; end
+      if ~isa(out3.data, 'tsdata'), atest = false; end
+      if ~isa(out4.data, 'xydata'), atest = false; end
+      if ~isa(out5.data, 'xyzdata'), atest = false; end
+      if ~eq(out1.data.getY, m), atest = false; end
+      if ~eq(out2.data.getY, y), atest = false; end
+      if ~eq(out3.data.getY, y), atest = false; end
+      if ~eq(out4.data.getY, y), atest = false; end
+      % </AlgoCode>
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename);
+  end % END UTP_26
+  
+  %% UTP_28
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the x-vector, y-vector constructor.
+  %
+  % </TestDescription>
+  function result = utp_28
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    try
+      % <SyntaxCode>
+      x = 0:99;
+      y = randn(100,1);
+      
+      out  = ao(x, y);
+      mout = rebuild(out);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    % 2) Check that the rebuilt object is the same as 'out'.
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out.hist.methodInfo.mname, 'ao'), atest = false; end
+      % Check data values
+      if ~eq(out.data.getX, x'), atest = false; end
+      if ~eq(out.data.getY, y), atest = false; end
+      % Check the rebuilt object
+      if ~eq(mout, out, ple1), atest = false; end
+      % </AlgoCode>
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename);
+  end % END UTP_28
+  
+  
+  %% UTP_29
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the filename +
+  % plist constructor.
+  %
+  % </TestDescription>
+  function result = utp_29
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    try
+      % <SyntaxCode>
+      %---- Make test file
+      fs    = 10;
+      Nsecs = 10;
+      t     = linspace(0, Nsecs-1/fs, Nsecs*fs);
+      x1    = randn(1,Nsecs*fs) + 2*sin(2*pi*45.*t);
+      x2    = randn(1,Nsecs*fs) + 2*sin(2*pi*45.*t);
+      
+      %---- Save data as ascii file
+      filename = 'data.txt';
+      fd = fopen(filename, 'w+');
+      % write header
+      fprintf(fd, '// A comment that should be read appropriately.\n');
+      fprintf(fd, '// \n');
+      fprintf(fd, '// M Hewitson\n');
+      % write data
+      for j=1:length(t)
+        fprintf(fd, '%.17g\t%.17g\t%.17g\n', t(j), x1(j), x2(j));
+      end
+      % close file
+      fclose(fd);
+      
+      desc   = 'ao from filename';
+      xunits = 's';
+      yunits = 'V';
+      
+      pl = plist(...
+        'description', desc,...
+        'type', 'tsdata', ...
+        'xunits', xunits, ...
+        'yunits', yunits, ...
+        'columns', [1 2 1 3], ...
+        'comment_char', '//');
+      
+      out  = ao(filename, pl);
+      mout = rebuild(out);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    % 2) Check that the rebuilt object is the same as 'out'.
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out(1).hist.methodInfo.mname, 'ao'), atest = false; end
+      if ~strcmp(out(2).hist.methodInfo.mname, 'ao'), atest = false; end
+      % Check data values
+      if ~isa(out(1).data, 'tsdata'),  atest = false; end
+      if ~isa(out(2).data, 'tsdata'),  atest = false; end
+      if  any(abs(out(1).data.getX - t.') > TOL),  atest = false; end
+      if ~isequal(out(1).data.getY, x1.'), atest = false; end
+      if  any(abs(out(2).data.getX - t.') > TOL),  atest = false; end
+      if ~isequal(out(2).data.getY, x2.'), atest = false; end
+      % Check the rebuilt object
+      if ~eq(mout, out, ple1), atest = false; end
+      % </AlgoCode>
+      delete(filename);
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename);
+  end % END UTP_29
+  
+  
+  %% UTP_30
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the filename +
+  % plist constructor.
+  %
+  % </TestDescription>
+  function result = utp_30
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    try
+      % <SyntaxCode>
+      %---- Make test file
+      fs    = 10;
+      Nsecs = 10;
+      t     = linspace(0, Nsecs-1/fs, Nsecs*fs);
+      x1    = .1*randn(1,Nsecs*fs) + 2*sin(2*pi*45.*t) + randn(1,Nsecs*fs)*1i;
+      x2    = .1*randn(1,Nsecs*fs) + 2*sin(2*pi*45.*t) + randn(1,Nsecs*fs)*1i;
+      
+      %---- Save data as ascii file
+      filename = 'complex.txt';
+      fd = fopen(filename, 'w+');
+      % write header
+      fprintf(fd, '// A comment that should be read appropriately.\n');
+      fprintf(fd, '// \n');
+      fprintf(fd, '// M Hewitson\n');
+      % write data
+      for j=1:length(t)
+        
+        %---- Save: f, abs, rad, abs, rad
+        fprintf(fd, '%.17g\t%.17g\t%.17g\t%.17g\t%.17g\n', t(j), abs(x1(j)), angle(x1(j)), abs(x2(j)), angle(x2(j)));
+      end
+      % close file
+      fclose(fd);
+      
+      desc   = 'ao from complex data';
+      xunits = 'Hz';
+      yunits = 'V';
+      
+      pl = plist(...
+        'complex_type', 'abs/rad', ...
+        'columns', [1 2 3 1 4 5], ...
+        'type', 'xydata', ...
+        'description', desc,...
+        'xunits', xunits, ...
+        'yunits', yunits, ...
+        'comment_char', '//');
+      
+      out  = ao(filename, pl);
+      mout = rebuild(out);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    % 2) Check the read data
+    % 3) Check that the rebuilt object is the same as 'out'
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out(1).hist.methodInfo.mname, 'ao'), atest = false; end
+      if ~strcmp(out(2).hist.methodInfo.mname, 'ao'), atest = false; end
+      % Check data values
+      if ~isa(out(1).data, 'xydata'),  atest = false; end
+      if ~isa(out(2).data, 'xydata'),  atest = false; end
+      % 'out(1)' -> f, abs, rad
+      if ~isequal(out(1).x, t.'), atest = false; end
+      if any(abs(out(1).y - x1.') > TOL), atest = false; end
+      if ~eq(out(1).yunits, unit(yunits)), atest = false; end
+      if ~eq(out(1).xunits, unit(xunits)), atest = false; end
+      if ~strcmp(out(1).description, desc), atest = false; end
+      % 'out(2)' -> f, abs, rad
+      if ~isequal(out(2).x, t.'), atest = false; end
+      if any(abs(out(2).y - x2.') > TOL), atest = false; end
+      if ~eq(out(2).yunits, unit(yunits)), atest = false; end
+      if ~eq(out(2).xunits, unit(xunits)), atest = false; end
+      if ~strcmp(out(2).description, desc), atest = false; end
+      % Check the re-built object
+      if ~eq(mout, out, ple1), atest = false; end
+      % </AlgoCode>
+      % delete test file
+      delete(filename);
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename);
+  end % END UTP_30
+  
+  
+  %% UTP_31
+  
+  % <TestDescription>
+  %
+  % Tests that the ao method properly applies history to the filename + plist constructor.
+  %
+  % </TestDescription>
+  function result = utp_31
+    
+    % <SyntaxDescription>
+    %
+    % Test that the output can be processed back to an m-file.
+    %
+    % </SyntaxDescription>
+    
+    try
+      % <SyntaxCode>
+      fs    = 10;
+      Nsecs = 10;
+      t0    = time('2008-02-15 14:00:00');
+      col   = [2 3];
+      x1    = randn(1,Nsecs*fs);
+      x2    = randn(1,Nsecs*fs);
+      x3    = randn(1,Nsecs*fs);
+      
+      %---- Save data as ascii file
+      filename = 'data.txt';
+      fd = fopen(filename, 'w+');
+      % write header
+      fprintf(fd, '%% A comment that should be read appropriately.\n');
+      fprintf(fd, '%% \n');
+      fprintf(fd, '%% M Hewitson\n');
+      % write data
+      for j=1:length(x1)
+        fprintf(fd, '%.17g\t%.17g\t%.17g\n', x1(j), x2(j), x3(j));
+      end
+      % close file
+      fclose(fd);
+      
+      % Build plist
+      desc   = 'ao from filename';
+      xunits = 's';
+      yunits = {'V', 'V^2'};
+      
+      pl = plist(...
+        'description', desc,...
+        'type', 'tsdata', ...
+        'xunits', xunits, ...
+        'yunits', yunits, ...
+        'columns', col, ...
+        'fs', fs, ...
+        't0', {t0, t0+20}, ...
+        'comment_char', '%');
+      
+      out  = ao(filename, pl);
+      mout = rebuild(out);
+      % </SyntaxCode>
+      stest = true;
+    catch err
+      disp(err.message)
+      stest = false;
+    end
+    
+    % <AlgoDescription>
+    %
+    % 1) Check that the last entry in the history of 'out' corresponds to
+    %    'ao'.
+    % 2) Check that the rebuilt object is the same as 'out'.
+    %
+    % </AlgoDescription>
+    
+    atest = true;
+    if stest
+      % <AlgoCode>
+      % Check the last step in the history of 'out'
+      if ~strcmp(out(1).hist.methodInfo.mname, 'ao'), atest = false; end
+      if ~strcmp(out(2).hist.methodInfo.mname, 'ao'), atest = false; end
+      % Check data values
+      if ~isa(out(1).data, 'tsdata'),             atest = false; end
+      if ~isa(out(2).data, 'tsdata'),             atest = false; end
+      if ~isequal(out(1).data.getY, x2.'),        atest = false; end
+      if ~isequal(out(2).data.getY, x3.'),        atest = false; end
+      if ~eq(unit(xunits),    out(1).data.xunits), atest = false; end
+      if ~eq(unit(yunits{1}), out(1).data.yunits), atest = false; end
+      if ~eq(unit(xunits),    out(2).data.xunits), atest = false; end
+      if ~eq(unit(yunits{2}), out(2).data.yunits), atest = false; end
+      if ~eq(out(1).data.t0, t0, ple1),      atest = false; end
+      if ~eq(out(2).data.t0, t0 + 20, ple1), atest = false; end
+      if ~out(1).data.fs == fs,                   atest = false; end
+      if ~out(2).data.fs == fs,                   atest = false; end
+      % Check the rebuilt object
+      if ~eq(mout, out, ple1), atest = false; end
+      % </AlgoCode>
+      % delete test file
+      delete(filename)
+    else
+      atest = false;
+    end
+    
+    % Return a result structure
+    result = utp_prepare_result(atest, stest, dbstack, mfilename);
+  end % END UTP_31
+  
+  
+end