1 /******************************************************************************
2 * Copyright (c) 2000-2016 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
12 ******************************************************************************/
13 module AbstractBlock {
15 // This module contains tests for the ABSTRACT and BLOCK encoding instructions,
16 // which are generally used in code generated from element substitutions and type
17 // substitutions in XSD.
21 /******* Test 1: Element substitution example *******/
22 type charstring Member1
24 variant "name as uncapitalized";
28 type enumerated Member2
34 variant "text 'else_' as 'else'";
35 variant "name as uncapitalized";
46 variant "name as uncapitalized";
48 variant(bar) "attribute";
49 variant(foo) "attribute";
50 variant(base) "untagged";
62 variant(head) "abstract";
63 variant(member3) "block";
66 type record of Head_group Data
68 variant "name as uncapitalized";
71 external function f_enc_data(in Data x) return octetstring
72 with { extension "prototype(convert) encode(XER:XER_EXTENDED)" };
74 external function f_dec_data(in octetstring x) return Data
75 with { extension "prototype(convert) decode(XER:XER_EXTENDED)" };
77 testcase tc_element_substitution() runs on CT
79 // non-blocked and non-abstract fields should be encoded and decoded normally
80 var Data v_data := { { member1 := "xy" }, { member2 := else_ } };
81 var octetstring v_exp_enc := char2oct(
82 "<data xmlns:tns='http://www.example.org/blockExtension'>\n" &
83 "\t<tns:member1>xy</tns:member1>\n" &
84 "\t<tns:member2>else</tns:member2>\n" &
87 var octetstring v_enc := f_enc_data(v_data);
88 if (v_enc != v_exp_enc) {
89 setverdict(fail, "Expected: ", v_exp_enc, ", got: ", v_enc);
91 var Data v_dec := f_dec_data(v_exp_enc);
92 if (v_dec != v_data) {
93 setverdict(fail, "Expected: ", v_data, ", got: ", v_dec);
96 // abstract and blocked fields are encoded as before, but cause an error while decoding
97 v_data := { { head := "abc" } };
98 v_exp_enc := char2oct(
100 "\t<head>abc</head>\n" &
103 v_enc := f_enc_data(v_data);
104 if (v_enc != v_exp_enc) {
105 setverdict(fail, "Expected: ", v_exp_enc, ", got: ", v_enc);
109 v_dec := f_dec_data(v_exp_enc);
110 setverdict(fail, "Error expected while decoding ", v_exp_enc);
113 if (not match(msg, pattern "*Index 0: Alternative 'head': Attempting to decode blocked or abstract field.")) {
114 setverdict(fail, "Incorrect error message received while decoding ", v_exp_enc, " (message: ", msg, ")");
118 // another negative test example
119 v_data := { { member2 := something }, { member3 := { bar := 10, foo := omit, base := "base" } } };
120 v_exp_enc := char2oct(
121 "<data xmlns:tns='http://www.example.org/blockExtension'>\n" &
122 "\t<tns:member2>something</tns:member2>\n" &
123 "\t<tns:member3 bar='10'>base</tns:member3>\n" &
126 v_enc := f_enc_data(v_data);
127 if (v_enc != v_exp_enc) {
128 setverdict(fail, "Expected: ", v_exp_enc, ", got: ", v_enc);
132 v_dec := f_dec_data(v_exp_enc);
133 setverdict(fail, "Error expected while decoding ", v_exp_enc);
136 if (not match(msg, pattern "*Index 1: Alternative 'member3': Attempting to decode blocked or abstract field.")) {
137 setverdict(fail, "Incorrect error message received while decoding ", v_exp_enc, " (message: ", msg, ")");
144 /******* Test 2: Type substitution example *******/
145 type record ParentType {
146 record length (1 .. infinity) of charstring foo_list optional,
150 variant "name as uncapitalized";
151 variant(foo_list) "untagged";
152 variant(foo_list[-]) "name as 'foo'";
155 type record RestrictedType {
156 record length (1 .. infinity) of charstring foo_list,
160 variant "name as uncapitalized";
161 variant(foo_list) "untagged";
162 variant(foo_list[-]) "name as 'foo'";
165 type union ParentType_derivations {
166 ParentType parentType,
167 RestrictedType restrictedType
171 variant "name as 'derivation'";
172 variant(parentType) "abstract";
175 type record of ParentType_derivations Data2
177 variant "name as 'data'";
180 external function f_enc_data2(in Data2 x) return octetstring
181 with { extension "prototype(convert) encode(XER:XER_EXTENDED)" };
183 external function f_dec_data2(in octetstring x) return Data2
184 with { extension "prototype(convert) decode(XER:XER_EXTENDED)" };
186 testcase tc_type_substitution() runs on CT
188 // non-blocked and non-abstract fields should be encoded and decoded normally
189 var Data2 v_data := { { restrictedType := { foo_list := { "first", "second" }, bar := "restricted" } } };
190 var octetstring v_exp_enc := char2oct(
191 "<data xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>\n" &
192 "\t<derivation xsi:type='restrictedType'>\n" &
193 "\t\t<foo>first</foo>\n" &
194 "\t\t<foo>second</foo>\n" &
195 "\t\t<bar>restricted</bar>\n" &
196 "\t</derivation>\n" &
199 var octetstring v_enc := f_enc_data2(v_data); // '>' missing from one of the tags, requires Bence's modification
200 /*if (v_enc != v_exp_enc) {
201 setverdict(fail, "Expected: ", v_exp_enc, ", got: ", v_enc);
203 var Data2 v_dec := f_dec_data2(v_exp_enc);
204 if (v_dec != v_data) {
205 setverdict(fail, "Expected: ", v_data, ", got: ", v_dec);
208 // abstract and blocked fields are encoded as before, but cause an error while decoding
209 v_data := { { parentType := { foo_list := omit, bar := "parent" } } };
210 v_exp_enc := char2oct(
213 "\t\t<bar>parent</bar>\n" &
214 "\t</derivation>\n" &
217 v_enc := f_enc_data2(v_data); // '>' missing
218 /*if (v_enc != v_exp_enc) {
219 setverdict(fail, "Expected: ", v_exp_enc, ", got: ", v_enc);
223 v_dec := f_dec_data2(v_exp_enc);
224 setverdict(fail, "Error expected while decoding ", v_exp_enc);
227 if (not match(msg, pattern "*Index 0: Alternative 'parentType': Attempting to decode blocked or abstract field.")) {
228 setverdict(fail, "Incorrect error message received while decoding ", v_exp_enc, " (message: ", msg, ")");
236 execute(tc_element_substitution());
237 execute(tc_type_substitution());
243 variant "namespace as 'http://www.example.org/blockExtension' prefix 'tns'";
244 variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'";