0a9688b8072ba3812df110908edc1d09fb7c00ca
[deliverable/titan.core.git] / regression_test / modifiedTemplate / TmodifiedTemplate.ttcn
1 /******************************************************************************
2 * Copyright (c) 2000-2015 Ericsson Telecom AB
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
7 ******************************************************************************/
8 module TmodifiedTemplate {
9
10 type record SIGNAL1
11 {
12 REC1 rec1
13 }
14
15 type record REC1
16 {
17 integer a,
18 integer b
19 }
20
21 template SIGNAL1 templateB :=
22 {
23 rec1:= ?
24 }
25
26 template SIGNAL1 templateC modifies templateB :=
27 {
28 rec1 :=
29 {
30 a := 3
31 }
32 }
33
34 template SIGNAL1 templateD modifies templateB :=
35 {
36 rec1 :=
37 {
38 a := 3,
39 b := 4
40 }
41 }
42
43
44 type port TP message {
45 inout SIGNAL1;
46 } with { extension "internal" }
47
48 type component main {
49 port TP tp;
50 port TP tp2;
51 }
52
53 testcase tc1() runs on main {
54 connect(mtc:tp, mtc:tp2);
55 tp.send(templateD);
56 log(templateC);
57 tp2.receive(templateC);
58 setverdict(pass);
59 }
60
61 type record R {
62 integer f1,
63 integer f2 optional
64 }
65
66 type record RR { // exactly the same
67 integer f1,
68 integer f2 optional
69 }
70
71 template R tbase := ?;
72 template R t1 modifies tbase := { f1 := 1 }; // 1, *
73 template R t2 modifies tbase := { f2 := 2 }; // ?, 2
74
75 const R c1 := { 1, 2 }; // matches t1, t2
76 const R c2 := { 1, omit }; // matches t1
77 const R c3 := { 2, 2 }; // matches t2
78 const R c4 := { 3, 4 }; // matches none
79
80 type component CT { };
81
82 testcase tc2() runs on CT
83 {
84 var template R vtbase := tbase;
85
86 log(t1);
87 log(t2);
88
89 if (match(c1, t1)) { setverdict(pass); }
90 else { setverdict(fail); }
91 if (match(c1, /* R : */ modifies vtbase := { f1 := 1 })) { setverdict(pass); }
92 else { setverdict(fail); }
93 if (match(c1, t2)) { setverdict(pass); }
94 else { setverdict(fail); }
95 if (match(c1, R : modifies vtbase := { f2 := 2 })) { setverdict(pass); }
96 else { setverdict(fail); }
97
98 if (match(c2, t1)) { setverdict(pass); }
99 else { setverdict(fail); }
100 if (match(c2, R : modifies vtbase := { f1 := 1 })) { setverdict(pass); }
101 else { setverdict(fail); }
102 if (match(c2, t2)) { setverdict(fail); }
103 else { setverdict(pass); }
104 if (match(c2, /* R : */ modifies vtbase := { f2 := 2 })) { setverdict(fail); }
105 else { setverdict(pass); }
106
107 if (match(c3, t1)) { setverdict(fail); }
108 else { setverdict(pass); }
109 if (match(c3, R : modifies vtbase := { f1 := 1 })) { setverdict(fail); }
110 else { setverdict(pass); }
111 if (match(c3, t2)) { setverdict(pass); }
112 else { setverdict(fail); }
113 if (match(c3, R : modifies vtbase := { f2 := 2 })) { setverdict(pass); }
114 else { setverdict(fail); }
115
116 if (match(c4, t1)) { setverdict(fail); }
117 else { setverdict(pass); }
118 if (match(c4, R : modifies vtbase := { f1 := 1 })) { setverdict(fail); }
119 else { setverdict(pass); }
120 if (match(c4, t2)) { setverdict(fail); }
121 else { setverdict(pass); }
122 if (match(c4, R : modifies vtbase := { f2 := 2 })) { setverdict(fail); }
123 else { setverdict(pass); }
124 }
125
126 type union U {
127 R altr
128 }
129
130 type record of R RofR;
131
132 testcase tc3() runs on CT
133 {
134 var template U tu := ?;
135 tu.altr.f1 := 1;
136 log(tu);
137 var template RofR vt := *;
138 vt[5].f2 := 5;
139 log(vt);
140 // todo: add more specific tests
141 setverdict(pass);
142 }
143
144 type record MyRecordType {
145 integer field1 optional,
146 charstring field2,
147 boolean field3
148 }
149
150 // With value parameters.
151
152 template MyRecordType MyTemplate11(integer p_int := 5) := {
153 field1 := p_int,
154 field2 := "A string",
155 field3 := true
156 }
157
158 template MyRecordType MyTemplate12(integer p_int) modifies MyTemplate11 := {
159 // p_int had a default value in MyTemplate11 but has none in this template
160 field2 := "B string"
161 }
162
163 template MyRecordType MyTemplate13(integer p_int := 0) modifies MyTemplate12 := {
164 // p_int has the default value 0
165 // no change is made to the template's content, but only to the default value of p_int
166 field2 := "C string"
167 }
168
169 template MyRecordType MyTemplate14(integer p_int := -) modifies MyTemplate13 := {
170 // p_int inherits the default value 0 from its parent MyTemplate13
171 field2 := "D string"
172 }
173
174 template MyRecordType MyTemplate15(integer p_int := -) modifies MyTemplate14 := {
175 // p_int inherits the default value 0 from MyTemplate13 via MyTemplate14
176 field2 := "E string"
177 }
178
179 // With template parameters.
180
181 template MyRecordType TMyTemplate11(template integer p_int := 5) := {
182 field1 := p_int,
183 field2 := "A string",
184 field3 := true
185 }
186
187 template MyRecordType TMyTemplate12(template integer p_int) modifies TMyTemplate11 := {
188 // p_int had a default value in MyTemplate11 but has none in this template
189 field2 := "B string"
190 }
191
192 template MyRecordType TMyTemplate13(template integer p_int := 0) modifies TMyTemplate12 := {
193 // p_int has the default value 0
194 // no change is made to the template's content, but only to the default value of p_int
195 field2 := "C string"
196 }
197
198 template MyRecordType TMyTemplate14(template integer p_int := -) modifies TMyTemplate13 := {
199 // p_int inherits the default value 0 from its parent MyTemplate13
200 field2 := "D string"
201 }
202
203 template MyRecordType TMyTemplate15(template integer p_int := -) modifies TMyTemplate14 := {
204 // p_int inherits the default value 0 from MyTemplate13 via MyTemplate14
205 field2 := "E string"
206 }
207
208 testcase ETSI_CR5091() runs on CT
209 {
210 template MyRecordType LMyTemplate11 := MyTemplate11()
211 template MyRecordType LMyTemplate12 := MyTemplate12(1)
212 template MyRecordType LMyTemplate13 := MyTemplate13()
213 template MyRecordType LMyTemplate14 := MyTemplate14()
214 template MyRecordType LMyTemplate15 := MyTemplate15()
215 template MyRecordType LTMyTemplate11 := TMyTemplate11()
216 template MyRecordType LTMyTemplate12 := TMyTemplate12(1)
217 template MyRecordType LTMyTemplate13 := TMyTemplate13()
218 template MyRecordType LTMyTemplate14 := TMyTemplate14()
219 template MyRecordType LTMyTemplate15 := TMyTemplate15()
220 if (valueof(LMyTemplate11.field1) == 5) { setverdict(pass) } else { setverdict(fail) }
221 if (valueof(LMyTemplate12.field1) == 1) { setverdict(pass) } else { setverdict(fail) }
222 if (valueof(LMyTemplate13.field1) == 0) { setverdict(pass) } else { setverdict(fail) }
223 if (valueof(LMyTemplate14.field1) == 0) { setverdict(pass) } else { setverdict(fail) }
224 if (valueof(LMyTemplate15.field1) == 0) { setverdict(pass) } else { setverdict(fail) }
225 if (valueof(LTMyTemplate11.field1) == 5) { setverdict(pass) } else { setverdict(fail) }
226 if (valueof(LTMyTemplate12.field1) == 1) { setverdict(pass) } else { setverdict(fail) }
227 if (valueof(LTMyTemplate13.field1) == 0) { setverdict(pass) } else { setverdict(fail) }
228 if (valueof(LTMyTemplate14.field1) == 0) { setverdict(pass) } else { setverdict(fail) }
229 if (valueof(LTMyTemplate15.field1) == 0) { setverdict(pass) } else { setverdict(fail) }
230 if (match({ 5, "A string", true }, MyTemplate11())) { setverdict(pass) } else { setverdict(fail) }
231 if (match({ 1, "B string", true }, MyTemplate12(1))) { setverdict(pass) } else { setverdict(fail) }
232 if (match({ 0, "C string", true }, MyTemplate13())) { setverdict(pass) } else { setverdict(fail) }
233 if (match({ 0, "D string", true }, MyTemplate14())) { setverdict(pass) } else { setverdict(fail) }
234 if (match({ 0, "E string", true }, MyTemplate15())) { setverdict(pass) } else { setverdict(fail) }
235 if (match({ 5, "A string", true }, TMyTemplate11())) { setverdict(pass) } else { setverdict(fail) }
236 if (match({ 1, "B string", true }, TMyTemplate12(1))) { setverdict(pass) } else { setverdict(fail) }
237 if (match({ 0, "C string", true }, TMyTemplate13())) { setverdict(pass) } else { setverdict(fail) }
238 if (match({ 0, "D string", true }, TMyTemplate14())) { setverdict(pass) } else { setverdict(fail) }
239 if (match({ 0, "E string", true }, TMyTemplate15())) { setverdict(pass) } else { setverdict(fail) }
240 }
241
242 testcase HO10136_sideeffect() runs on CT
243 // A side-effect of the first attempt to fix HO10136 caused the compiler
244 // to generate C++ code that could not be compiled.
245 {
246 template integer v_timeUnit := 60;
247
248 template R v_r modifies tbase := {
249 f1 := v_timeUnit // this line was miscompiled
250 }
251
252 if (valueof(v_r.f1) == 60) { setverdict(pass) } else { setverdict(pass) }
253 }
254
255 control {
256 execute( tc1() );
257 execute( tc2() );
258 execute( tc3() );
259 execute( ETSI_CR5091() );
260 execute( HO10136_sideeffect() );
261 }
262
263 }
This page took 0.037816 seconds and 4 git commands to generate.