fix assert_checkequal
[scilab.git] / scilab / modules / development_tools / macros / assert / assert_checkequal.sci
1 // Copyright (C) 2008-2009 - INRIA - Michael Baudin
2 // Copyright (C) 2010 - 2011 - DIGITEO - Michael Baudin
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.1-en.txt
9
10 function [flag,errmsg] = assert_checkequal ( computed , expected )
11     //  Check that computed and expected are equal.
12
13     function flag = comparedoubles ( computed , expected )
14         [cnonan , cnumb] = mythrownan(computed)
15         [enonan , enumb] = mythrownan(expected)
16         if ( and(enonan == cnonan) & and(enumb == cnumb) ) then
17             flag = %t
18         else
19             flag = %f
20         end
21     endfunction
22
23     function [nonan,numb] = mythrownan(x)
24         //
25         //
26         // Copyright (C) 2000 - INRIA - Carlos Klimann
27         // Copyright (C) 2010 - 2011 - DIGITEO - Michael Baudin
28         //This  function  returns  in  vector  nonan  the  values
29         //(ignoring the NANs) of a  vector or matrix x and in the
30         //corresponding places of vector  numb the indexes of the
31         //value.
32         //
33         //For  a  vector  or matrix  x,  [nonan,numb]=thrownan(x)
34         //considers x, whatever his dimensions are, like a linear
35         //vector (columns  first).
36         //
37         //
38         [lhs,rhs]=argn(0)
39         if ( rhs<>1 ) then
40             error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"thrownan",1))
41         end
42         numb=find(bool2s(~isnan(x)))
43         nonan=x(~isnan(x))
44     endfunction
45
46     [lhs,rhs]=argn()
47     if ( rhs <> 2 ) then
48         errmsg = sprintf ( gettext ( "%s: Wrong number of input arguments: %d expected.\n") , "assert_checkequal" , 2 )
49         error(errmsg)
50     end
51
52     // Check types of variables
53     if ( typeof(computed) <> typeof(expected) ) then
54         errmsg = sprintf ( gettext ( "%s: Incompatible input arguments #%d and #%d: Same types expected.\n" ) , "assert_checkequal" , 1 , 2 )
55         error(errmsg)
56    end
57
58     // Check hypermat type
59     if (typeof(computed) == "hypermat") then
60         // Check on first element type
61         if (typeof(computed(1)) <> typeof(expected(1))) then
62             errmsg = sprintf ( gettext ( "%s: Incompatible input arguments #%d and #%d: Same types expected.\n" ) , "assert_checkequal" , 1 , 2 )
63             error(errmsg)
64         end
65     end
66
67
68     //
69     // Check sizes of variables
70     if ( or(type(computed)==[16 17]) ) then
71         ncom = length(computed)
72     else
73         ncom = size(computed)
74     end
75     if ( or(type(expected)==[16 17]) ) then
76         nexp = length(expected)
77     else
78         nexp = size(expected)
79     end
80     if ( or(ncom <> nexp) ) then
81         errmsg = sprintf ( gettext ( "%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n") , "assert_checkequal" , 1 , 2 )
82         error(errmsg)
83     end
84     //
85     if ( type(computed) == 1 & type(expected) == 1 ) then
86         // These are two matrices of doubles
87         cisreal = isreal(computed)
88         eisreal = isreal(expected)
89         if ( cisreal & ~eisreal ) then
90             errmsg = sprintf ( gettext ( "%s: Computed is real, but expected is complex.") , "assert_checkequal" )
91             error(errmsg)
92         end
93         if ( ~cisreal & eisreal ) then
94             errmsg = sprintf ( gettext ( "%s: Computed is complex, but expected is real.") , "assert_checkequal" )
95             error(errmsg)
96         end
97         if ( cisreal & eisreal ) then
98             flag = comparedoubles ( computed , expected )
99         else
100             flagreal = comparedoubles ( real(computed) , real(expected) )
101             if ( flagreal ) then
102                 flagimag = comparedoubles ( imag(computed) , imag(expected) )
103                 flag = flagimag
104             else
105                 flag = %f
106             end
107         end
108     else
109         if ( and ( computed == expected ) ) then
110             flag = %t
111         else
112             flag = %f
113         end
114     end
115
116     if ( flag == %t ) then
117
118         errmsg = ""
119     else
120         // Change the message if the matrix contains more than one value
121         if ( size(expected,"*") == 1 ) then
122             if ( or(typeof(expected) == ["sparse", "boolean sparse"])) then
123                 val = full(expected)
124             else
125                 val = expected
126             end
127             estr = string(val)
128         else
129             if ( or(typeof(expected) == ["sparse", "boolean sparse"])) then
130                 val = full(expected(1))
131             else
132                 val = expected(1)
133             end
134             estr = "[" + string(val) + " ...]"
135         end
136         if ( size(computed,"*") == 1 ) then
137             if ( or(typeof(computed) == ["sparse", "boolean sparse"])) then
138                 val = full(computed)
139             else
140                 val = computed
141             end
142             cstr = string(val)
143         else
144             if ( or(typeof(computed) == ["sparse", "boolean sparse"])) then
145                 val = full(computed(1))
146             else
147                 val = computed(1)
148             end
149             cstr = "[" + string(val) + " ...]"
150         end
151         ierr = execstr("mdiff = string(mean(computed - expected))", "errcatch");
152         if ( ierr == 0 ) then
153             errmsg = msprintf(gettext("%s: Assertion failed: expected = %s while computed = %s (mean diff = %s)"),"assert_checkequal",estr,cstr,mdiff)
154         else
155             errmsg = msprintf(gettext("%s: Assertion failed: expected = %s while computed = %s"),"assert_checkequal",estr,cstr)
156         end
157         if ( lhs < 2 ) then
158             // If no output variable is given, generate an error
159             assert_generror ( errmsg )
160         end
161     end
162 endfunction
163
164