1 /******************************************************************************
2 * Copyright (c) 2000-2014 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 {
21 template SIGNAL1 templateB :=
26 template SIGNAL1 templateC modifies templateB :=
34 template SIGNAL1 templateD modifies templateB :=
44 type port TP message {
46 } with { extension "internal" }
53 testcase tc1() runs on main {
54 connect(mtc:tp, mtc:tp2);
57 tp2.receive(templateC);
66 type record RR { // exactly the same
71 template R tbase := ?;
72 template R t1 modifies tbase := { f1 := 1 }; // 1, *
73 template R t2 modifies tbase := { f2 := 2 }; // ?, 2
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
80 type component CT { };
82 testcase tc2() runs on CT
84 var template R vtbase := tbase;
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); }
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); }
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); }
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); }
130 type record of R RofR;
132 testcase tc3() runs on CT
134 var template U tu := ?;
137 var template RofR vt := *;
140 // todo: add more specific tests
144 type record MyRecordType {
145 integer field1 optional,
150 // With value parameters.
152 template MyRecordType MyTemplate11(integer p_int := 5) := {
154 field2 := "A string",
158 template MyRecordType MyTemplate12(integer p_int) modifies MyTemplate11 := {
159 // p_int had a default value in MyTemplate11 but has none in this template
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
169 template MyRecordType MyTemplate14(integer p_int := -) modifies MyTemplate13 := {
170 // p_int inherits the default value 0 from its parent MyTemplate13
174 template MyRecordType MyTemplate15(integer p_int := -) modifies MyTemplate14 := {
175 // p_int inherits the default value 0 from MyTemplate13 via MyTemplate14
179 // With template parameters.
181 template MyRecordType TMyTemplate11(template integer p_int := 5) := {
183 field2 := "A string",
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
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
198 template MyRecordType TMyTemplate14(template integer p_int := -) modifies TMyTemplate13 := {
199 // p_int inherits the default value 0 from its parent MyTemplate13
203 template MyRecordType TMyTemplate15(template integer p_int := -) modifies TMyTemplate14 := {
204 // p_int inherits the default value 0 from MyTemplate13 via MyTemplate14
208 testcase ETSI_CR5091() runs on CT
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) }
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.
246 template integer v_timeUnit := 60;
248 template R v_r modifies tbase := {
249 f1 := v_timeUnit // this line was miscompiled
252 if (valueof(v_r.f1) == 60) { setverdict(pass) } else { setverdict(pass) }
259 execute( ETSI_CR5091() );
260 execute( HO10136_sideeffect() );