Last sync 2016.04.01
[deliverable/titan.core.git] / regression_test / recofOper / TrecofParamRef.ttcn
CommitLineData
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 ******************************************************************************/
13module TrecofParamRef {
14
15import 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
21type component CT_Empty {};
22
23// 1. Assignment
24type record of integer RoI;
25
26function 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
42testcase 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
52function 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
75testcase 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
85function 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
112testcase 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
122type record of integer RoI_json with { encode "JSON" };
123
124external function f_enc_json(in RoI_json x) return octetstring
125 with { extension "prototype(convert) encode(JSON)" }
126
127external function f_dec_json(in octetstring os, out RoI_json x)
128 with { extension "prototype(fast) decode(JSON)" }
129
130function 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
158testcase 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
168type record of integer RoI_xer with { encode "XML" };
169
170external function f_enc_xer(in RoI_xer x) return octetstring
171 with { extension "prototype(convert) encode(XER:XER_EXTENDED)" }
172
173external function f_dec_xer(in octetstring os, out RoI_xer x)
174 with { extension "prototype(fast) decode(XER:XER_EXTENDED)" }
175
176function 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
204testcase 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
214type record of integer RoI_text with { encode "TEXT"; variant "BEGIN('numbrz:'),END(';'),SEPARATOR(' ')"; };
215
216external function f_enc_text(in RoI_text x) return charstring
217 with { extension "prototype(convert) encode(TEXT)" }
218
219external function f_dec_text(in charstring cs, out RoI_text x)
220 with { extension "prototype(fast) decode(TEXT)" }
221
222function 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
250testcase 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
260type record of integer RoI_raw with { encode "RAW"; variant "" };
261
262external function f_enc_raw(in RoI_raw x) return octetstring
263 with { extension "prototype(convert) encode(RAW)" }
264
265external function f_dec_raw(in octetstring os, out RoI_raw x)
266 with { extension "prototype(fast) decode(RAW)" }
267
268function 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
296testcase 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
307external function f_enc_ber(in RoI_ber x) return octetstring
308 with { extension "prototype(convert) encode(BER:BER_ENCODE_DER)" }
309
310external function f_dec_ber(in octetstring os, out RoI_ber x)
311 with { extension "prototype(fast) decode(BER:BER_ACCEPT_ALL)" }
312
313function 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
341testcase 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
351type record EmbRec {
352 charstring text,
353 RoI numbers
354}
355
356function 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
372testcase 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
382type record ElemType {
383 integer num,
384 charstring str
385}
386
387type record of ElemType Elems;
388
389function 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
405testcase 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
415function 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
431function 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
444testcase 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)
454function 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
470testcase 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
480function 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
507testcase 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
521type integer Ints[6];
522function 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
535testcase 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
545type record of EmbRec EmbRecs;
546
547function 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
563testcase 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
573function 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
589testcase 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
599type record EmbRecOpt {
600 charstring text,
601 RoI numbers optional
602}
603
604function 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
620testcase 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
630function 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
648function 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
659testcase 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)
669function 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
677testcase 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
694control {
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
This page took 0.054892 seconds and 5 git commands to generate.