2347b4611ff14aeef8d348cb338f507c18f30580
[scilab.git] / scilab / modules / core / tests / unit_tests / macro.dia.ref
1 // =============================================================================
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) ????-2008 - INRIA
4 //
5 //  This file is distributed under the same license as the Scilab package.
6 // =============================================================================
7 // <-- JVM NOT MANDATORY -->
8 funcprot(0);
9 // simple
10 //
11 deff('[x,y]=t1(a,b)','x=a+b,y=a-b','n')
12 [u,v]=t1(1,2);
13 if u<> 3 then bugmes();quit;end
14 if v<>-1 then bugmes();quit;end
15 //
16 //with arguments
17 b=2;
18 if t1(1)<>t1(1,2) then bugmes();quit;end
19 t2=t1;
20 //
21 [u,v]=t1(1,2);
22 if u<> 3 then bugmes();quit;end
23 if v<>-1 then bugmes();quit;end
24 b=2;
25 if t1(1)<>t1(1,2) then bugmes();quit;end
26 //
27 //resume
28 //
29 deff('[x,y]=t3(a,b)','x=a+b,y=a-b,z=resume(a*a)','n')
30 [u,v]=t3(1,2);
31 if u<> 3 then bugmes();quit;end
32 if v<>-1 then bugmes();quit;end
33 if z<>1 then bugmes();quit;end
34 b=2;
35 clear z
36 if t3(1)<>t3(1,2) then bugmes();quit;end
37 if z<>1 then bugmes();quit;end
38 t4=t3;
39 [u,v]=t3(1,2);
40 if u<> 3 then bugmes();quit;end
41 if v<>-1 then bugmes();quit;end
42 if z<>1 then bugmes();quit;end
43 clear z
44 b=2;
45 if t3(1)<>t3(1,2) then bugmes();quit;end
46 if z<>1 then bugmes();quit;end
47 //
48 // macro + clauses
49 //
50 text = ['if n>0 then x=1'
51                                 'y=0;for k=1:n,y=y+k,end'
52                             'else x=-1'
53                                  'if n==4 then y=''yes'' '
54                                          'else y=''no'' '
55                                  'end'
56                     'end'
57                    'if n==-1 then return,end'
58                    'if n==-2 then tt=resume(n),end'
59                     'select x,'
60                     'case 1 then x=''pos'' ,tt=resume(''ok''),'
61                     'case -1 then x=''neg'' ,'
62                     'end'];
63 //
64 deff('[x,y]=t5(n)',text,'n')
65 [u,v]=t5(5);
66 if u<>'pos' then bugmes();quit;end
67 if v<>15 then bugmes();quit;end
68 if tt<>'ok' then bugmes();quit;end
69 clear tt
70 [u,v]=t5(-1);
71 if u<>-1 then bugmes();quit;end
72 if v<>'no' then bugmes();quit;end
73 if exists('tt')==1 then bugmes();quit;end
74 clear tt v
75 u=t5(-2);
76 if u<>-1 then bugmes();quit;end
77 if tt<>-2 then bugmes();quit;end
78 clear tt
79 u=t5(-4);
80 if u<>'neg' then bugmes();quit;end
81 if exists('tt')==1 then bugmes();quit;end
82 clear u v tt
83 [u,v]=t5(5);
84 if u<>'pos' then bugmes();quit;end
85 if v<>15 then bugmes();quit;end
86 if tt<>'ok' then bugmes();quit;end
87 clear tt
88 [u,v]=t5(-1);
89 if u<>-1 then bugmes();quit;end
90 if v<>'no' then bugmes();quit;end
91 if exists('tt')==1 then bugmes();quit;end
92 clear tt v
93 u=t5(-2);
94 if u<>-1 then bugmes();quit;end
95 if tt<>-2 then bugmes();quit;end
96 clear tt
97 u=t5(-4);
98 if u<>'neg' then bugmes();quit;end
99 if exists('tt')==1 then bugmes();quit;end
100 //
101 // complex clauses
102 //
103 text = ['if n>0 then x=1'
104                                 'y=0;for k=1:b(n),y=y+b(k),end'
105                             'else x=-1'
106                                  'if n==4 then y=b(''yes'') '
107                                          'else y=b(''no'') '
108                                  'end'
109                     'end'
110                    'if n==b(-1) then return,end'
111                    'if n==b(-2) then tt=resume(b(n)),end'
112                     'select x,'
113                     'case 1 then x=b(''pos'') ,tt=resume(b(''ok'')),'
114                     'case b(-1) then x=b(''neg'') ,'
115                     'end'];
116 deff('[x]=b(a)','x=a,prod([1 1])','n')
117 deff('[x,y]=t5(n)',text,'n')
118 [u,v]=t5(5);
119 if u<>'pos' then bugmes();quit;end
120 if v<>15 then bugmes();quit;end
121 if tt<>'ok' then bugmes();quit;end
122 clear tt
123 [u,v]=t5(-1);
124 if u<>-1 then bugmes();quit;end
125 if v<>'no' then bugmes();quit;end
126 if exists('tt')==1 then bugmes();quit;end
127 clear tt v
128 u=t5(-2);
129 if u<>-1 then bugmes();quit;end
130 if tt<>-2 then bugmes();quit;end
131 clear tt
132 u=t5(-4);
133 if u<>'neg' then bugmes();quit;end
134 if exists('tt')==1 then bugmes();quit;end
135 clear u v tt
136 [u,v]=t5(5);
137 if u<>'pos' then bugmes();quit;end
138 if v<>15 then bugmes();quit;end
139 if tt<>'ok' then bugmes();quit;end
140 clear tt
141 [u,v]=t5(-1);
142 if u<>-1 then bugmes();quit;end
143 if v<>'no' then bugmes();quit;end
144 if exists('tt')==1 then bugmes();quit;end
145 clear tt v
146 u=t5(-2);
147 if u<>-1 then bugmes();quit;end
148 if tt<>-2 then bugmes();quit;end
149 clear tt
150 u=t5(-4);
151 if u<>'neg' then bugmes();quit;end
152 if exists('tt')==1 then bugmes();quit;end
153 deff('[x,y]=t5(n)',text,'n')
154 [u,v]=t5(5);
155 if u<>'pos' then bugmes();quit;end
156 if v<>15 then bugmes();quit;end
157 if tt<>'ok' then bugmes();quit;end
158 clear tt
159 [u,v]=t5(-1);
160 if u<>-1 then bugmes();quit;end
161 if v<>'no' then bugmes();quit;end
162 if exists('tt')==1 then bugmes();quit;end
163 clear tt v
164 u=t5(-2);
165 if u<>-1 then bugmes();quit;end
166 if tt<>-2 then bugmes();quit;end
167 clear tt
168 u=t5(-4);
169 if u<>'neg' then bugmes();quit;end
170 if exists('tt')==1 then bugmes();quit;end
171 // 
172 clear u v tt
173 [u,v]=t5(5);
174 if u<>'pos' then bugmes();quit;end
175 if v<>15 then bugmes();quit;end
176 if tt<>'ok' then bugmes();quit;end
177 clear tt
178 [u,v]=t5(-1);
179 if u<>-1 then bugmes();quit;end
180 if v<>'no' then bugmes();quit;end
181 if exists('tt')==1 then bugmes();quit;end
182 clear tt v
183 u=t5(-2);
184 if u<>-1 then bugmes();quit;end
185 if tt<>-2 then bugmes();quit;end
186 clear tt
187 u=t5(-4);
188 if u<>'neg' then bugmes();quit;end
189 if exists('tt')==1 then bugmes();quit;end
190 //more complex
191 deff('[x]=b(a)','if a==1 then x=1,else x=a,prod([1 1]),end','n')
192 //
193 deff('[x,y]=t5(n)',text,'n')
194 [u,v]=t5(5);
195 if u<>'pos' then bugmes();quit;end
196 if v<>15 then bugmes();quit;end
197 if tt<>'ok' then bugmes();quit;end
198 clear tt
199 [u,v]=t5(-1);
200 if u<>-1 then bugmes();quit;end
201 if v<>'no' then bugmes();quit;end
202 if exists('tt')==1 then bugmes();quit;end
203 clear tt v
204 u=t5(-2);
205 if u<>-1 then bugmes();quit;end
206 if tt<>-2 then bugmes();quit;end
207 clear tt
208 u=t5(-4);
209 if u<>'neg' then bugmes();quit;end
210 if exists('tt')==1 then bugmes();quit;end
211 clear u v tt
212 [u,v]=t5(5);
213 if u<>'pos' then bugmes();quit;end
214 if v<>15 then bugmes();quit;end
215 if tt<>'ok' then bugmes();quit;end
216 clear tt
217 [u,v]=t5(-1);
218 if u<>-1 then bugmes();quit;end
219 if v<>'no' then bugmes();quit;end
220 if exists('tt')==1 then bugmes();quit;end
221 clear tt v
222 u=t5(-2);
223 if u<>-1 then bugmes();quit;end
224 if tt<>-2 then bugmes();quit;end
225 clear tt
226 u=t5(-4);
227 if u<>'neg' then bugmes();quit;end
228 if exists('tt')==1 then bugmes();quit;end
229 //
230 deff('[x,y]=t5(n)',text,'n')
231 [u,v]=t5(5);
232 if u<>'pos' then bugmes();quit;end
233 if v<>15 then bugmes();quit;end
234 if tt<>'ok' then bugmes();quit;end
235 clear tt
236 [u,v]=t5(-1);
237 if u<>-1 then bugmes();quit;end
238 if v<>'no' then bugmes();quit;end
239 if exists('tt')==1 then bugmes();quit;end
240 clear tt v
241 u=t5(-2);
242 if u<>-1 then bugmes();quit;end
243 if tt<>-2 then bugmes();quit;end
244 clear tt
245 u=t5(-4);
246 if u<>'neg' then bugmes();quit;end
247 if exists('tt')==1 then bugmes();quit;end
248 //
249 clear u v tt
250 [u,v]=t5(5);
251 if u<>'pos' then bugmes();quit;end
252 if v<>15 then bugmes();quit;end
253 if tt<>'ok' then bugmes();quit;end
254 clear tt
255 [u,v]=t5(-1);
256 if u<>-1 then bugmes();quit;end
257 if v<>'no' then bugmes();quit;end
258 if exists('tt')==1 then bugmes();quit;end
259 clear tt v
260 u=t5(-2);
261 if u<>-1 then bugmes();quit;end
262 if tt<>-2 then bugmes();quit;end
263 clear tt
264 u=t5(-4);
265 if u<>'neg' then bugmes();quit;end
266 if exists('tt')==1 then bugmes();quit;end
267 // resume
268 deff('[]=t6(a)','x=resume(a)','n')
269 clear ans x
270 t6(15)
271 if x<>15 then bugmes();quit;end
272 if exists('ans')==1 then bugmes();quit;end
273 //
274 clear ans x
275 t6(15)
276 if x<>15 then bugmes();quit;end
277 if exists('ans')==1 then bugmes();quit;end
278 //
279 //
280 //
281 deff('[ydot]=simul(t,y,a)','ydot=a','n')
282 a=2;
283 //appel le plus imple
284 y=ode(0,0,1:2,simul)
285  y  =
286  
287     2.    4.  
288 if norm(y-[a 2*a]) >1000*%eps then bugmes();quit;end
289 y=ode(0,0,1:2,simul)
290  y  =
291  
292     2.    4.  
293 if norm(y-[a 2*a]) >1000*%eps then bugmes();quit;end
294 //appel avec passage d'arguments supplementaires
295 deff('[ydot]=simul(t,y,a)','ydot=a','n')
296 y=ode(0,0,1:2,list(simul,a))
297  y  =
298  
299     2.    4.  
300 if norm(y-[a 2*a]) >1000*%eps then bugmes();quit;end
301 y=ode(0,0,1:2,list(simul,a))
302  y  =
303  
304     2.    4.  
305 if norm(y-[a 2*a]) >1000*%eps then bugmes();quit;end
306 //
307 //non linear
308 //
309 text=['for k=1:n,'
310      'y=ode(a*(k-1),k-1,k,simul),'
311      'x=[x,y],'
312      'end'];
313 //
314 deff('[x]=calcul(n)',text,'n')
315 deff('[ydot]=simul(t,y,a)','ydot=a','n')
316 x=[];
317 x=calcul(3);
318 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
319 x=[];
320 x=calcul(3);
321 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
322 x=[];
323 x=calcul(3);
324 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
325 deff('[ydot]=simul(t,y,a)','ydot=a','n')
326 x=[];
327 x=calcul(3);
328 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
329 //
330 text(2)='y=ode(a*(k-1),k-1,k,list(simul,a)),';
331 deff('[x]=calcul(n)',text,'n')
332 deff('[ydot]=simul(t,y,a)','ydot=a','n')
333 x=[];
334 x=calcul(3);
335 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
336 x=[];
337 x=calcul(3);
338 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
339 x=[];
340 x=calcul(3);
341 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
342 deff('[ydot]=simul(t,y,a)','ydot=a','n')
343 x=[];
344 x=calcul(3);
345 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
346 //resume in external
347 deff('[ydot]=simul(t,y,a)','ydot=a,tt=resume([tt,t])','n')
348 tt=[]
349  tt  =
350  
351      []
352 deff('[x]=calcul(n)',text,'n')
353 deff('[ydot]=simul(t,y,a)','ydot=a','n')
354 x=[];
355 x=calcul(3);
356 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
357 x=[];
358 x=calcul(3);
359 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
360 x=[];
361 x=calcul(3);
362 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
363 deff('[ydot]=simul(t,y,a)','ydot=a','n')
364 x=[];
365 x=calcul(3);
366 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
367 //
368 //external calls a macro
369 //
370 deff('[x]=b(a)','if a==1 then x=a,prod([1 1]),else x=a,prod([1 1]),end','n')
371 text=['for k=1:n,'
372      'y=ode(a*(k-1),k-1,k,simul),'
373      'x=[x,y],'
374      'end'];
375 //
376 deff('[x]=calcul(n)',text,'n')
377 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
378 x=[];
379 x=calcul(3);
380 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
381 x=[];
382 x=calcul(3);
383 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
384 x=[];
385 x=calcul(3);
386 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
387 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
388 x=[];
389 x=calcul(3);
390 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
391 //
392 text(2)='y=ode(a*(k-1),k-1,k,list(simul,a)),';
393 deff('[x]=calcul(n)',text,'n')
394 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
395 x=[];
396 x=calcul(3);
397 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
398 x=[];
399 x=calcul(3);
400 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
401 x=[];
402 x=calcul(3);
403 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
404 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
405 x=[];
406 x=calcul(3);
407 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
408 //
409 deff('[ydot]=simul(t,y,a)','ydot=b(a),tt=resume([tt,t])','n')
410 tt=[]
411  tt  =
412  
413      []
414 deff('[x]=calcul(n)',text,'n')
415 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
416 x=[];
417 x=calcul(3);
418 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
419 x=[];
420 x=calcul(3);
421 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
422 x=[];
423 x=calcul(3);
424 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
425 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
426 x=[];
427 x=calcul(3);
428 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
429 text=['for k=1:n,'
430      'y=ode(a*(k-1),k-1,k,simul),'
431      'x=[x,y],'
432      'end'];
433 //
434 deff('[x]=calcul(n)',text,'n')
435 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
436 x=[];
437 x=calcul(3);
438 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
439 x=[];
440 x=calcul(3);
441 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
442 x=[];
443 x=calcul(3);
444 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
445 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
446 x=[];
447 x=calcul(3);
448 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
449 //
450 text(2)='y=ode(a*(k-1),k-1,k,list(simul,a)),';
451 deff('[x]=calcul(n)',text,'n')
452 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
453 x=[];
454 x=calcul(3);
455 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
456 x=[];
457 x=calcul(3);
458 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
459 x=[];
460 x=calcul(3);
461 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
462 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
463 x=[];
464 x=calcul(3);
465 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
466 //
467 deff('[ydot]=simul(t,y,a)','ydot=b(a),tt=resume([tt,t])','n')
468 tt=[]
469  tt  =
470  
471      []
472 deff('[x]=calcul(n)',text,'n')
473 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
474 x=[];
475 x=calcul(3);
476 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
477 x=[];
478 x=calcul(3);
479 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
480 x=[];
481 x=calcul(3);
482 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
483 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
484 x=[];
485 x=calcul(3);
486 if norm(x-a*[1 2 3])>1000*%eps then bugmes();quit;end
487 //
488 //macro defining ,compiling and executing a macro
489 //
490 text=['deff(''[x]=b(a)'',''if a==1 then x=1,else x=a,prod([1 1]),end'',''n''),'
491       'b,'
492       'x=b(n),']
493  text  =
494  
495 !deff('[x]=b(a)','if a==1 then x=1,else x=a,prod([1 1]),end','n'),  !
496 !                                                                   !
497 !b,                                                                 !
498 !                                                                   !
499 !x=b(n),                                                            !
500 deff('[x]=t8(n)',text','n')
501 y=t8(10);
502 if y<>10 then bugmes();quit;end
503 y=t8(10);
504 if y<>10 then bugmes();quit;end
505 //
506 //
507 s=poly(0,'s');z=poly(0,'z');
508 deff('[ok]=cplist(l1,l2)',['ok=1;'
509                  'if size(l1)<>size(l2) then ok=0,return,end'
510                  'for k=1:length(l1),'
511                     'if l1(k)<>l2(k) then ok=0,return,end;'
512                  'end'],'n')
513 deff('[r]=horner(p,x)',['if type(p)==15|type(p)==16 then';
514                            'r=horner(p(2),x)./horner(p(3),x),';
515                            'return,';
516                         'end;';
517                         'd=max(degree(p));';
518                         'r=coeff(p,d);';
519                         'for k=1:d,';
520                           'r=r*x+coeff(p,d-k)*eye();';
521                         'end;'],'n')
522 deff('[f]=%p_r_p(p1,p2)',['[l,c]=size(p2);';
523                         'if l*c <>1 then f=p1*invr(p2),return,end;';
524                         '[l,c]=size(p1);';
525                         '[p1 p2]=simp(p1,p2*ones(l,c));';
526                         'f=tlist([''r'',''num'',''den'',''dt''],p1,p2,[]);'],'n')
527 horn=horner;
528 h=1/s;
529 if cplist(h,tlist(['r','num','den','dt'],1,s,[]))==0 then bugmes();quit;end
530 h1=(z-1)/(z+1);
531 hrn=horner(h,h1);
532 if cplist(hrn , tlist(['r','num','den','dt'],z+1,z-1,[]))==0 then bugmes();quit;end
533 //
534 hrn=horner(h,h1);
535 if cplist(hrn , tlist(['r','num','den','dt'],z+1,z-1,[]))==0 then bugmes();quit;end
536 //
537 h=1/s;
538 if cplist(h,tlist(['r','num','den','dt'],1,s,[]))==0 then bugmes();quit;end
539 h1=(z-1)/(z+1);
540 hrn=horn(h,h1);
541 if cplist(hrn , tlist(['r','num','den','dt'],z+1,z-1,[]))==0 then bugmes();quit;end
542 //
543 hrn=horn(h,h1);
544 if cplist(hrn , tlist(['r','num','den','dt'],z+1,z-1,[]))==0 then bugmes();quit;end
545 //
546 //
547 //
548 text=['aa=1,if a==2 then aa=b(a),end']
549  text  =
550  
551  aa=1,if a==2 then aa=b(a),end   
552 fic=file('open',TMPDIR+"/test_macro_exec",'unknown');
553 write(fic,text)
554 file('close',fic)
555 deff('[x]=b(a)','x=a,prod([1 1])','n')
556 deff('[x]=t9(a)','exec(TMPDIR+''/test_macro_exec''),x=aa','n')
557 y=t9(2)
558  
559  aa=1,if a==2 then aa=b(a),end
560  aa  =
561  
562     1.  
563  aa  =
564  
565     2.  
566  
567  y  =
568  
569     2.  
570 if y<>2 then bugmes();quit;end
571 file('rewind',fic)
572 y=t9(2)
573  
574  aa=1,if a==2 then aa=b(a),end
575  aa  =
576  
577     1.  
578  aa  =
579  
580     2.  
581  
582  y  =
583  
584     2.  
585 if y<>2 then bugmes();quit;end
586 //
587 deff('[x]=t9(a)','exec(TMPDIR+''/test_macro_exec''),x=aa','n')
588 y=t9(2)
589  
590  aa=1,if a==2 then aa=b(a),end
591  aa  =
592  
593     1.  
594  aa  =
595  
596     2.  
597  
598  y  =
599  
600     2.  
601 if y<>2 then bugmes();quit;end
602 y=t9(2)
603  
604  aa=1,if a==2 then aa=b(a),end
605  aa  =
606  
607     1.  
608  aa  =
609  
610     2.  
611  
612  y  =
613  
614     2.  
615 if y<>2 then bugmes();quit;end