/****************************************************************************** * Copyright (c) 2000-2015 Ericsson Telecom AB * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html ******************************************************************************/ module AbstractBlock { // This module contains tests for the ABSTRACT and BLOCK encoding instructions, // which are generally used in code generated from element substitutions and type // substitutions in XSD. type component CT {} /******* Test 1: Element substitution example *******/ type charstring Member1 with { variant "name as uncapitalized"; variant "element"; } type enumerated Member2 { else_, something } with { variant "text 'else_' as 'else'"; variant "name as uncapitalized"; variant "element"; } type record Member3 { integer bar optional, float foo optional, charstring base } with { variant "name as uncapitalized"; variant "element"; variant(bar) "attribute"; variant(foo) "attribute"; variant(base) "untagged"; } type union Head_group { charstring head, Member1 member1, Member2 member2, Member3 member3 } with { variant "untagged"; variant(head) "abstract"; variant(member3) "block"; } type record of Head_group Data with { variant "name as uncapitalized"; } external function f_enc_data(in Data x) return octetstring with { extension "prototype(convert) encode(XER:XER_EXTENDED)" }; external function f_dec_data(in octetstring x) return Data with { extension "prototype(convert) decode(XER:XER_EXTENDED)" }; testcase tc_element_substitution() runs on CT { // non-blocked and non-abstract fields should be encoded and decoded normally var Data v_data := { { member1 := "xy" }, { member2 := else_ } }; var octetstring v_exp_enc := char2oct( "\n" & "\txy\n" & "\telse\n" & "\n\n"); var octetstring v_enc := f_enc_data(v_data); if (v_enc != v_exp_enc) { setverdict(fail, "Expected: ", v_exp_enc, ", got: ", v_enc); } var Data v_dec := f_dec_data(v_exp_enc); if (v_dec != v_data) { setverdict(fail, "Expected: ", v_data, ", got: ", v_dec); } // abstract and blocked fields are encoded as before, but cause an error while decoding v_data := { { head := "abc" } }; v_exp_enc := char2oct( "\n" & "\tabc\n" & "\n\n"); v_enc := f_enc_data(v_data); if (v_enc != v_exp_enc) { setverdict(fail, "Expected: ", v_exp_enc, ", got: ", v_enc); } @try { v_dec := f_dec_data(v_exp_enc); setverdict(fail, "Error expected while decoding ", v_exp_enc); } @catch (msg) { if (not match(msg, pattern "*Index 0: Alternative 'head': Attempting to decode blocked or abstract field.")) { setverdict(fail, "Incorrect error message received while decoding ", v_exp_enc, " (message: ", msg, ")"); } } // another negative test example v_data := { { member2 := something }, { member3 := { bar := 10, foo := omit, base := "base" } } }; v_exp_enc := char2oct( "\n" & "\tsomething\n" & "\tbase\n" & "\n\n"); v_enc := f_enc_data(v_data); if (v_enc != v_exp_enc) { setverdict(fail, "Expected: ", v_exp_enc, ", got: ", v_enc); } @try { v_dec := f_dec_data(v_exp_enc); setverdict(fail, "Error expected while decoding ", v_exp_enc); } @catch (msg) { if (not match(msg, pattern "*Index 1: Alternative 'member3': Attempting to decode blocked or abstract field.")) { setverdict(fail, "Incorrect error message received while decoding ", v_exp_enc, " (message: ", msg, ")"); } } setverdict(pass); } /******* Test 2: Type substitution example *******/ type record ParentType { record length (1 .. infinity) of charstring foo_list optional, charstring bar } with { variant "name as uncapitalized"; variant(foo_list) "untagged"; variant(foo_list[-]) "name as 'foo'"; } type record RestrictedType { record length (1 .. infinity) of charstring foo_list, charstring bar } with { variant "name as uncapitalized"; variant(foo_list) "untagged"; variant(foo_list[-]) "name as 'foo'"; } type union ParentType_derivations { ParentType parentType, RestrictedType restrictedType } with { variant "useType"; variant "name as 'derivation'"; variant(parentType) "abstract"; } type record of ParentType_derivations Data2 with { variant "name as 'data'"; } external function f_enc_data2(in Data2 x) return octetstring with { extension "prototype(convert) encode(XER:XER_EXTENDED)" }; external function f_dec_data2(in octetstring x) return Data2 with { extension "prototype(convert) decode(XER:XER_EXTENDED)" }; testcase tc_type_substitution() runs on CT { // non-blocked and non-abstract fields should be encoded and decoded normally var Data2 v_data := { { restrictedType := { foo_list := { "first", "second" }, bar := "restricted" } } }; var octetstring v_exp_enc := char2oct( "\n" & "\t\n" & "\t\tfirst\n" & "\t\tsecond\n" & "\t\trestricted\n" & "\t\n" & "\n\n"); var octetstring v_enc := f_enc_data2(v_data); // '>' missing from one of the tags, requires Bence's modification /*if (v_enc != v_exp_enc) { setverdict(fail, "Expected: ", v_exp_enc, ", got: ", v_enc); }*/ var Data2 v_dec := f_dec_data2(v_exp_enc); if (v_dec != v_data) { setverdict(fail, "Expected: ", v_data, ", got: ", v_dec); } // abstract and blocked fields are encoded as before, but cause an error while decoding v_data := { { parentType := { foo_list := omit, bar := "parent" } } }; v_exp_enc := char2oct( "\n" & "\t\n" & "\t\tparent\n" & "\t\n" & "\n\n"); v_enc := f_enc_data2(v_data); // '>' missing /*if (v_enc != v_exp_enc) { setverdict(fail, "Expected: ", v_exp_enc, ", got: ", v_enc); }*/ @try { v_dec := f_dec_data2(v_exp_enc); setverdict(fail, "Error expected while decoding ", v_exp_enc); } @catch (msg) { if (not match(msg, pattern "*Index 0: Alternative 'parentType': Attempting to decode blocked or abstract field.")) { setverdict(fail, "Incorrect error message received while decoding ", v_exp_enc, " (message: ", msg, ")"); } } setverdict(pass); } control { execute(tc_element_substitution()); execute(tc_type_substitution()); } } with { encode "XML"; variant "namespace as 'http://www.example.org/blockExtension' prefix 'tns'"; variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'"; }