blob: 2bb1d565edc7dd560ce3bd1e17a7b41f28fa0859 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.daffodil.dsom
import org.apache.daffodil.xml.XMLUtils
import org.junit.Assert._
import org.apache.daffodil.util._
import org.junit.Test
class TestMiddleEndAttributes {
val xsd = XMLUtils.XSD_NAMESPACE
val dfdl = XMLUtils.DFDL_NAMESPACE
val xsi = XMLUtils.XSI_NAMESPACE
val example = XMLUtils.EXAMPLE_NAMESPACE
@Test def test_hasStaticallyRequiredOccurrencesInDataRepresentation_1: Unit = {
val testSchema = SchemaUtils.dfdlTestSchema(
<xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>,
<dfdl:format representation="text" lengthUnits="bytes" encoding="US-ASCII" initiator="" terminator="" separator="" ignoreCase="no"/>,
<xs:element name="e1" dfdl:lengthKind="implicit">
<xs:complexType>
<xs:sequence dfdl:sequenceKind="ordered">
<xs:element name="s1" type="xs:string" dfdl:lengthKind="explicit" dfdl:length="{ 1 }"/>
<xs:element name="s2" type="xs:string" dfdl:lengthKind="explicit" dfdl:length="{ 1 }"/>
</xs:sequence>
</xs:complexType>
</xs:element>)
val sset = SchemaSet(testSchema)
val Seq(sch) = sset.schemas
val Seq(sd, _) = sch.schemaDocuments
// Explore global element decl
val Seq(e1) = sd.globalElementDecls
val e1ct = e1.complexType
val seq = e1ct.sequence
val Seq(s1, s2) = seq.groupMembers
assertTrue(s1.hasStaticallyRequiredOccurrencesInDataRepresentation)
assertTrue(s2.hasStaticallyRequiredOccurrencesInDataRepresentation)
}
@Test def test_hasStaticallyRequiredOccurrencesInDataRepresentation_2: Unit = {
val testSchema = SchemaUtils.dfdlTestSchema(
<xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>,
<dfdl:format representation="text" occursCountKind="parsed" lengthUnits="bytes" encoding="US-ASCII" initiator="" terminator="" separator="" ignoreCase="no"/>,
<xs:element name="e1" dfdl:lengthKind="implicit">
<xs:complexType>
<xs:sequence dfdl:sequenceKind="ordered">
<xs:element name="s1" type="xs:string" minOccurs="0" dfdl:lengthKind="explicit" dfdl:length="{ 1 }"/>
<xs:element name="s2" type="xs:string" minOccurs="0" dfdl:lengthKind="explicit" dfdl:length="{ 1 }"/>
</xs:sequence>
</xs:complexType>
</xs:element>)
val sset = SchemaSet(testSchema)
val Seq(sch) = sset.schemas
val Seq(sd, _) = sch.schemaDocuments
// Explore global element decl
val Seq(e1) = sd.globalElementDecls
val e1ct = e1.complexType
val seq = e1ct.sequence
val Seq(s1, s2) = seq.groupMembers
assertFalse(s1.hasStaticallyRequiredOccurrencesInDataRepresentation)
assertFalse(s2.hasStaticallyRequiredOccurrencesInDataRepresentation)
}
@Test def testRequiredSiblings: Unit = {
val testSchema = SchemaUtils.dfdlTestSchema(
<xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>,
<dfdl:format representation="text" occursCountKind="parsed" lengthUnits="bytes" encoding="US-ASCII" initiator="" terminator="" separator="" ignoreCase="no"/>,
<xs:element name="e1" dfdl:lengthKind="implicit">
<xs:complexType>
<xs:sequence dfdl:sequenceKind="ordered">
<xs:element name="s1" type="xs:string" minOccurs="0" dfdl:lengthKind="explicit" dfdl:length="{ 1 }"/>
<xs:element name="s2" type="xs:string" dfdl:lengthKind="explicit" dfdl:length="{ 1 }"/>
<xs:element name="s3" type="xs:string" minOccurs="0" dfdl:lengthKind="explicit" dfdl:length="{ 1 }"/>
<xs:element name="s4" type="xs:string" dfdl:lengthKind="explicit" dfdl:length="{ 1 }"/>
<xs:element name="s5" type="xs:string" minOccurs="0" dfdl:lengthKind="explicit" dfdl:length="{ 1 }"/>
</xs:sequence>
</xs:complexType>
</xs:element>)
val sset = SchemaSet(testSchema)
val Seq(sch) = sset.schemas
val Seq(sd, _) = sch.schemaDocuments
// Explore global element decl
val Seq(e1) = sd.globalElementDecls
val e1ct = e1.complexType
val seq = e1ct.sequence
val Seq(s1, s2, s3, s4, s5) = seq.groupMembers
assertFalse(s1.hasStaticallyRequiredOccurrencesInDataRepresentation)
assertTrue(s2.hasStaticallyRequiredOccurrencesInDataRepresentation)
assertFalse(s3.hasStaticallyRequiredOccurrencesInDataRepresentation)
assertTrue(s4.hasStaticallyRequiredOccurrencesInDataRepresentation)
assertFalse(s5.hasStaticallyRequiredOccurrencesInDataRepresentation)
}
@Test def testStaticallyFirstWithChoice: Unit = {
val testSchema = SchemaUtils.dfdlTestSchema(
<xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>,
<dfdl:format representation="text" occursCountKind="parsed" lengthUnits="bytes" encoding="US-ASCII" initiator="" terminator="" separator="" ignoreCase="no"
alignment="1" alignmentUnits="bytes" leadingSkip="0" trailingSkip="0"/>,
<xs:element name="e1" dfdl:lengthKind="implicit">
<xs:complexType>
<xs:sequence dfdl:sequenceKind="ordered" dfdl:separator="," dfdl:separatorPosition="infix">
<xs:choice>
<xs:element name="s1" type="xs:int" dfdl:lengthKind="explicit" dfdl:length="{ 1 }"/>
<xs:element name="s2" type="xs:string" dfdl:lengthKind="explicit" dfdl:length="{ 1 }"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>)
val sset = SchemaSet(testSchema)
val Seq(sch) = sset.schemas
val Seq(sd, _) = sch.schemaDocuments
// Explore global element decl
val Seq(e1) = sd.globalElementDecls
val e1ct = e1.complexType
val seq = e1ct.sequence
val Seq(seqMem) = seq.groupMembers
val cho = seqMem.asInstanceOf[Choice]
val Seq(s1, s2) = cho.groupMembers
val es = s1.optLexicalParent.get.optLexicalParent.get.asInstanceOf[LocalSequence]
assertTrue(es.hasInfixSep)
assertEquals(1, s1.position)
assertTrue(s1.isScalar)
val es2 = s2.optLexicalParent.get.optLexicalParent.get.asInstanceOf[LocalSequence]
assertEquals(es, es2)
assertEquals(2, s2.position)
assertTrue(s2.isScalar)
}
@Test def testNearestEnclosingSequenceElementRef(): Unit = {
val testSchema = SchemaUtils.dfdlTestSchema(
<xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>,
<dfdl:format ref="tns:GeneralFormat" representation="text" occursCountKind="parsed" lengthUnits="bytes" encoding="US-ASCII" initiator="" terminator="" separator="" ignoreCase="no" initiatedContent="no"/>,
<xs:element name="e1" dfdl:lengthKind="explicit" dfdl:length="{ 1 }"/>
<xs:element name="e2" dfdl:lengthKind="implicit">
<xs:complexType>
<xs:sequence dfdl:sequenceKind="ordered" dfdl:separator="," dfdl:separatorPosition="infix">
<xs:element ref="e1"/>
</xs:sequence>
</xs:complexType>
</xs:element>)
val sset = SchemaSet(testSchema)
val Seq(sch) = sset.schemas
val Seq(sd, _) = sch.schemaDocuments
// Explore global element decl
val Seq(_, e2) = sd.globalElementDecls
val e2ct = e2.complexType
val seq = e2ct.sequence
val mems = seq.groupMembers
val Seq(t1: Term) = mems
val e1ref = t1.asInstanceOf[ElementRef]
val Some(nes: LocalSequence) = e1ref.optLexicalParent
assertEquals(seq, nes)
}
@Test def testImmediatelyEnclosingModelGroup1(): Unit = {
val testSchema = SchemaUtils.dfdlTestSchema(
<xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>,
<dfdl:format ref="tns:GeneralFormat" lengthKind="delimited"/>,
<xs:element name="doc">
<xs:complexType>
<xs:sequence dfdl:sequenceKind="ordered">
<xs:element name="msg" type="ex:msgType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="msgType">
<xs:choice dfdl:initiatedContent="yes">
<xs:element ref="ex:fWithInitiator"/>
<!-- Only one in the choice -->
</xs:choice>
</xs:complexType>
<xs:element name="fWithInitiator" dfdl:initiator="$">
<xs:complexType>
<xs:sequence dfdl:sequenceKind="ordered">
<xs:element name="f" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>)
val sset = SchemaSet(testSchema)
val Seq(sch) = sset.schemas
val Seq(sd, _) = sch.schemaDocuments
// Explore global element decl
val Seq(e1, _) = sd.globalElementDecls
val e1ct = e1.complexType
val e1seq = e1ct.sequence
val Seq(t1: Term) = e1seq.groupMembers
val eMsg = t1.asInstanceOf[LocalElementDecl]
val eMsgct = eMsg.typeDef.asInstanceOf[GlobalComplexTypeDef]
val eMsgChoice = eMsgct.modelGroup.asInstanceOf[Choice]
val Seq(t2: Term) = eMsgChoice.groupMembers
val e2ref = t2.asInstanceOf[ElementRef]
val e3 = e2ref.referencedElement
val e3ct = e3.complexType
val e3seq = e3ct.sequence
val e3seqImmediatelyEnclosingModelGroup = e3seq.immediatelyEnclosingModelGroup
// Sequence inside an element doesn't have an immediately enclosing model group
assertEquals(None, e3seqImmediatelyEnclosingModelGroup)
// element reference also contained inside same
assertEquals(Some(eMsgChoice), e2ref.immediatelyEnclosingModelGroup)
}
}