stevedlawrence commented on code in PR #1652:
URL: https://github.com/apache/daffodil/pull/1652#discussion_r3058988029
##########
daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/Term.scala:
##########
@@ -269,6 +269,26 @@ trait Term
.getOrElse(false)
}
+ final lazy val immediatelyEnclosingElementParent: Option[ElementBase] = {
+ val p = optLexicalParent.flatMap {
Review Comment:
Note that I think lexical parents does not extend past global decls, so if a
global decl has endOfParent then I'm not sure we will correctly check EOP
restrictions for anything that references that decl. I'm wondering if the
checks need to go down instead up?
For example, maybe an element needs to check if it has properties that would
disallow children with lengthKind EOP and if so check if any children have are
EOP? Or check if any immediate children have EOP, and if so then check if they
are compatible?
##########
daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/LocalElementMixin.scala:
##########
@@ -61,10 +61,8 @@ trait LocalElementMixin extends ParticleMixin with
LocalElementGrammarMixin {
else if (representation =:= Representation.Binary) true
else false
}
- case LengthKind.EndOfParent if isComplexType =>
- notYetImplemented("lengthKind='endOfParent' for complex type")
- case LengthKind.EndOfParent =>
- notYetImplemented("lengthKind='endOfParent' for simple type")
+ // per DFDL Spec 9.3.2, endOfParent is already positioned at parent's
end so length is zero
Review Comment:
This comment is a bit confusing to me. This function is supposed to return
whether or not we statically know if this element must have non-zero length. I
imagine we can rarely statically know that for endOfParent elements, so I think
returning false here is correct. But the comment kindof makes it sound like the
length is always zero, which kindof contradicts that.
Reading this portion of the spec (which this comment copies), I think the
spec is talking about the runtime evaluation of whether or not a field is zero
length. I believe the spec is just saying that that an endOfParent element has
zero length representation if it is already at the parents end (i.e. bitLimit
== bitPosition). Since this is more about runtime, I'm not sure this comment
belongs here and might avoid that confusion.
##########
daffodil-core/src/main/scala/org/apache/daffodil/core/grammar/ElementBaseGrammarMixin.scala:
##########
@@ -252,6 +257,134 @@ trait ElementBaseGrammarMixin
}
final lazy val prefixedLengthBody = prefixedLengthElementDecl.parsedValue
+ final lazy val parentEffectiveLengthUnits: LengthUnits =
+ immediatelyEnclosingElementParent match {
+ case Some(parent: ElementBase) => {
+ parent.lengthKind match {
+ case LengthKind.Explicit | LengthKind.Prefixed => parent.lengthUnits
+ case LengthKind.Pattern => LengthUnits.Characters
+ case _
+ if parent.isInstanceOf[ChoiceTermBase] && (parent
+ .asInstanceOf[ChoiceTermBase]
+ .choiceLengthKind == ChoiceLengthKind.Explicit) =>
+ LengthUnits.Bytes
+ case LengthKind.EndOfParent => parent.parentEffectiveLengthUnits
+ case _ =>
+ Assert.invariantFailed(
+ s"Could not figure effective length unit of parents of
${context}"
+ )
+ }
+ }
+ case None if this.isInstanceOf[Root] => LengthUnits.Characters
+ case _ =>
+ Assert.invariantFailed(
Review Comment:
I feel like this invariant might break if we have something like a global
element decl with a child with EOP. That EOP will want to reach up to find
where it's used but wont' be able to find a parent because it only looks
lexically.
##########
daffodil-core/src/main/scala/org/apache/daffodil/core/grammar/ElementBaseGrammarMixin.scala:
##########
@@ -252,6 +257,134 @@ trait ElementBaseGrammarMixin
}
final lazy val prefixedLengthBody = prefixedLengthElementDecl.parsedValue
+ final lazy val parentEffectiveLengthUnits: LengthUnits =
+ immediatelyEnclosingElementParent match {
+ case Some(parent: ElementBase) => {
+ parent.lengthKind match {
+ case LengthKind.Explicit | LengthKind.Prefixed => parent.lengthUnits
+ case LengthKind.Pattern => LengthUnits.Characters
+ case _
+ if parent.isInstanceOf[ChoiceTermBase] && (parent
+ .asInstanceOf[ChoiceTermBase]
+ .choiceLengthKind == ChoiceLengthKind.Explicit) =>
+ LengthUnits.Bytes
+ case LengthKind.EndOfParent => parent.parentEffectiveLengthUnits
+ case _ =>
+ Assert.invariantFailed(
+ s"Could not figure effective length unit of parents of
${context}"
+ )
+ }
+ }
+ case None if this.isInstanceOf[Root] => LengthUnits.Characters
+ case _ =>
+ Assert.invariantFailed(
+ s"Could not figure effective length unit of parents of ${context}"
+ )
+ }
+ final lazy val checkEndOfParentElem: Unit = {
+ if (lengthKind != LengthKind.EndOfParent) ()
+ else {
+ schemaDefinitionWhen(
+ hasTerminator,
+ "%s is specified as dfdl:lengthKind=\"endOfParent\", but specifies a
dfdl:terminator.",
+ context
Review Comment:
I don't think we need to include context in the error string. I believe the
error context is capture and output as part of the SDE.
##########
daffodil-core/src/main/scala/org/apache/daffodil/core/grammar/AlignedMixin.scala:
##########
@@ -456,7 +456,11 @@ trait AlignedMixin extends GrammarMixin { self: Term =>
}
case LengthKind.Delimited => encodingLengthApprox
case LengthKind.Pattern => encodingLengthApprox
- case LengthKind.EndOfParent => LengthMultipleOf(1) // NYI
+ case LengthKind.EndOfParent =>
+ eb.immediatelyEnclosingElementParent match {
+ case Some(parent) => parent.elementSpecifiedLengthApprox
Review Comment:
I don't think this is quite right. The length of this element isn't the same
as the parent length, it's whatever is left over of the parent after the
previous siblings.
So this elements length is kindof `parent.elementSpecifiedLenghtApprox -
priorAlignmentApprox` (i.e the length of the parent minus wherever we are
starting) but we can't just subtract approx things since they are potentially
multiples.
That said, I wonder if we don't really need to get this elements approx
length perfect, because no elements come after it, and the endingAlignApprox of
the parent won't need this specific is going to be known since it has an
explicit length? Maybe this just becomes LengthMultipleOf 1 or 8 depending on
length units? This might need some more thought...
##########
daffodil-core/src/main/scala/org/apache/daffodil/unparsers/runtime1/SpecifiedLengthUnparsers.scala:
##########
@@ -72,6 +72,20 @@ final class SpecifiedLengthExplicitImplicitUnparser(
}
}
+final class SpecifiedLengthEndOfParentUnparser(
+ eUnparser: Unparser,
+ erd: ElementRuntimeData
+) extends CombinatorUnparser(erd) {
+
+ override def runtimeDependencies = Vector()
+
+ override def childProcessors = Vector(eUnparser)
+
+ override final def unparse(state: UState): Unit = {
+ eUnparser.unparse1(state)
+ }
+}
Review Comment:
If this unparser doesn't do anything I would suggest we shouldn't even have
it and the SpecifiedLengthEndOfParent primitive just wants to return eUnparser.
It looks like the pattern parser does something similar, for example.
##########
daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/Term.scala:
##########
@@ -269,6 +269,26 @@ trait Term
.getOrElse(false)
}
+ final lazy val immediatelyEnclosingElementParent: Option[ElementBase] = {
+ val p = optLexicalParent.flatMap {
+ case e: ElementBase => Some(e)
+ case ge: GlobalElementDecl => Some(ge.asRoot)
+ case s: SequenceTermBase => s.immediatelyEnclosingElementParent
+ case c: ChoiceTermBase => c.immediatelyEnclosingElementParent
Review Comment:
Do we need to return the choice in some cases? It looks like the logic for
EOP sometimes cares about the choice so I'm not sure we can bypass this?
##########
daffodil-core/src/main/scala/org/apache/daffodil/core/grammar/ElementBaseGrammarMixin.scala:
##########
@@ -252,6 +257,134 @@ trait ElementBaseGrammarMixin
}
final lazy val prefixedLengthBody = prefixedLengthElementDecl.parsedValue
+ final lazy val parentEffectiveLengthUnits: LengthUnits =
+ immediatelyEnclosingElementParent match {
+ case Some(parent: ElementBase) => {
+ parent.lengthKind match {
+ case LengthKind.Explicit | LengthKind.Prefixed => parent.lengthUnits
+ case LengthKind.Pattern => LengthUnits.Characters
+ case _
+ if parent.isInstanceOf[ChoiceTermBase] && (parent
+ .asInstanceOf[ChoiceTermBase]
+ .choiceLengthKind == ChoiceLengthKind.Explicit) =>
+ LengthUnits.Bytes
+ case LengthKind.EndOfParent => parent.parentEffectiveLengthUnits
+ case _ =>
+ Assert.invariantFailed(
+ s"Could not figure effective length unit of parents of
${context}"
+ )
+ }
+ }
+ case None if this.isInstanceOf[Root] => LengthUnits.Characters
+ case _ =>
+ Assert.invariantFailed(
+ s"Could not figure effective length unit of parents of ${context}"
+ )
+ }
+ final lazy val checkEndOfParentElem: Unit = {
+ if (lengthKind != LengthKind.EndOfParent) ()
+ else {
+ schemaDefinitionWhen(
+ hasTerminator,
+ "%s is specified as dfdl:lengthKind=\"endOfParent\", but specifies a
dfdl:terminator.",
+ context
+ )
+ schemaDefinitionWhen(
+ trailingSkip != 0,
+ "%s is specified as dfdl:lengthKind=\"endOfParent\", but specifies a
non-zero dfdl:trailingSkip.",
+ context
+ )
+ schemaDefinitionWhen(
+ maxOccurs > 1,
+ "%s is specified as dfdl:lengthKind=\"endOfParent\", but specifies a
maxOccurs greater than 1.",
+ context
+ )
+ schemaDefinitionWhen(
+ nextSibling.isDefined && nextSibling.get.isInstanceOf[ModelGroup],
+ "%s is specified as dfdl:lengthKind=\"endOfParent\", but a model group
is defined between this element and the end of the enclosing component",
+ context
+ )
+ schemaDefinitionWhen(
+ nextSibling.isDefined && nextSibling.get.isRepresented,
+ "%s is specified as dfdl:lengthKind=\"endOfParent\", but a represented
element is defined between this element and the end of the enclosing component",
+ context
+ )
+ immediatelyEnclosingElementParent match {
+ case Some(parent: ElementBase) =>
+ parent.lengthKind match {
+ case LengthKind.Implicit | LengthKind.Delimited =>
+ schemaDefinitionError(
+ "%s is specified as dfdl:lengthKind=\"endOfParent\", but its
parent is an element with dfdl:lengthKind 'implicit' or 'delimited'.",
+ context
+ )
+ case _ => // do nothing
+ }
+ case _ => // do nothing
+ }
+ schemaDefinitionWhen(
+ representation == Representation.Text && knownEncodingWidthInBits != 8
&& parentEffectiveLengthUnits != LengthUnits.Characters,
Review Comment:
I did some testing and change the CVS schema to this:
```
<element name="file" dfdl:lengthKind="explicit" dfdl:length="10"
dfdl:terminator="%NL;">
<complexType>
<sequence>
<element name="field" type="xs:string" dfdl:lengthKind="endOfParent"
/>
</sequence>
</complexType>
</element>
```
And a got this stack trace:
```
org.apache.daffodil.lib.exceptions.Abort: Invariant broken:
KnownEncodingMixin.this.isKnownEncoding
org.apache.daffodil.lib.exceptions.Assert$.abort(Assert.scala:153)
org.apache.daffodil.runtime1.processors.KnownEncodingMixin.knownEncodingName(EncodingRuntimeData.scala:56)
org.apache.daffodil.runtime1.processors.KnownEncodingMixin.knownEncodingName$(EncodingRuntimeData.scala:46)
org.apache.daffodil.core.dsom.LocalElementDeclBase.knownEncodingName$lzyINIT1(LocalElementDecl.scala:25)
at org.apache.daffodil.lib.exceptions.Assert$.abort(Assert.scala:153)
at
org.apache.daffodil.runtime1.processors.KnownEncodingMixin.knownEncodingName(EncodingRuntimeData.scala:56)
at
org.apache.daffodil.runtime1.processors.KnownEncodingMixin.knownEncodingName$(EncodingRuntimeData.scala:46)
at
org.apache.daffodil.core.dsom.LocalElementDeclBase.knownEncodingName$lzyINIT1(LocalElementDecl.scala:25)
at
org.apache.daffodil.core.dsom.LocalElementDeclBase.knownEncodingName(LocalElementDecl.scala:25)
at
org.apache.daffodil.runtime1.processors.KnownEncodingMixin.knownEncodingCharset(EncodingRuntimeData.scala:62)
at
org.apache.daffodil.runtime1.processors.KnownEncodingMixin.knownEncodingCharset$(EncodingRuntimeData.scala:46)
at
org.apache.daffodil.core.dsom.LocalElementDeclBase.knownEncodingCharset$lzyINIT1(LocalElementDecl.scala:25)
at
org.apache.daffodil.core.dsom.LocalElementDeclBase.knownEncodingCharset(LocalElementDecl.scala:25)
at
org.apache.daffodil.runtime1.processors.KnownEncodingMixin.knownEncodingWidthInBits(EncodingRuntimeData.scala:81)
at
org.apache.daffodil.runtime1.processors.KnownEncodingMixin.knownEncodingWidthInBits$(EncodingRuntimeData.scala:46)
at
org.apache.daffodil.core.dsom.LocalElementDeclBase.knownEncodingWidthInBits$lzyINIT1(LocalElementDecl.scala:25)
at
org.apache.daffodil.core.dsom.LocalElementDeclBase.knownEncodingWidthInBits(LocalElementDecl.scala:25)
at
org.apache.daffodil.core.grammar.ElementBaseGrammarMixin.checkEndOfParentElem(ElementBaseGrammarMixin.scala:325)
at
org.apache.daffodil.core.grammar.ElementBaseGrammarMixin.checkEndOfParentElem$(ElementBaseGrammarMixin.scala:49)
at
org.apache.daffodil.core.dsom.LocalElementDeclBase.checkEndOfParentElem$lzyINIT1(LocalElementDecl.scala:25)
at
org.apache.daffodil.core.dsom.LocalElementDeclBase.checkEndOfParentElem(LocalElementDecl.scala:25)
```
I think the issue is that the default encoding used by csv is UTF-8, which
seems to cause problems here.
##########
daffodil-core/src/main/scala/org/apache/daffodil/core/grammar/ElementBaseGrammarMixin.scala:
##########
@@ -252,6 +257,134 @@ trait ElementBaseGrammarMixin
}
final lazy val prefixedLengthBody = prefixedLengthElementDecl.parsedValue
+ final lazy val parentEffectiveLengthUnits: LengthUnits =
+ immediatelyEnclosingElementParent match {
+ case Some(parent: ElementBase) => {
+ parent.lengthKind match {
+ case LengthKind.Explicit | LengthKind.Prefixed => parent.lengthUnits
+ case LengthKind.Pattern => LengthUnits.Characters
+ case _
+ if parent.isInstanceOf[ChoiceTermBase] && (parent
Review Comment:
I think a choice might not necessarily be a direct parent? It's not uncommon
for a choice branch to be a sequence (or a nested sequences). I think we need
to look up the parent until we find a choice or an element.
##########
daffodil-core/src/main/scala/org/apache/daffodil/core/grammar/ElementBaseGrammarMixin.scala:
##########
@@ -252,6 +257,134 @@ trait ElementBaseGrammarMixin
}
final lazy val prefixedLengthBody = prefixedLengthElementDecl.parsedValue
+ final lazy val parentEffectiveLengthUnits: LengthUnits =
+ immediatelyEnclosingElementParent match {
+ case Some(parent: ElementBase) => {
+ parent.lengthKind match {
+ case LengthKind.Explicit | LengthKind.Prefixed => parent.lengthUnits
+ case LengthKind.Pattern => LengthUnits.Characters
+ case _
+ if parent.isInstanceOf[ChoiceTermBase] && (parent
+ .asInstanceOf[ChoiceTermBase]
+ .choiceLengthKind == ChoiceLengthKind.Explicit) =>
+ LengthUnits.Bytes
+ case LengthKind.EndOfParent => parent.parentEffectiveLengthUnits
+ case _ =>
+ Assert.invariantFailed(
+ s"Could not figure effective length unit of parents of
${context}"
+ )
+ }
+ }
+ case None if this.isInstanceOf[Root] => LengthUnits.Characters
+ case _ =>
+ Assert.invariantFailed(
+ s"Could not figure effective length unit of parents of ${context}"
+ )
+ }
+ final lazy val checkEndOfParentElem: Unit = {
+ if (lengthKind != LengthKind.EndOfParent) ()
+ else {
+ schemaDefinitionWhen(
+ hasTerminator,
+ "%s is specified as dfdl:lengthKind=\"endOfParent\", but specifies a
dfdl:terminator.",
+ context
+ )
+ schemaDefinitionWhen(
+ trailingSkip != 0,
+ "%s is specified as dfdl:lengthKind=\"endOfParent\", but specifies a
non-zero dfdl:trailingSkip.",
+ context
+ )
+ schemaDefinitionWhen(
+ maxOccurs > 1,
+ "%s is specified as dfdl:lengthKind=\"endOfParent\", but specifies a
maxOccurs greater than 1.",
+ context
+ )
+ schemaDefinitionWhen(
+ nextSibling.isDefined && nextSibling.get.isInstanceOf[ModelGroup],
+ "%s is specified as dfdl:lengthKind=\"endOfParent\", but a model group
is defined between this element and the end of the enclosing component",
+ context
+ )
Review Comment:
I think nextSibling is lexical, so I don't think it will detect errors if
this is a global element decl that is referenced in a manner where it has
siblings? Or maybe the context will be the element reference and the that
global decl so it will work? Do we ahve tests forthis?
##########
daffodil-core/src/main/scala/org/apache/daffodil/core/grammar/ElementBaseGrammarMixin.scala:
##########
@@ -1396,10 +1524,7 @@ trait ElementBaseGrammarMixin
case LengthKind.Implicit
if isSimpleType && impliedRepresentation == Representation.Binary
=>
new SpecifiedLengthImplicit(this, body, implicitBinaryLengthInBits)
- case LengthKind.EndOfParent if isComplexType =>
- notYetImplemented("lengthKind='endOfParent' for complex type")
- case LengthKind.EndOfParent =>
- notYetImplemented("lengthKind='endOfParent' for simple type")
+ case LengthKind.EndOfParent => new SpecifiedLengthEndOfParent(this,
body)
Review Comment:
I think this is is only needed for complex types? My thinking is that simple
types with lengthKind EOP should have parent parser (ether complex or explicity
length choice) that already set the bit limit via one of these specified length
parsers. So the bit limit has already been set correctly and we don't need
another parser to do that.
But this is needed for complex types with EOP since they need to skip any
bits up to their parents bit limit that thier children might not have consumed.
So I think this wants to be:
```scala
case LengthKind.EndOfParent if isComplexType => new
SpecifiedLengthEndOfParent(this, body)
```
And then `bodyRequiresSpecifiedLength` wants to be modified to make it so it
evaluates to false if this is a simple type with lengthKind EOP.
##########
daffodil-test/src/test/resources/org/apache/daffodil/section12/lengthKind/EndOfParentTests.tdml:
##########
@@ -35,64 +35,1965 @@
<!-- END OF PARENT, simplest case -->
<!-- { child,child,child } -->
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:initiator="{{" dfdl:terminator="}">
+ <xs:complexType>
+ <xs:sequence
dfdl:separator="," dfdl:separatorPosition="infix">
+ <xs:element
name="child" maxOccurs="unbounded"
+
dfdl:lengthKind="endOfParent"
dfdl:representation="text"
+
dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
+
dfdl:initiator="X"
dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
+
dfdl:initiator="Y"
dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="after"
type="xs:string" dfdl:lengthKind="explicit" dfdl:length="1"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:initiator="{{" dfdl:terminator="}">
+ <xs:complexType>
+ <xs:sequence
dfdl:separator="," dfdl:separatorPosition="infix">
+ <xs:element
name="child" type="xs:string" maxOccurs="unbounded"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"
+
dfdl:occursCountKind="parsed" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="after"
type="xs:string" dfdl:lengthKind="explicit" dfdl:length="1"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypesDelimited"
+ root="rootCT" model="parentIsLKDelimited"
description="lengthKind is endOfParent">
+
<tdml:document><![CDATA[{{X1.Y1.,X2.Y2.,X3.Y3.}Z]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>Schema Definition Error</tdml:error>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>but its parent</tdml:error>
+ <tdml:error>lengthKind</tdml:error>
+ <tdml:error>delimited</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypesDelimited"
+ root="rootST" model="parentIsLKDelimited"
description="lengthKind is endOfParent">
+ <tdml:document><![CDATA[{{X,Y,Z}A]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>Schema Definition Error</tdml:error>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>but its parent</tdml:error>
+ <tdml:error>lengthKind</tdml:error>
+ <tdml:error>delimited</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:defineSchema name="parentIsLKImplicit">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="implicit"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT">
+ <xs:complexType>
+ <xs:sequence
dfdl:separator="," dfdl:separatorPosition="infix">
+ <xs:element
name="child" maxOccurs="unbounded"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"
+
dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="after"
type="xs:string" dfdl:lengthKind="explicit" dfdl:length="1"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST">
+ <xs:complexType>
+ <xs:sequence
dfdl:separator="," dfdl:separatorPosition="infix">
+ <xs:element
name="child" type="xs:string" maxOccurs="unbounded"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"
+
dfdl:occursCountKind="parsed" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="after"
type="xs:string" dfdl:lengthKind="explicit" dfdl:length="1"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypesImplicit"
+ root="rootCT" model="parentIsLKImplicit">
+ <tdml:document><![CDATA[X1.Y1.,X2.Y2.,X3.Y3.Z]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>Schema Definition Error</tdml:error>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>but its parent</tdml:error>
+ <tdml:error>lengthKind</tdml:error>
+ <tdml:error>implicit</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypesImplicit"
+ root="rootST" model="parentIsLKImplicit">
+ <tdml:document><![CDATA[X,Y,ZA]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>Schema Definition Error</tdml:error>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>but its parent</tdml:error>
+ <tdml:error>lengthKind</tdml:error>
+ <tdml:error>implicit</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:defineSchema name="parentIsLKExplicit">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="explicit"
lengthUnits="bytes"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:length="18">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild"
+
dfdl:length="6" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit"
maxOccurs="unbounded" dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="after"
type="xs:string" dfdl:lengthKind="explicit" dfdl:length="1"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:length="3">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="firstChild"
type="xs:string"
+ dfdl:length="1"
dfdl:representation="text"/>
+ <xs:element name="rest" type="xs:string"
+ dfdl:lengthKind="endOfParent"
dfdl:representation="text"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="after"
type="xs:string" dfdl:lengthKind="explicit" dfdl:length="1"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypesExplicit"
+ root="rootCT" model="parentIsLKExplicit">
+ <tdml:document><![CDATA[X1.Y1.X2.Y2.X3.Y3.A]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:rootCT>
+ <parentCT>
+ <firstChild>
+ <X>1</X>
+ <Y>1</Y>
+ </firstChild>
+ <rest>
+ <child>
+ <X>2</X>
+ <Y>2</Y>
+ </child>
+ <child>
+ <X>3</X>
+ <Y>3</Y>
+ </child>
+ </rest>
+ </parentCT>
+ <after>A</after>
+ </ex:rootCT>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypesExplicit"
+ root="rootST" model="parentIsLKExplicit">
+ <tdml:document><![CDATA[XYZA]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:rootST>
+ <parentST>
+ <firstChild>X</firstChild>
+ <rest>YZ</rest>
+ </parentST>
+ <after>A</after>
+ </ex:rootST>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:defineSchema name="parentIsLKPrefixed">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="explicit"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
- <xs:element name="parentCT" dfdl:representation="text"
- dfdl:initiator="{{" dfdl:terminator="}">
+ <xs:simpleType name="prefixedType2B" dfdl:length="2">
+ <xs:restriction base="xs:int"/>
+ </xs:simpleType>
+ <xs:simpleType name="prefixedType1B" dfdl:length="1">
+ <xs:restriction base="xs:int"/>
+ </xs:simpleType>
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:lengthKind="prefixed" dfdl:prefixLengthType="prefixedType2B"
dfdl:prefixIncludesPrefixLength="no">
<xs:complexType>
- <xs:sequence dfdl:separator=","
dfdl:separatorPosition="infix">
- <xs:element name="child"
maxOccurs="unbounded"
- dfdl:lengthKind="endOfParent"
dfdl:representation="text"
- dfdl:occursCountKind="parsed">
+ <xs:sequence>
+ <xs:element name="firstChild"
+ dfdl:length="6"
dfdl:representation="text">
<xs:complexType>
<xs:sequence>
- <xs:element
name="X" type="xs:integer"
+ <xs:element
name="X" type="xs:integer" dfdl:lengthKind="delimited"
dfdl:initiator="X" dfdl:terminator="." />
- <xs:element
name="Y" type="xs:integer"
+ <xs:element
name="Y" type="xs:integer" dfdl:lengthKind="delimited"
dfdl:initiator="Y" dfdl:terminator="." />
</xs:sequence>
</xs:complexType>
</xs:element>
+ <xs:element name="rest"
+ dfdl:lengthKind="endOfParent"
dfdl:representation="text">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="child" dfdl:lengthKind="implicit" maxOccurs="unbounded"
dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="after"
type="xs:string" dfdl:lengthKind="explicit" dfdl:length="1"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:lengthKind="prefixed" dfdl:prefixLengthType="prefixedType1B"
dfdl:prefixIncludesPrefixLength="no">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="firstChild"
type="xs:string"
+ dfdl:length="1"
dfdl:representation="text"/>
+ <xs:element name="rest" type="xs:string"
+ dfdl:lengthKind="endOfParent"
dfdl:representation="text"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="after"
type="xs:string" dfdl:lengthKind="explicit" dfdl:length="1"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypesPrefixed"
+ root="rootCT" model="parentIsLKPrefixed">
+ <tdml:document><![CDATA[18X1.Y1.X2.Y2.X3.Y3.A]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:rootCT>
+ <parentCT>
+ <firstChild>
+ <X>1</X>
+ <Y>1</Y>
+ </firstChild>
+ <rest>
+ <child>
+ <X>2</X>
+ <Y>2</Y>
+ </child>
+ <child>
+ <X>3</X>
+ <Y>3</Y>
+ </child>
+ </rest>
+ </parentCT>
+ <after>A</after>
+ </ex:rootCT>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypesPrefixed"
+ root="rootST" model="parentIsLKPrefixed">
+ <tdml:document><![CDATA[3XYZA]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:rootST>
+ <parentST>
+ <firstChild>X</firstChild>
+ <rest>YZ</rest>
+ </parentST>
+ <after>A</after>
+ </ex:rootST>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:defineSchema name="parentIsLKPattern">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="pattern"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:lengthPattern="[^\r\n]{18}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" dfdl:lengthKind="explicit"
+ dfdl:length="6"
dfdl:representation="text">
+ <xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text">
+ <xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit" maxOccurs="unbounded"
dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="after"
type="xs:string" dfdl:lengthKind="explicit" dfdl:length="1"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:lengthPattern="[^\r\n]{3}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+ dfdl:length="1"
dfdl:representation="text"/>
+ <xs:element name="rest"
type="xs:string"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="after"
type="xs:string" dfdl:lengthKind="explicit" dfdl:length="1"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypesPattern"
+ root="rootCT" model="parentIsLKPattern">
+ <tdml:document><![CDATA[X1.Y1.X2.Y2.X3.Y3.A]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:rootCT>
+ <parentCT>
+ <firstChild>
+ <X>1</X>
+ <Y>1</Y>
+ </firstChild>
+ <rest>
+ <child>
+ <X>2</X>
+ <Y>2</Y>
+ </child>
+ <child>
+ <X>3</X>
+ <Y>3</Y>
+ </child>
+ </rest>
+ </parentCT>
+ <after>A</after>
+ </ex:rootCT>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypesPattern"
+ root="rootST" model="parentIsLKPattern">
+ <tdml:document><![CDATA[XYZA]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:rootST>
+ <parentST>
+ <firstChild>X</firstChild>
+ <rest>YZ</rest>
+ </parentST>
+ <after>A</after>
+ </ex:rootST>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:defineSchema name="parentIsLKEOP">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="endOfParent"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="explicit" dfdl:length="18">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" dfdl:lengthKind="explicit"
+
dfdl:length="6" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit"
maxOccurs="unbounded" dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="explicit" dfdl:length="3">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:string"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypesEOP"
+ root="rootCT" model="parentIsLKEOP">
+ <tdml:document><![CDATA[X1.Y1.X2.Y2.X3.Y3.]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:rootCT>
+ <parentCT>
+ <firstChild>
+ <X>1</X>
+ <Y>1</Y>
+ </firstChild>
+ <rest>
+ <child>
+ <X>2</X>
+ <Y>2</Y>
+ </child>
+ <child>
+ <X>3</X>
+ <Y>3</Y>
+ </child>
+ </rest>
+ </parentCT>
+ </ex:rootCT>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypesEOP"
+ root="rootST" model="parentIsLKEOP">
+ <tdml:document><![CDATA[XYZ]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:rootST>
+ <parentST>
+ <firstChild>X</firstChild>
+ <rest>YZ</rest>
+ </parentST>
+ </ex:rootST>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:defineSchema name="hasNextSiblingST">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="pattern"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:lengthPattern="[^\r\n]{18}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" dfdl:lengthKind="explicit"
+
dfdl:length="6" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit"
maxOccurs="unbounded" dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X"
dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y"
dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="after" type="xs:string" dfdl:lengthKind="explicit" dfdl:length="1"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:lengthPattern="[^\r\n]{3}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:string"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ <xs:element
name="after" type="xs:string" dfdl:lengthKind="explicit" dfdl:length="1"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypes1"
+ root="rootCT" model="hasNextSiblingST">
+ <tdml:document><![CDATA[X1.Y1.X2.Y2.X3.Y3.A]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>represented element</tdml:error>
+ <tdml:error>between this element and</tdml:error>
+ <tdml:error>end of the enclosing component</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes1"
+ root="rootST" model="hasNextSiblingST">
+ <tdml:document><![CDATA[XYZA]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>represented element</tdml:error>
+ <tdml:error>between this element and</tdml:error>
+ <tdml:error>end of the enclosing component</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:defineSchema name="hasNextSiblingMG">
- <xs:element name="parentST" dfdl:representation="text"
- dfdl:initiator="{{" dfdl:terminator="}">
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="pattern"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
<xs:complexType>
- <xs:sequence dfdl:separator=","
dfdl:separatorPosition="infix">
- <xs:element name="child"
type="xs:string" maxOccurs="unbounded"
- dfdl:lengthKind="endOfParent"
dfdl:representation="text"
- dfdl:occursCountKind="parsed" />
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:lengthPattern="[^\r\n]{18}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" dfdl:lengthKind="explicit"
+
dfdl:length="6" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit"
maxOccurs="unbounded" dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X"
dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y"
dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:sequence/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:lengthPattern="[^\r\n]{3}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:string"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ <xs:sequence/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
</tdml:defineSchema>
- <tdml:parserTestCase name="TestEndOfParentNYIComplexTypes"
- root="parentCT" model="endOfParent-Embedded.dfdl.xsd"
description="lengthKind is endOfParent">
-
<tdml:document><![CDATA[{X1.Y1.,X2.Y2.,X3.Y3.}]]></tdml:document>
+ <tdml:parserTestCase name="TestEndOfParentComplexTypes2"
+ root="rootCT" model="hasNextSiblingMG">
+ <tdml:document><![CDATA[X1.Y1.X2.Y2.X3.Y3.A]]></tdml:document>
<tdml:errors>
- <tdml:error>Schema Definition Error</tdml:error>
- <tdml:error>not</tdml:error>
- <tdml:error>implemented</tdml:error>
<tdml:error>endOfParent</tdml:error>
- <tdml:error>complex</tdml:error>
- <tdml:error>type</tdml:error>
+ <tdml:error>model group</tdml:error>
+ <tdml:error>between this element and</tdml:error>
+ <tdml:error>end of the enclosing component</tdml:error>
</tdml:errors>
</tdml:parserTestCase>
- <tdml:parserTestCase name="TestEndOfParentNYISimpleTypes"
- root="parentST" model="endOfParent-Embedded.dfdl.xsd"
description="lengthKind is endOfParent">
- <tdml:document><![CDATA[{X,Y,Z}]]></tdml:document>
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes2"
+ root="rootST" model="hasNextSiblingMG">
+ <tdml:document><![CDATA[XYZA]]></tdml:document>
<tdml:errors>
- <tdml:error>Schema Definition Error</tdml:error>
- <tdml:error>not</tdml:error>
- <tdml:error>implemented</tdml:error>
<tdml:error>endOfParent</tdml:error>
- <tdml:error>simple</tdml:error>
- <tdml:error>type</tdml:error>
+ <tdml:error>model group</tdml:error>
+ <tdml:error>between this element and</tdml:error>
+ <tdml:error>end of the enclosing component</tdml:error>
</tdml:errors>
</tdml:parserTestCase>
+ <tdml:defineSchema name="hasNextSiblingIVC">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="pattern"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:lengthPattern="[^\r\n]{18}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" dfdl:lengthKind="explicit"
+
dfdl:length="6" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit"
maxOccurs="unbounded" dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X"
dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y"
dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="after" type="xs:string" dfdl:inputValueCalc="{'A'}"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:lengthPattern="[^\r\n]{3}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:string"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ <xs:element
name="after" type="xs:string" dfdl:inputValueCalc="{'A'}"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypes3"
+ root="rootCT" model="hasNextSiblingIVC">
+ <tdml:document><![CDATA[X1.Y1.X2.Y2.X3.Y3.]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:rootCT>
+ <parentCT>
+ <firstChild>
+ <X>1</X>
+ <Y>1</Y>
+ </firstChild>
+ <rest>
+ <child>
+ <X>2</X>
+ <Y>2</Y>
+ </child>
+ <child>
+ <X>3</X>
+ <Y>3</Y>
+ </child>
+ </rest>
+ <after>A</after>
+ </parentCT>
+ </ex:rootCT>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes3"
+ root="rootST" model="hasNextSiblingIVC">
+ <tdml:document><![CDATA[XYZ]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:rootST>
+ <parentST>
+ <firstChild>X</firstChild>
+ <rest>YZ</rest>
+ <after>A</after>
+ </parentST>
+ </ex:rootST>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+ <tdml:defineSchema name="hasTerminator">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="pattern"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:lengthPattern="[^\r\n]{18}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" dfdl:lengthKind="explicit"
+
dfdl:length="6" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text" dfdl:terminator="}">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit"
maxOccurs="unbounded" dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X"
dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y"
dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:lengthPattern="[^\r\n]{3}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:string" dfdl:terminator="}"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypes4"
+ root="rootCT" model="hasTerminator">
+ <tdml:document><![CDATA[X1.Y1.X2.Y2.X3.Y3.]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>specifies</tdml:error>
+ <tdml:error>terminator</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes4"
+ root="rootST" model="hasTerminator">
+ <tdml:document><![CDATA[XYZ]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>specifies</tdml:error>
+ <tdml:error>terminator</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+<tdml:defineSchema name="hasNonZeroTrailingSkip">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="pattern"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:lengthPattern="[^\r\n]{18}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" dfdl:lengthKind="explicit"
+
dfdl:length="6" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text" dfdl:trailingSkip="1">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit"
maxOccurs="unbounded" dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X"
dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y"
dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:lengthPattern="[^\r\n]{3}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:string" dfdl:trailingSkip="1"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypes5"
+ root="rootCT" model="hasNonZeroTrailingSkip">
+ <tdml:document><![CDATA[X1.Y1.X2.Y2.X3.Y3.]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>specifies</tdml:error>
+ <tdml:error>non-zero</tdml:error>
+ <tdml:error>trailingSkip</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes5"
+ root="rootST" model="hasNonZeroTrailingSkip">
+ <tdml:document><![CDATA[XYZ]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>specifies</tdml:error>
+ <tdml:error>non-zero</tdml:error>
+ <tdml:error>trailingSkip</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+<tdml:defineSchema name="hasMaxOccursGreaterThanOne">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="pattern"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:lengthPattern="[^\r\n]{18}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" dfdl:lengthKind="explicit"
+
dfdl:length="6" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text" maxOccurs="2">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit"
maxOccurs="unbounded" dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X"
dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y"
dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:lengthPattern="[^\r\n]{3}">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:string" maxOccurs="2"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypes6"
+ root="rootCT" model="hasMaxOccursGreaterThanOne">
+ <tdml:document><![CDATA[X1.Y1.X2.Y2.X3.Y3.]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>specifies</tdml:error>
+ <tdml:error>maxOccurs</tdml:error>
+ <tdml:error>greater than 1</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes6"
+ root="rootST" model="hasMaxOccursGreaterThanOne">
+ <tdml:document><![CDATA[XYZ]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>specifies</tdml:error>
+ <tdml:error>maxOccurs</tdml:error>
+ <tdml:error>greater than 1</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:defineSchema name="hasNonSingleByteEncoding">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="explicit"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:length="18">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" dfdl:lengthKind="explicit"
+
dfdl:length="6" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text" dfdl:encoding="UTF-16">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit"
maxOccurs="unbounded" dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X"
dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y"
dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:length="3">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:string" dfdl:encoding="UTF-16"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypes7"
+ root="rootCT" model="hasNonSingleByteEncoding">
+ <tdml:document><![CDATA[X1.Y1.X2.Y2.X3.Y3.]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>does not have</tdml:error>
+ <tdml:error>single-byte character set
encoding</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes7"
+ root="rootST" model="hasNonSingleByteEncoding">
+ <tdml:document><![CDATA[XYZ]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>does not have</tdml:error>
+ <tdml:error>single-byte character set
encoding</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:defineSchema name="inSequenceWithPostfixSeparator">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="explicit"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:length="18">
+ <xs:complexType>
+ <xs:sequence
dfdl:separator="," dfdl:separatorPosition="postfix">
+ <xs:element
name="firstChild" dfdl:lengthKind="explicit"
+
dfdl:length="6" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit"
maxOccurs="unbounded" dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X"
dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y"
dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:length="3">
+ <xs:complexType>
+ <xs:sequence
dfdl:separator="," dfdl:separatorPosition="postfix">
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:string"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypes8"
+ root="rootCT"
model="inSequenceWithPostfixSeparator">
+ <tdml:document><![CDATA[X1.Y1.,X2.Y2.,X3.Y3.,]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>in a sequence with</tdml:error>
+ <tdml:error>separatorPosition</tdml:error>
+ <tdml:error>postfix</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes8"
+ root="rootST"
model="inSequenceWithPostfixSeparator">
+ <tdml:document><![CDATA[X,Y,Z]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>in a sequence with</tdml:error>
+ <tdml:error>separatorPosition</tdml:error>
+ <tdml:error>postfix</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:defineSchema name="inUnorderedSequence">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="explicit"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:length="18">
+ <xs:complexType>
+ <xs:sequence
dfdl:sequenceKind="unordered">
+ <xs:element
name="firstChild" dfdl:lengthKind="explicit"
+
dfdl:length="6" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit"
maxOccurs="unbounded" dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X"
dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y"
dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:length="3">
+ <xs:complexType>
+ <xs:sequence
dfdl:sequenceKind="unordered">
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:string"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypes9"
+ root="rootCT" model="inUnorderedSequence">
+ <tdml:document><![CDATA[X1.Y1.X2.Y2.X3.Y3.]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>in a sequence with</tdml:error>
+ <tdml:error>sequenceKind</tdml:error>
+ <tdml:error>unordered</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes9"
+ root="rootST" model="inUnorderedSequence">
+ <tdml:document><![CDATA[XYZ]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>in a sequence with</tdml:error>
+ <tdml:error>sequenceKind</tdml:error>
+ <tdml:error>unordered</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:defineSchema name="hasFloatingSiblings">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="explicit"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:length="18">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" dfdl:lengthKind="explicit"
+
dfdl:floating="yes"
+
dfdl:length="6" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit"
maxOccurs="unbounded" dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X"
dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y"
dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:length="3">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:floating="yes"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:string"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypes10"
+ root="rootCT" model="hasFloatingSiblings">
+ <tdml:document><![CDATA[X1.Y1.X2.Y2.X3.Y3.]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>in a sequence with</tdml:error>
+ <tdml:error>elements</tdml:error>
+ <tdml:error>floating='yes</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes10"
+ root="rootST" model="hasFloatingSiblings">
+ <tdml:document><![CDATA[XYZ]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>in a sequence with</tdml:error>
+ <tdml:error>elements</tdml:error>
+ <tdml:error>floating='yes</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+
+ <tdml:defineSchema name="inSequenceWithNonZeroTrailingSkip">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="explicit"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:length="18">
+ <xs:complexType>
+ <xs:sequence
dfdl:trailingSkip="1">
+ <xs:element
name="firstChild" dfdl:lengthKind="explicit"
+
dfdl:length="6" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit"
maxOccurs="unbounded" dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X"
dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y"
dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:length="3">
+ <xs:complexType>
+ <xs:sequence
dfdl:trailingSkip="1">
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:string"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypes11"
+ root="rootCT"
model="inSequenceWithNonZeroTrailingSkip">
+ <tdml:document><![CDATA[X1.Y1.X2.Y2.X3.Y3.]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>in a sequence with</tdml:error>
+ <tdml:error>non-zero</tdml:error>
+ <tdml:error>trailingSkip</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes11"
+ root="rootST"
model="inSequenceWithNonZeroTrailingSkip">
+ <tdml:document><![CDATA[XYZ]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>in a sequence with</tdml:error>
+ <tdml:error>non-zero</tdml:error>
+ <tdml:error>trailingSkip</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:defineSchema name="inChoiceWithNonZeroTrailingSkip">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="explicit"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:length="6">
+ <xs:complexType>
+ <xs:choice
dfdl:trailingSkip="1">
+ <xs:element
name="firstChild" dfdl:lengthKind="explicit"
+
dfdl:length="6" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit"
maxOccurs="unbounded" dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X"
dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y"
dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:length="1">
+ <xs:complexType>
+ <xs:choice
dfdl:trailingSkip="1">
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:string"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypes12"
+ root="rootCT"
model="inChoiceWithNonZeroTrailingSkip">
+ <tdml:document><![CDATA[X1.Y1.]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>in a choice with</tdml:error>
+ <tdml:error>non-zero</tdml:error>
+ <tdml:error>trailingSkip</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes12"
+ root="rootST"
model="inChoiceWithNonZeroTrailingSkip">
+ <tdml:document><![CDATA[X]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>in a choice with</tdml:error>
+ <tdml:error>non-zero</tdml:error>
+ <tdml:error>trailingSkip</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:defineSchema name="inChoiceWithTerminator">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="explicit"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootCT" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentCT"
dfdl:length="6">
+ <xs:complexType>
+ <xs:choice
dfdl:terminator="}">
+ <xs:element
name="firstChild" dfdl:lengthKind="explicit"
+
dfdl:length="6" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="X" dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer" dfdl:lengthKind="delimited"
+
dfdl:initiator="Y" dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ <xs:element
name="rest"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="child" dfdl:lengthKind="implicit"
maxOccurs="unbounded" dfdl:occursCountKind="parsed">
+
<xs:complexType>
+
<xs:sequence>
+
<xs:element name="X" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="X"
dfdl:terminator="." />
+
<xs:element name="Y" type="xs:integer"
dfdl:lengthKind="delimited"
+
dfdl:initiator="Y"
dfdl:terminator="." />
+
</xs:sequence>
+
</xs:complexType>
+
</xs:element>
+
</xs:sequence>
+
</xs:complexType>
+ </xs:element>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:length="1">
+ <xs:complexType>
+ <xs:choice
dfdl:terminator="}">
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:string"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentComplexTypes13"
+ root="rootCT" model="inChoiceWithTerminator">
+ <tdml:document><![CDATA[X1.Y1.]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>in a choice with</tdml:error>
+ <tdml:error>terminator</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes13"
+ root="rootST" model="inChoiceWithTerminator">
+ <tdml:document><![CDATA[X]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>in a choice with</tdml:error>
+ <tdml:error>terminator</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:defineSchema name="STChecks">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="explicit"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootST1" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:length="3">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:int"
+
dfdl:lengthKind="endOfParent" dfdl:representation="binary"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST2" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:length="3">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:int"
+
dfdl:lengthKind="endOfParent" dfdl:representation="binary"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes14"
+ root="rootST1" model="STChecks">
+ <tdml:document><![CDATA[X12]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>simple type</tdml:error>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>isn't a string type</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes15"
+ root="rootST2" model="STChecks">
+ <tdml:document><![CDATA[X12]]></tdml:document>
+ <tdml:errors>
+ <tdml:error>simple type</tdml:error>
+ <tdml:error>endOfParent</tdml:error>
+ <tdml:error>doesn't have binary representation with
packed decimal representation</tdml:error>
+ </tdml:errors>
+ </tdml:parserTestCase>
+
+ <tdml:defineSchema name="hexBinary_StringEOP">
+
+ <xs:include
schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+ <dfdl:format ref="ex:GeneralFormat" lengthKind="explicit"
+ separator="" leadingSkip='0' encoding="US-ASCII"
ignoreCase='no'
+ initiator="" terminator="" initiatedContent="no"
textNumberRep="standard"
+ separatorSuppressionPolicy="anyEmpty"
separatorPosition="infix"
+ documentFinalTerminatorCanBeMissing='yes'
byteOrder="bigEndian"
+ binaryNumberRep='binary' />
+
+ <xs:element name="rootST1" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:length="3">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:hexBinary"
+
dfdl:lengthKind="endOfParent" dfdl:representation="binary"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="rootST2" dfdl:representation="text"
dfdl:lengthKind="implicit">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="parentST"
dfdl:length="3">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element
name="firstChild" type="xs:string" dfdl:lengthKind="explicit"
+
dfdl:length="1" dfdl:representation="text"/>
+ <xs:element
name="rest" type="xs:string"
+
dfdl:lengthKind="endOfParent" dfdl:representation="text"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </tdml:defineSchema>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes16"
+ root="rootST1" model="hexBinary_StringEOP">
+ <tdml:document><![CDATA[X12]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:rootST1>
+ <parentST>
+ <firstChild>X</firstChild>
+ <rest>3132</rest>
+ </parentST>
+ </ex:rootST1>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
+ <tdml:parserTestCase name="TestEndOfParentSimpleTypes17"
+ root="rootST2" model="hexBinary_StringEOP">
+ <tdml:document><![CDATA[X12]]></tdml:document>
+ <tdml:infoset>
+ <tdml:dfdlInfoset>
+ <ex:rootST2>
+ <parentST>
+ <firstChild>X</firstChild>
+ <rest>12</rest>
+ </parentST>
+ </ex:rootST2>
+ </tdml:dfdlInfoset>
+ </tdml:infoset>
+ </tdml:parserTestCase>
+
Review Comment:
Some lines from the spec that I'm not sure I saw tests for:
> The dfdl:lengthKind 'endOfParent' can also be used on the document root to
allow the last element to consume the data up to the end of the data stream.
I assume this means something like:
```xml
<element name="root" dfdl:lengthKind="endOfParent">
<complexType>
<sequence>
<element name="field1" ... />
<element name="rest" dfdl:lenghtKind="endOfParent" ... />
</sequence>
</complexType>
</element>
```
So rest should contain everything up until the end of the data. That doesn't
really work will with the assuming that we'll always have a bit limit, since
the root element won't every set bitLimit in this case.
> A simple element must have one of [...] dfdl:representation 'binary' and a
packed decimal representation
I don't think there are any tests for packed binary formats, and it looks
like there aren't any modifications to the code to support packed types
> A simple element must have one of [...] dfdl:representation 'text'
I think this implies that you can have simple types with
bool/numbers/dates/times/etc as long as representation is text. I *think* these
should all work because they just add a converter to a specified length string
parser, but we should have tests for them.
> The dfdl:lengthKind 'endOfParent' means that the element is terminated
[...] or the end of an enclosing choice with dfdl:choiceLengthKind ‘explicit’.
choiceLengthKind="explicit" isn't used very often, but we should probably
have a couple tests to make sure this works with EOP children.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]