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