Mercurial > hg > octave-lyh
annotate scripts/testfun/assert.m @ 9448:cb4a4119a21a
Fix string comparison bug in assert.m
author | Thorsten Meyer <thorsten.meyier@gmx.de> |
---|---|
date | Thu, 23 Jul 2009 10:19:26 +0200 |
parents | bb2ae2210e37 |
children | 6f1ea8241c99 |
rev | line source |
---|---|
8920 | 1 ## Copyright (C) 2000, 2006, 2007, 2008, 2009 Paul Kienzle |
5589 | 2 ## |
7016 | 3 ## This file is part of Octave. |
5589 | 4 ## |
7016 | 5 ## Octave is free software; you can redistribute it and/or modify it |
6 ## under the terms of the GNU General Public License as published by | |
7 ## the Free Software Foundation; either version 3 of the License, or (at | |
8 ## your option) any later version. | |
9 ## | |
10 ## Octave is distributed in the hope that it will be useful, but | |
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 ## General Public License for more details. | |
5589 | 14 ## |
15 ## You should have received a copy of the GNU General Public License | |
7016 | 16 ## along with Octave; see the file COPYING. If not, see |
17 ## <http://www.gnu.org/licenses/>. | |
5589 | 18 |
19 ## -*- texinfo -*- | |
20 ## @deftypefn {Function File} {} assert (@var{cond}) | |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
21 ## @deftypefnx {Function File} {} assert (@var{cond}, @var{errmsg}, @dots{}) |
9313 | 22 ## @deftypefnx {Function File} {} assert (@var{cond}, @var{msg_id}, @var{errmsg}, @dots{}) |
5589 | 23 ## @deftypefnx {Function File} {} assert (@var{observed},@var{expected}) |
24 ## @deftypefnx {Function File} {} assert (@var{observed},@var{expected},@var{tol}) | |
25 ## | |
9051
1bf0ce0930be
Grammar check TexInfo in all .m files
Rik <rdrider0-list@yahoo.com>
parents:
8989
diff
changeset
|
26 ## Produces an error if the condition is not met. @code{assert} can be |
5589 | 27 ## called in three different ways. |
28 ## | |
29 ## @table @code | |
30 ## @item assert (@var{cond}) | |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
31 ## @itemx assert (@var{cond}, @var{errmsg}, @dots{}) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
32 ## @itemx assert (@var{cond}, @var{msg_id}, @var{errmsg}, @dots{}) |
5589 | 33 ## Called with a single argument @var{cond}, @code{assert} produces an |
9051
1bf0ce0930be
Grammar check TexInfo in all .m files
Rik <rdrider0-list@yahoo.com>
parents:
8989
diff
changeset
|
34 ## error if @var{cond} is zero. If called with a single argument a |
1bf0ce0930be
Grammar check TexInfo in all .m files
Rik <rdrider0-list@yahoo.com>
parents:
8989
diff
changeset
|
35 ## generic error message. With more than one argument, the additional |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
36 ## arguments are passed to the @code{error} function. |
5589 | 37 ## |
38 ## @item assert (@var{observed}, @var{expected}) | |
9051
1bf0ce0930be
Grammar check TexInfo in all .m files
Rik <rdrider0-list@yahoo.com>
parents:
8989
diff
changeset
|
39 ## Produce an error if observed is not the same as expected. Note that |
5589 | 40 ## observed and expected can be strings, scalars, vectors, matrices, |
41 ## lists or structures. | |
42 ## | |
43 ## @item assert(@var{observed}, @var{expected}, @var{tol}) | |
7027 | 44 ## Accept a tolerance when comparing numbers. |
8325
b93ac0586e4b
spelling corrections
Brian Gough<bjg@network-theory.co.uk>
parents:
8202
diff
changeset
|
45 ## If @var{tol} is positive use it as an absolute tolerance, will produce an error if |
7027 | 46 ## @code{abs(@var{observed} - @var{expected}) > abs(@var{tol})}. |
47 ## If @var{tol} is negative use it as a relative tolerance, will produce an error if | |
48 ## @code{abs(@var{observed} - @var{expected}) > abs(@var{tol} * @var{expected})}. | |
49 ## If @var{expected} is zero @var{tol} will always be used as an absolute tolerance. | |
5589 | 50 ## @end table |
5642 | 51 ## @seealso{test} |
5589 | 52 ## @end deftypefn |
53 | |
8202
cf59d542f33e
replace all TODOs and XXXs with FIXMEs
Jaroslav Hajek <highegg@gmail.com>
parents:
7770
diff
changeset
|
54 ## FIXME: Output throttling: don't print out the entire 100x100 matrix, |
cf59d542f33e
replace all TODOs and XXXs with FIXMEs
Jaroslav Hajek <highegg@gmail.com>
parents:
7770
diff
changeset
|
55 ## but instead give a summary; don't print out the whole list, just |
cf59d542f33e
replace all TODOs and XXXs with FIXMEs
Jaroslav Hajek <highegg@gmail.com>
parents:
7770
diff
changeset
|
56 ## say what the first different element is, etc. To do this, make |
cf59d542f33e
replace all TODOs and XXXs with FIXMEs
Jaroslav Hajek <highegg@gmail.com>
parents:
7770
diff
changeset
|
57 ## the message generation type specific. |
6494 | 58 |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
59 function assert (cond, varargin) |
6494 | 60 |
61 in = deblank (argn(1,:)); | |
62 for i = 2:rows (argn) | |
7540
3422f39573b1
strcat.m: Matlab compatibility, with cstrcat.m replacing conventional strcat.m.
Ben Abbott <bpabbott@mac.com>
parents:
7151
diff
changeset
|
63 in = cstrcat (in, ",", deblank (argn(i,:))); |
7151 | 64 endfor |
7540
3422f39573b1
strcat.m: Matlab compatibility, with cstrcat.m replacing conventional strcat.m.
Ben Abbott <bpabbott@mac.com>
parents:
7151
diff
changeset
|
65 in = cstrcat ("(", in, ")"); |
5589 | 66 |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
67 if (nargin == 1 || (nargin > 1 && islogical (cond) && ischar (varargin{1}))) |
6494 | 68 if (! isnumeric (cond) || ! all (cond(:))) |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
69 if (nargin == 1) |
8506 | 70 ## Say which elements failed? |
71 error ("assert %s failed", in); | |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
72 else |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
73 error (varargin{:}); |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
74 endif |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
75 endif |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
76 else |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
77 if (nargin < 2 || nargin > 3) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
78 print_usage (); |
5589 | 79 endif |
80 | |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
81 expected = varargin {1}; |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
82 if (nargin < 3) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
83 tol = 0; |
5589 | 84 else |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
85 tol = varargin {2}; |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
86 endif |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
87 |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
88 if (exist ("argn") == 0) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
89 argn = " "; |
5589 | 90 endif |
91 | |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
92 coda = ""; |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
93 iserror = 0; |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
94 |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
95 |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
96 if (ischar (expected)) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
97 iserror = (! ischar (cond) || ! strcmp (cond, expected)); |
5589 | 98 |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
99 elseif (iscell (expected)) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
100 if (! iscell (cond) || any (size (cond) != size (expected))) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
101 iserror = 1; |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
102 else |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
103 try |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
104 for i = 1:length (expected(:)) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
105 assert (cond{i}, expected{i}, tol); |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
106 endfor |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
107 catch |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
108 iserror = 1; |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
109 end_try_catch |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
110 endif |
5589 | 111 |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
112 elseif (isstruct (expected)) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
113 if (! isstruct (cond) || any (size (cond) != size (expected)) |
8507 | 114 || rows (fieldnames (cond)) != rows (fieldnames (expected))) |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
115 iserror = 1; |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
116 else |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
117 try |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
118 empty = numel (cond) == 0; |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
119 normal = numel (cond) == 1; |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
120 for [v, k] = cond |
8538
f4a4f914462e
assert.m: use isfield instead of struct_contains
John W. Eaton <jwe@octave.org>
parents:
8507
diff
changeset
|
121 if (! isfield (expected, k)) |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
122 error (); |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
123 endif |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
124 if (empty) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
125 v = cell (1, 0); |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
126 endif |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
127 if (normal) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
128 v = {v}; |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
129 else |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
130 v = v(:)'; |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
131 endif |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
132 assert (v, {expected.(k)}, tol); |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
133 endfor |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
134 catch |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
135 iserror = 1; |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
136 end_try_catch |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
137 endif |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
138 |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
139 elseif (ndims (cond) != ndims (expected) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
140 || any (size (cond) != size (expected))) |
5589 | 141 iserror = 1; |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
142 coda = "Dimensions don't match"; |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
143 |
9447
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
144 else |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
145 if (nargin < 3) |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
146 ## Without explicit tolerance, be more strict. |
9448
cb4a4119a21a
Fix string comparison bug in assert.m
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
9447
diff
changeset
|
147 if (! strcmp(class (cond), class (expected))) |
9447
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
148 iserror = 1; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
149 coda = cstrcat ("Class ", class (cond), " != ", class (expected)); |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
150 elseif (isnumeric (cond)) |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
151 if (issparse (cond) != issparse (expected)) |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
152 if (issparse (cond)) |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
153 iserror = 1; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
154 coda = "sparse != non-sparse"; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
155 else |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
156 iserror = 1; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
157 coda = "non-sparse != sparse"; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
158 endif |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
159 elseif (iscomplex (cond) != iscomplex (expected)) |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
160 if (iscomplex (cond)) |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
161 iserror = 1; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
162 coda = "complex != real"; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
163 else |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
164 iserror = 1; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
165 coda = "real != complex"; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
166 endif |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
167 endif |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
168 endif |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
169 endif |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
170 |
9447
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
171 if (! iserror) |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
172 ## Numeric. |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
173 A = cond(:); |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
174 B = expected(:); |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
175 ## Check exceptional values. |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
176 if (any (isna (A) != isna (B))) |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
177 iserror = 1; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
178 coda = "NAs don't match"; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
179 elseif (any (isnan (A) != isnan (B))) |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
180 iserror = 1; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
181 coda = "NaNs don't match"; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
182 ## Try to avoid problems comparing strange values like Inf+NaNi. |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
183 elseif (any (isinf (A) != isinf (B)) |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
184 || any (A(isinf (A) & ! isnan (A)) != B(isinf (B) & ! isnan (B)))) |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
185 iserror = 1; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
186 coda = "Infs don't match"; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
187 else |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
188 ## Check normal values. |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
189 A = A(finite (A)); |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
190 B = B(finite (B)); |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
191 if (tol == 0) |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
192 err = any (A != B); |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
193 errtype = "values do not match"; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
194 elseif (tol >= 0) |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
195 err = max (abs (A - B)); |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
196 errtype = "maximum absolute error %g exceeds tolerance %g"; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
197 else |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
198 abserr = max (abs (A(B == 0))); |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
199 A = A(B != 0); |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
200 B = B(B != 0); |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
201 relerr = max (abs (A - B) ./ abs (B)); |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
202 err = max ([abserr; relerr]); |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
203 errtype = "maximum relative error %g exceeds tolerance %g"; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
204 endif |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
205 if (err > abs (tol)) |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
206 iserror = 1; |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
207 coda = sprintf (errtype, err, abs (tol)); |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
208 endif |
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
209 endif |
5589 | 210 endif |
9447
bb2ae2210e37
relax assert for exact matches
Jaroslav Hajek <highegg@gmail.com>
parents:
9313
diff
changeset
|
211 |
5589 | 212 endif |
213 | |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
214 if (! iserror) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
215 return; |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
216 endif |
5589 | 217 |
8506 | 218 ## Pretty print the "expected but got" info, trimming leading and |
219 ## trailing "\n". | |
7770
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
220 str = disp (expected); |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
221 idx = find (str != "\n"); |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
222 if (! isempty (idx)) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
223 str = str(idx(1):idx(end)); |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
224 endif |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
225 str2 = disp (cond); |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
226 idx = find (str2 != "\n"); |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
227 if (! isempty (idx)) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
228 str2 = str2 (idx(1):idx(end)); |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
229 endif |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
230 msg = cstrcat ("assert ", in, " expected\n", str, "\nbut got\n", str2); |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
231 if (! isempty (coda)) |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
232 msg = cstrcat (msg, "\n", coda); |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
233 endif |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
234 error ("%s", msg); |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
235 ## disp (msg); |
c6a1a217ac3c
Compatibility fix for assert
David Bateman <dbateman@free.fr>
parents:
7703
diff
changeset
|
236 ## error ("assertion failed"); |
5589 | 237 endif |
238 endfunction | |
239 | |
240 ## empty | |
241 %!assert([]) | |
242 %!assert(zeros(3,0),zeros(3,0)) | |
243 %!error assert(zeros(3,0),zeros(0,2)) | |
244 %!error assert(zeros(3,0),[]) | |
6455 | 245 %!fail("assert(zeros(2,0,2),zeros(2,0))", "Dimensions don't match") |
5589 | 246 |
247 ## conditions | |
248 %!assert(isempty([])) | |
249 %!assert(1) | |
250 %!error assert(0) | |
251 %!assert(ones(3,1)) | |
252 %!assert(ones(1,3)) | |
253 %!assert(ones(3,4)) | |
254 %!error assert([1,0,1]) | |
255 %!error assert([1;1;0]) | |
256 %!error assert([1,0;1,1]) | |
257 | |
258 ## vectors | |
259 %!assert([1,2,3],[1,2,3]); | |
260 %!assert([1;2;3],[1;2;3]); | |
261 %!error assert([2;2;3],[1;2;3]); | |
262 %!error assert([1,2,3],[1;2;3]); | |
263 %!error assert([1,2],[1,2,3]); | |
264 %!error assert([1;2;3],[1;2]); | |
265 %!assert([1,2;3,4],[1,2;3,4]); | |
266 %!error assert([1,4;3,4],[1,2;3,4]) | |
267 %!error assert([1,3;2,4;3,5],[1,2;3,4]) | |
268 | |
269 ## exceptional values | |
270 %!assert([NaN, NA, Inf, -Inf, 1+eps, eps],[NaN, NA, Inf, -Inf, 1, 0],eps) | |
271 %!error assert(NaN, 1) | |
272 %!error assert(NA, 1) | |
273 %!error assert(-Inf, Inf) | |
274 | |
275 ## scalars | |
276 %!error assert(3, [3,3; 3,3]) | |
277 %!error assert([3,3; 3,3], 3) | |
278 %!assert(3, 3); | |
279 %!assert(3+eps, 3, eps); | |
280 %!assert(3, 3+eps, eps); | |
281 %!error assert(3+2*eps, 3, eps); | |
282 %!error assert(3, 3+2*eps, eps); | |
283 | |
7027 | 284 ## must give a little space for floating point errors on relative |
5589 | 285 %!assert(100+100*eps, 100, -2*eps); |
286 %!assert(100, 100+100*eps, -2*eps); | |
287 %!error assert(100+300*eps, 100, -2*eps); | |
288 %!error assert(100, 100+300*eps, -2*eps); | |
289 %!error assert(3, [3,3]); | |
290 %!error assert(3,4); | |
291 | |
7027 | 292 ## test relative vs. absolute tolerances |
293 %!test assert (0.1+eps, 0.1, 2*eps); # accept absolute | |
294 %!error assert (0.1+eps, 0.1, -2*eps); # fail relative | |
295 %!test assert (100+100*eps, 100, -2*eps); # accept relative | |
296 %!error assert (100+100*eps, 100, 2*eps); # fail absolute | |
297 | |
5589 | 298 ## structures |
299 %!shared x,y | |
300 %! x.a = 1; x.b=[2, 2]; | |
301 %! y.a = 1; y.b=[2, 2]; | |
302 %!assert (x,y) | |
303 %!test y.b=3; | |
304 %!error assert (x,y) | |
305 %!error assert (3, x); | |
306 %!error assert (x, 3); | |
307 | |
308 ## check usage statements | |
309 %!error assert | |
310 %!error assert(1,2,3,4,5) | |
311 | |
312 ## strings | |
313 %!assert("dog","dog") | |
314 %!error assert("dog","cat") | |
315 %!error assert("dog",3); | |
316 %!error assert(3,"dog"); |