50937d2835aee5537daeef65c81ebe8e01c2dcb6
[scilab.git] / scilab / modules / ast / tests / unit_tests / insert.tst
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2012 - Scilab Enterprises - Antoine ELIAS
3 //
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12 //
13 //
14
15 // <-- CLI SHELL MODE -->
16
17 oldFuncProt = funcprot(0);
18 ref = [0 0 0 ; 0 1 4 ; 0 2 5];
19 a = zeros(3,3);a(:) = 1:9;
20 b(2:3, 2:3) = a(1:2,1:2);
21
22 assert_checkequal(b, ref);
23
24 a=2;
25 a.b=3;
26 assert_checkequal(a.b, 3);
27 a.b.c=4;
28 assert_checkequal(a.b.c, 4);
29 clear a
30
31 a.b = 2;
32 a.c = 3;
33 a.d = 4;
34
35 e.f = 7;
36 e.d = 55;
37 e.g = 12;
38
39 a(2) = e;
40 assert_checkequal(fieldnames(a(1)), fieldnames(a(2)));
41 assert_checkequal(a(1).d, 4);
42 assert_checkequal(a(2).d, 55);
43
44 clear a;
45 clear e;
46
47 a.a.a = -2;
48 assert_checkequal(a.a.a, -2);
49
50 a(2, 1:3, [2 6 7]).b = 12;
51 computed = a.b;
52 expected = list();
53 for i=1:(2*3*7)
54     expected(i) = [];
55 end
56 expected(8)  = 12;
57 expected(10) = 12;
58 expected(12) = 12;
59 expected(32) = 12;
60 expected(34) = 12;
61 expected(36) = 12;
62 expected(38) = 12;
63 expected(40) = 12;
64 expected(42) = 12;
65 assert_checkequal(a.b, expected);
66 clear a;
67
68 a(1,3).b = 2;
69 assert_checkequal(size(a), [1 3]);
70 a(5).b = 2;
71 assert_checkequal(size(a), [1 5]);
72 a(2,3).b = 2;
73 assert_checkequal(size(a), [2 5]);
74 clear a;
75
76 st.f.e = 22;
77 st.f(3).e = 112;
78 assert_checkequal(st.f.e, list(22, [], 112));
79
80 st.f(2).j = 1124;
81 assert_checkequal(st.f.j, list([], 1124, []));
82
83 st.f.e = 5;
84 assert_checkequal(st.f.e, list(5, 5, 5));
85 clear st;
86
87 //tlist
88 tl=tlist(["myTlist" "gg"], 22);
89 tll=tlist(["myTlOfTl" "tt"],tl);
90
91 a.b=tll;
92 a.b.tt(2) = 4;
93 assert_checkequal(a.b.tt(2), 4);
94 assert_checkequal(a.b.tt.gg, 4);
95 a.b.tt.gg = 5;
96 assert_checkequal(a.b.tt(2), 5);
97 assert_checkequal(a.b.tt.gg, 5);
98 clear a;
99
100 rl = rlist(%s,2);
101 a.b = [rl rl rl];
102 a.b(2) = [4 4 4];
103 assert_checkequal(a.b.num, [4 4 4]);
104 assert_checkequal(a.b.den, [2 2 2]);
105 clear a;
106
107 a.b = [rl rl rl];
108 %r_6 = %r_e;
109
110 a.b(1,2).num = 14;
111 assert_checkequal(a.b.num, [%s 14 %s]);
112 assert_checkequal(a.b.den, [2 2 2]);
113
114 a(2).b = [rl rl rl] * %s;
115 assert_checkequal(size(a), [2 1]);
116 assert_checkequal(a(2).b.num, [%s**2 %s**2 %s**2]);
117
118 err = execstr("a.b(1,3).num = 5;", "errcatch");
119 assert_checktrue(err <> 0);
120
121
122 a(3).b.num = 12;
123 assert_checkequal(a(3).b.num, 12);
124
125 execstr("a.b(1,1).num = -9;", "errcatch");
126 assert_checktrue(err <> 0);
127 clear a;
128
129 tt = tlist(["toto" "gg" "ff"] , 12, 13);
130 tt(3).c = 23;
131 assert_checkequal(tt.ff.c, 23);
132 tt(2).c = 22;
133 assert_checkequal(tt.gg.c, 22);
134
135 err = execstr("tt([2 3]).d = 99;", "errcatch");
136 assert_checktrue(err <> 0);
137
138 err = execstr("tt([2 3]).d.e = 98;", "errcatch");
139 assert_checktrue(err <> 0);
140
141 err = execstr("tt([2 3]).d(3).e = 78;", "errcatch");
142 assert_checktrue(err <> 0);
143
144 tt(2).d.e(4) = 12;
145 assert_checkequal(tt(2).d.e, [0; 0; 0; 12]);
146
147 tt(2).d(2).o = 15;
148 err = execstr("tt(2).d.e(4) = 16;", "errcatch");
149 assert_checktrue(err <> 0);
150
151 clear tt;
152
153 tl=tlist(["toto" "gg"],11);
154 function tutu(tl)
155     tl.gg = 12;
156     assert_checkequal(tl.gg, 12);
157 endfunction
158
159 tutu(tl);
160 assert_checkequal(tl.gg, 11);
161 clear tl;
162
163 // mlist
164 function varargout=%toto_e(varargin)
165     args = varargin(1);
166     ml = varargin($);
167     varargout = list();
168
169     for i=args
170         if i == 1
171             varargout($+1) = ["toto" "gg" "ff"];
172         elseif i == 2
173             varargout($+1) = ml.gg;
174         elseif i == 3
175             varargout($+1) = ml.ff;
176         end
177     end
178 endfunction
179
180 %toto_6 = %toto_e;
181
182 function r=%l_i_toto(varargin)
183     args = varargin(1);
184     l = varargin($-1);
185     r = varargin($);
186     for i=1:size(args, "*")
187         if args(i) == 2
188             r.gg = l(i);
189         elseif args(i) == 3
190             r.ff = l(i);
191         end
192     end
193 endfunction
194
195 function r=%st_i_toto(varargin)
196     args = varargin(1);
197     st = varargin($-1);
198     r = varargin($);
199     for i=args
200         if i == 2
201             r.gg = st;
202         elseif i == 3
203             r.ff = st;
204         end
205     end
206 endfunction
207
208 mm = tlist(["toto" "gg" "ff"] , 12, 13);
209 mm(3).c = 23;
210 assert_checkequal(mm.ff.c, 23);
211 mm(2).c = 22;
212 assert_checkequal(mm.gg.c, 22);
213
214 err = execstr("mm([2 3]).d = 99;", "errcatch");
215 assert_checktrue(err <> 0);
216
217 err = execstr("mm([2 3]).d.e = 98;", "errcatch");
218 assert_checktrue(err <> 0);
219
220 err = execstr("mm([2 3]).d(3).e = 78;", "errcatch");
221 assert_checktrue(err <> 0);
222
223 mm(2).d.e(4) = 12;
224 assert_checkequal(mm(2).d.e, [0; 0; 0; 12]);
225
226 mm(2).d(2).o = 15;
227 err = execstr("mm(2).d.e(4) = 16;", "errcatch");
228 assert_checktrue(err <> 0);
229
230 clear mm;
231
232 ml = mlist(["tutu" "t"], 12);
233 std=struct("d", 5);
234 stc=struct("c", 6);
235 a=std;
236 assert_checkequal(a, std);
237 a=stc;
238 assert_checkequal(a, stc);
239 ml.t = std;
240 assert_checkequal(ml.t.d, 5);
241 ml.t = stc;
242 assert_checkequal(ml.t.c, 6);
243
244 ml = mlist(["tutu" "t"], 12);
245 ml.t = 21;
246 assert_checkequal(ml.t, 21);
247
248 function r=%s_i_tutu(varargin)
249     s1=varargin($-1);
250     s2=varargin($);
251     r=s2;
252     r.t = s1;
253 endfunction
254
255 function r=%tutu_e(varargin)
256     r=varargin($).t;
257 endfunction
258
259 function r=%st_i_tutu(varargin)
260     s1=varargin($-1);
261     s2=varargin($);
262     //s2(i,j)=s1 s1 is a struct
263     r=s2;
264     r.t = s1;
265 endfunction
266
267 %tutu_6 = %tutu_e;
268
269 a.b = ml;
270 assert_checkequal(a.b(2), 21);
271 a.b(2) = stc;
272 assert_checkequal(a.b(2), stc);
273 a.b(2).c=44;
274 assert_checkequal(a.b(2).c, 44);
275 clear a;
276
277 //tlist/mlist
278 tl =tlist(["toto" "gg"], tlist(["tutu" "tt" "ee"], 22, 23));
279 tl(2)(3)=12;
280 assert_checkequal(tl.gg.ee, 12);
281 tl(2)(3)(4)=88;
282 assert_checkequal(tl.gg.ee, [12; 0; 0; 88]);
283
284 function r=%tata_e(varargin)
285     r=varargin($).ff;
286 endfunction
287
288 %tata_6 = %tata_e;
289
290 function r=%toto_i_tata(varargin)
291     s1=varargin($-1);
292     s2=varargin($);
293     r=s2;
294     r.ff = s1;
295 endfunction
296
297 ml = mlist(["tata" "ff"], tl);
298 assert_checkequal(ml.ff.gg.ee, [12; 0; 0; 88]);
299 ml(2)(2)(3) = 44;
300 assert_checkequal(ml.ff.gg.ee, 44);
301 clear tl;
302
303 // List
304 l=list();
305 // call insertion overload
306 err = execstr("l.x = 2;","errcatch");
307 assert_checkequal(err, 999);
308
309 st.l = list([1 2 3], "toto");
310 st.l = 44;
311 assert_checkequal(st.l, 44);
312
313 st.l = list([1 2 3], "toto");
314 st.l(3) = 55;
315 assert_checkequal(st.l(3), 55);
316
317 st.l(1)(2) = -2;
318 assert_checkequal(st.l(1), [1 -2 3]);
319
320 st.l(3) = tlist(["toto", "gg"], 112);
321
322 function r=%l_6(varargin)
323     r=[]
324     for in = varargin(2)
325         if type(in) == 16 // tlist
326             if find(varargin(1) == in(1)) <> [] // search field in tlist
327                 r = in(varargin(1));
328             end
329         end
330     end
331 endfunction
332
333 function l=%st_i_l(varargin)
334     l=list();
335     pos = 0;
336     for in = varargin(3)
337         pos = pos + 1;
338         if type(in) == 16 // tlist
339             in((varargin(1))) = varargin(2);
340         end
341         l(pos) = in;
342     end
343 endfunction
344
345 st.l.gg.c = 12;
346 assert_checkequal(st.l(1), [1 -2 3]);
347 assert_checkequal(st.l(2), "toto");
348 assert_checkequal(st.l(3).gg, struct("c", 12));
349 clear st;
350
351 st.l = list([1 2 3], "toto");
352 function r=%s_i_l(varargin)
353     r=struct(varargin(1), varargin(2)) ;
354 endfunction
355
356 st.l.c = 24;
357 assert_checkequal(st.l, struct("c", 24));
358 clear st;
359
360 // check error overload
361 errmsg = msprintf(gettext("%s: Affection of a string in a matrix of numbers is not implemented.\n"), "%c_i_s");
362 assert_checkerror("a=1;a(1,1)=""d""", errmsg);
363
364 // list delete
365 tl = tlist(["toto" "gg" "ff" "uu"], 45, 89, 87);
366 tl(2) = null();
367
368 assert_checkequal(tl(1), ["toto" "gg" "ff" "uu"]);
369 assert_checkequal(tl(2), 89);
370 assert_checkequal(tl(3), 87);
371
372 tl = tlist(["toto" "gg" "ff" "uu"], 45, 89, 87);
373 // call overload
374 err = execstr("tl.gg = null();","errcatch");
375 assert_checkequal(err, 999);
376
377 function l=%0_i_toto(varargin)
378     idx = find(varargin(3)(1) == varargin(1));
379     l = varargin(3);
380     l(idx) = null();
381 endfunction
382
383 tl.gg = null();
384 assert_checkequal(tl(1), ["toto" "gg" "ff" "uu"]);
385 assert_checkequal(tl(2), 89);
386 assert_checkequal(tl(3), 87);
387
388 clear tl;
389
390 l = list(["toto" "gg" "ff" "uu"], 45, 89, 87);
391 l(2) = null();
392
393 assert_checkequal(l(1), ["toto" "gg" "ff" "uu"]);
394 assert_checkequal(l(2), 89);
395 assert_checkequal(l(3), 87);
396
397 l = list(["toto" "gg" "ff" "uu"], 45, 89, 87);
398 // call overload
399 err = execstr("l.gg = null();","errcatch");
400 assert_checkequal(err, 999);
401
402 clear l;
403
404 // cell
405
406 function varargout=%toto_e(varargin)
407     args = varargin(1);
408     ml = varargin($);
409     varargout = list();
410
411     for i=args
412         if i == 1
413             varargout($+1) = ["toto" "ff"];
414         elseif i == 2
415             varargout($+1) = ml.ff;
416         end
417     end
418 endfunction
419
420 %toto_6 = %toto_e;
421
422 function ml=%s_i_toto(varargin)
423     args = varargin(1);
424     s = varargin($-1);
425     ml = varargin($);
426     for i=1:size(args, "*")
427         if args(i) == 2
428             ml.ff = s;
429         end
430     end
431 endfunction
432
433 tl = tlist(["tutu" "gg"], 12);
434 ml = mlist(["toto" "ff"], 22);
435
436 a{2} = 2;
437 assert_checkequal(a{2}, 2);
438 a{1,3} = tl;
439 assert_checkequal(a{5}(1), ["tutu" "gg"]);
440 assert_checkequal(a{5}(2), 12);
441 a{[3 6]} = ml;
442 assert_checkequal(a{3}(1), ["toto" "ff"]);
443 assert_checkequal(a{3}(2), 22);
444 assert_checkequal(a{6}(1), ["toto" "ff"]);
445 assert_checkequal(a{6}(2), 22);
446
447 a{2}.c = 123;
448 assert_checkequal(a{2}.c, 123);
449
450 a{2}(3).e = 12;
451 assert_checkequal(a{2}.e, list([], [], 12));
452 assert_checkequal(a{2}.c, list(123, [], []));
453
454 a{2}.b = 12;
455 assert_checkequal(a{2}.b, list(12, 12, 12));
456
457 a{2}.e = 99;
458 assert_checkequal(a{2}.e, list(99, 99, 99));
459
460 a{6}(2) = 8;
461 assert_checkequal(a{6}(1), ["toto" "ff"]);
462 assert_checkequal(a{6}(2), 8);
463
464 a{1, [1 3]}.gg = 14;
465 assert_checkequal(a{1}.gg, 14);
466 assert_checkequal(a{5}.gg, 14);
467
468 a{1:2, [1 3], 2}.g = "A string";
469 assert_checkequal(a{7}.g, "A string");
470 assert_checkequal(a{8}.g, "A string");
471 assert_checkequal(a{11}.g, "A string");
472 assert_checkequal(a{12}.g, "A string");
473 clear a;
474
475 a{1,3}.b = 2;
476 assert_checkequal(size(a), [1 3]);
477 a{5}.b = 2;
478 assert_checkequal(size(a), [1 5]);
479 a{2,3}.b = 2;
480 assert_checkequal(size(a), [2 5]);
481 clear a;
482
483 a{1,3} = 2;
484 assert_checkequal(size(a), [1 3]);
485 a{5} = 2;
486 assert_checkequal(size(a), [1 5]);
487 a{2,3} = 2;
488 assert_checkequal(size(a), [2 5]);
489 clear a;
490
491 tl = tlist(["mytlist", "f1"], 12);
492 ml = mlist(["mymlist", "f"], tl);
493 mml = mlist(["mymmlist", "ff1"], ml);
494
495 mml(list("ff1", "f", 2)) = 14;
496
497 assert_checkequal(tl.f1, 12);
498 assert_checkequal(ml.f.f1, 12);
499 assert_checkequal(mml.ff1.f.f1, 14);
500
501 funcprot(oldFuncProt);
502
503
504 // multiple insertion in struct
505 function r = initst()
506     r.f.e = list()
507     r.f(3).e = 3
508 endfunction
509
510 st=initst();
511 st.f(:).e = 5;
512 assert_checkequal(st.f.e, list(5,5,5));
513
514 st=initst();
515 st.f(1:4).e = 5;
516 assert_checkequal(st.f.e, list(5,5,5,5));
517
518 st=initst();
519 err=execstr("st.f(1:2).e(2) = 5;", "errcatch");
520 assert_checktrue(err <> 0);
521
522 st=initst();
523 err=execstr("st(1:2).f(1:4).e = 5;", "errcatch");
524 assert_checktrue(err <> 0);
525
526 // insert without arguments
527 errmsg = msprintf(gettext("Wrong insertion : Cannot insert without arguments."));
528 assert_checkerror("a()=1;", errmsg);
529 assert_checkerror("a{}=1;", errmsg);
530 a=1;
531 assert_checkerror("a()=1;", errmsg);