* Bug 16269 fixed: scalar struct was poorly displayed
[scilab.git] / scilab / modules / data_structures / tests / unit_tests / struct.tst
1 // =============================================================================
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2010 - DIGITEO - Sylvestre LEDRU
4 // Copyright (C) 2011 - DIGITEO - Antoine ELIAS
5 //
6 //  This file is distributed under the same license as the Scilab package.
7 // =============================================================================
8
9 // <-- ENGLISH IMPOSED -->
10 // <-- CLI SHELL MODE -->
11 // <-- NO CHECK REF -->
12
13 // unit tests for structs
14 // =============================================================================
15
16 date_st=struct('jour',25,'mois','DEC','annee',2006);
17
18 if date_st.jour <> 25 then pause, end
19 if date_st.mois <> 'DEC' then pause, end
20 if date_st.annee <> 2006 then pause, end
21
22 date_st.jour=19;
23 if date_st.jour <> 19 then pause, end
24
25 date_st.mois='AOU';
26 if date_st.mois <> 'AOU' then pause, end
27
28 date_st.annee=1973;
29 if date_st.annee <> 1973 then pause, end
30
31 date_st.semaine=32;
32 if date_st.semaine <> 32 then pause, end
33
34 // Example from bug #7244
35 clear;
36 foo(1) = 1;
37 foo(2) = 2;
38 foo(3) = 3;
39 foo = foo([1 3]);
40 foo(3) = 2;
41 if [1; 3; 2] <> foo then pause, end
42
43 clear;
44 foo(1) = 1;
45 foo(2) = 2;
46 foo(3) = 3;
47 foo = foo([%T %F %T]);
48 foo(3) = 2; 
49 if or([1; 3; 2] <> foo) then pause, end
50
51 clear;
52 foo(1).bar = 1;
53 foo(2).bar = 2;
54 foo(3).bar = 3;
55 foo = foo([1 3]);
56 foo(3).bar = 2;
57 if foo(1).bar <> 1 then pause, end
58 if foo(2).bar <> 3 then pause, end
59 if foo(3).bar <> 2 then pause, end
60
61 out.a=1;
62 out.b=2;
63 if size(out,'*') <> 1 then pause, end
64
65 out(2,3).b=2;
66 if or(size(out) <> [2 3]) then pause, end
67
68 s=struct("txt","Hello","num",%pi,"pol",%z^2+1);
69 if s.pol <> %z^2+1 then pause, end
70 if s.txt <> "Hello" then pause, end
71
72 s.txt=null();s.num=null();s.pol=null();
73 if isfield( s , "txt"  ) then pause, end
74 if isfield( s , "num"  ) then pause, end
75 if isfield( s , "pol"  ) then pause, end
76 if or(isfield( s , ["pol", "num", "txt"]  )) then pause, end
77 if or(size(s) <> [1 1]) then pause, end
78
79 z.y = 42;
80 y.o = z;
81 y.d.e = z;
82 y.f.r.h = z;
83 y.i.j.k.l = z;
84 z.m = y;
85 z.m.o.y = z;
86 if z.m.o.y.m.i.j.k.l.y <> 42 then pause, end
87 if ~isfield(z.m.o.y.m.i.j.k.l,"y") then pause, end
88
89 z.z = 21;
90 z.b = z;
91 z.b.c = z;
92 if z.z <> 21 then pause, end
93 if z.b.c.z <> 21 then pause, end
94 if ~isfield(z,"b") then pause, end
95 if ~isfield(z.b,"c") then pause, end
96
97 z(1).x.x = 1;
98 if execstr('z(42).x','errcatch')<>999 then pause,end
99
100 // -----------------------------------------------------------------
101
102 //function struct
103
104 firstname       = "firstname";
105 firstname_new   = "firstname_new";
106 lastname        = "lastname";
107 lastname_new    = "lastname_new";
108 email           = "email";
109 email_new       = "email_new";
110 phone_new       = "phone_new";
111
112 // create a one dimensional struct
113 st = struct("firstname", firstname, "lastname", lastname, "email", email);
114
115 assert_checkequal(st.firstname, firstname);
116 assert_checkequal(st.lastname, lastname);
117 assert_checkequal(st.email, email);
118
119 //change some values
120 st.firstname    = firstname_new;
121 st.lastname     = lastname_new;
122 st.email        = email_new;
123
124 // add a phone field
125 st.phone        = phone_new;
126
127 assert_checkequal(st.firstname, firstname_new);
128 assert_checkequal(st.lastname, lastname_new);
129 assert_checkequal(st.email, email_new);
130 assert_checkequal(st.phone, phone_new);
131 clear st;
132
133 //create multi-dimentional struct (4x3x2)
134 n1 = 4;
135 n2 = 3;
136 n3 = 2;
137
138 firstnames{n1,n2,n3}    = [];
139 lastnames{n1,n2,n3}     = [];
140 emails{n1,n2,n3}        = [];
141
142
143 for i = 1:(n1*n2*n3)
144     sz              = string(i);
145     firstnames{i}   = "firstname_" + sz;
146     lastnames{i}    = "lastname_" + sz;
147     emails{i}       = "email_" + sz;
148 end
149
150 st = struct("firstname", firstnames, "lastname", lastnames, "email", emails);
151
152 for i = 1:24
153     if st(i).firstname <> firstnames{i} then pause end
154     if st(i).lastname <> lastnames{i} then pause end
155     if st(i).email <> emails{i} then pause end
156 end
157 clear firstnames lastnames emails st
158
159 //creating one dimensional structure by insertion
160 firstname   = "firstname";
161 lastname    = "lastname";
162 email       = "email";
163
164 st.firstname    = firstname;
165 st.lastname     = lastname;
166 st.email        = email;
167
168 assert_checkequal(st.firstname, firstname);
169 assert_checkequal(st.lastname, lastname);
170 assert_checkequal(st.email, email);
171 clear st;
172
173 //create multi dimentional struct by insertion
174 n1 = 4;
175 n2 = 3;
176 n3 = 2;
177
178 firstnames(n1,n2,n3)    = "";
179 lastnames(n1,n2,n3)     = "";
180 emails(n1,n2,n3)        = "";
181
182
183 for i = 1:(n1*n2*n3)
184     sz              = string(i);
185     firstnames(i)   = "firstname_" + sz;
186     lastnames(i)    = "lastname_" + sz;
187     emails(i)       = "email_" + sz;
188 end
189
190 //set dimension to 4x3x2
191 st(4,3,2).firstname = firstnames($);
192 st(4,3,2).lastname = lastnames($);
193
194 //fill struct as vector
195 for i = 1:(n1*n2*n3)
196     st(i).firstname = firstnames(i);
197     st(i).lastname  = lastnames(i);
198     st(i).email     = emails(i);
199 end
200
201 //check data on each dimension
202 for i = 1:n1
203     for j = i:n2
204         for k = 1:n3
205             assert_checkequal(st(i,j,k).firstname, firstnames(i,j,k));
206             assert_checkequal(st(i,j,k).lastname, lastnames(i,j,k));
207             assert_checkequal(st(i,j,k).email, emails(i,j,k));
208         end
209     end
210 end
211 clear firstnames lastnames emails st
212
213 //fields of an empty struct
214 fields = getfield(1,struct());
215 assert_checkequal(fields(1), "st");
216 assert_checkequal(fields(2), "dims");