diff --git a/core/Universal_charstring.cc b/core/Universal_charstring.cc index 6e8318042577f1686f896796614a7a6a41942741..cc777a956687a837e36bcccedc4d924249802bd1 100644 --- a/core/Universal_charstring.cc +++ b/core/Universal_charstring.cc @@ -891,6 +891,15 @@ void UNIVERSAL_CHARSTRING::dump() const } } +boolean UNIVERSAL_CHARSTRING::can_start(const char *name, const char *uri, + XERdescriptor_t const& xd, unsigned int flavor, unsigned int flavor2) +{ + if (is_exer(flavor) && (xd.xer_bits & ANY_ELEMENT)) { + return TRUE; + } + return Base_Type::can_start(name, uri, xd, flavor, flavor2); +} + void UNIVERSAL_CHARSTRING::log() const { if (charstring) { diff --git a/core/Universal_charstring.hh b/core/Universal_charstring.hh index 36dfec4ae0f029b73f26fb87ab3da179b413f25b..bdb8c279e63e60de9db6177d76eedadb3cb48d2c 100644 --- a/core/Universal_charstring.hh +++ b/core/Universal_charstring.hh @@ -272,6 +272,9 @@ public: void dump() const; + static boolean can_start(const char *name, const char *uri, + XERdescriptor_t const& xd, unsigned int flavor, unsigned int flavor2); + private: // convert this string to character string for pattern matching: ([A-P]{8})* char* convert_to_regexp_form() const; diff --git a/regression_test/XML/EXER-whitepaper/AnyElement.ttcnpp b/regression_test/XML/EXER-whitepaper/AnyElement.ttcnpp index ae45f1876e6db9aa71a6e9118b0fd568691984fd..54014c2e79384663da319e3c99332434079d9e13 100644 --- a/regression_test/XML/EXER-whitepaper/AnyElement.ttcnpp +++ b/regression_test/XML/EXER-whitepaper/AnyElement.ttcnpp @@ -434,6 +434,58 @@ testcase decode_ae_emb() runs on AE CHECK_DECODE(exer_dec_ae, str_ae_emb, AEProduct, aep_emb); } +// testing 'anyElement' in a record of record (bug 539956) +type record Main +{ + record of AnyElem anyElem_list +} +with { + variant "name as uncapitalized"; + variant (anyElem_list) "untagged"; +}; + +type record AnyElem +{ + universal charstring elem +} +with { + variant "untagged"; + variant (elem) "anyElement"; +}; + +DECLARE_XER_ENCODERS(Main, main); +DECLARE_EXER_ENCODERS(Main, main); + +const Main ae_rorec := { + anyElem_list := { { elem := "<something/>" } } +}; + +const universal charstring str_ae_rorec_b := +"<Main>\n" & +"\t<anyElem_list>\n" & +"\t\t<AnyElem>\n" & +"\t\t\t<elem><something/></elem>\n" & +"\t\t</AnyElem>\n" & +"\t</anyElem_list>\n" & +"</Main>\n\n"; + +const universal charstring str_ae_rorec_e := +"<main>\n" & +"\t<something/>\n" & +"</main>\n\n"; + +testcase encode_ae_rorec() runs on AE +{ + CHECK_METHOD(bxer_enc_main, ae_rorec, str_ae_rorec_b); + CHECK_METHOD(exer_enc_main, ae_rorec, str_ae_rorec_e); +} + +testcase decode_ae_rorec() runs on AE +{ + CHECK_DECODE(bxer_dec_main, str_ae_rorec_b, Main, ae_rorec); + CHECK_DECODE(exer_dec_main, str_ae_rorec_e, Main, ae_rorec); +} + control { @@ -457,6 +509,9 @@ control execute(encode_ae_emb()) execute(decode_ae_emb()) + + execute(encode_ae_rorec()) + execute(decode_ae_rorec()) } }