Commit | Line | Data |
---|---|---|
970ed795 EL |
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 { | |
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 | } |