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 smallany { | |
9 | type component Small {} | |
10 | ||
11 | type record of anytype anysequence; | |
12 | type record address { integer i } | |
13 | template address t_a := { 1 } | |
14 | ||
15 | type integer pie(3, 14, 15, 9, 26); | |
16 | ||
17 | type record of integer intlist_0; | |
18 | type intlist_0 intlist; | |
19 | ||
20 | template anytype anytemp := { intlist := { 1, 2, 3 } } | |
21 | const anytype anyconst := { intlist := { 1, 2, 3 } } | |
22 | template anytype anytemp2 := { level2 := { level1 := { 1, 2, 3 } } } | |
23 | const anytype anyconst2 := { level2 := { level1 := { 1, 2, 3 } } } | |
24 | type record level2 { | |
25 | intlist level1 | |
26 | } | |
27 | ||
28 | type record level3 { | |
29 | level2 level_2 optional | |
30 | } | |
31 | ||
32 | function dummy(in level3 p3_in, out level3 p3_out, inout level3 p3_inout) | |
33 | { | |
34 | var level3 v_l3; | |
35 | v_l3.level_2.level1[0] := 17; | |
36 | ||
37 | var integer a := 42; | |
38 | p3_out .level_2.level1[0] := a; | |
39 | p3_in .level_2.level1[0] := a; | |
40 | p3_inout.level_2.level1[0] := a; | |
41 | } | |
42 | // These two functions are "compile-only" | |
43 | function dummy_template(in template level3 p3_in, out template level3 p3_out, inout template level3 p3_inout) | |
44 | { | |
45 | var template level3 v_l3; | |
46 | v_l3.level_2.level1[0] := 17; | |
47 | ||
48 | var integer a := 42; | |
49 | var template integer b; | |
50 | p3_out .level_2.level1[a] := a; | |
51 | p3_in .level_2.level1[a+1] := a; | |
52 | p3_inout.level_2.level1[-a] := a; // it would be nice to flag this indexing as an error (a is still 42, even though it's not a const) | |
53 | ||
54 | b := p3_out .level_2.level1[a]; | |
55 | b := p3_in .level_2.level1[a+1]; | |
56 | b := p3_inout.level_2.level1[-a]; // if a is const, this _is_ flagged as error | |
57 | ||
58 | } | |
59 | ||
60 | function fval(in anytype any_in, out anytype any_out) return anytype | |
61 | { | |
62 | any_out := any_in; | |
63 | var integer local := any_in.anysequence[3].anysequence[0].integer; | |
64 | if (local == 13) { setverdict(pass); } | |
65 | else { setverdict(fail); } | |
66 | ||
67 | var level3 l3 := { level_2 := anyconst2.level2 } | |
68 | var level3 l4; | |
69 | l4 := { level_2 := anyconst2.level2 } | |
70 | if (l3 == l4) { setverdict(pass); } | |
71 | else { setverdict(fail); } | |
72 | if (l3 == { level_2 := anyconst2.level2 }) { setverdict(pass); } | |
73 | else { setverdict(fail); } | |
74 | return any_out; | |
75 | } | |
76 | ||
77 | function ftmpl(in template anytype anytempl_in, out template anytype anytempl_out) return template anytype | |
78 | { | |
79 | anytempl_out := anytempl_in; | |
80 | if (ischosen(anytempl_in.intlist)) { | |
81 | var template intlist local_template := anytempl_in.intlist; | |
82 | if( match(valueof(anytemp.intlist), local_template) ) { setverdict(pass); } | |
83 | else { setverdict(fail); } | |
84 | ||
85 | local_template := anytempl_in.intlist; // assign, not init | |
86 | } | |
87 | else { | |
88 | var template level3 l3 := { level_2 := anytempl_in.level2 } | |
89 | var template level3 l4; | |
90 | l4 := { level_2 := anytempl_in.level2 } // assign, not init | |
91 | } | |
92 | return anytempl_out; | |
93 | } | |
94 | ||
95 | testcase values() runs on Small | |
96 | { | |
97 | var anytype anyvar; | |
98 | // partial init is not enough anymore, checks became stricter due to HL51459 | |
99 | anyvar.anysequence[0] := { integer := 0 } | |
100 | anyvar.anysequence[1] := { integer := 1 } | |
101 | anyvar.anysequence[2] := { integer := 2 } | |
102 | anyvar.anysequence[3] := { anysequence := { { integer := 13 } } } | |
103 | //anyvar.address.i := 3; | |
104 | var anytype anyout; | |
105 | var anytype anyret := fval(anyvar, anyout); | |
106 | ||
107 | if (anyout == anyret) { setverdict(pass); } | |
108 | else { setverdict(fail); } | |
109 | } | |
110 | ||
111 | testcase templates() runs on Small | |
112 | { | |
113 | var template anytype anytemplout; | |
114 | var template anytype anytemplret := ftmpl(anytemp, anytemplout); | |
115 | ||
116 | if (valueof(anytemplout) == valueof(anytemplret)) { setverdict(pass); } | |
117 | else { setverdict(fail); } | |
118 | ||
119 | anytemplret := ftmpl(anytemp2, anytemplout); | |
120 | if (valueof(anytemplout) == valueof(anytemplret)) { setverdict(pass); } | |
121 | else { setverdict(fail); } | |
122 | } | |
123 | ||
124 | control{ | |
125 | var anytype anyvar; | |
126 | var template intlist myvtemplist := anytemp.intlist | |
127 | template intlist mytemplist := anytemp.intlist // Needs "AT_" prefix. | |
128 | template intlist mytemplist2 := anytemp2.level2.level1 // Needs "AT_" prefix on level2, but not leve1 | |
129 | anyvar.anysequence[3] := { anysequence := { } } | |
130 | anyvar.address.i := 3; | |
131 | //(interpreted as module.function) anyvar.pie(2); | |
132 | var integer io := anyvar.address.i | |
133 | ||
134 | ||
135 | template anytype t_aa := { integer := 3 }; | |
136 | // PredefinedType----------^^^^^^^ | |
137 | // StructFieldRef----------^^^^^^^ | |
138 | // FieldReference----------^^^^^^^ | |
139 | //--------------------------------------^----- SimpleSpec as TemplateBody | |
140 | // FieldRefce:= TemplateBody | |
141 | // FieldSpec------ | |
142 | // \-FieldSpecList--/ | |
143 | // \-TemplateBody---/ | |
144 | ||
145 | //template address t_ii := { pie(13) } | |
146 | ||
147 | execute(values()); | |
148 | execute(templates()); | |
149 | } | |
150 | ||
151 | } | |
152 | with { | |
153 | encode "XML" | |
154 | extension "anytype anysequence,address,integer,intlist,level2" | |
155 | /*syntax error belongs to function_test extension "anytype boolean, | |
156 | integer,address,boolean intreg"*/ | |
157 | } |