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