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

olabusayo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/daffodil.git


The following commit(s) were added to refs/heads/main by this push:
     new 36826799a Enable dfdl:extraEscapedCharcaters to take an expression
36826799a is described below

commit 36826799a81861e0577e657cacf0a95e3865be83
Author: olabusayoT <[email protected]>
AuthorDate: Wed Mar 20 16:39:29 2024 -0400

    Enable dfdl:extraEscapedCharcaters to take an expression
    
    - implement Ev val and class for extraEscapedCharacters similar to  
escapeCharacter and escapeEscapeCharacter
    - add optimization to DynamicEscapeSchemeCombinatorElement adding 
isConstant to checks
    - fix bug in hasDynamicEscapeScheme by adding consideration for 
escapeSchemeUnparseEv
    - add optionExtraEscapedCharsEv to localElementPropertyReferencedElements
    - add tests for literal and expression examples
    - refactor extraEscaoedCgarCooked to evalAndConvertExtraEscapedCharacters 
to more closely match other Evs
    - add test for escapeBlocks and literal and expressioned extraEscapeChars
    
    DAFFODIL-2876
---
 .../daffodil/core/dsom/DFDLEscapeScheme.scala      |  25 +++-
 .../RawCommonRuntimeValuedPropertiesMixin.scala    |   5 +-
 .../daffodil/core/dsom/RuntimePropertyMixins.scala |  11 +-
 .../core/grammar/ElementBaseGrammarMixin.scala     |   2 +-
 .../primitives/DelimiterAndEscapeRelated.scala     |  10 +-
 .../runtime1/processors/EvEscapeSchemes.scala      |  40 ++++--
 .../section07/escapeScheme/escapeScheme.tdml       | 157 +++++++++++++++++++++
 .../section07/escapeScheme/TestEscapeScheme.scala  |   4 +
 8 files changed, 230 insertions(+), 24 deletions(-)

diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/DFDLEscapeScheme.scala
 
b/daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/DFDLEscapeScheme.scala
index 79b944d7f..23f896969 100644
--- 
a/daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/DFDLEscapeScheme.scala
+++ 
b/daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/DFDLEscapeScheme.scala
@@ -35,6 +35,7 @@ import 
org.apache.daffodil.runtime1.processors.EscapeSchemeCharParseEv
 import org.apache.daffodil.runtime1.processors.EscapeSchemeCharUnparseEv
 import org.apache.daffodil.runtime1.processors.EscapeSchemeParseEv
 import org.apache.daffodil.runtime1.processors.EscapeSchemeUnparseEv
+import org.apache.daffodil.runtime1.processors.ExtraEscapedCharsEv
 
 final class DFDLEscapeScheme(
   node: Node,
@@ -120,10 +121,26 @@ final class DFDLEscapeScheme(
     }
   }.value
 
-  final lazy val optionExtraEscapedCharacters = 
LV('optionExtraEscapedCharacters) {
+  final lazy val optionExtraEscapedCharactersEv = 
LV('optionExtraEscapedCharacters) {
+    val qn = this.qNameForProperty("extraEscapedCharacters")
     extraEscapedCharactersRaw match {
       case Found("", _, _, _) => Nope
-      case Found(v, _, _, _) => One(v)
+      case found @ Found(v, _, _, _) => {
+        val typeIfStaticallyKnown = NodeInfo.String
+        val typeIfRuntimeKnown = NodeInfo.NonEmptyString
+        val ci = defES.pointOfUse.dpathCompileInfo
+        val expr = ExpressionCompilers.String.compileDelimiter(
+          qn,
+          typeIfStaticallyKnown,
+          typeIfRuntimeKnown,
+          found,
+          this,
+          ci,
+        )
+        val ev = new ExtraEscapedCharsEv(expr, ci)
+        ev.compile(tunable)
+        One(ev)
+      }
     }
   }.value
 
@@ -150,7 +167,7 @@ final class DFDLEscapeScheme(
           escapeBlockStart,
           escapeBlockEnd,
           optionEscapeEscapeCharacterEv,
-          optionExtraEscapedCharacters,
+          optionExtraEscapedCharactersEv,
           generateEscapeBlock,
           ci,
         )
@@ -158,7 +175,7 @@ final class DFDLEscapeScheme(
         new EscapeSchemeCharUnparseEv(
           escapeCharacterEv,
           optionEscapeEscapeCharacterEv,
-          optionExtraEscapedCharacters,
+          optionExtraEscapedCharactersEv,
           ci,
         )
     }
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/RawCommonRuntimeValuedPropertiesMixin.scala
 
b/daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/RawCommonRuntimeValuedPropertiesMixin.scala
index e4a416f0b..265208ad8 100644
--- 
a/daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/RawCommonRuntimeValuedPropertiesMixin.scala
+++ 
b/daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/RawCommonRuntimeValuedPropertiesMixin.scala
@@ -94,9 +94,8 @@ trait RawEscapeSchemeRuntimeValuedPropertiesMixin extends 
PropertyMixin {
   protected final lazy val escapeBlockStartRaw = 
requireProperty(optionEscapeBlockStartRaw)
   protected final lazy val optionEscapeBlockEndRaw = 
findPropertyOption("escapeBlockEnd")
   protected final lazy val escapeBlockEndRaw = 
requireProperty(optionEscapeBlockEndRaw)
-  protected final lazy val optionExtraEscapedCharactersRaw = 
findPropertyOption(
-    "extraEscapedCharacters",
-  )
+  protected final lazy val optionExtraEscapedCharactersRaw =
+    findPropertyOption("extraEscapedCharacters", expressionAllowed = true)
   protected final lazy val extraEscapedCharactersRaw = requireProperty(
     optionExtraEscapedCharactersRaw,
   )
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/RuntimePropertyMixins.scala
 
b/daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/RuntimePropertyMixins.scala
index 82ad4a720..e04bca9c5 100644
--- 
a/daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/RuntimePropertyMixins.scala
+++ 
b/daffodil-core/src/main/scala/org/apache/daffodil/core/dsom/RuntimePropertyMixins.scala
@@ -637,7 +637,16 @@ trait ElementRuntimeValuedPropertiesMixin
             f(es.optionEscapeEscapeCharacterEv.get)
           else
             ReferencedElementInfos.None
-        ee ++ propExprElts(es.optionEscapeCharacterRaw, es.escapeCharacterEv, 
f)
+        val extraEscapeChars =
+          if (es.optionExtraEscapedCharactersEv.isDefined)
+            f(es.optionExtraEscapedCharactersEv.get)
+          else
+            ReferencedElementInfos.None
+        ee ++ extraEscapeChars ++ propExprElts(
+          es.optionEscapeCharacterRaw,
+          es.escapeCharacterEv,
+          f,
+        )
       } else {
         ReferencedElementInfos.None
       }
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/core/grammar/ElementBaseGrammarMixin.scala
 
b/daffodil-core/src/main/scala/org/apache/daffodil/core/grammar/ElementBaseGrammarMixin.scala
index f34f1e1bd..f94daf153 100644
--- 
a/daffodil-core/src/main/scala/org/apache/daffodil/core/grammar/ElementBaseGrammarMixin.scala
+++ 
b/daffodil-core/src/main/scala/org/apache/daffodil/core/grammar/ElementBaseGrammarMixin.scala
@@ -1409,7 +1409,7 @@ trait ElementBaseGrammarMixin
   }
 
   private lazy val hasDynamicEscapeScheme =
-    this.optionEscapeScheme.isDefined && 
!this.optionEscapeScheme.get.escapeSchemeParseEv.isConstant
+    this.optionEscapeScheme.isDefined && 
(!this.optionEscapeScheme.get.escapeSchemeParseEv.isConstant || 
!this.optionEscapeScheme.get.escapeSchemeUnparseEv.isConstant)
 
   private def withEscapeScheme(body: Gram) = {
     if (hasDynamicEscapeScheme) DynamicEscapeSchemeCombinatorElement(this, 
body)
diff --git 
a/daffodil-core/src/main/scala/org/apache/daffodil/core/grammar/primitives/DelimiterAndEscapeRelated.scala
 
b/daffodil-core/src/main/scala/org/apache/daffodil/core/grammar/primitives/DelimiterAndEscapeRelated.scala
index 88036ff30..6c0fe81ed 100644
--- 
a/daffodil-core/src/main/scala/org/apache/daffodil/core/grammar/primitives/DelimiterAndEscapeRelated.scala
+++ 
b/daffodil-core/src/main/scala/org/apache/daffodil/core/grammar/primitives/DelimiterAndEscapeRelated.scala
@@ -120,18 +120,20 @@ case class DynamicEscapeSchemeCombinatorElement(e: 
ElementBase, body: Gram)
   val schemeParseOpt = e.optionEscapeScheme.map { _.escapeSchemeParseEv }
   val schemeUnparseOpt = e.optionEscapeScheme.map { _.escapeSchemeUnparseEv }
 
-  Assert.invariant(schemeParseOpt.isDefined && !schemeParseOpt.get.isConstant)
-  Assert.invariant(schemeUnparseOpt.isDefined && 
!schemeUnparseOpt.get.isConstant)
+  val schemeParseIsConstant = schemeParseOpt.map(_.isConstant).getOrElse(true)
+  val schemeUnparseIsConstant = 
schemeUnparseOpt.map(_.isConstant).getOrElse(true)
+
+  Assert.invariant(!schemeParseIsConstant || !schemeUnparseIsConstant)
 
   lazy val parser: DaffodilParser = {
     val p = body.parser
-    if (p.isEmpty) p
+    if (p.isEmpty || schemeParseIsConstant) p
     else new DynamicEscapeSchemeParser(schemeParseOpt.get, e.termRuntimeData, 
p)
   }
 
   override lazy val unparser: DaffodilUnparser = {
     val u = body.unparser
-    if (u.isEmpty) u
+    if (u.isEmpty || schemeUnparseIsConstant) u
     else new DynamicEscapeSchemeUnparser(schemeUnparseOpt.get, 
e.termRuntimeData, u)
   }
 }
diff --git 
a/daffodil-runtime1/src/main/scala/org/apache/daffodil/runtime1/processors/EvEscapeSchemes.scala
 
b/daffodil-runtime1/src/main/scala/org/apache/daffodil/runtime1/processors/EvEscapeSchemes.scala
index 0f3472094..a4bdb885b 100644
--- 
a/daffodil-runtime1/src/main/scala/org/apache/daffodil/runtime1/processors/EvEscapeSchemes.scala
+++ 
b/daffodil-runtime1/src/main/scala/org/apache/daffodil/runtime1/processors/EvEscapeSchemes.scala
@@ -41,6 +41,15 @@ class EscapeEscapeCharEv(expr: CompiledExpression[String], 
ci: DPathCompileInfo)
   with InfosetCachedEvaluatable[String] {
   override lazy val runtimeDependencies = Vector()
 }
+class ExtraEscapedCharsEv(expr: CompiledExpression[String], ci: 
DPathCompileInfo)
+  extends EvaluatableConvertedExpression[String, Seq[String]](
+    expr,
+    ExtraEscapedCharactersCooker,
+    ci,
+  )
+  with InfosetCachedEvaluatable[Seq[String]] {
+  override lazy val runtimeDependencies = Vector()
+}
 
 trait EscapeSchemeCommonEv {
   def optEscapeEscapeChar: Maybe[EscapeEscapeCharEv]
@@ -74,13 +83,14 @@ abstract class EscapeSchemeUnparseEv(ci: DPathCompileInfo)
     state.asInstanceOf[UState].escapeSchemeEVCache
   }
 
-  def extraEscapedChars: Maybe[String]
+  def extraEscapedChars: Maybe[ExtraEscapedCharsEv]
 
-  val extraEscapedCharsCooked = {
+  def evalAndConvertExtraEscapedCharacters(state: ParseOrUnparseState): 
Seq[Char] = {
     if (extraEscapedChars.isDefined) {
-      ExtraEscapedCharactersCooker
-        .convertConstant(extraEscapedChars.get, ci, forUnparse = true)
-        .map { _.charAt(0) }
+      val extEscChar = extraEscapedChars.get
+        .evaluate(state)
+        .map(_.charAt(0))
+      extEscChar
     } else {
       Seq()
     }
@@ -105,16 +115,23 @@ class EscapeSchemeCharParseEv(
 class EscapeSchemeCharUnparseEv(
   escapeChar: EscapeCharEv,
   override val optEscapeEscapeChar: Maybe[EscapeEscapeCharEv],
-  override val extraEscapedChars: Maybe[String],
+  override val extraEscapedChars: Maybe[ExtraEscapedCharsEv],
   ci: DPathCompileInfo,
 ) extends EscapeSchemeUnparseEv(ci) {
 
-  override val runtimeDependencies = Vector(escapeChar) ++ 
optEscapeEscapeChar.toList
+  override val runtimeDependencies =
+    Vector(escapeChar) ++ optEscapeEscapeChar.toList ++ 
extraEscapedChars.toList
 
   def compute(state: ParseOrUnparseState) = {
     val escChar = escapeChar.evaluate(state).charAt(0)
     val optEscEscChar = evalAndConvertEEC(state)
-    new EscapeSchemeCharUnparserHelper(escChar, optEscEscChar, 
extraEscapedCharsCooked, ci)
+    val extEscChars = evalAndConvertExtraEscapedCharacters(state)
+    new EscapeSchemeCharUnparserHelper(
+      escChar,
+      optEscEscChar,
+      extEscChars,
+      ci,
+    )
   }
 }
 
@@ -140,23 +157,24 @@ class EscapeSchemeBlockUnparseEv(
   blockStart: String,
   blockEnd: String,
   override val optEscapeEscapeChar: Maybe[EscapeEscapeCharEv],
-  override val extraEscapedChars: Maybe[String],
+  override val extraEscapedChars: Maybe[ExtraEscapedCharsEv],
   generateEscapeBlock: GenerateEscape,
   ci: DPathCompileInfo,
 ) extends EscapeSchemeUnparseEv(ci) {
 
-  override val runtimeDependencies = optEscapeEscapeChar.toList
+  override val runtimeDependencies = optEscapeEscapeChar.toList ++ 
extraEscapedChars.toList
 
   val bs = EscapeBlockStartCooker.convertConstant(blockStart, ci, forUnparse = 
true)
   val be = EscapeBlockEndCooker.convertConstant(blockEnd, ci, forUnparse = 
true)
 
   def compute(state: ParseOrUnparseState) = {
     val optEscEscChar = evalAndConvertEEC(state)
+    val extEscChars = evalAndConvertExtraEscapedCharacters(state)
     new EscapeSchemeBlockUnparserHelper(
       optEscEscChar,
       bs,
       be,
-      extraEscapedCharsCooked,
+      extEscChars,
       generateEscapeBlock,
       ci,
     )
diff --git 
a/daffodil-test/src/test/resources/org/apache/daffodil/section07/escapeScheme/escapeScheme.tdml
 
b/daffodil-test/src/test/resources/org/apache/daffodil/section07/escapeScheme/escapeScheme.tdml
index 1b560c20c..54c7bf6b9 100644
--- 
a/daffodil-test/src/test/resources/org/apache/daffodil/section07/escapeScheme/escapeScheme.tdml
+++ 
b/daffodil-test/src/test/resources/org/apache/daffodil/section07/escapeScheme/escapeScheme.tdml
@@ -314,6 +314,24 @@
         escapeKind="escapeCharacter" escapeEscapeCharacter="{ 
xs:string(xs:int(fn:ceiling(xs:float(../tns:escapeEscapeChar)))) }" 
extraEscapedCharacters="" generateEscapeBlock="whenNeeded" />
     </dfdl:defineEscapeScheme>
 
+    <dfdl:defineEscapeScheme name="fromData4">
+      <dfdl:escapeScheme
+              escapeCharacter="{ xs:string(xs:int(../tns:escapeChar) - 3) }"
+              escapeKind="escapeCharacter"
+              escapeEscapeCharacter="{ 
xs:string(xs:int(fn:ceiling(xs:float(../tns:escapeEscapeChar)))) }"
+              extraEscapedCharacters="{ xs:string(../tns:extraEscapedChars) }"
+              generateEscapeBlock="whenNeeded" />
+    </dfdl:defineEscapeScheme>
+
+    <dfdl:defineEscapeScheme name="fromData5">
+      <dfdl:escapeScheme
+              escapeCharacter="{ xs:string(xs:int(../tns:escapeChar) - 3) }"
+              escapeKind="escapeCharacter"
+              escapeEscapeCharacter="{ 
xs:string(xs:int(fn:ceiling(xs:float(../tns:escapeEscapeChar)))) }"
+              extraEscapedCharacters="1 3"
+              generateEscapeBlock="whenNeeded" />
+    </dfdl:defineEscapeScheme>
+
     <xs:element name="e1">
       <xs:complexType>
         <xs:sequence dfdl:separator=",">
@@ -359,6 +377,27 @@
         </xs:sequence>
       </xs:complexType>
     </xs:element>
+
+    <xs:element name="e4">
+      <xs:complexType>
+        <xs:sequence dfdl:separator=",">
+          <xs:element name="escapeChar" type="xs:int"/>
+          <xs:element name="escapeEscapeChar" type="xs:float"/>
+          <xs:element name="extraEscapedChars" type="xs:string"/>
+          <xs:element name="strng" type="xs:string" 
dfdl:lengthKind="delimited" minOccurs="1" maxOccurs="5" 
dfdl:escapeSchemeRef="tns:fromData4"/>
+        </xs:sequence>
+      </xs:complexType>
+    </xs:element>
+
+    <xs:element name="e5">
+      <xs:complexType>
+        <xs:sequence dfdl:separator=",">
+          <xs:element name="escapeChar" type="xs:int"/>
+          <xs:element name="escapeEscapeChar" type="xs:float"/>
+          <xs:element name="strng" type="xs:string" 
dfdl:lengthKind="delimited" minOccurs="1" maxOccurs="5" 
dfdl:escapeSchemeRef="tns:fromData5"/>
+        </xs:sequence>
+      </xs:complexType>
+    </xs:element>
   
   </defineSchema>
   
@@ -532,6 +571,57 @@
     </infoset>
   </parserTestCase>
 
+  <!--
+       Test Name: escapeExpressions_07
+          Schema: escapeSchemeExpressions
+            Root: e5
+         Purpose: This test demonstrates that you can use an expression to 
define an escapeCharacter, escapeEscapeCharacter and a literal for 
extraEscapedCharacters
+  -->
+
+  <parserTestCase name="escapeExpressions_07" model="escapeSchemeExpressions"
+    description="Section 13 - escapeCharacter" root="e5">
+    <document>5,3.2,212,000,52,000,642,5230,500</document>
+    <infoset>
+      <dfdlInfoset>
+        <tns:e5 xmlns:tns="http://example.com";>
+          <tns:escapeChar>5</tns:escapeChar>
+          <tns:escapeEscapeChar>3.2</tns:escapeEscapeChar>
+          <tns:strng>1,000</tns:strng>
+          <tns:strng>5,000</tns:strng>
+          <tns:strng>62</tns:strng>
+          <tns:strng>530</tns:strng>
+          <tns:strng>500</tns:strng>
+        </tns:e5>
+      </dfdlInfoset>
+    </infoset>
+  </parserTestCase>
+
+  <!--
+       Test Name: escapeExpressions_08
+          Schema: escapeSchemeExpressions
+            Root: e4
+         Purpose: This test demonstrates that you can use an expression to 
define an escapeCharacter, escapeEscapeCharacter and an extraEscapedCharacters
+  -->
+
+  <parserTestCase name="escapeExpressions_08" model="escapeSchemeExpressions"
+    description="Section 13 - escapeCharacter" root="e4">
+    <document>5,3.2,1 3,212,000,52,000,642,5230,500</document>
+    <infoset>
+      <dfdlInfoset>
+        <tns:e4 xmlns:tns="http://example.com";>
+          <tns:escapeChar>5</tns:escapeChar>
+          <tns:escapeEscapeChar>3.2</tns:escapeEscapeChar>
+          <tns:extraEscapedChars>1 3</tns:extraEscapedChars>
+          <tns:strng>1,000</tns:strng>
+          <tns:strng>5,000</tns:strng>
+          <tns:strng>62</tns:strng>
+          <tns:strng>530</tns:strng>
+          <tns:strng>500</tns:strng>
+        </tns:e4>
+      </dfdlInfoset>
+    </infoset>
+  </parserTestCase>
+
   <!--
        Test Name: escBlkAllQuotes
           Schema: eBlkAllQuotes
@@ -590,6 +680,18 @@
         escapeEscapeCharacter=")"  extraEscapedCharacters="" 
generateEscapeBlock="whenNeeded"/>
     </dfdl:defineEscapeScheme>
 
+    <dfdl:defineEscapeScheme name="eBlkEndParen_eecExp">
+      <dfdl:escapeScheme escapeBlockStart="("
+        escapeBlockEnd=")" escapeKind="escapeBlock"
+        escapeEscapeCharacter=")" 
extraEscapedCharacters="{../tns:extraEscapedCharacters }" 
generateEscapeBlock="whenNeeded"/>
+    </dfdl:defineEscapeScheme>
+
+    <dfdl:defineEscapeScheme name="eBlkEndParen_eecLit">
+      <dfdl:escapeScheme escapeBlockStart="("
+        escapeBlockEnd=")" escapeKind="escapeBlock"
+        escapeEscapeCharacter=")" extraEscapedCharacters="? *" 
generateEscapeBlock="whenNeeded"/>
+    </dfdl:defineEscapeScheme>
+
     <xs:element name="record">
       <xs:complexType>
         <xs:sequence dfdl:separator="," >
@@ -598,6 +700,27 @@
         </xs:sequence>
       </xs:complexType>
     </xs:element>
+
+    <xs:element name="record2">
+      <xs:complexType>
+        <xs:sequence dfdl:separator="," >
+          <xs:element name="extraEscapedCharacters" type="xs:string"/>
+          <xs:element name="item" type="xs:string" dfdl:lengthKind="delimited" 
maxOccurs="5"
+           dfdl:escapeSchemeRef="tns:eBlkEndParen_eecExp" />
+        </xs:sequence>
+      </xs:complexType>
+    </xs:element>
+
+    <xs:element name="record3">
+      <xs:complexType>
+        <xs:sequence dfdl:separator="," >
+          <xs:element name="extraEscapedCharacters" type="xs:string"/>
+          <xs:element name="item" type="xs:string" dfdl:lengthKind="delimited" 
maxOccurs="5"
+           dfdl:escapeSchemeRef="tns:eBlkEndParen_eecLit" />
+        </xs:sequence>
+      </xs:complexType>
+    </xs:element>
+
   </defineSchema>
  
   <parserTestCase name="escBlkEndSame" model="eBlkEndSame"
@@ -616,6 +739,40 @@
     </infoset>
   </parserTestCase>
 
+  <unparserTestCase name="escBlkEndSame2" model="eBlkEndSame"
+    description="Section 7 defineEscapeScheme - escapeBlock with expression 
extraEscapedCharacters" root="record2" roundTrip="true">
+    <document>? *,1,(Column Number? Two*),3,4,5</document>
+    <infoset>
+      <dfdlInfoset>
+       <tns:record2>
+         <tns:extraEscapedCharacters>? *</tns:extraEscapedCharacters>
+         <tns:item>1</tns:item>
+         <tns:item>Column Number? Two*</tns:item>
+         <tns:item>3</tns:item>
+         <tns:item>4</tns:item>
+         <tns:item>5</tns:item>
+           </tns:record2>
+      </dfdlInfoset>
+    </infoset>
+  </unparserTestCase>
+
+  <unparserTestCase name="escBlkEndSame3" model="eBlkEndSame"
+    description="Section 7 defineEscapeScheme - escapeBlock with literal 
extraEscapedCharacters" root="record3" roundTrip="true">
+    <document>? *,1,(Column Number? Two*),3,4,5</document>
+    <infoset>
+      <dfdlInfoset>
+       <tns:record3>
+         <tns:extraEscapedCharacters>? *</tns:extraEscapedCharacters>
+         <tns:item>1</tns:item>
+         <tns:item>Column Number? Two*</tns:item>
+         <tns:item>3</tns:item>
+         <tns:item>4</tns:item>
+         <tns:item>5</tns:item>
+           </tns:record3>
+      </dfdlInfoset>
+    </infoset>
+  </unparserTestCase>
+
   <!--
        Test Name: escBlkMultipleEEC
           Schema: eBlkMultipleEEC
diff --git 
a/daffodil-test/src/test/scala/org/apache/daffodil/section07/escapeScheme/TestEscapeScheme.scala
 
b/daffodil-test/src/test/scala/org/apache/daffodil/section07/escapeScheme/TestEscapeScheme.scala
index 98d143199..28ee31dea 100644
--- 
a/daffodil-test/src/test/scala/org/apache/daffodil/section07/escapeScheme/TestEscapeScheme.scala
+++ 
b/daffodil-test/src/test/scala/org/apache/daffodil/section07/escapeScheme/TestEscapeScheme.scala
@@ -59,6 +59,8 @@ class TestEscapeScheme {
   @Test def test_escapeExpressions_04(): Unit = { 
runner.runOneTest("escapeExpressions_04") }
   @Test def test_escapeExpressions_05(): Unit = { 
runner.runOneTest("escapeExpressions_05") }
   @Test def test_escapeExpressions_06(): Unit = { 
runner.runOneTest("escapeExpressions_06") }
+  @Test def test_escapeExpressions_07(): Unit = { 
runner.runOneTest("escapeExpressions_07") }
+  @Test def test_escapeExpressions_08(): Unit = { 
runner.runOneTest("escapeExpressions_08") }
 
   @Test def test_escapeSchemeNeg(): Unit = { 
runnerNeg.runOneTest("escapeSchemeNeg") }
 
@@ -98,6 +100,8 @@ class TestEscapeScheme {
 
   @Test def test_escBlkAllQuotes(): Unit = { 
runner.runOneTest("escBlkAllQuotes") }
   @Test def test_escBlkEndSame(): Unit = { runner.runOneTest("escBlkEndSame") }
+  @Test def test_escBlkEndSame2(): Unit = { 
runner.runOneTest("escBlkEndSame2") }
+  @Test def test_escBlkEndSame3(): Unit = { 
runner.runOneTest("escBlkEndSame3") }
   // @Test def test_escBlkMultipleEEC() { 
runner.runOneTest("escBlkMultipleEEC") } // DAFFODIL-1972
 
   @Test def test_escapeScheme_with_comment(): Unit = {

Reply via email to