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