You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@daffodil.apache.org by ef...@apache.org on 2018/07/27 17:59:08 UTC

[incubator-daffodil] branch master updated: Adding value of 'bcd' to binaryCalendarRep

This is an automated email from the ASF dual-hosted git repository.

efinnegan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-daffodil.git


The following commit(s) were added to refs/heads/master by this push:
     new 339967f  Adding value of 'bcd' to binaryCalendarRep
339967f is described below

commit 339967faf80ca9b13f8a3725032e79b5c988a8fd
Author: Beth Fahl <ef...@tresys.com>
AuthorDate: Tue May 22 12:29:47 2018 -0400

    Adding value of 'bcd' to binaryCalendarRep
    
    Adds parsing and unparsing capability for binary representation of
    xs:date, xs:time, and xs:dateTime with a binaryCalendarRep of 'bcd',
    including known, runtime determined, and delimited lengths of data.
    
    This uses a combination of the existing BCD parser/unparser and
    text calendar parser/unparser, with some added checks for binary
    calendars.
    
    DAFFODIL-1941
---
 .../daffodil/grammar/ElementBaseGrammarMixin.scala |  74 ++++-
 .../grammar/primitives/PrimitivesDateTime.scala    | 104 ++++--
 .../unparsers/ConvertBinaryCalendarUnparser.scala  |   2 +-
 .../unparsers/PackedBinaryUnparserTraits.scala     |  14 +-
 .../section05/simple_types/SimpleTypes.tdml        | 360 +++++++++++++++++++--
 .../section12/lengthKind/DelimitedTests.tdml       |   2 +-
 .../section05/simple_types/TestSimpleTypes.scala   |  22 +-
 7 files changed, 514 insertions(+), 64 deletions(-)

diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/ElementBaseGrammarMixin.scala b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/ElementBaseGrammarMixin.scala
index e83e40a..db1e65a 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/ElementBaseGrammarMixin.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/ElementBaseGrammarMixin.scala
@@ -130,6 +130,7 @@ import org.apache.daffodil.schema.annotation.props.NotFound
 import org.apache.daffodil.schema.annotation.props.gen.BinaryCalendarRep
 import org.apache.daffodil.schema.annotation.props.gen.BinaryFloatRep
 import org.apache.daffodil.schema.annotation.props.gen.BinaryNumberRep
+import org.apache.daffodil.schema.annotation.props.gen.CalendarPatternKind
 import org.apache.daffodil.schema.annotation.props.gen.LengthKind
 import org.apache.daffodil.schema.annotation.props.gen.LengthUnits
 import org.apache.daffodil.schema.annotation.props.gen.NilKind
@@ -478,9 +479,9 @@ trait ElementBaseGrammarMixin
     case PrimType.DateTime => binaryCalendarRep match {
       case BinaryCalendarRep.BinarySeconds => 32
       case BinaryCalendarRep.BinaryMilliseconds => 64
-      case _ => schemaDefinitionError("Size of binary data '" + primType.name + "' with binaryCalendarRep='" + binaryCalendarRep + "' cannot be determined implicitly.")
+      case _ => schemaDefinitionError("Length of binary data '" + primType.name + "' with binaryCalendarRep='" + binaryCalendarRep + "' cannot be determined implicitly.")
     }
-    case _ => schemaDefinitionError("Size of binary data '" + primType.name + "' cannot be determined implicitly.")
+    case _ => schemaDefinitionError("Length of binary data '" + primType.name + "' cannot be determined implicitly.")
   }
 
   /**
@@ -496,8 +497,14 @@ trait ElementBaseGrammarMixin
     case LengthKind.Implicit => implicitBinaryLengthInBits
     case LengthKind.Explicit if (lengthEv.isConstant) => explicitBinaryLengthInBits()
     case LengthKind.Explicit => -1 // means must be computed at runtime.
-    case LengthKind.Delimited if (binaryNumberRep == BinaryNumberRep.Binary) => subsetError("lengthKind='delimited' only supported for packed binary formats.")
-    case LengthKind.Delimited => -1 // only for packed binary data, length must be computed at runtime.
+    case LengthKind.Delimited => primType match {
+      case PrimType.DateTime | PrimType.Date | PrimType.Time =>
+        if (binaryCalendarRep == BinaryCalendarRep.BinaryMilliseconds || binaryCalendarRep == BinaryCalendarRep.BinarySeconds)
+          SDE("lengthKind='delimited' only supported for packed binary formats.")
+        else -1 // only for packed binary data, length must be computed at runtime.
+      case _ => if (binaryNumberRep == BinaryNumberRep.Binary) SDE("lengthKind='delimited' only supported for packed binary formats.")
+        else -1 // only for packed binary data, length must be computed at runtime.
+    }
     case LengthKind.Pattern => schemaDefinitionError("Binary data elements cannot have lengthKind='pattern'.")
     case LengthKind.Prefixed => subsetError("lengthKind='prefixed' not yet supported.")
     case LengthKind.EndOfParent => schemaDefinitionError("Binary data elements cannot have lengthKind='endOfParent'.")
@@ -652,6 +659,51 @@ trait ElementBaseGrammarMixin
   private lazy val zonedTextUnsignedByte = prod("zonedTextUnsignedByte",
     textNumberRep == TextNumberRep.Zoned) { ConvertZonedCombinator(this, stringValue, ConvertZonedUnsignedBytePrim(this)) }
 
+
+  private lazy val bcdKnownLengthCalendar = prod("bcdKnownLengthCalendar", binaryCalendarRep == BinaryCalendarRep.Bcd) {
+    bcdDateKnownLength | bcdTimeKnownLength | bcdDateTimeKnownLength
+  }
+  private lazy val bcdRuntimeLengthCalendar = prod("bcdRuntimeLengthCalendar", binaryCalendarRep == BinaryCalendarRep.Bcd) {
+    bcdDateRuntimeLength | bcdTimeRuntimeLength | bcdDateTimeRuntimeLength
+  }
+  private lazy val bcdDelimitedLengthCalendar = prod("bcdDelimitedLengthCalendar", binaryCalendarRep == BinaryCalendarRep.Bcd) {
+    bcdDateDelimitedLength | bcdTimeDelimitedLength | bcdDateTimeDelimitedLength
+  }
+
+  // BCD calendar with known length
+  private lazy val bcdDateKnownLength = prod("bcdDateKnownLength", primType == PrimType.Date) {
+    ConvertZonedCombinator(this, new BCDIntegerKnownLength(this, binaryNumberKnownLengthInBits), ConvertTextDatePrim(this))
+  }
+  private lazy val bcdDateTimeKnownLength = prod("bcdDateTimeKnownLength", primType == PrimType.DateTime) {
+    ConvertZonedCombinator(this, new BCDIntegerKnownLength(this, binaryNumberKnownLengthInBits), ConvertTextDateTimePrim(this))
+  }
+  private lazy val bcdTimeKnownLength = prod("bcdTimeKnownLength", primType == PrimType.Time) {
+    ConvertZonedCombinator(this, new BCDIntegerKnownLength(this, binaryNumberKnownLengthInBits), ConvertTextTimePrim(this))
+  }
+
+  // BCD calendar with runtime length
+  private lazy val bcdDateRuntimeLength = prod("bcdDateRuntimeLength", primType == PrimType.Date) {
+    ConvertZonedCombinator(this, new BCDIntegerRuntimeLength(this), ConvertTextDatePrim(this))
+  }
+  private lazy val bcdDateTimeRuntimeLength = prod("bcdDateTimeRuntimeLength", primType == PrimType.DateTime) {
+    ConvertZonedCombinator(this, new BCDIntegerRuntimeLength(this), ConvertTextDateTimePrim(this))
+  }
+  private lazy val bcdTimeRuntimeLength = prod("bcdTimeRuntimeLength", primType == PrimType.Time) {
+    ConvertZonedCombinator(this, new BCDIntegerRuntimeLength(this), ConvertTextTimePrim(this))
+  }
+
+  // BCD calendar with delimited length
+  private lazy val bcdDateDelimitedLength = prod("bcdDateDelimitedLength", primType == PrimType.Date) {
+    ConvertZonedCombinator(this, new BCDIntegerDelimitedEndOfData(this), ConvertTextDatePrim(this))
+  }
+  private lazy val bcdDateTimeDelimitedLength = prod("bcdDateTimeDelimitedLength", primType == PrimType.DateTime) {
+    ConvertZonedCombinator(this, new BCDIntegerDelimitedEndOfData(this), ConvertTextDateTimePrim(this))
+  }
+  private lazy val bcdTimeDelimitedLength = prod("bcdTimeDelimitedLength", primType == PrimType.Time) {
+    ConvertZonedCombinator(this, new BCDIntegerDelimitedEndOfData(this), ConvertTextTimePrim(this))
+  }
+
+
   private lazy val textDouble = prod("textDouble", impliedRepresentation == Representation.Text) {
     standardTextDouble || zonedTextDouble
   }
@@ -829,7 +881,19 @@ trait ElementBaseGrammarMixin
             case (_, n) => SDE("binary xs:dateTime must be 64 bits when binaryCalendarRep='binaryMilliseconds'. Length in bits was %s.", n)
           }
           case (_, BinaryCalendarRep.BinaryMilliseconds) => SDE("binaryCalendarRep='binaryMilliseconds' is not allowed with type %s", primType.name)
-          case _ => notYetImplemented("Type %s when representation='binary' and binaryCalendarRep=%s", primType.name, binaryCalendarRep.toString)
+          case (_, BinaryCalendarRep.Bcd) => {
+            if ((binaryNumberKnownLengthInBits != -1) && (binaryNumberKnownLengthInBits % 4) != 0)
+              SDE("The given length (%s bits) must be a multiple of 4 when using binaryCalendarRep='%s'.", binaryNumberKnownLengthInBits, binaryCalendarRep)
+            if (calendarPatternKind != CalendarPatternKind.Explicit)
+              SDE("calendarPatternKind must be 'explicit' when binaryCalendarRep='%s'", binaryCalendarRep)
+
+            (lengthKind, binaryNumberKnownLengthInBits) match {
+              case (LengthKind.Delimited, -1) => bcdDelimitedLengthCalendar
+              case (_, -1) => bcdRuntimeLengthCalendar
+              case (_, _) => bcdKnownLengthCalendar
+            }
+          }
+          case _ =>  notYetImplemented("Type %s when representation='binary' and binaryCalendarRep=%s", primType.name, binaryCalendarRep.toString)
         }
       }
 
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesDateTime.scala b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesDateTime.scala
index e6f275e..bef2ea3 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesDateTime.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesDateTime.scala
@@ -23,6 +23,7 @@ import com.ibm.icu.util.Calendar
 import com.ibm.icu.util.TimeZone
 import com.ibm.icu.util.ULocale
 import org.apache.daffodil.dsom.ElementBase
+import org.apache.daffodil.exceptions.Assert
 import org.apache.daffodil.grammar.Terminal
 import org.apache.daffodil.schema.annotation.props.gen.CalendarCheckPolicy
 import org.apache.daffodil.schema.annotation.props.gen.CalendarFirstDayOfWeek
@@ -36,6 +37,8 @@ import org.apache.daffodil.processors.CalendarLanguageEv
 import org.apache.daffodil.processors.parsers.ConvertBinaryCalendarSecMilliParser
 import org.apache.daffodil.processors.parsers.ConvertTextCalendarParser
 import org.apache.daffodil.processors.parsers.TextCalendarConstants
+import org.apache.daffodil.schema.annotation.props.gen.BinaryCalendarRep
+import org.apache.daffodil.schema.annotation.props.gen.Representation
 import scala.Boolean
 
 abstract class ConvertCalendarPrimBase(e: ElementBase, guard: Boolean)
@@ -54,26 +57,6 @@ abstract class ConvertTextCalendarPrimBase(e: ElementBase, guard: Boolean)
   protected def implicitPattern: String
   protected def validFormatCharacters: Seq[Char]
 
-  lazy val pattern: String = {
-    val p = e.calendarPatternKind match {
-      case CalendarPatternKind.Explicit => e.calendarPattern
-      case CalendarPatternKind.Implicit => implicitPattern
-    }
-
-    val escapedText = "(''|'[^']+'|[^a-zA-Z])".r
-    val patternNoEscapes = escapedText.replaceAllIn(p, "")
-    patternNoEscapes.toSeq.foreach(char =>
-      if (!validFormatCharacters.contains(char)) {
-        SDE("Character '%s' not allowed in dfdl:calendarPattern for xs:%s".format(char, xsdType))
-      })
-
-    if (patternNoEscapes.indexOf("S" * (TextCalendarConstants.maxFractionalSeconds + 1)) >= 0) {
-      SDE("More than %d fractional seconds unsupported in dfdl:calendarPattern for xs:%s".format(TextCalendarConstants.maxFractionalSeconds, xsdType))
-    }
-
-    p
-  }
-
   val firstDay = e.calendarFirstDayOfWeek match {
     case CalendarFirstDayOfWeek.Sunday => Calendar.SUNDAY
     case CalendarFirstDayOfWeek.Monday => Calendar.MONDAY
@@ -92,13 +75,19 @@ abstract class ConvertTextCalendarPrimBase(e: ElementBase, guard: Boolean)
   }
 
   val TimeZoneRegex = """(UTC)?([+\-])?([01]\d|\d)(:?([0-5]\d))?""".r
-  val tzStr = e.calendarTimeZone match {
-    case TimeZoneRegex(_, plusOrMinus, hour, _, minute) => {
-      val pomStr = if (plusOrMinus == null) "+" else plusOrMinus
-      val minStr = if (minute == null) "" else minute
-      "GMT%s%s%s".format(pomStr, hour, minStr)
+
+  // Binary calendars with a BinaryCalendarRep of 'bcd' or 'ibm4690Packed' should ignore the calendarTimeZone option
+  val tzStr = if (e.representation == Representation.Binary && e.binaryCalendarRep != BinaryCalendarRep.Packed) {
+    ""
+  } else {
+    e.calendarTimeZone match {
+      case TimeZoneRegex(_, plusOrMinus, hour, _, minute) => {
+        val pomStr = if (plusOrMinus == null) "+" else plusOrMinus
+        val minStr = if (minute == null) "" else minute
+        "GMT%s%s%s".format(pomStr, hour, minStr)
+      }
+      case _ => e.calendarTimeZone
     }
-    case _ => e.calendarTimeZone
   }
 
   val calendarTz: Option[TimeZone] = {
@@ -146,6 +135,43 @@ abstract class ConvertTextCalendarPrimBase(e: ElementBase, guard: Boolean)
     cev
   }
 
+  lazy val pattern: String = {
+    val p = e.calendarPatternKind match {
+      case CalendarPatternKind.Explicit => e.calendarPattern
+      case CalendarPatternKind.Implicit => e.representation match {
+        case Representation.Binary => Assert.impossibleCase
+        case _ => implicitPattern
+      }
+    }
+
+    val patternToCheck : String = if (e.representation == Representation.Text) {
+      val escapedText = "(''|'[^']+'|[^a-zA-Z])".r
+      escapedText.replaceAllIn(p, "")
+    } else {
+      p
+    }
+    patternToCheck.toSeq.foreach(char =>
+      if (!validFormatCharacters.contains(char)) {
+        if (e.representation == Representation.Binary)
+          SDE("Character '%s' not allowed in dfdl:calendarPattern for xs:%s with a binaryCalendarRep of '%s'".format(char, xsdType, e.binaryCalendarRep))
+        else
+          SDE("Character '%s' not allowed in dfdl:calendarPattern for xs:%s".format(char, xsdType))
+      })
+
+    if (e.representation == Representation.Binary) {
+      // For binary calendars, calendarPattern can contain only characters that always result in digits,
+      //   so more than 2 'e' or 'M' in a row aren't valid as they result in text
+      if (patternToCheck.contains("eee") || patternToCheck.contains("MMM")) {
+        SDE("dfdl:calendarPattern must only contain characters that result in the presentation of digits for xs:%s with a binaryCalendarRep of '%s'".format(xsdType, e.binaryCalendarRep))
+      }
+    }
+    if (patternToCheck.indexOf("S" * (TextCalendarConstants.maxFractionalSeconds + 1)) >= 0) {
+      SDE("More than %d fractional seconds unsupported in dfdl:calendarPattern for xs:%s".format(TextCalendarConstants.maxFractionalSeconds, xsdType))
+    }
+
+    p
+  }
+
   override lazy val parser = new ConvertTextCalendarParser(
     e.elementRuntimeData,
     xsdType,
@@ -167,7 +193,12 @@ case class ConvertTextDatePrim(e: ElementBase) extends ConvertTextCalendarPrimBa
   protected override val prettyType = "Date"
   protected override val infosetPattern = "uuuu-MM-ddxxx"
   protected override val implicitPattern = "uuuu-MM-dd"
-  protected override val validFormatCharacters = "dDeEFGMuwWyXxYzZ".toSeq
+  protected override val validFormatCharacters =
+    if (e.representation == Representation.Binary) {
+      "dDeFMuwWyY".toSeq
+    } else {
+      "dDeEFGMuwWyXxYzZ".toSeq
+    }
 }
 
 case class ConvertTextTimePrim(e: ElementBase) extends ConvertTextCalendarPrimBase(e, true) {
@@ -175,7 +206,12 @@ case class ConvertTextTimePrim(e: ElementBase) extends ConvertTextCalendarPrimBa
   protected override val prettyType = "Time"
   protected override val infosetPattern = "HH:mm:ss.SSSSSSxxx"
   protected override val implicitPattern = "HH:mm:ssZ"
-  protected override val validFormatCharacters = "ahHkKmsSvVzXxZ".toSeq
+  protected override val validFormatCharacters =
+    if (e.representation == Representation.Binary) {
+      "hHkKmsS".toSeq
+    } else {
+      "ahHkKmsSvVzXxZ".toSeq
+    }
 }
 
 case class ConvertTextDateTimePrim(e: ElementBase) extends ConvertTextCalendarPrimBase(e, true) {
@@ -183,12 +219,12 @@ case class ConvertTextDateTimePrim(e: ElementBase) extends ConvertTextCalendarPr
   protected override val prettyType = "DateTime"
   protected override val infosetPattern = "uuuu-MM-dd'T'HH:mm:ss.SSSSSSxxx"
   protected override val implicitPattern = "uuuu-MM-dd'T'HH:mm:ss"
-  protected override val validFormatCharacters = "adDeEFGhHkKmMsSuwWvVyXxYzZ".toSeq
-}
-
-abstract class ConvertBinaryCalendarPrimBase(e: ElementBase, guard: Boolean, lengthInBits: Long)
-  extends ConvertCalendarPrimBase(e, guard) {
-
+  protected override val validFormatCharacters =
+    if (e.representation == Representation.Binary) {
+      "dDeFhHkKmMsSuwWyY".toSeq
+    } else {
+      "adDeEFGhHkKmMsSuwWvVyXxYzZ".toSeq
+    }
 }
 
 case class ConvertBinaryDateTimeSecMilliPrim(e: ElementBase, lengthInBits: Long) extends ConvertCalendarPrimBase(e, true) {
diff --git a/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertBinaryCalendarUnparser.scala b/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertBinaryCalendarUnparser.scala
index f948c22..aef452c 100644
--- a/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertBinaryCalendarUnparser.scala
+++ b/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertBinaryCalendarUnparser.scala
@@ -51,7 +51,7 @@ case class ConvertBinaryCalendarSecMilliUnparser(
 
     val calValue = node.dataValue match {
       case dc: DFDLCalendar => dc.calendar
-      case x => Assert.invariantFailed("ConvertTextCalendar received unsupported type. %s of type %s.".format(x, Misc.getNameFromClass(x)))
+      case x => Assert.invariantFailed("ConvertBinaryCalendar received unsupported type. %s of type %s.".format(x, Misc.getNameFromClass(x)))
     }
 
     // Adjust the time based on time zone - if a time zone wasn't specified, Calendar will assume the default
diff --git a/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/PackedBinaryUnparserTraits.scala b/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/PackedBinaryUnparserTraits.scala
index 6bedb58..810f1ae 100644
--- a/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/PackedBinaryUnparserTraits.scala
+++ b/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/PackedBinaryUnparserTraits.scala
@@ -26,6 +26,7 @@ import org.apache.daffodil.exceptions.Assert
 import org.apache.daffodil.io.DataOutputStream
 import org.apache.daffodil.io.FormatInfo
 import org.apache.daffodil.processors.Evaluatable
+import org.apache.daffodil.dpath.NodeInfo
 
 trait PackedBinaryConversion {
   def fromBigInteger(bigInt: JBigInteger, nBits: Int): Array[Byte]
@@ -45,7 +46,18 @@ abstract class PackedBinaryBaseUnparser(
   override def unparse(state: UState): Unit = {
     val nBits = getBitLength(state)
     val node = state.currentInfosetNode.asSimple
-    val value = node.dataValue.asInstanceOf[JNumber]
+
+    // Packed decimal calendars use the convert combinator which sets the string value of the calendar
+    //   - using dataValue would give the Calendar value rather than that string. Since the Calendar value
+    //   cannot be cast as a JNumber we need to use dataValueAsString and convert it to a JBigInteger.
+    //   With packed numbers, dataValue is already a number so just use that.
+    val nodeValue =
+      node.erd.optPrimType.get match {
+      case NodeInfo.Date | NodeInfo.DateTime | NodeInfo.Time => new JBigInteger(node.dataValueAsString)
+      case _ => node.dataValue
+    }
+
+    val value = nodeValue.asInstanceOf[JNumber]
     val dos = state.dataOutputStream
 
     val res = putNumber(dos, value, nBits, state)
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/section05/simple_types/SimpleTypes.tdml b/daffodil-test/src/test/resources/org/apache/daffodil/section05/simple_types/SimpleTypes.tdml
index 8d215cd..61cf569 100644
--- a/daffodil-test/src/test/resources/org/apache/daffodil/section05/simple_types/SimpleTypes.tdml
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/section05/simple_types/SimpleTypes.tdml
@@ -263,9 +263,68 @@
       dfdl:binaryCalendarRep="binarySeconds" dfdl:binaryCalendarEpoch="2000-1-1T00:00"/>
     <xs:element name="dateTimeBin11" type="xs:dateTime" dfdl:lengthKind="implicit" dfdl:lengthUnits="bytes"
       dfdl:binaryCalendarRep="binarySeconds" dfdl:binaryCalendarEpoch="01-01-2000T00:00:00"/>
+    <xs:element name="dateTimeBin12" type="xs:dateTime" dfdl:lengthKind="delimited" dfdl:terminator=";"
+      dfdl:binaryCalendarRep="binarySeconds" dfdl:binaryCalendarEpoch="1977-01-01T00:00:07"/>
+
+    <xs:element name="dateBinBCD" type="xs:date" dfdl:calendarPattern="MMddyy" dfdl:calendarPatternKind="explicit"
+      dfdl:lengthKind="explicit" dfdl:length="{ 3 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd" />
+    <xs:element name="dateBinBCD2" type="xs:date" dfdl:calendarPattern="MMddyyyy" dfdl:calendarPatternKind="explicit"
+      dfdl:lengthKind="explicit" dfdl:length="{ 4 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/>
+    <xs:element name="dateBinBCD3" type="xs:date" dfdl:calendarPattern="MM-dd-yy" dfdl:calendarPatternKind="explicit"
+      dfdl:lengthKind="explicit" dfdl:length="{ 3 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/>
+    <xs:element name="dateBinBCD4" type="xs:date" dfdl:calendarPattern="MMddyy" dfdl:calendarPatternKind="explicit"
+      dfdl:lengthKind="explicit" dfdl:length="{ 7 }" dfdl:lengthUnits="bits" dfdl:binaryCalendarRep="bcd"/>
+    <xs:element name="dateBinBCD5" type="xs:date" dfdl:calendarPattern="MMEEyy" dfdl:calendarPatternKind="explicit"
+      dfdl:lengthKind="explicit" dfdl:length="{ 3 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/>
+    <xs:element name="dateBinBCD6" type="xs:date" dfdl:calendarPattern="MMddyyeee" dfdl:calendarPatternKind="explicit"
+      dfdl:lengthKind="explicit" dfdl:length="{ 3 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/>
+    <xs:element name="dateBinBCD7" type="xs:date" dfdl:calendarPattern="eMyy" dfdl:calendarPatternKind="explicit"
+      dfdl:lengthKind="explicit" dfdl:length="{ 16 }" dfdl:lengthUnits="bits" dfdl:binaryCalendarRep="bcd"/>
+
+    <xs:element name="timeBinBCD" type="xs:time" dfdl:calendarPattern="HHmmss" dfdl:calendarPatternKind="explicit"
+      dfdl:lengthKind="explicit" dfdl:length="{ 3 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/>
+    <xs:element name="timeBinBCD2" type="xs:time" dfdl:calendarPattern="HHmmssSSSS" dfdl:calendarPatternKind="explicit"
+      dfdl:lengthKind="explicit" dfdl:length="{ 5 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/>
+    <xs:element name="timeBinBCD3" type="xs:time" dfdl:calendarPatternKind="implicit"
+      dfdl:lengthKind="explicit" dfdl:length="{ 5 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/>
+    <xs:element name="timeBinBCD4" type="xs:time" dfdl:calendarPattern="HHmmss" dfdl:calendarPatternKind="explicit"
+      dfdl:lengthKind="implicit" dfdl:binaryCalendarRep="bcd"/>
+    <xs:element name="timeBinBCD5" type="xs:time" dfdl:calendarPattern="HHmmss" dfdl:calendarPatternKind="explicit"
+      dfdl:lengthKind="delimited" dfdl:terminator=";" dfdl:binaryCalendarRep="bcd" dfdl:encoding="ISO-8859-1"/>
+
+    <xs:element name="timeBinBCD6">
+      <xs:complexType>
+        <xs:sequence>
+          <xs:element name="length" type="xs:int" dfdl:representation="binary"
+            dfdl:lengthKind="explicit" dfdl:length="{ 1 }" dfdl:lengthUnits="bytes" />
+          <xs:element name="time" type="xs:time" dfdl:calendarPattern="HHmmss" dfdl:calendarPatternKind="explicit"
+            dfdl:lengthKind="explicit" dfdl:length="{ ../ex:length }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd" />
+        </xs:sequence>
+      </xs:complexType>
+    </xs:element>
+
+    <xs:element name="dateTimeBinBCD" type="xs:dateTime" dfdl:calendarPattern="MMddyyyyHHmmss" dfdl:calendarPatternKind="explicit"
+      dfdl:lengthKind="explicit" dfdl:length="{ 7 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/>
+    <xs:element name="dateTimeBinBCD2" type="xs:dateTime" dfdl:calendarPattern="MMddyyyyhhmmss" dfdl:calendarPatternKind="explicit"
+      dfdl:lengthKind="implicit" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/>
+    <xs:element name="dateTimeBinBCD3" type="xs:dateTime" dfdl:calendarPattern="MMddyyyyhhmmss" dfdl:calendarPatternKind="explicit"
+      dfdl:lengthKind="explicit" dfdl:length="{ 7 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/>
+
+    <xs:element name="dateTimeBinBCD4">
+      <xs:complexType>
+        <xs:sequence>
+          <xs:element name="num1" type="xs:decimal" dfdl:encoding="ISO-8859-1" dfdl:representation="binary" dfdl:binaryNumberRep="bcd"
+            dfdl:lengthKind="delimited" dfdl:terminator=";" dfdl:binaryDecimalVirtualPoint="0"/>
+          <xs:element name="datetime" type="xs:dateTime" dfdl:calendarPattern="MMddyyyyHHmmss" dfdl:encoding="ISO-8859-1"
+            dfdl:calendarPatternKind="explicit" dfdl:binaryCalendarRep="bcd" dfdl:lengthKind="delimited" dfdl:terminator=";"/>
+          <xs:element name="num2" type="xs:decimal" dfdl:encoding="ISO-8859-1" dfdl:representation="binary" dfdl:binaryNumberRep="bcd"
+            dfdl:lengthKind="delimited" dfdl:terminator=";" dfdl:binaryDecimalVirtualPoint="0"/>
+        </xs:sequence>
+      </xs:complexType>
+    </xs:element>
 
-    <xs:element name="dateBin2" type="xs:date" dfdl:lengthKind="explicit" dfdl:length="{ 4 }"
-      dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="binarySeconds" dfdl:binaryCalendarEpoch="1970-01-01T00:00:00+00:00"/>
+    <xs:element name="dateBinInvalid" type="xs:date" dfdl:calendarPattern="yyyy.MM.dd" dfdl:calendarPatternKind="explicit" dfdl:lengthKind="explicit"
+      dfdl:length="{ 4 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="binarySeconds" dfdl:binaryCalendarEpoch="1970-01-01T00:00:00+00:00"/>
 
   </tdml:defineSchema>
   
@@ -1850,7 +1909,7 @@
     <tdml:document><tdml:documentPart type="byte">ff ff fb ff ff ff fb</tdml:documentPart></tdml:document>
     <tdml:errors>
       <tdml:error>Schema Definition Error</tdml:error>
-      <tdml:error>Size of binary data 'nonNegativeInteger' cannot be determined implicitly.</tdml:error>
+      <tdml:error>Length of binary data 'nonNegativeInteger' cannot be determined implicitly.</tdml:error>
     </tdml:errors>
   </tdml:parserTestCase>
   
@@ -1996,8 +2055,7 @@
   </tdml:parserTestCase>
 
   <tdml:parserTestCase name="dateTimeBin2" root="dateTimeBin2"
-    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
-    roundTrip="false">
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
 
     <tdml:document>
       <tdml:documentPart type="bits">00000000 00000000 00000000 00111101</tdml:documentPart>
@@ -2008,8 +2066,7 @@
   </tdml:parserTestCase>
 
   <tdml:parserTestCase name="dateTimeBin3" root="dateTimeBin3"
-    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
-    roundTrip="false">
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
 
     <tdml:document>
       <tdml:documentPart type="bits">00000000 00000000 00000000 00111101</tdml:documentPart>
@@ -2124,8 +2181,7 @@
   </tdml:parserTestCase>
 
   <tdml:parserTestCase name="dateTimeBin11" root="dateTimeBin6"
-    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
-    roundTrip="true">
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
 
     <tdml:document>
       <tdml:documentPart type="bits">01111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111</tdml:documentPart>
@@ -2156,8 +2212,7 @@
   <!-- xs:dateTime with binaryCalendarRep='binaryMillieconds' - expecting an error for being 1 milisecond
     greater than the maximum date allowed -->
   <tdml:parserTestCase name="dateTimeBin13" root="dateTimeBin6"
-    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
-    roundTrip="true">
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
 
     <tdml:document>
       <tdml:documentPart type="bits">00000010 10001101 01000110 11111011 11111100 10101110 01100010 11101001</tdml:documentPart>
@@ -2187,8 +2242,7 @@
   <!-- xs:dateTime with binaryCalendarRep='binaryMillieconds' - expecting an error for being 1 milisecond
     less than the minimum date allowed -->
   <tdml:parserTestCase name="dateTimeBin15" root="dateTimeBin6"
-    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
-    roundTrip="true">
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
 
     <tdml:document>
       <tdml:documentPart type="bits">11111101 01110001 00110111 10110011 11111100 10101110 01100010 11100111</tdml:documentPart>
@@ -2228,8 +2282,7 @@
   </tdml:parserTestCase>
 
   <tdml:parserTestCase name="dateTimeBin18" root="dateTimeBin10"
-    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
-    roundTrip="false">
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
 
     <tdml:document>
       <tdml:documentPart type="bits">00000000 00000000 00000000 00111101</tdml:documentPart>
@@ -2240,8 +2293,7 @@
   </tdml:parserTestCase>
 
   <tdml:parserTestCase name="dateTimeBin19" root="dateTimeBin11"
-    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
-    roundTrip="false">
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
 
     <tdml:document>
       <tdml:documentPart type="bits">00000000 00000000 00000000 00111101</tdml:documentPart>
@@ -2251,11 +2303,277 @@
     </tdml:errors>
   </tdml:parserTestCase>
 
-  <tdml:parserTestCase name="dateBin2" root="dateBin2"
+  <tdml:parserTestCase name="dateTimeBin20" root="dateTimeBin12"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
+
+    <tdml:document>
+      <tdml:documentPart type="bits">00000000 00000000 00000000 00111101</tdml:documentPart>
+    </tdml:document>
+    <tdml:errors>
+      <tdml:error>Schema Definition Error: lengthKind='delimited' only supported for packed binary formats.</tdml:error>
+    </tdml:errors>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="dateBinBCD" root="dateBinBCD"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
+    roundTrip="true">
+
+    <tdml:document>
+      <tdml:documentPart type="byte">12 14 23</tdml:documentPart>
+    </tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <dateBinBCD>2023-12-14</dateBinBCD>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="dateBinBCD2" root="dateBinBCD2"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
+    roundTrip="true">
+
+    <tdml:document>
+      <tdml:documentPart type="byte">12 14 20 23</tdml:documentPart>
+    </tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <dateBinBCD2>2023-12-14</dateBinBCD2>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="dateBinBCD3" root="dateBinBCD"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
+
+    <tdml:document>
+      <tdml:documentPart type="byte">12 0F 23</tdml:documentPart>
+    </tdml:document>
+    <tdml:errors>
+      <tdml:error>Parse Error</tdml:error>
+      <tdml:error>Invalid low nibble</tdml:error>
+    </tdml:errors>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="dateBinBCD4" root="dateBinBCD3"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
+
+    <tdml:document>
+      <tdml:documentPart type="byte">08 17 48</tdml:documentPart>
+    </tdml:document>
+    <tdml:errors>
+      <tdml:error>Schema Definition Error</tdml:error>
+      <tdml:error>Character '-' not allowed in dfdl:calendarPattern for xs:date with a binaryCalendarRep of 'bcd'</tdml:error>
+    </tdml:errors>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="dateBinBCD5" root="dateBinBCD4"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
+
+    <tdml:document>
+      <tdml:documentPart type="bits">0000000</tdml:documentPart>
+    </tdml:document>
+    <tdml:errors>
+      <tdml:error>Schema Definition Error</tdml:error>
+      <tdml:error>The given length (7 bits) must be a multiple of 4 when using binaryCalendarRep='bcd'</tdml:error>
+    </tdml:errors>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="dateBinBCD6" root="dateBinBCD"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
+    roundTrip="true">
+
+    <tdml:document>
+      <tdml:documentPart type="bits">0001 0010 0010 0111 1001 1001</tdml:documentPart>
+    </tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <dateBinBCD>1999-12-27</dateBinBCD>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="dateBinBCD7" root="dateBinBCD5"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
+
+    <tdml:document>
+      <tdml:documentPart type="byte">08 17 48</tdml:documentPart>
+    </tdml:document>
+    <tdml:errors>
+      <tdml:error>Schema Definition Error</tdml:error>
+      <tdml:error>Character 'E' not allowed in dfdl:calendarPattern for xs:date with a binaryCalendarRep of 'bcd'</tdml:error>
+    </tdml:errors>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="dateBinBCD8" root="dateBinBCD6"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
+
+    <tdml:document>
+      <tdml:documentPart type="byte">08 17 48</tdml:documentPart>
+    </tdml:document>
+    <tdml:errors>
+      <tdml:error>Schema Definition Error</tdml:error>
+      <tdml:error>dfdl:calendarPattern must only contain characters that result in the presentation of digits for xs:date with a binaryCalendarRep of 'bcd'</tdml:error>
+    </tdml:errors>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="dateBinBCD9" root="dateBinBCD7"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
+
+    <tdml:document>
+      <tdml:documentPart type="byte">38 18</tdml:documentPart>
+    </tdml:document>
+   <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <dateBinBCD7>2018-08-07</dateBinBCD7>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="timeBinBCD" root="timeBinBCD"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
+    roundTrip="true">
+
+    <tdml:document>
+      <tdml:documentPart type="byte">18 56 03</tdml:documentPart>
+    </tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <timeBinBCD>18:56:03.000000</timeBinBCD>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="timeBinBCD2" root="timeBinBCD2"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
+    roundTrip="twoPass">
+
+    <tdml:document>
+      <tdml:documentPart type="byte">01 45 00 99 87</tdml:documentPart>
+    </tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <timeBinBCD2>01:45:00.998000</timeBinBCD2>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="timeBinBCD3" root="timeBinBCD3"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
+
+    <tdml:document>
+      <tdml:documentPart type="byte">01 45 00 99 87</tdml:documentPart>
+    </tdml:document>
+    <tdml:errors>
+      <tdml:error>Schema Definition Error</tdml:error>
+      <tdml:error>calendarPatternKind must be 'explicit' when binaryCalendarRep='bcd'</tdml:error>
+    </tdml:errors>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="timeBinBCD4" root="timeBinBCD4"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
+
+    <tdml:document>
+      <tdml:documentPart type="byte">18 56 03</tdml:documentPart>
+    </tdml:document>
+    <tdml:errors>
+      <tdml:error>Schema Definition Error</tdml:error>
+      <tdml:error>Length of binary data 'Time' cannot be determined implicitly</tdml:error>
+    </tdml:errors>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="timeBinBCD5" root="timeBinBCD5"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
+    roundTrip="true">
+
+    <tdml:document>
+      <tdml:documentPart type="byte">18 56 03 3B</tdml:documentPart>
+    </tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <timeBinBCD5>18:56:03.000000</timeBinBCD5>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="timeBinBCD6" root="timeBinBCD6"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
+    roundTrip="true">
+
+    <tdml:document>
+      <tdml:documentPart type="byte">03 18 56 03</tdml:documentPart>
+    </tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <timeBinBCD6>
+          <length>3</length>
+          <time>18:56:03.000000</time>
+        </timeBinBCD6>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="dateTimeBinBCD" root="dateTimeBinBCD"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
+    roundTrip="true">
+
+    <tdml:document>
+      <tdml:documentPart type="byte">06 14 20 04 18 56 03</tdml:documentPart>
+    </tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <dateTimeBinBCD>2004-06-14T18:56:03.000000</dateTimeBinBCD>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="dateTimeBinBCD2" root="dateTimeBinBCD2"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
+
+    <tdml:document>
+      <tdml:documentPart type="byte">01 45 00 99 87</tdml:documentPart>
+    </tdml:document>
+    <tdml:errors>
+      <tdml:error>Schema Definition Error</tdml:error>
+      <tdml:error>Length of binary data 'DateTime' with binaryCalendarRep='bcd' cannot be determined implicitly</tdml:error>
+    </tdml:errors>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="dateTimeBinBCD3" root="dateTimeBinBCD3"
     model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
     roundTrip="false">
 
     <tdml:document>
+      <tdml:documentPart type="byte">06 14 20 04 18 56 03</tdml:documentPart>
+    </tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <dateTimeBinBCD3>2004-06-14T18:56:03.000000</dateTimeBinBCD3>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="dateTimeBinBCD4" root="dateTimeBinBCD4"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R"
+    roundTrip="true">
+
+    <tdml:document>
+      <tdml:documentPart type="byte">03 3B 06 14 20 04 18 56 03 3B 19 3B</tdml:documentPart>
+    </tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <dateTimeBinBCD4>
+          <num1>3</num1>
+          <datetime>2004-06-14T18:56:03.000000</datetime>
+          <num2>19</num2>
+        </dateTimeBinBCD4>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <tdml:parserTestCase name="dateBinInvalid" root="dateBinInvalid"
+    model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" >
+
+    <tdml:document>
       <tdml:documentPart type="bits">0000 0000 0011 1101</tdml:documentPart>
     </tdml:document>
     <tdml:errors>
@@ -2427,7 +2745,7 @@
       <tdml:documentPart type="byte">00 00 00 01</tdml:documentPart>
     </tdml:document>
     <tdml:errors>
-      <tdml:error>Schema Definition Error: Size of binary data 'decimal' cannot be determined implicitly.</tdml:error>
+      <tdml:error>Schema Definition Error: Length of binary data 'decimal' cannot be determined implicitly.</tdml:error>
     </tdml:errors>
   </tdml:parserTestCase>
 
@@ -3282,7 +3600,7 @@
     </tdml:document>
     <tdml:errors>
       <tdml:error>Schema Definition Error</tdml:error>
-      <tdml:error>Size of binary data 'integer' cannot be determined implicitly</tdml:error>
+      <tdml:error>Length of binary data 'integer' cannot be determined implicitly</tdml:error>
     </tdml:errors>
   </tdml:parserTestCase>
   
@@ -3299,7 +3617,7 @@
     </tdml:document>
     <tdml:errors>
       <tdml:error>Schema Definition Error</tdml:error>
-      <tdml:error>Size of binary data 'integer' cannot be determined implicitly</tdml:error>
+      <tdml:error>Length of binary data 'integer' cannot be determined implicitly</tdml:error>
     </tdml:errors>
   </tdml:parserTestCase>
   
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/section12/lengthKind/DelimitedTests.tdml b/daffodil-test/src/test/resources/org/apache/daffodil/section12/lengthKind/DelimitedTests.tdml
index 6b5019e..682646b 100644
--- a/daffodil-test/src/test/resources/org/apache/daffodil/section12/lengthKind/DelimitedTests.tdml
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/section12/lengthKind/DelimitedTests.tdml
@@ -1098,7 +1098,7 @@ C</MessageHeaders>
     </tdml:document>
     <tdml:errors>
       <tdml:error>Schema Definition Error</tdml:error>
-      <tdml:error>Subset lengthKind='delimited' only supported for packed binary formats.</tdml:error>
+      <tdml:error>lengthKind='delimited' only supported for packed binary formats.</tdml:error>
     </tdml:errors>
   </tdml:parserTestCase>
 
diff --git a/daffodil-test/src/test/scala/org/apache/daffodil/section05/simple_types/TestSimpleTypes.scala b/daffodil-test/src/test/scala/org/apache/daffodil/section05/simple_types/TestSimpleTypes.scala
index a878313..c5a0ed4 100644
--- a/daffodil-test/src/test/scala/org/apache/daffodil/section05/simple_types/TestSimpleTypes.scala
+++ b/daffodil-test/src/test/scala/org/apache/daffodil/section05/simple_types/TestSimpleTypes.scala
@@ -189,7 +189,27 @@ class TestSimpleTypes {
   @Test def test_dateTimeBin17() { runner.runOneTest("dateTimeBin17") }
   @Test def test_dateTimeBin18() { runner.runOneTest("dateTimeBin18") }
   @Test def test_dateTimeBin19() { runner.runOneTest("dateTimeBin19") }
-  @Test def test_dateBin2() { runner.runOneTest("dateBin2") }
+  @Test def test_dateTimeBin20() { runner.runOneTest("dateTimeBin20") }
+  @Test def test_dateBinBCD() { runner.runOneTest("dateBinBCD") }
+  @Test def test_dateBinBCD2() { runner.runOneTest("dateBinBCD2") }
+  @Test def test_dateBinBCD3() { runner.runOneTest("dateBinBCD3") }
+  @Test def test_dateBinBCD4() { runner.runOneTest("dateBinBCD4") }
+  @Test def test_dateBinBCD5() { runner.runOneTest("dateBinBCD5") }
+  @Test def test_dateBinBCD6() { runner.runOneTest("dateBinBCD6") }
+  @Test def test_dateBinBCD7() { runner.runOneTest("dateBinBCD7") }
+  @Test def test_dateBinBCD8() { runner.runOneTest("dateBinBCD8") }
+  @Test def test_dateBinBCD9() { runner.runOneTest("dateBinBCD9") }
+  @Test def test_timeBinBCD() { runner.runOneTest("timeBinBCD") }
+  @Test def test_timeBinBCD2() { runner.runOneTest("timeBinBCD2") }
+  @Test def test_timeBinBCD3() { runner.runOneTest("timeBinBCD3") }
+  @Test def test_timeBinBCD4() { runner.runOneTest("timeBinBCD4") }
+  @Test def test_timeBinBCD5() { runner.runOneTest("timeBinBCD5") }
+  @Test def test_timeBinBCD6() { runner.runOneTest("timeBinBCD6") }
+  @Test def test_dateTimeBinBCD() { runner.runOneTest("dateTimeBinBCD") }
+  @Test def test_dateTimeBinBCD2() { runner.runOneTest("dateTimeBinBCD2") }
+  @Test def test_dateTimeBinBCD3() { runner.runOneTest("dateTimeBinBCD3") }
+  @Test def test_dateTimeBinBCD4() { runner.runOneTest("dateTimeBinBCD4") }
+  @Test def test_dateBinInvalid() { runner.runOneTest("dateBinInvalid") }
 
   @Test def test_dateTimeImplicitPattern() { runner.runOneTest("dateTimeImplicitPattern") }
   @Test def test_dateTimeImplicitPatternFail() { runner.runOneTest("dateTimeImplicitPatternFail") }