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