Mercurial > hg > ltpda
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