Commit | Line | Data |
---|---|---|
970ed795 | 1 | /****************************************************************************** |
d44e3c4f | 2 | * Copyright (c) 2000-2016 Ericsson Telecom AB |
970ed795 EL |
3 | * All rights reserved. This program and the accompanying materials |
4 | * are made available under the terms of the Eclipse Public License v1.0 | |
5 | * which accompanies this distribution, and is available at | |
6 | * http://www.eclipse.org/legal/epl-v10.html | |
d44e3c4f | 7 | * |
8 | * Contributors: | |
9 | * Balasko, Jeno | |
10 | * Baranyi, Botond | |
11 | * | |
970ed795 EL |
12 | ******************************************************************************/ |
13 | module TrecofParamRef { | |
14 | ||
15 | import from BerType language "ASN.1:1997" all with { encode "DER:1997" }; | |
16 | ||
17 | // This module contains test cases, where a record of/set of and one of its elements are passed | |
18 | // as inout parameters to a function. Inside this function modifications to the element will also modify | |
19 | // the record of, while modifications to the record of may (in our case WILL) modify the element. | |
20 | ||
21 | type component CT_Empty {}; | |
22 | ||
23 | // 1. Assignment | |
24 | type record of integer RoI; | |
25 | ||
26 | function f_param_ref_assign(inout RoI p_roi, inout integer p_elem) runs on CT_Empty | |
27 | { | |
28 | p_roi := { 10 }; | |
29 | ||
d44e3c4f | 30 | if (p_roi == { 10 }) { setverdict(pass); } |
970ed795 EL |
31 | else { setverdict(fail, "@1 got: ", p_roi, ", expected: { 10 }"); } |
32 | ||
d44e3c4f | 33 | if (log2str(p_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
34 | else { setverdict(fail, "@2 got: ", p_elem, ", expected: <unbound>"); } |
35 | ||
36 | p_elem := 20; | |
37 | ||
38 | if (log2str(p_roi) == "{ 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }") { setverdict(pass); } | |
39 | else { setverdict(fail, "@3 got: ", p_roi, ", expected: { 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }"); } | |
40 | } | |
41 | ||
42 | testcase tc_param_ref_assign() runs on CT_Empty | |
43 | { | |
44 | var RoI v_roi := { 0, 1, 2, 3, 4, 5 }; | |
45 | f_param_ref_assign(v_roi, v_roi[5]); | |
46 | ||
47 | if (log2str(v_roi) == "{ 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }") { setverdict(pass); } | |
48 | else { setverdict(fail, "@4 got: ", v_roi, ", expected: { 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }"); } | |
49 | } | |
50 | ||
51 | // 2. Concatenation | |
52 | function f_param_ref_concat(inout RoI p_roi, inout integer p_elem) runs on CT_Empty | |
53 | { | |
54 | const RoI c := { 9, 8, 7 }; | |
55 | ||
56 | p_roi := c & { 4, 5 }; | |
57 | ||
d44e3c4f | 58 | if (p_roi == { 9, 8, 7, 4, 5 }) { setverdict(pass); } |
970ed795 EL |
59 | else { setverdict(fail, "@1 got: ", p_roi, ", expected: { 9, 8, 7, 4, 5 }"); } |
60 | ||
d44e3c4f | 61 | if (log2str(p_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
62 | else { setverdict(fail, "@2 got: ", p_elem, ", expected: <unbound>"); } |
63 | ||
64 | p_elem := 20; | |
65 | ||
66 | if (log2str(p_roi) == "{ 9, 8, 7, 4, 5, 20 }") { setverdict(pass); } | |
67 | else { setverdict(fail, "@3 got: ", p_roi, ", expected: { 9, 8, 7, 4, 5, 20 }"); } | |
68 | ||
69 | p_roi := p_roi & { 6, 7 }; | |
70 | ||
d44e3c4f | 71 | if (p_roi == { 9, 8, 7, 4, 5, 20, 6, 7 }) { setverdict(pass); } |
970ed795 EL |
72 | else { setverdict(fail, "@4 got: ", p_roi, ", expected: { 9, 8, 7, 4, 5, 20, 6, 7 }"); } |
73 | } | |
74 | ||
75 | testcase tc_param_ref_concat() runs on CT_Empty | |
76 | { | |
77 | var RoI v_roi := { 0, 1, 2, 3, 4, 5 }; | |
78 | f_param_ref_concat(v_roi, v_roi[5]); | |
79 | ||
80 | if (log2str(v_roi) == "{ 9, 8, 7, 4, 5, 20, 6, 7 }") { setverdict(pass); } | |
81 | else { setverdict(fail, "@5 got: ", v_roi, ", expected: { 9, 8, 7, 4, 5, 20, 6, 7 }"); } | |
82 | } | |
83 | ||
84 | // 3. Replacing | |
85 | function f_param_ref_replace(inout RoI p_roi, inout integer p_elem) runs on CT_Empty | |
86 | { | |
87 | const RoI c1 := { 7, 6 }; | |
88 | const RoI c2 := { 5, 4, 3 }; | |
89 | ||
90 | p_roi := replace(p_roi, 2, 4, c1); | |
91 | ||
d44e3c4f | 92 | if (p_roi == { 0, 1, 7, 6 }) { setverdict(pass); } |
970ed795 EL |
93 | else { setverdict(fail, "@1 got: ", p_roi, ", expected: { 0, 1, 7, 6 }"); } |
94 | ||
d44e3c4f | 95 | if (log2str(p_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
96 | else { setverdict(fail, "@2 got: ", p_elem, ", expected: <unbound>"); } |
97 | ||
98 | p_elem := 20; | |
99 | ||
100 | if (log2str(p_roi) == "{ 0, 1, 7, 6, <unbound>, 20 }") { setverdict(pass); } | |
101 | else { setverdict(fail, "@3 got: ", p_roi, ", expected: { 0, 1, 7, 6, <unbound>, 20 }"); } | |
102 | ||
103 | p_roi := replace(p_roi, 4, 2, c2); | |
104 | ||
d44e3c4f | 105 | if (p_roi == { 0, 1, 7, 6, 5, 4, 3 }) { setverdict(pass); } |
970ed795 EL |
106 | else { setverdict(fail, "@4 got: ", p_roi, ", expected: { 0, 1, 7, 6, 5, 4, 3 }"); } |
107 | ||
d44e3c4f | 108 | if (p_elem == 4) { setverdict(pass); } |
970ed795 EL |
109 | else { setverdict(fail, "@5 got: ", p_elem, ", expected: 4"); } |
110 | } | |
111 | ||
112 | testcase tc_param_ref_replace() runs on CT_Empty | |
113 | { | |
114 | var RoI v_roi := { 0, 1, 2, 3, 4, 5 }; | |
115 | f_param_ref_replace(v_roi, v_roi[5]); | |
116 | ||
117 | if (log2str(v_roi) == "{ 0, 1, 7, 6, 5, 4, 3 }") { setverdict(pass); } | |
118 | else { setverdict(fail, "@6 got: ", v_roi, ", expected: { 0, 1, 7, 6, 5, 4, 3 }"); } | |
119 | } | |
120 | ||
121 | // 4. JSON decoding | |
122 | type record of integer RoI_json with { encode "JSON" }; | |
123 | ||
124 | external function f_enc_json(in RoI_json x) return octetstring | |
125 | with { extension "prototype(convert) encode(JSON)" } | |
126 | ||
127 | external function f_dec_json(in octetstring os, out RoI_json x) | |
128 | with { extension "prototype(fast) decode(JSON)" } | |
129 | ||
130 | function f_param_ref_json(inout RoI_json p_roi, inout integer p_elem) runs on CT_Empty | |
131 | { | |
132 | var RoI_json enc_val := { 10, 16 }; | |
133 | var octetstring os := f_enc_json(enc_val); | |
134 | f_dec_json(os, p_roi); | |
135 | ||
d44e3c4f | 136 | if (p_roi == enc_val) { setverdict(pass); } |
970ed795 EL |
137 | else { setverdict(fail, "@1 got: ", p_roi, ", expected: ", enc_val); } |
138 | ||
d44e3c4f | 139 | if (log2str(p_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
140 | else { setverdict(fail, "@2 got: ", p_elem, ", expected: <unbound>"); } |
141 | ||
142 | p_elem := 20; | |
143 | ||
144 | if (log2str(p_roi) == "{ 10, 16, <unbound>, <unbound>, <unbound>, 20 }") { setverdict(pass); } | |
145 | else { setverdict(fail, "@3 got: ", p_roi, ", expected: { 10, 16, <unbound>, <unbound>, <unbound>, 20 }"); } | |
146 | ||
147 | enc_val := { 3, 2, 1, 9, 8, 7, 6 }; | |
148 | os := f_enc_json(enc_val); | |
149 | f_dec_json(os, p_roi); | |
150 | ||
d44e3c4f | 151 | if (p_roi == enc_val) { setverdict(pass); } |
970ed795 EL |
152 | else { setverdict(fail, "@4 got: ", p_roi, ", expected: ", enc_val); } |
153 | ||
d44e3c4f | 154 | if (p_elem == 7) { setverdict(pass); } |
970ed795 EL |
155 | else { setverdict(fail, "@5 got: ", p_elem, ", expected: 7"); } |
156 | } | |
157 | ||
158 | testcase tc_param_ref_json() runs on CT_Empty | |
159 | { | |
160 | var RoI_json v_roi := { 0, 1, 2, 3, 4, 5 }; | |
161 | f_param_ref_json(v_roi, v_roi[5]); | |
162 | ||
163 | if (log2str(v_roi) == "{ 3, 2, 1, 9, 8, 7, 6 }") { setverdict(pass); } | |
164 | else { setverdict(fail, "@6 got: ", v_roi, ", expected: { 3, 2, 1, 9, 8, 7, 6 }"); } | |
165 | } | |
166 | ||
167 | // 5. XER decoding | |
168 | type record of integer RoI_xer with { encode "XML" }; | |
169 | ||
170 | external function f_enc_xer(in RoI_xer x) return octetstring | |
171 | with { extension "prototype(convert) encode(XER:XER_EXTENDED)" } | |
172 | ||
173 | external function f_dec_xer(in octetstring os, out RoI_xer x) | |
174 | with { extension "prototype(fast) decode(XER:XER_EXTENDED)" } | |
175 | ||
176 | function f_param_ref_xer(inout RoI_xer p_roi, inout integer p_elem) runs on CT_Empty | |
177 | { | |
178 | var RoI_xer enc_val := { 10, 16 }; | |
179 | var octetstring os := f_enc_xer(enc_val); | |
180 | f_dec_xer(os, p_roi); | |
181 | ||
d44e3c4f | 182 | if (p_roi == enc_val) { setverdict(pass); } |
970ed795 EL |
183 | else { setverdict(fail, "@1 got: ", p_roi, ", expected: ", enc_val); } |
184 | ||
d44e3c4f | 185 | if (log2str(p_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
186 | else { setverdict(fail, "@2 got: ", p_elem, ", expected: <unbound>"); } |
187 | ||
188 | p_elem := 20; | |
189 | ||
190 | if (log2str(p_roi) == "{ 10, 16, <unbound>, <unbound>, <unbound>, 20 }") { setverdict(pass); } | |
191 | else { setverdict(fail, "@3 got: ", p_roi, ", expected: { 10, 16, <unbound>, <unbound>, <unbound>, 20 }"); } | |
192 | ||
193 | enc_val := { 3, 2, 1, 9, 8, 7, 6 }; | |
194 | os := f_enc_xer(enc_val); | |
195 | f_dec_xer(os, p_roi); | |
196 | ||
d44e3c4f | 197 | if (p_roi == enc_val) { setverdict(pass); } |
970ed795 EL |
198 | else { setverdict(fail, "@4 got: ", p_roi, ", expected: ", enc_val); } |
199 | ||
d44e3c4f | 200 | if (p_elem == 7) { setverdict(pass); } |
970ed795 EL |
201 | else { setverdict(fail, "@5 got: ", p_elem, ", expected: 7"); } |
202 | } | |
203 | ||
204 | testcase tc_param_ref_xer() runs on CT_Empty | |
205 | { | |
206 | var RoI_xer v_roi := { 0, 1, 2, 3, 4, 5 }; | |
207 | f_param_ref_xer(v_roi, v_roi[5]); | |
208 | ||
209 | if (log2str(v_roi) == "{ 3, 2, 1, 9, 8, 7, 6 }") { setverdict(pass); } | |
210 | else { setverdict(fail, "@6 got: ", v_roi, ", expected: { 3, 2, 1, 9, 8, 7, 6 }"); } | |
211 | } | |
212 | ||
213 | // 6. TEXT decoding | |
214 | type record of integer RoI_text with { encode "TEXT"; variant "BEGIN('numbrz:'),END(';'),SEPARATOR(' ')"; }; | |
215 | ||
216 | external function f_enc_text(in RoI_text x) return charstring | |
217 | with { extension "prototype(convert) encode(TEXT)" } | |
218 | ||
219 | external function f_dec_text(in charstring cs, out RoI_text x) | |
220 | with { extension "prototype(fast) decode(TEXT)" } | |
221 | ||
222 | function f_param_ref_text(inout RoI_text p_roi, inout integer p_elem) runs on CT_Empty | |
223 | { | |
224 | var RoI_text enc_val := { 10, 16 }; | |
225 | var charstring cs := f_enc_text(enc_val); | |
226 | f_dec_text(cs, p_roi); | |
227 | ||
d44e3c4f | 228 | if (p_roi == enc_val) { setverdict(pass); } |
970ed795 EL |
229 | else { setverdict(fail, "@1 got: ", p_roi, ", expected: ", enc_val); } |
230 | ||
d44e3c4f | 231 | if (log2str(p_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
232 | else { setverdict(fail, "@2 got: ", p_elem, ", expected: <unbound>"); } |
233 | ||
234 | p_elem := 20; | |
235 | ||
236 | if (log2str(p_roi) == "{ 10, 16, <unbound>, <unbound>, <unbound>, 20 }") { setverdict(pass); } | |
237 | else { setverdict(fail, "@3 got: ", p_roi, ", expected: { 10, 16, <unbound>, <unbound>, <unbound>, 20 }"); } | |
238 | ||
239 | enc_val := { 3, 2, 1, 9, 8, 7, 6 }; | |
240 | cs := f_enc_text(enc_val); | |
241 | f_dec_text(cs, p_roi); | |
242 | ||
d44e3c4f | 243 | if (p_roi == enc_val) { setverdict(pass); } |
970ed795 EL |
244 | else { setverdict(fail, "@4 got: ", p_roi, ", expected: ", enc_val); } |
245 | ||
d44e3c4f | 246 | if (p_elem == 7) { setverdict(pass); } |
970ed795 EL |
247 | else { setverdict(fail, "@5 got: ", p_elem, ", expected: 7"); } |
248 | } | |
249 | ||
250 | testcase tc_param_ref_text() runs on CT_Empty | |
251 | { | |
252 | var RoI_text v_roi := { 0, 1, 2, 3, 4, 5 }; | |
253 | f_param_ref_text(v_roi, v_roi[5]); | |
254 | ||
255 | if (log2str(v_roi) == "{ 3, 2, 1, 9, 8, 7, 6 }") { setverdict(pass); } | |
256 | else { setverdict(fail, "@6 got: ", v_roi, ", expected: { 3, 2, 1, 9, 8, 7, 6 }"); } | |
257 | } | |
258 | ||
259 | // 7. RAW decoding | |
260 | type record of integer RoI_raw with { encode "RAW"; variant "" }; | |
261 | ||
262 | external function f_enc_raw(in RoI_raw x) return octetstring | |
263 | with { extension "prototype(convert) encode(RAW)" } | |
264 | ||
265 | external function f_dec_raw(in octetstring os, out RoI_raw x) | |
266 | with { extension "prototype(fast) decode(RAW)" } | |
267 | ||
268 | function f_param_ref_raw(inout RoI_raw p_roi, inout integer p_elem) runs on CT_Empty | |
269 | { | |
270 | var RoI_raw enc_val := { 10, 16 }; | |
271 | var octetstring os := f_enc_raw(enc_val); | |
272 | f_dec_raw(os, p_roi); | |
273 | ||
d44e3c4f | 274 | if (p_roi == enc_val) { setverdict(pass); } |
970ed795 EL |
275 | else { setverdict(fail, "@1 got: ", p_roi, ", expected: ", enc_val); } |
276 | ||
d44e3c4f | 277 | if (log2str(p_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
278 | else { setverdict(fail, "@2 got: ", p_elem, ", expected: <unbound>"); } |
279 | ||
280 | p_elem := 20; | |
281 | ||
282 | if (log2str(p_roi) == "{ 10, 16, <unbound>, <unbound>, <unbound>, 20 }") { setverdict(pass); } | |
283 | else { setverdict(fail, "@3 got: ", p_roi, ", expected: { 10, 16, <unbound>, <unbound>, <unbound>, 20 }"); } | |
284 | ||
285 | enc_val := { 3, 2, 1, 9, 8, 7, 6 }; | |
286 | os := f_enc_raw(enc_val); | |
287 | f_dec_raw(os, p_roi); | |
288 | ||
d44e3c4f | 289 | if (p_roi == enc_val) { setverdict(pass); } |
970ed795 EL |
290 | else { setverdict(fail, "@4 got: ", p_roi, ", expected: ", enc_val); } |
291 | ||
d44e3c4f | 292 | if (p_elem == 7) { setverdict(pass); } |
970ed795 EL |
293 | else { setverdict(fail, "@5 got: ", p_elem, ", expected: 7"); } |
294 | } | |
295 | ||
296 | testcase tc_param_ref_raw() runs on CT_Empty | |
297 | { | |
298 | var RoI_raw v_roi := { 0, 1, 2, 3, 4, 5 }; | |
299 | f_param_ref_raw(v_roi, v_roi[5]); | |
300 | ||
301 | if (log2str(v_roi) == "{ 3, 2, 1, 9, 8, 7, 6 }") { setverdict(pass); } | |
302 | else { setverdict(fail, "@6 got: ", v_roi, ", expected: { 3, 2, 1, 9, 8, 7, 6 }"); } | |
303 | } | |
304 | ||
305 | // 8. BER decoding, using record of integer type defined in BerType.asn | |
306 | ||
307 | external function f_enc_ber(in RoI_ber x) return octetstring | |
308 | with { extension "prototype(convert) encode(BER:BER_ENCODE_DER)" } | |
309 | ||
310 | external function f_dec_ber(in octetstring os, out RoI_ber x) | |
311 | with { extension "prototype(fast) decode(BER:BER_ACCEPT_ALL)" } | |
312 | ||
313 | function f_param_ref_ber(inout RoI_ber p_roi, inout integer p_elem) runs on CT_Empty | |
314 | { | |
315 | var RoI_ber enc_val := { 10, 16 }; | |
316 | var octetstring os := f_enc_ber(enc_val); | |
317 | f_dec_ber(os, p_roi); | |
318 | ||
d44e3c4f | 319 | if (p_roi == enc_val) { setverdict(pass); } |
970ed795 EL |
320 | else { setverdict(fail, "@1 got: ", p_roi, ", expected: ", enc_val); } |
321 | ||
d44e3c4f | 322 | if (log2str(p_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
323 | else { setverdict(fail, "@2 got: ", p_elem, ", expected: <unbound>"); } |
324 | ||
325 | p_elem := 20; | |
326 | ||
327 | if (log2str(p_roi) == "{ 10, 16, <unbound>, <unbound>, <unbound>, 20 }") { setverdict(pass); } | |
328 | else { setverdict(fail, "@3 got: ", p_roi, ", expected: { 10, 16, <unbound>, <unbound>, <unbound>, 20 }"); } | |
329 | ||
330 | enc_val := { 3, 2, 1, 9, 8, 7, 6 }; | |
331 | os := f_enc_ber(enc_val); | |
332 | f_dec_ber(os, p_roi); | |
333 | ||
d44e3c4f | 334 | if (p_roi == enc_val) { setverdict(pass); } |
970ed795 EL |
335 | else { setverdict(fail, "@4 got: ", p_roi, ", expected: ", enc_val); } |
336 | ||
d44e3c4f | 337 | if (p_elem == 7) { setverdict(pass); } |
970ed795 EL |
338 | else { setverdict(fail, "@5 got: ", p_elem, ", expected: 7"); } |
339 | } | |
340 | ||
341 | testcase tc_param_ref_ber() runs on CT_Empty | |
342 | { | |
343 | var RoI_ber v_roi := { 0, 1, 2, 3, 4, 5 }; | |
344 | f_param_ref_ber(v_roi, v_roi[5]); | |
345 | ||
346 | if (log2str(v_roi) == "{ 3, 2, 1, 9, 8, 7, 6 }") { setverdict(pass); } | |
347 | else { setverdict(fail, "@6 got: ", v_roi, ", expected: { 3, 2, 1, 9, 8, 7, 6 }"); } | |
348 | } | |
349 | ||
350 | // 9. The record of is embedded in another structure | |
351 | type record EmbRec { | |
352 | charstring text, | |
353 | RoI numbers | |
354 | } | |
355 | ||
356 | function f_param_ref_emb_recof(inout EmbRec p_rec, inout integer p_elem) runs on CT_Empty | |
357 | { | |
358 | p_rec := { "second", { 10 } }; | |
359 | ||
d44e3c4f | 360 | if (p_rec == { "second", { 10 } }) { setverdict(pass); } |
970ed795 EL |
361 | else { setverdict(fail, "@1 got: ", p_rec, ", expected: { text := \"second\", numbers := { 10 } }"); } |
362 | ||
d44e3c4f | 363 | if (log2str(p_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
364 | else { setverdict(fail, "@2 got: ", p_elem, ", expected: <unbound>"); } |
365 | ||
366 | p_elem := 20; | |
367 | ||
368 | if (log2str(p_rec) == "{ text := \"second\", numbers := { 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 } }") { setverdict(pass); } | |
369 | else { setverdict(fail, "@3 got: ", p_rec, ", expected: { text := \"second\", numbers := { 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 } }"); } | |
370 | } | |
371 | ||
372 | testcase tc_param_ref_emb_recof() runs on CT_Empty | |
373 | { | |
374 | var EmbRec v_rec := { "first", { 0, 1, 2, 3, 4, 5 } }; | |
375 | f_param_ref_emb_recof(v_rec, v_rec.numbers[5]); | |
376 | ||
377 | if (log2str(v_rec) == "{ text := \"second\", numbers := { 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 } }") { setverdict(pass); } | |
378 | else { setverdict(fail, "@4 got: ", v_rec, ", expected: { text := \"second\", numbers := { 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 } }"); } | |
379 | } | |
380 | ||
381 | // 10. The second parameter is not the whole element type, just a part of it | |
382 | type record ElemType { | |
383 | integer num, | |
384 | charstring str | |
385 | } | |
386 | ||
387 | type record of ElemType Elems; | |
388 | ||
389 | function f_param_ref_emb_elem(inout Elems p_elems, inout integer p_num) runs on CT_Empty | |
390 | { | |
391 | p_elems := { { 10, "ten" } }; | |
392 | ||
d44e3c4f | 393 | if (p_elems == { { 10, "ten" } }) { setverdict(pass); } |
970ed795 EL |
394 | else { setverdict(fail, "@1 got: ", p_elems, ", expected: { { num := 10, str := \"ten\" } }"); } |
395 | ||
d44e3c4f | 396 | if (log2str(p_num) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
397 | else { setverdict(fail, "@2 got: ", p_num, ", expected: <unbound>"); } |
398 | ||
399 | p_num := 20; | |
400 | ||
401 | if (log2str(p_elems) == "{ { num := 10, str := \"ten\" }, <unbound>, { num := 20, str := <unbound> } }") { setverdict(pass); } | |
402 | else { setverdict(fail, "@3 got: ", p_elems, ", expected: { { num := 10, str := \"ten\" }, <unbound>, { num := 20, str := <unbound> } }"); } | |
403 | } | |
404 | ||
405 | testcase tc_param_ref_emb_elem() runs on CT_Empty | |
406 | { | |
407 | var Elems v_elems := { { 1, "one" }, { 2, "two" }, { 3, "three" }, { 4, "four" } }; | |
408 | f_param_ref_emb_elem(v_elems, v_elems[2].num); | |
409 | ||
410 | if (log2str(v_elems) == "{ { num := 10, str := \"ten\" }, <unbound>, { num := 20, str := <unbound> } }") { setverdict(pass); } | |
411 | else { setverdict(fail, "@4 got: ", v_elems, ", expected: { { num := 10, str := \"ten\" }, <unbound>, { num := 20, str := <unbound> } }"); } | |
412 | } | |
413 | ||
414 | // 11. Two embedded functions, each called with a reference to one of the elements in the record of | |
415 | function f_param_ref_emb_inner(inout RoI p_roi, inout integer p_elem) runs on CT_Empty | |
416 | { | |
417 | p_roi := { 10 }; | |
418 | ||
d44e3c4f | 419 | if (p_roi == { 10 }) { setverdict(pass); } |
970ed795 EL |
420 | else { setverdict(fail, "@1 got: ", p_roi, ", expected: { 10 }"); } |
421 | ||
d44e3c4f | 422 | if (log2str(p_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
423 | else { setverdict(fail, "@2 got: ", p_elem, ", expected: <unbound>"); } |
424 | ||
425 | p_elem := 20; | |
426 | ||
427 | if (log2str(p_roi) == "{ 10, <unbound>, <unbound>, 20 }") { setverdict(pass); } | |
428 | else { setverdict(fail, "@3 got: ", p_roi, ", expected: { 10, <unbound>, <unbound>, 20 }"); } | |
429 | } | |
430 | ||
431 | function f_param_ref_emb_outer(inout RoI p_roi, inout integer p_elem) runs on CT_Empty | |
432 | { | |
433 | f_param_ref_emb_inner(p_roi, p_roi[3]); | |
434 | ||
d44e3c4f | 435 | if (log2str(p_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
436 | else { setverdict(fail, "@4 got: ", p_elem, ", expected: <unbound>"); } |
437 | ||
438 | p_elem := 30; | |
439 | ||
440 | if (log2str(p_roi) == "{ 10, <unbound>, <unbound>, 20, <unbound>, 30 }") { setverdict(pass); } | |
441 | else { setverdict(fail, "@5 got: ", p_roi, ", expected: { 10, <unbound>, <unbound>, 20, <unbound>, 30 }"); } | |
442 | } | |
443 | ||
444 | testcase tc_param_ref_emb_func() runs on CT_Empty | |
445 | { | |
446 | var RoI v_roi := { 0, 1, 2, 3, 4, 5 }; | |
447 | f_param_ref_emb_outer(v_roi, v_roi[5]); | |
448 | ||
449 | if (log2str(v_roi) == "{ 10, <unbound>, <unbound>, 20, <unbound>, 30 }") { setverdict(pass); } | |
450 | else { setverdict(fail, "@6 got: ", v_roi, ", expected: { 10, <unbound>, <unbound>, 20, <unbound>, 30 }"); } | |
451 | } | |
452 | ||
453 | // 12. The element as out parameter instead of inout (it will be set to unbound at the begining of the function) | |
454 | function f_param_ref_out_par(inout RoI p_roi, out integer p_elem) runs on CT_Empty | |
455 | { | |
456 | if (log2str(p_roi) == "{ 0, 1, 2, 3, <unbound>, 5 }") { setverdict(pass); } | |
457 | else { setverdict(fail, "@1 got: ", p_roi, ", expected: { 0, 1, 2, 3, <unbound>, 5 }"); } | |
458 | ||
459 | p_roi := { 9, 8, 7, 6, 5 }; | |
460 | ||
d44e3c4f | 461 | if (p_elem == 5) { setverdict(pass); } |
970ed795 EL |
462 | else { setverdict(fail, "@2 got: ", p_elem, ", expected: 5"); } |
463 | ||
464 | p_elem := 20; | |
465 | ||
466 | if (log2str(p_roi) == "{ 9, 8, 7, 6, 20 }") { setverdict(pass); } | |
467 | else { setverdict(fail, "@3 got: ", p_roi, ", expected: { 9, 8, 7, 6, 20 }"); } | |
468 | } | |
469 | ||
470 | testcase tc_param_ref_out_par() runs on CT_Empty | |
471 | { | |
472 | var RoI v_roi := { 0, 1, 2, 3, 4, 5 }; | |
473 | f_param_ref_out_par(v_roi, v_roi[4]); | |
474 | ||
475 | if (log2str(v_roi) == "{ 9, 8, 7, 6, 20 }") { setverdict(pass); } | |
476 | else { setverdict(fail, "@4 got: ", v_roi, ", expected: { 9, 8, 7, 6, 20 }"); } | |
477 | } | |
478 | ||
479 | // 13. Copying the array | |
480 | function f_param_ref_copy(inout RoI p_roi, inout integer p_elem) runs on CT_Empty | |
481 | { | |
482 | var RoI v_copy := p_roi; | |
483 | p_roi := { 10 }; | |
484 | ||
d44e3c4f | 485 | if (p_roi == { 10 }) { setverdict(pass); } |
970ed795 EL |
486 | else { setverdict(fail, "@1 got: ", p_roi, ", expected: { 10 }"); } |
487 | ||
d44e3c4f | 488 | if (log2str(p_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
489 | else { setverdict(fail, "@2 got: ", p_elem, ", expected: <unbound>"); } |
490 | ||
491 | p_elem := 20; | |
492 | ||
493 | if (log2str(p_roi) == "{ 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }") { setverdict(pass); } | |
494 | else { setverdict(fail, "@3 got: ", p_roi, ", expected: { 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }"); } | |
495 | ||
496 | if (v_copy == { 0, 1, 2, 3, 4, 5 }) { setverdict(pass); } | |
497 | else { setverdict(fail, "@4 got: ", v_copy, ", expected: { 0, 1, 2, 3, 4, 5 }"); } | |
498 | ||
499 | v_copy := p_roi; | |
500 | v_copy[5] := 11; | |
501 | v_copy[2] := 3; | |
502 | ||
503 | if (log2str(p_roi) == "{ 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }") { setverdict(pass); } | |
504 | else { setverdict(fail, "@5 got: ", p_roi, ", expected: { 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }"); } | |
505 | } | |
506 | ||
507 | testcase tc_param_ref_copy() runs on CT_Empty | |
508 | { | |
509 | var RoI v_roi := { 0, 1, 2, 3, 4, 5 }; | |
510 | var RoI v_copy := v_roi; | |
511 | f_param_ref_copy(v_roi, v_roi[5]); | |
512 | ||
513 | if (log2str(v_roi) == "{ 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }") { setverdict(pass); } | |
514 | else { setverdict(fail, "@6 got: ", v_roi, ", expected: { 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }"); } | |
515 | ||
516 | if (v_copy == { 0, 1, 2, 3, 4, 5 }) { setverdict(pass); } | |
517 | else { setverdict(fail, "@7 got: ", v_copy, ", expected: { 0, 1, 2, 3, 4, 5 }"); } | |
518 | } | |
519 | ||
520 | // 14. Arrays | |
521 | type integer Ints[6]; | |
522 | function f_param_ref_array(inout Ints p_arr, inout integer p_elem) runs on CT_Empty | |
523 | { | |
524 | p_arr := { 10, 12, 14, 16, 18, 20 }; | |
525 | ||
d44e3c4f | 526 | if (p_elem == 20) { setverdict(pass); } |
970ed795 EL |
527 | else { setverdict(fail, "@1 got: ", p_elem, ", expected: 20"); } |
528 | ||
529 | p_elem := 7; | |
530 | ||
531 | if (log2str(p_arr) == "{ 10, 12, 14, 16, 18, 7 }") { setverdict(pass); } | |
532 | else { setverdict(fail, "@2 got: ", p_arr, ", expected: { 10, 12, 14, 16, 18, 7 }"); } | |
533 | } | |
534 | ||
535 | testcase tc_param_ref_array() runs on CT_Empty | |
536 | { | |
537 | var Ints v_arr := { 0, 1, 2, 3, 4, 5 }; | |
538 | f_param_ref_array(v_arr, v_arr[5]); | |
539 | ||
540 | if (log2str(v_arr) == "{ 10, 12, 14, 16, 18, 7 }") { setverdict(pass); } | |
541 | else { setverdict(fail, "@3 got: ", v_arr, ", expected: { 10, 12, 14, 16, 18, 7 }"); } | |
542 | } | |
543 | ||
544 | // 15. Multiple array indexes | |
545 | type record of EmbRec EmbRecs; | |
546 | ||
547 | function f_param_ref_multi(inout EmbRecs p_recs, inout integer p_elem) runs on CT_Empty | |
548 | { | |
549 | p_recs := { { "just one", { 10 } } }; | |
550 | ||
d44e3c4f | 551 | if (p_recs == { { "just one", { 10 } } }) { setverdict(pass); } |
970ed795 EL |
552 | else { setverdict(fail, "@1 got: ", p_recs, ", expected: { { text := \"just one\", numbers := { 10 } } }"); } |
553 | ||
d44e3c4f | 554 | if (log2str(p_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
555 | else { setverdict(fail, "@2 got: ", p_elem, ", expected: <unbound>"); } |
556 | ||
557 | p_elem := 20; | |
558 | ||
559 | if (log2str(p_recs) == "{ { text := \"just one\", numbers := { 10 } }, <unbound>, { text := <unbound>, numbers := { <unbound>, 20 } } }") { setverdict(pass); } | |
560 | else { setverdict(fail, "@3 got: ", p_recs, ", expected: { { text := \"just one\", numbers := { 10 } }, <unbound>, { text := <unbound>, numbers := { <unbound>, 20 } } }"); } | |
561 | } | |
562 | ||
563 | testcase tc_param_ref_multi() runs on CT_Empty | |
564 | { | |
565 | var EmbRecs v_recs := { { "first", { 5, 10, 15 } }, { "second", { 7 } }, { "third", { 1, 2, 3 } } }; | |
566 | f_param_ref_multi(v_recs, v_recs[2].numbers[1]); | |
567 | ||
568 | if (log2str(v_recs) == "{ { text := \"just one\", numbers := { 10 } }, <unbound>, { text := <unbound>, numbers := { <unbound>, 20 } } }") { setverdict(pass); } | |
569 | else { setverdict(fail, "@4 got: ", v_recs, ", expected: { { text := \"just one\", numbers := { 10 } }, <unbound>, { text := <unbound>, numbers := { <unbound>, 20 } } }"); } | |
570 | } | |
571 | ||
572 | // 16. Template parameter | |
573 | function f_param_ref_templ8(inout template RoI pt_roi, inout template integer pt_elem) runs on CT_Empty | |
574 | { | |
575 | pt_roi := { 10 }; | |
576 | ||
d44e3c4f | 577 | if (log2str(pt_roi) == "{ 10 }") { setverdict(pass); } |
970ed795 EL |
578 | else { setverdict(fail, "@1 got: ", pt_roi, ", expected: { 10 }"); } |
579 | ||
d44e3c4f | 580 | if (log2str(pt_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
581 | else { setverdict(fail, "@2 got: ", pt_elem, ", expected: <unbound>"); } |
582 | ||
583 | pt_elem := 20; | |
584 | ||
585 | if (log2str(pt_roi) == "{ 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }") { setverdict(pass); } | |
586 | else { setverdict(fail, "@3 got: ", pt_roi, ", expected: { 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }"); } | |
587 | } | |
588 | ||
589 | testcase tc_param_ref_templ8() runs on CT_Empty | |
590 | { | |
591 | var template RoI vt_roi := { 0, 1, 2, 3, 4, 5 }; | |
592 | f_param_ref_templ8(vt_roi, vt_roi[5]); | |
593 | ||
594 | if (log2str(vt_roi) == "{ 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }") { setverdict(pass); } | |
595 | else { setverdict(fail, "@4 got: ", vt_roi, ", expected: { 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }"); } | |
596 | } | |
597 | ||
598 | // 17. Same as no. 9 (record of embedded in a record) but with the record of field being optional | |
599 | type record EmbRecOpt { | |
600 | charstring text, | |
601 | RoI numbers optional | |
602 | } | |
603 | ||
604 | function f_param_ref_emb_recof_opt(inout EmbRecOpt p_rec, inout integer p_elem) runs on CT_Empty | |
605 | { | |
606 | p_rec := { "second", omit }; | |
607 | ||
d44e3c4f | 608 | if (p_rec == { "second", omit }) { setverdict(pass); } |
970ed795 EL |
609 | else { setverdict(fail, "@1 got: ", p_rec, ", expected: { text := \"second\", numbers := omit }"); } |
610 | ||
d44e3c4f | 611 | if (log2str(p_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
612 | else { setverdict(fail, "@2 got: ", p_elem, ", expected: <unbound>"); } |
613 | ||
614 | p_elem := 20; | |
615 | ||
616 | if (log2str(p_rec) == "{ text := \"second\", numbers := { <unbound>, <unbound>, <unbound>, <unbound>, <unbound>, 20 } }") { setverdict(pass); } | |
617 | else { setverdict(fail, "@3 got: ", p_rec, ", expected: { text := \"second\", numbers := { <unbound>, <unbound>, <unbound>, <unbound>, <unbound>, 20 } }"); } | |
618 | } | |
619 | ||
620 | testcase tc_param_ref_emb_recof_opt() runs on CT_Empty | |
621 | { | |
622 | var EmbRecOpt v_rec := { "first", { 0, 1, 2, 3, 4, 5 } }; | |
623 | f_param_ref_emb_recof_opt(v_rec, v_rec.numbers[5]); | |
624 | ||
625 | if (log2str(v_rec) == "{ text := \"second\", numbers := { <unbound>, <unbound>, <unbound>, <unbound>, <unbound>, 20 } }") { setverdict(pass); } | |
626 | else { setverdict(fail, "@4 got: ", v_rec, ", expected: { text := \"second\", numbers := { <unbound>, <unbound>, <unbound>, <unbound>, <unbound>, 20 } }"); } | |
627 | } | |
628 | ||
629 | // 18. The function call is part of a lazy parameter expression | |
630 | function f_param_ref_emb_lazy(inout RoI p_roi, inout integer p_elem) runs on CT_Empty return charstring | |
631 | { | |
632 | p_roi := { 10 }; | |
633 | ||
d44e3c4f | 634 | if (p_roi == { 10 }) { setverdict(pass); } |
970ed795 EL |
635 | else { setverdict(fail, "@1 got: ", p_roi, ", expected: { 10 }"); } |
636 | ||
d44e3c4f | 637 | if (log2str(p_elem) == "<unbound>") { setverdict(pass); } |
970ed795 EL |
638 | else { setverdict(fail, "@2 got: ", p_elem, ", expected: <unbound>"); } |
639 | ||
640 | p_elem := 20; | |
641 | ||
642 | if (log2str(p_roi) == "{ 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }") { setverdict(pass); } | |
643 | else { setverdict(fail, "@3 got: ", p_roi, ", expected: { 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }"); } | |
644 | ||
645 | return int2str(p_elem); | |
646 | } | |
647 | ||
648 | function f_lazy(in integer p_val, in @lazy charstring p_str) runs on CT_Empty | |
649 | { | |
650 | if (isbound(p_val)) { | |
651 | log(p_str); | |
652 | setverdict(pass); | |
653 | } | |
654 | else { | |
655 | setverdict(fail, "lazy expression evaluated too soon"); | |
656 | } | |
657 | } | |
658 | ||
659 | testcase tc_param_ref_emb_lazy() runs on CT_Empty | |
660 | { | |
661 | var RoI v_roi := { 0, 1, 2, 3, 4, 5 }; | |
662 | f_lazy(v_roi[1], f_param_ref_emb_lazy(v_roi, v_roi[5])); | |
663 | ||
664 | if (log2str(v_roi) == "{ 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }") { setverdict(pass); } | |
665 | else { setverdict(fail, "@4 got: ", v_roi, ", expected: { 10, <unbound>, <unbound>, <unbound>, <unbound>, 20 }"); } | |
666 | } | |
667 | ||
a38c6d4c | 668 | // 19. The function call is interrupted by a DTE, the reference to the element should be cleaned up (HT47424) |
669 | function f_dte(in RoI p_roi, inout integer p_val) runs on CT_Empty | |
670 | { | |
671 | var integer bad_index := -1; | |
672 | if (p_val < p_roi[bad_index]) { | |
673 | setverdict(fail, "expected DTE in if clause"); | |
674 | } | |
675 | } | |
676 | ||
677 | testcase tc_param_ref_dte() runs on CT_Empty | |
678 | { | |
679 | var RoI v_roi := { 0, 1, 2, 3 }; | |
680 | @try { | |
681 | f_dte(v_roi, v_roi[2]); | |
682 | setverdict(fail, "expected DTE in function call"); | |
683 | } | |
684 | @catch (dummy) {} | |
685 | v_roi := { }; | |
686 | var RoI v_copy := v_roi; | |
687 | var charstring log_exp := "{ }"; | |
688 | if (log2str(v_roi) == log_exp) { setverdict(pass); } | |
689 | else { setverdict(fail, "@1 got: ", v_roi, ", expected: ", log_exp); } | |
690 | if (log2str(v_copy) == log_exp) { setverdict(pass); } | |
691 | else { setverdict(fail, "@2 got: ", v_copy, ", expected: ", log_exp); } | |
692 | } | |
693 | ||
970ed795 EL |
694 | control { |
695 | execute(tc_param_ref_assign()); | |
696 | execute(tc_param_ref_concat()); | |
697 | execute(tc_param_ref_replace()); | |
698 | ||
699 | execute(tc_param_ref_json()); | |
700 | execute(tc_param_ref_xer()); | |
701 | execute(tc_param_ref_text()); | |
702 | execute(tc_param_ref_raw()); | |
703 | execute(tc_param_ref_ber()); | |
704 | ||
705 | execute(tc_param_ref_emb_recof()); | |
706 | execute(tc_param_ref_emb_elem()); | |
707 | execute(tc_param_ref_emb_func()); | |
708 | ||
709 | execute(tc_param_ref_out_par()); | |
710 | execute(tc_param_ref_copy()); | |
711 | execute(tc_param_ref_array()); | |
712 | execute(tc_param_ref_multi()); | |
713 | ||
714 | //execute(tc_param_ref_templ8()); Doesn't work for templates | |
715 | ||
716 | execute(tc_param_ref_emb_recof_opt()); | |
717 | execute(tc_param_ref_emb_lazy()); | |
a38c6d4c | 718 | |
719 | execute(tc_param_ref_dte()); | |
970ed795 EL |
720 | } |
721 | ||
722 | } // end of module |