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 ******************************************************************************/
10 // This module contains tests for the ABSTRACT and BLOCK encoding instructions,
11 // which are generally used in code generated from element substitutions and type
12 // substitutions in XSD.
16 /******* Test 1: Element substitution example *******/
17 type charstring Member1
19 variant "name as uncapitalized";
23 type enumerated Member2
29 variant "text 'else_' as 'else'";
30 variant "name as uncapitalized";
41 variant "name as uncapitalized";
43 variant(bar) "attribute";
44 variant(foo) "attribute";
45 variant(base) "untagged";
57 variant(head) "abstract";
58 variant(member3) "block";
61 type record of Head_group Data
63 variant "name as uncapitalized";
66 external function f_enc_data(in Data x) return octetstring
67 with { extension "prototype(convert) encode(XER:XER_EXTENDED)" };
69 external function f_dec_data(in octetstring x) return Data
70 with { extension "prototype(convert) decode(XER:XER_EXTENDED)" };
72 testcase tc_element_substitution() runs on CT
74 // non-blocked and non-abstract fields should be encoded and decoded normally
75 var Data v_data := { { member1 := "xy" }, { member2 := else_ } };
76 var octetstring v_exp_enc := char2oct(
77 "<data xmlns:tns='http://www.example.org/blockExtension'>\n" &
78 "\t<tns:member1>xy</tns:member1>\n" &
79 "\t<tns:member2>else</tns:member2>\n" &
82 var octetstring v_enc := f_enc_data(v_data);
83 if (v_enc != v_exp_enc) {
84 setverdict(fail, "Expected: ", v_exp_enc, ", got: ", v_enc);
86 var Data v_dec := f_dec_data(v_exp_enc);
87 if (v_dec != v_data) {
88 setverdict(fail, "Expected: ", v_data, ", got: ", v_dec);
91 // abstract and blocked fields are encoded as before, but cause an error while decoding
92 v_data := { { head := "abc" } };
93 v_exp_enc := char2oct(
95 "\t<head>abc</head>\n" &
98 v_enc := f_enc_data(v_data);
99 if (v_enc != v_exp_enc) {
100 setverdict(fail, "Expected: ", v_exp_enc, ", got: ", v_enc);
104 v_dec := f_dec_data(v_exp_enc);
105 setverdict(fail, "Error expected while decoding ", v_exp_enc);
108 if (not match(msg, pattern "*Index 0: Alternative 'head': Attempting to decode blocked or abstract field.")) {
109 setverdict(fail, "Incorrect error message received while decoding ", v_exp_enc, " (message: ", msg, ")");
113 // another negative test example
114 v_data := { { member2 := something }, { member3 := { bar := 10, foo := omit, base := "base" } } };
115 v_exp_enc := char2oct(
116 "<data xmlns:tns='http://www.example.org/blockExtension'>\n" &
117 "\t<tns:member2>something</tns:member2>\n" &
118 "\t<tns:member3 bar='10'>base</tns:member3>\n" &
121 v_enc := f_enc_data(v_data);
122 if (v_enc != v_exp_enc) {
123 setverdict(fail, "Expected: ", v_exp_enc, ", got: ", v_enc);
127 v_dec := f_dec_data(v_exp_enc);
128 setverdict(fail, "Error expected while decoding ", v_exp_enc);
131 if (not match(msg, pattern "*Index 1: Alternative 'member3': Attempting to decode blocked or abstract field.")) {
132 setverdict(fail, "Incorrect error message received while decoding ", v_exp_enc, " (message: ", msg, ")");
139 /******* Test 2: Type substitution example *******/
140 type record ParentType {
141 record length (1 .. infinity) of charstring foo_list optional,
145 variant "name as uncapitalized";
146 variant(foo_list) "untagged";
147 variant(foo_list[-]) "name as 'foo'";
150 type record RestrictedType {
151 record length (1 .. infinity) of charstring foo_list,
155 variant "name as uncapitalized";
156 variant(foo_list) "untagged";
157 variant(foo_list[-]) "name as 'foo'";
160 type union ParentType_derivations {
161 ParentType parentType,
162 RestrictedType restrictedType
166 variant "name as 'derivation'";
167 variant(parentType) "abstract";
170 type record of ParentType_derivations Data2
172 variant "name as 'data'";
175 external function f_enc_data2(in Data2 x) return octetstring
176 with { extension "prototype(convert) encode(XER:XER_EXTENDED)" };
178 external function f_dec_data2(in octetstring x) return Data2
179 with { extension "prototype(convert) decode(XER:XER_EXTENDED)" };
181 testcase tc_type_substitution() runs on CT
183 // non-blocked and non-abstract fields should be encoded and decoded normally
184 var Data2 v_data := { { restrictedType := { foo_list := { "first", "second" }, bar := "restricted" } } };
185 var octetstring v_exp_enc := char2oct(
186 "<data xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>\n" &
187 "\t<derivation xsi:type='restrictedType'>\n" &
188 "\t\t<foo>first</foo>\n" &
189 "\t\t<foo>second</foo>\n" &
190 "\t\t<bar>restricted</bar>\n" &
191 "\t</derivation>\n" &
194 var octetstring v_enc := f_enc_data2(v_data); // '>' missing from one of the tags, requires Bence's modification
195 /*if (v_enc != v_exp_enc) {
196 setverdict(fail, "Expected: ", v_exp_enc, ", got: ", v_enc);
198 var Data2 v_dec := f_dec_data2(v_exp_enc);
199 if (v_dec != v_data) {
200 setverdict(fail, "Expected: ", v_data, ", got: ", v_dec);
203 // abstract and blocked fields are encoded as before, but cause an error while decoding
204 v_data := { { parentType := { foo_list := omit, bar := "parent" } } };
205 v_exp_enc := char2oct(
208 "\t\t<bar>parent</bar>\n" &
209 "\t</derivation>\n" &
212 v_enc := f_enc_data2(v_data); // '>' missing
213 /*if (v_enc != v_exp_enc) {
214 setverdict(fail, "Expected: ", v_exp_enc, ", got: ", v_enc);
218 v_dec := f_dec_data2(v_exp_enc);
219 setverdict(fail, "Error expected while decoding ", v_exp_enc);
222 if (not match(msg, pattern "*Index 0: Alternative 'parentType': Attempting to decode blocked or abstract field.")) {
223 setverdict(fail, "Incorrect error message received while decoding ", v_exp_enc, " (message: ", msg, ")");
231 execute(tc_element_substitution());
232 execute(tc_type_substitution());
238 variant "namespace as 'http://www.example.org/blockExtension' prefix 'tns'";
239 variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'";