f5fd18472f67184ca7a8c6a17db81fc0dc5e7edb
[scilab.git] / scilab / modules / core / tests / unit_tests / macro.tst
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 pause,end
14 if v<>-1 then pause,end
15 //
16 //with arguments
17 b=2;
18 if t1(1)<>t1(1,2) then pause,end
19 t2=t1;
20 //
21 [u,v]=t1(1,2);
22 if u<> 3 then pause,end
23 if v<>-1 then pause,end
24 b=2;
25 if t1(1)<>t1(1,2) then pause,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 pause,end
32 if v<>-1 then pause,end
33 if z<>1 then pause,end
34 b=2;
35 clear z
36 if t3(1)<>t3(1,2) then pause,end
37 if z<>1 then pause,end
38 t4=t3;
39 [u,v]=t3(1,2);
40 if u<> 3 then pause,end
41 if v<>-1 then pause,end
42 if z<>1 then pause,end
43 clear z
44 b=2;
45 if t3(1)<>t3(1,2) then pause,end
46 if z<>1 then pause,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 pause,end
67 if v<>15 then pause,end
68 if tt<>'ok' then pause,end
69 clear tt
70 [u,v]=t5(-1);
71 if u<>-1 then pause,end
72 if v<>'no' then pause,end
73 if exists('tt')==1 then pause,end
74 clear tt v
75 u=t5(-2);
76 if u<>-1 then pause,end
77 if tt<>-2 then pause,end
78 clear tt
79 u=t5(-4);
80 if u<>'neg' then pause,end
81 if exists('tt')==1 then pause,end
82 clear u v tt
83 [u,v]=t5(5);
84 if u<>'pos' then pause,end
85 if v<>15 then pause,end
86 if tt<>'ok' then pause,end
87 clear tt
88 [u,v]=t5(-1);
89 if u<>-1 then pause,end
90 if v<>'no' then pause,end
91 if exists('tt')==1 then pause,end
92 clear tt v
93 u=t5(-2);
94 if u<>-1 then pause,end
95 if tt<>-2 then pause,end
96 clear tt
97 u=t5(-4);
98 if u<>'neg' then pause,end
99 if exists('tt')==1 then pause,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 pause,end
120 if v<>15 then pause,end
121 if tt<>'ok' then pause,end
122 clear tt
123 [u,v]=t5(-1);
124 if u<>-1 then pause,end
125 if v<>'no' then pause,end
126 if exists('tt')==1 then pause,end
127 clear tt v
128 u=t5(-2);
129 if u<>-1 then pause,end
130 if tt<>-2 then pause,end
131 clear tt
132 u=t5(-4);
133 if u<>'neg' then pause,end
134 if exists('tt')==1 then pause,end
135 clear u v tt
136 [u,v]=t5(5);
137 if u<>'pos' then pause,end
138 if v<>15 then pause,end
139 if tt<>'ok' then pause,end
140 clear tt
141 [u,v]=t5(-1);
142 if u<>-1 then pause,end
143 if v<>'no' then pause,end
144 if exists('tt')==1 then pause,end
145 clear tt v
146 u=t5(-2);
147 if u<>-1 then pause,end
148 if tt<>-2 then pause,end
149 clear tt
150 u=t5(-4);
151 if u<>'neg' then pause,end
152 if exists('tt')==1 then pause,end
153 deff('[x,y]=t5(n)',text,'n')
154 [u,v]=t5(5);
155 if u<>'pos' then pause,end
156 if v<>15 then pause,end
157 if tt<>'ok' then pause,end
158 clear tt
159 [u,v]=t5(-1);
160 if u<>-1 then pause,end
161 if v<>'no' then pause,end
162 if exists('tt')==1 then pause,end
163 clear tt v
164 u=t5(-2);
165 if u<>-1 then pause,end
166 if tt<>-2 then pause,end
167 clear tt
168 u=t5(-4);
169 if u<>'neg' then pause,end
170 if exists('tt')==1 then pause,end
171 // 
172 clear u v tt
173 [u,v]=t5(5);
174 if u<>'pos' then pause,end
175 if v<>15 then pause,end
176 if tt<>'ok' then pause,end
177 clear tt
178 [u,v]=t5(-1);
179 if u<>-1 then pause,end
180 if v<>'no' then pause,end
181 if exists('tt')==1 then pause,end
182 clear tt v
183 u=t5(-2);
184 if u<>-1 then pause,end
185 if tt<>-2 then pause,end
186 clear tt
187 u=t5(-4);
188 if u<>'neg' then pause,end
189 if exists('tt')==1 then pause,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 pause,end
196 if v<>15 then pause,end
197 if tt<>'ok' then pause,end
198 clear tt
199 [u,v]=t5(-1);
200 if u<>-1 then pause,end
201 if v<>'no' then pause,end
202 if exists('tt')==1 then pause,end
203 clear tt v
204 u=t5(-2);
205 if u<>-1 then pause,end
206 if tt<>-2 then pause,end
207 clear tt
208 u=t5(-4);
209 if u<>'neg' then pause,end
210 if exists('tt')==1 then pause,end
211 clear u v tt
212 [u,v]=t5(5);
213 if u<>'pos' then pause,end
214 if v<>15 then pause,end
215 if tt<>'ok' then pause,end
216 clear tt
217 [u,v]=t5(-1);
218 if u<>-1 then pause,end
219 if v<>'no' then pause,end
220 if exists('tt')==1 then pause,end
221 clear tt v
222 u=t5(-2);
223 if u<>-1 then pause,end
224 if tt<>-2 then pause,end
225 clear tt
226 u=t5(-4);
227 if u<>'neg' then pause,end
228 if exists('tt')==1 then pause,end
229 //
230 deff('[x,y]=t5(n)',text,'n')
231 [u,v]=t5(5);
232 if u<>'pos' then pause,end
233 if v<>15 then pause,end
234 if tt<>'ok' then pause,end
235 clear tt
236 [u,v]=t5(-1);
237 if u<>-1 then pause,end
238 if v<>'no' then pause,end
239 if exists('tt')==1 then pause,end
240 clear tt v
241 u=t5(-2);
242 if u<>-1 then pause,end
243 if tt<>-2 then pause,end
244 clear tt
245 u=t5(-4);
246 if u<>'neg' then pause,end
247 if exists('tt')==1 then pause,end
248 //
249 clear u v tt
250 [u,v]=t5(5);
251 if u<>'pos' then pause,end
252 if v<>15 then pause,end
253 if tt<>'ok' then pause,end
254 clear tt
255 [u,v]=t5(-1);
256 if u<>-1 then pause,end
257 if v<>'no' then pause,end
258 if exists('tt')==1 then pause,end
259 clear tt v
260 u=t5(-2);
261 if u<>-1 then pause,end
262 if tt<>-2 then pause,end
263 clear tt
264 u=t5(-4);
265 if u<>'neg' then pause,end
266 if exists('tt')==1 then pause,end
267 // resume
268 deff('[]=t6(a)','x=resume(a)','n')
269 clear ans x
270 t6(15)
271 if x<>15 then pause,end
272 if exists('ans')==1 then pause,end
273 //
274 clear ans x
275 t6(15)
276 if x<>15 then pause,end
277 if exists('ans')==1 then pause,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 if norm(y-[a 2*a]) >1000*%eps then pause,end
286 y=ode(0,0,1:2,simul)
287 if norm(y-[a 2*a]) >1000*%eps then pause,end
288 //appel avec passage d'arguments supplementaires
289 deff('[ydot]=simul(t,y,a)','ydot=a','n')
290 y=ode(0,0,1:2,list(simul,a))
291 if norm(y-[a 2*a]) >1000*%eps then pause,end
292 y=ode(0,0,1:2,list(simul,a))
293 if norm(y-[a 2*a]) >1000*%eps then pause,end
294 //
295 //non linear
296 //
297 text=['for k=1:n,'
298      'y=ode(a*(k-1),k-1,k,simul),'
299      'x=[x,y],'
300      'end'];
301 //
302 deff('[x]=calcul(n)',text,'n')
303 deff('[ydot]=simul(t,y,a)','ydot=a','n')
304 x=[];
305 x=calcul(3);
306 if norm(x-a*[1 2 3])>1000*%eps then pause,end
307 x=[];
308 x=calcul(3);
309 if norm(x-a*[1 2 3])>1000*%eps then pause,end
310 x=[];
311 x=calcul(3);
312 if norm(x-a*[1 2 3])>1000*%eps then pause,end
313 deff('[ydot]=simul(t,y,a)','ydot=a','n')
314 x=[];
315 x=calcul(3);
316 if norm(x-a*[1 2 3])>1000*%eps then pause,end
317 //
318 text(2)='y=ode(a*(k-1),k-1,k,list(simul,a)),';
319 deff('[x]=calcul(n)',text,'n')
320 deff('[ydot]=simul(t,y,a)','ydot=a','n')
321 x=[];
322 x=calcul(3);
323 if norm(x-a*[1 2 3])>1000*%eps then pause,end
324 x=[];
325 x=calcul(3);
326 if norm(x-a*[1 2 3])>1000*%eps then pause,end
327 x=[];
328 x=calcul(3);
329 if norm(x-a*[1 2 3])>1000*%eps then pause,end
330 deff('[ydot]=simul(t,y,a)','ydot=a','n')
331 x=[];
332 x=calcul(3);
333 if norm(x-a*[1 2 3])>1000*%eps then pause,end
334 //resume in external
335 deff('[ydot]=simul(t,y,a)','ydot=a,tt=resume([tt,t])','n')
336 tt=[]
337 deff('[x]=calcul(n)',text,'n')
338 deff('[ydot]=simul(t,y,a)','ydot=a','n')
339 x=[];
340 x=calcul(3);
341 if norm(x-a*[1 2 3])>1000*%eps then pause,end
342 x=[];
343 x=calcul(3);
344 if norm(x-a*[1 2 3])>1000*%eps then pause,end
345 x=[];
346 x=calcul(3);
347 if norm(x-a*[1 2 3])>1000*%eps then pause,end
348 deff('[ydot]=simul(t,y,a)','ydot=a','n')
349 x=[];
350 x=calcul(3);
351 if norm(x-a*[1 2 3])>1000*%eps then pause,end
352 //
353 //external calls a macro
354 //
355 deff('[x]=b(a)','if a==1 then x=a,prod([1 1]),else x=a,prod([1 1]),end','n')
356 text=['for k=1:n,'
357      'y=ode(a*(k-1),k-1,k,simul),'
358      'x=[x,y],'
359      'end'];
360 //
361 deff('[x]=calcul(n)',text,'n')
362 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
363 x=[];
364 x=calcul(3);
365 if norm(x-a*[1 2 3])>1000*%eps then pause,end
366 x=[];
367 x=calcul(3);
368 if norm(x-a*[1 2 3])>1000*%eps then pause,end
369 x=[];
370 x=calcul(3);
371 if norm(x-a*[1 2 3])>1000*%eps then pause,end
372 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
373 x=[];
374 x=calcul(3);
375 if norm(x-a*[1 2 3])>1000*%eps then pause,end
376 //
377 text(2)='y=ode(a*(k-1),k-1,k,list(simul,a)),';
378 deff('[x]=calcul(n)',text,'n')
379 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
380 x=[];
381 x=calcul(3);
382 if norm(x-a*[1 2 3])>1000*%eps then pause,end
383 x=[];
384 x=calcul(3);
385 if norm(x-a*[1 2 3])>1000*%eps then pause,end
386 x=[];
387 x=calcul(3);
388 if norm(x-a*[1 2 3])>1000*%eps then pause,end
389 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
390 x=[];
391 x=calcul(3);
392 if norm(x-a*[1 2 3])>1000*%eps then pause,end
393 //
394 deff('[ydot]=simul(t,y,a)','ydot=b(a),tt=resume([tt,t])','n')
395 tt=[]
396 deff('[x]=calcul(n)',text,'n')
397 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
398 x=[];
399 x=calcul(3);
400 if norm(x-a*[1 2 3])>1000*%eps then pause,end
401 x=[];
402 x=calcul(3);
403 if norm(x-a*[1 2 3])>1000*%eps then pause,end
404 x=[];
405 x=calcul(3);
406 if norm(x-a*[1 2 3])>1000*%eps then pause,end
407 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
408 x=[];
409 x=calcul(3);
410 if norm(x-a*[1 2 3])>1000*%eps then pause,end
411 text=['for k=1:n,'
412      'y=ode(a*(k-1),k-1,k,simul),'
413      'x=[x,y],'
414      'end'];
415 //
416 deff('[x]=calcul(n)',text,'n')
417 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
418 x=[];
419 x=calcul(3);
420 if norm(x-a*[1 2 3])>1000*%eps then pause,end
421 x=[];
422 x=calcul(3);
423 if norm(x-a*[1 2 3])>1000*%eps then pause,end
424 x=[];
425 x=calcul(3);
426 if norm(x-a*[1 2 3])>1000*%eps then pause,end
427 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
428 x=[];
429 x=calcul(3);
430 if norm(x-a*[1 2 3])>1000*%eps then pause,end
431 //
432 text(2)='y=ode(a*(k-1),k-1,k,list(simul,a)),';
433 deff('[x]=calcul(n)',text,'n')
434 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
435 x=[];
436 x=calcul(3);
437 if norm(x-a*[1 2 3])>1000*%eps then pause,end
438 x=[];
439 x=calcul(3);
440 if norm(x-a*[1 2 3])>1000*%eps then pause,end
441 x=[];
442 x=calcul(3);
443 if norm(x-a*[1 2 3])>1000*%eps then pause,end
444 deff('[ydot]=simul(t,y,a)','ydot=b(a)','n')
445 x=[];
446 x=calcul(3);
447 if norm(x-a*[1 2 3])>1000*%eps then pause,end
448 //
449 deff('[ydot]=simul(t,y,a)','ydot=b(a),tt=resume([tt,t])','n')
450 tt=[]
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 pause,end
456 x=[];
457 x=calcul(3);
458 if norm(x-a*[1 2 3])>1000*%eps then pause,end
459 x=[];
460 x=calcul(3);
461 if norm(x-a*[1 2 3])>1000*%eps then pause,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 pause,end
466 //
467 //macro defining ,compiling and executing a macro
468 //
469 text=['deff(''[x]=b(a)'',''if a==1 then x=1,else x=a,prod([1 1]),end'',''n''),'
470       'b,'
471       'x=b(n),']
472 deff('[x]=t8(n)',text','n')
473 y=t8(10);
474 if y<>10 then pause,end
475 y=t8(10);
476 if y<>10 then pause,end
477 //
478 //
479 s=poly(0,'s');z=poly(0,'z');
480 deff('[ok]=cplist(l1,l2)',['ok=1;'
481                  'if size(l1)<>size(l2) then ok=0,return,end'
482                  'for k=1:length(l1),'
483                     'if l1(k)<>l2(k) then ok=0,return,end;'
484                  'end'],'n')
485 deff('[r]=horner(p,x)',['if type(p)==15|type(p)==16 then';
486                            'r=horner(p(2),x)./horner(p(3),x),';
487                            'return,';
488                         'end;';
489                         'd=max(degree(p));';
490                         'r=coeff(p,d);';
491                         'for k=1:d,';
492                           'r=r*x+coeff(p,d-k)*eye();';
493                         'end;'],'n')
494 deff('[f]=%p_r_p(p1,p2)',['[l,c]=size(p2);';
495                         'if l*c <>1 then f=p1*invr(p2),return,end;';
496                         '[l,c]=size(p1);';
497                         '[p1 p2]=simp(p1,p2*ones(l,c));';
498                         'f=tlist([''r'',''num'',''den'',''dt''],p1,p2,[]);'],'n')
499  
500  
501  
502 horn=horner;
503 h=1/s;
504 if cplist(h,tlist(['r','num','den','dt'],1,s,[]))==0 then pause,end
505 h1=(z-1)/(z+1);
506 hrn=horner(h,h1);
507 if cplist(hrn , tlist(['r','num','den','dt'],z+1,z-1,[]))==0 then pause,end
508 //
509 hrn=horner(h,h1);
510 if cplist(hrn , tlist(['r','num','den','dt'],z+1,z-1,[]))==0 then pause,end
511 //
512 h=1/s;
513 if cplist(h,tlist(['r','num','den','dt'],1,s,[]))==0 then pause,end
514 h1=(z-1)/(z+1);
515 hrn=horn(h,h1);
516 if cplist(hrn , tlist(['r','num','den','dt'],z+1,z-1,[]))==0 then pause,end
517 //
518 hrn=horn(h,h1);
519 if cplist(hrn , tlist(['r','num','den','dt'],z+1,z-1,[]))==0 then pause,end
520 //
521 //
522 //
523 text=['aa=1,if a==2 then aa=b(a),end']
524 fic=file('open',TMPDIR+"/test_macro_exec",'unknown');
525 write(fic,text)
526 file('close',fic)
527 deff('[x]=b(a)','x=a,prod([1 1])','n')
528 deff('[x]=t9(a)','exec(TMPDIR+''/test_macro_exec''),x=aa','n')
529 y=t9(2)
530 if y<>2 then pause,end
531 file('rewind',fic)
532 y=t9(2)
533 if y<>2 then pause,end
534 //
535 deff('[x]=t9(a)','exec(TMPDIR+''/test_macro_exec''),x=aa','n')
536 y=t9(2)
537 if y<>2 then pause,end
538 y=t9(2)
539 if y<>2 then pause,end
540