9f39269803af83e53ebaae5c4998a8422c1cb90b
[scilab.git] / scilab / modules / signal_processing / tests / unit_tests / test_utilities.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2009 - Digiteo - Vincent Liard
3 //
4 // This file must be used under the terms of the CeCILL.
5 // This source file is licensed as described in the file COPYING, which
6 // you should have received as part of this distribution.  The terms
7 // are also available at    
8 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
9
10 // RPEM unit tests
11
12 // substraction on lists (for lists whose elements allow the minus operator)
13 function r=list_substract(l1,l2)
14 r = list();
15 for i=1:length(l1)
16   r(i) = l1(i) - l2(i);
17 end
18 endfunction
19
20 // overload minus operator for lists
21 deff('x = %l_s_l(l1,l2)', 'x = list_substract(l1,l2)');
22
23 // absolute value on lists
24 function r=list_abs(l)
25 r=list()
26 for i=1:length(l)
27   r(i) = abs(l(i))
28 end
29 endfunction
30
31 // overload absolute value on lists
32 deff('y = %l_abs(x)', 'y = list_abs(x)');
33
34 // overall maximum on structured objects
35 // list(list(1,2,3),list(2,list(7,11),4)) -> 11
36 // [4,[[7,[11,3,[1,[20],[]],2]],2]] -> 20
37 function m=list_max(l)
38 m=-%inf
39 if typeof(l) == 'constant' then
40   m = max(l)
41 else
42   for e=l
43     m = max(list_max(e), m)
44   end
45 end
46 endfunction
47
48 // unfortunately, max can't be overloaded on lists
49 // (since list max is already hardwrired)
50
51 // check whether objects a and b differ from less than 2*epsilon
52 // (error on a and b: eps => error on a-b: 2eps)
53 // (works on any list-matrix combination)
54 // epsilon defaults to %eps if not provided by calling sequence
55 function r=match(a,b,epsilon)
56 if ~isdef('epsilon') then
57   epsilon = %eps;
58 end
59 r = (list_max(abs(a-b)) <= 2*epsilon);
60 endfunction
61
62 // because of test mechanism restrictions...
63 if ~isdef('bugmes') then
64   function bugmes()
65   pause
66   endfunction
67 end
68
69 // compare objects a and b, pause if differ from more than epsilon
70 // epsilon defaults to %eps if not provided by calling sequence
71 // would better rely on match's default epsilon but I lack inspiration in this thursday's early afternoon
72 function check(a,b,epsilon)
73 if ~isdef('epsilon') then
74   epsilon = %eps;
75 end
76 if ~match(a,b,epsilon) then
77   bugmes();
78 end
79 endfunction