Commit 7076d2df authored by Kristof Szabados's avatar Kristof Szabados
Browse files

Merge pull request #24 from BenceJanosSzabo/master

xsd2ttcn: fixed list generation
parents d44e3c4f d705825f
/*******************************************************************************
* Copyright (c) 2000-2016 Ericsson Telecom AB
*
* XSD to TTCN-3 Translator version: CRL 113 200/5 R4C
*
* 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
*
* Contributors:
* Szabo Bence Janos
*
*******************************************************************************/
//
// File: www_example_org_list_complextype_e.ttcn
// Description:
// References:
// Rev:
// Prodnr:
// Updated: Thu Mar 24 11:50:07 2015
// Contact: http://ttcn.ericsson.se
//
////////////////////////////////////////////////////////////////////////////////
// Generated from file(s):
// - list_complextype_e.xsd
// /* xml version = "1.0" */
// /* targetnamespace = "www.example.org/list/complextype/e" */
////////////////////////////////////////////////////////////////////////////////
// Modification header(s):
//-----------------------------------------------------------------------------
// Modified by:
// Modification date:
// Description:
// Modification contact:
//------------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
module www_example_org_list_complextype {
import from XSD all;
type record ComplexTypeWithList
{
record length(3) of XSD.Float elementWithList
}
with {
variant (elementWithList) "name as capitalized";
variant (elementWithList) "list";
};
type record length(3) of XSD.Float ElementWithList
with {
variant "list";
variant "element";
};
type record ChoiceWithList
{
union {
record length(3) of XSD.Float element1,
record of XSD.String element2
} choice
}
with {
variant (choice) "untagged";
variant (choice.element1) "name as capitalized";
variant (choice.element1) "list";
variant (choice.element2) "name as capitalized";
variant (choice.element2) "list";
};
type XSD.Token Ipv4 (pattern "IPV4")
with {
variant "name as uncapitalized";
};
type XSD.Token Ipv6 (pattern "IPV6")
with {
variant "name as uncapitalized";
};
type record A
{
XSD.String b,
XSD.Integer c,
record of record {
XSD.Integer e optional,
record {
record length(1 .. infinity) of Ipv4 ipv4addresses,
record length(1 .. infinity) of Ipv6 ipv6addresses
} f optional,
XSD.String g optional
} d_list
}
with {
variant "name as uncapitalized";
variant (d_list) "untagged";
variant (d_list[-]) "name as 'd'";
variant (d_list[-].f.ipv4addresses) "list";
variant (d_list[-].f.ipv6addresses) "list";
};
}
with {
encode "XML";
variant "namespace as 'www.example.org/list/complextype' prefix 'this'";
variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'";
}
......@@ -162,6 +162,7 @@
<File path="../xsd/attribute_enumeration_variant.xsd" />
<File path="../xsd/including_module.xsd" />
<File path="../xsd/included_without_namespace.xsd" />
<File path="../xsd/list_complextype.xsd" />
</File_Group>
<File_Group name="XmlTest_xsds" >
<File path="../XmlTest_xsds/XmlTest_boolean.xsd" />
......@@ -394,6 +395,7 @@
<File path="../XmlTest_expectedTtcns/www_XmlTest_org_element_nameInheritance_e.ttcn" />
<File path="../XmlTest_expectedTtcns/www_example_org_attribute_enumeration_variant_e.ttcn" />
<File path="../XmlTest_expectedTtcns/www_example_org_including_module_e.ttcn" />
<File path="../XmlTest_expectedTtcns/www_example_org_list_complextype_e.ttcn" />
</File_Group>
<File_Group name="XmlTest_src" >
<File path="xmlTest_Shell.ttcn" />
......
......@@ -1073,6 +1073,17 @@ group ListTest {
}
}//tc_
testcase tc_list_complextype() runs on xmlTest_CT {
f_shellCommandWithVerdict("xsd2ttcn list_complextype.xsd","",c_shell_successWithoutWarningAndError)
if(getverdict==pass) {
f_compareFiles(
"www_example_org_list_complextype_e.ttcn","www_example_org_list_complextype.ttcn", c_numOfDiff_headerAndModuleName);
}
}//tc_
}//ListTest
group UnionTest {
......@@ -2572,6 +2583,7 @@ control {
execute(tc_list_encDec());//Passed
execute(tc_integerList());//Passed
execute(tc_list_simpletype());//Passed
execute(tc_list_complextype());
//===Float===
execute(tc_float_not_a_number());
......
<!--
Copyright (c) 2000-2016 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
Contributors:
Bence Janos Szabo – initial implementation
-->
<xs:schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="www.example.org/list/complextype"
xmlns:this="www.example.org/list/complextype"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="unqualified">
<xs:complexType name="ComplexTypeWithList">
<xs:sequence>
<xs:element name="ElementWithList">
<xs:simpleType>
<xs:restriction>
<xs:simpleType>
<xs:list itemType="xs:float" />
</xs:simpleType>
<xs:minLength value="3" />
<xs:maxLength value="3" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="ElementWithList">
<xs:simpleType>
<xs:restriction>
<xs:simpleType>
<xs:list itemType="xs:float" />
</xs:simpleType>
<xs:minLength value="3" />
<xs:maxLength value="3" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:complexType name="ChoiceWithList">
<xs:choice>
<xs:element name="Element1">
<xs:simpleType>
<xs:restriction>
<xs:simpleType>
<xs:list itemType="xs:float" />
</xs:simpleType>
<xs:minLength value="3" />
<xs:maxLength value="3" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Element2">
<xs:simpleType>
<xs:list itemType="xs:string" />
</xs:simpleType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:simpleType name="ipv4">
<xs:restriction base="xs:token">
<xs:pattern value="IPV4"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ipv6">
<xs:restriction base="xs:token">
<xs:pattern value="IPV6"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="a">
<xs:sequence>
<xs:element name="b" type="xs:string"/>
<xs:element name="c" type="xs:integer"/>
<xs:element name="d" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="e" type="xs:integer" minOccurs="0"/>
<xs:element name="f" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="ipv4addresses" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction>
<xs:simpleType>
<xs:list itemType="this:ipv4"/>
</xs:simpleType>
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="ipv6addresses" minOccurs="0" maxOccurs="1">
<xs:simpleType>
<xs:restriction>
<xs:simpleType>
<xs:list itemType="this:ipv6"/>
</xs:simpleType>
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="g" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
......@@ -35,6 +35,7 @@ ComplexType::ComplexType(XMLParser * a_parser, TTCN3Module * a_module, Construct
, fromAll(false)
, max_alt(0)
, skipback(0)
, list(false)
, lastType()
, actualPath(empty_string)
, actfield(this)
......@@ -62,6 +63,7 @@ ComplexType::ComplexType(ComplexType & other)
, fromAll(other.fromAll)
, max_alt(other.max_alt)
, skipback(other.skipback)
, list(other.list)
, lastType(other.lastType)
, actualPath(other.actualPath)
, actfield(this)
......@@ -109,6 +111,7 @@ ComplexType::ComplexType(ComplexType * other)
, fromAll(false)
, max_alt(0)
, skipback(0)
, list(false)
, lastType()
, actualPath(empty_string)
, actfield(this)
......@@ -138,6 +141,7 @@ ComplexType::ComplexType(const SimpleType & other, CT_fromST c)
, fromAll(false)
, max_alt(0)
, skipback(0)
, list(false)
, lastType()
, actualPath(empty_string)
, actfield(this)
......@@ -580,6 +584,13 @@ void ComplexType::loadWithValues() {
}
break;
case n_list:
if (parent != NULL && parent->basefield == this) {
parent->list = true;
parent->SimpleType::loadWithValues();
parent->basefield = NULL;
setInvisible();
break;
}
case n_length:
case n_minLength:
case n_maxLength:
......@@ -614,8 +625,16 @@ void ComplexType::modifyValues() {
if (xsdtype == n_sequence) {
skipback = skipback - 1;
}
//embedded simpletype with list in element
if(xsdtype == n_simpleType && list) {
list = false;
return;
}
if ((xsdtype == n_element ||
if ( parent != NULL &&
(xsdtype == n_element ||
xsdtype == n_complexType ||
xsdtype == n_complexContent ||
xsdtype == n_all ||
......@@ -626,11 +645,10 @@ void ComplexType::modifyValues() {
xsdtype == n_attributeGroup ||
xsdtype == n_extension ||
xsdtype == n_restriction ||
xsdtype == n_simpleType ||
(xsdtype == n_simpleType && !list) ||
xsdtype == n_simpleContent ||
(xsdtype == n_sequence && skipback < 0)
)
&& parent != NULL) {
)) {
if (!tagNames.empty() && tagNames.back() == parser->getParentTagName()) {
if (nillable && tagNames.back() == n_element) {
parent->modifyValues();
......@@ -2095,3 +2113,4 @@ Mstring ComplexType::findRoot(const BlockValue block_value, SimpleType* elem, co
return empty_string;
}
}
......@@ -71,6 +71,9 @@ private:
bool fromAll;
unsigned max_alt;
int skipback;
//Special use: true if an element of a complextype is restricted to a list
// in a simpletype
bool list;
TagName lastType;
Mstring actualPath;
RootType * actfield;
......@@ -165,3 +168,4 @@ inline bool compareTypes(ComplexType * lhs, ComplexType * rhs) {
#endif /* COMPLEXTYPE_H_ */
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment