You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@daffodil.apache.org by mb...@apache.org on 2021/03/22 15:25:00 UTC

[daffodil] branch master updated: Add tests for DAF-2486 discr and DAF-2487 hang bugs

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 78bcc3b  Add tests for DAF-2486 discr and DAF-2487 hang bugs
78bcc3b is described below

commit 78bcc3b61ee176bba3bd98878aafba2484035aed
Author: Michael Beckerle <mb...@tresys.com>
AuthorDate: Fri Mar 19 13:10:03 2021 -0600

    Add tests for DAF-2486 discr and DAF-2487 hang bugs
    
    Tests include:
    A negative test for malformed date in the first row. That works.
    A test using terminators, not separators, works
    A negative test using terminators, not separators, also detects bad date, even in later rows.
    
    Also added tests to characterize parser hang bug on CSV-like data.
    
    This bug also found playing with CSV.
    
    The problem is related to separated sequences containing an array when minOccurs="0" so that all elements are optional.
    
    When an initial field is empty on a line, the tests hang.
    
    DAFFODIL-2486, DAFFODIL-2487
---
 .../section07/discriminators/discriminator2.tdml   | 226 ++++++++++++++++
 .../sequence_groups/SequenceGroupNestedArray.tdml  | 287 +++++++++++++++++++++
 .../discriminators/TestDiscriminators.scala        |   8 +
 .../TestSequenceGroupNestedArray.scala             |  47 ++++
 4 files changed, 568 insertions(+)

diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/section07/discriminators/discriminator2.tdml b/daffodil-test/src/test/resources/org/apache/daffodil/section07/discriminators/discriminator2.tdml
new file mode 100644
index 0000000..14d380d
--- /dev/null
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/section07/discriminators/discriminator2.tdml
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<testSuite suiteName="NameDOB"
+           xmlns:xs="http://www.w3.org/2001/XMLSchema"
+           xmlns:fn="http://www.w3.org/2005/xpath-functions"
+           xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/"
+           xmlns:tdml="http://www.ibm.com/xmlns/dfdl/testData"
+           xmlns:ex="http://example.com"
+           xmlns:tns="http://example.com"
+           defaultRoundTrip="none">
+
+  <tdml:defineSchema name="s1">
+
+    <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd" />
+
+    <dfdl:format
+      ref="tns:GeneralFormat"
+      representation="text"
+      encoding="ASCII"
+      lengthKind="delimited"
+      separator=""
+      separatorPosition="infix"
+    />
+
+    <!--
+    Schema for simple CSV-like file containing 4 columns, the last of which is a date.
+
+    What makes this non-trivial is use of discriminator after the first column.
+    If we can parse a first column, then the remaining columns MUST be present, and an error
+    in parsing them should be fatal.
+
+    -->
+    <xs:element name="file" dfdl:initiator="last,first,middle,DOB%NL;%WSP*;">
+      <xs:complexType>
+        <xs:sequence dfdl:separator="%NL;" dfdl:separatorPosition="postfix">
+          <xs:element name="record" maxOccurs="unbounded">
+            <xs:complexType>
+              <xs:sequence>
+                <xs:element name="lastName" type="xs:string"
+                            dfdl:terminator=","/>
+                <xs:sequence>
+                  <xs:annotation>
+                    <xs:appinfo source="http://www.ogf.org/dfdl/">
+                      <!--
+                      This discriminator should discriminate the closest
+                      point of uncertainty, which should be the record array element.
+
+                      If we parse the record to this discriminator, then
+                      any subsequent error parsing the remaining fields (e.g., such as
+                      the date being incorrect format, should fail the whole parse, not
+                      just terminate the array.
+                      -->
+                      <dfdl:discriminator test="{ fn:true() }"/>
+                    </xs:appinfo>
+                  </xs:annotation>
+                </xs:sequence>
+                <xs:sequence dfdl:separator=",">
+                  <xs:element name="firstName" type="xs:string"/>
+                  <xs:element name="middleName" type="xs:string"/>
+                  <xs:element name="DOB" type="xs:date"
+                              dfdl:calendarPattern="MM/dd/yyyy"
+                              dfdl:calendarPatternKind="explicit"/>
+                </xs:sequence>
+              </xs:sequence>
+            </xs:complexType>
+          </xs:element>
+        </xs:sequence>
+      </xs:complexType>
+    </xs:element>
+
+    <xs:element name="file2" dfdl:initiator="last,first,middle,DOB%NL;%WSP*;">
+      <xs:complexType>
+        <xs:sequence>
+          <xs:element name="record" maxOccurs="unbounded" dfdl:terminator="%NL;">
+            <xs:complexType>
+              <xs:sequence>
+                <xs:element name="lastName" type="xs:string"
+                            dfdl:terminator=","/>
+                <xs:sequence>
+                  <xs:annotation>
+                    <xs:appinfo source="http://www.ogf.org/dfdl/">
+                      <!--
+                      This discriminator should discriminate the closest
+                      point of uncertainty, which should be the record array element.
+
+                      If we parse the record to this discriminator, then
+                      any subsequent error parsing the remaining fields (e.g., such as
+                      the date being incorrect format, should fail the whole parse, not
+                      just terminate the array.
+                      -->
+                      <dfdl:discriminator test="{ fn:true() }"/>
+                    </xs:appinfo>
+                  </xs:annotation>
+                </xs:sequence>
+                <xs:sequence>
+                  <xs:element name="firstName" type="xs:string" dfdl:terminator="," />
+                  <xs:element name="middleName" type="xs:string" dfdl:terminator=","/>
+                  <xs:element name="DOB" type="xs:date"
+                              dfdl:calendarPattern="MM/dd/yyyy"
+                              dfdl:calendarPatternKind="explicit"/>
+                </xs:sequence>
+              </xs:sequence>
+            </xs:complexType>
+          </xs:element>
+        </xs:sequence>
+      </xs:complexType>
+    </xs:element>
+
+  </tdml:defineSchema>
+
+  <!--
+  This test just illustrates that the above schema does parse well-formed CSV-like data
+  including the final date element.
+  -->
+  <tdml:parserTestCase name="nameDOB_test1" model="s1">
+    <tdml:document><![CDATA[last,first,middle,DOB
+smith,robert,brandon,03/24/1988
+johnson,john,henry,01/23/1986
+jones,arya,cat,02/19/1986
+]]></tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <ex:file2 xmlns:ex="http://example.com">
+          <record>
+            <lastName>smith</lastName>
+            <firstName>robert</firstName>
+            <middleName>brandon</middleName>
+            <DOB>1988-03-24</DOB>
+          </record>
+          <record>
+            <lastName>johnson</lastName>
+            <firstName>john</firstName>
+            <middleName>henry</middleName>
+            <DOB>1986-01-23</DOB>
+          </record>
+          <record>
+            <lastName>jones</lastName>
+            <firstName>arya</firstName>
+            <middleName>cat</middleName>
+            <DOB>1986-02-19</DOB>
+          </record>
+        </ex:file2>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <!--
+    Shows that the discriminator causes a malformed date in
+    the first row of data to be detected and an error diagnostic about
+    the date field reported.
+    -->
+  <tdml:parserTestCase name="nameDOB_test_bad_date_first_row" root="file"
+                       model="s1">
+    <tdml:document><![CDATA[last,first,middle,DOB
+smith,robert,brandon,1986-02-19
+johnson,john,henry,01/23/1986
+jones,arya,cat,02/19/1986
+]]></tdml:document>
+    <tdml:errors>
+      <tdml:error>xs:date</tdml:error>
+    </tdml:errors>
+  </tdml:parserTestCase>
+
+  <!--
+  This test illustrates that because of the malformed date in the
+  final row of data, the schema should deem the whole file malformed.
+
+  Bug DAFFODIL-2486 reports that the discriminator in the schema
+  for this data does not seem to work.
+
+  There is a problem related to separator suppression which is introducing an
+  additional point of uncertainty, which renders the discriminator ineffective
+  for rows after the first one.
+
+  The test should end with a complaint about the DOB element, which is a date.
+  Until that bug is fixed, this ends with "left over data".
+  Because it backtracks and terminates the record array based on the failure
+  to parse the date.
+  That shouldn't happen because of the discriminator.
+  -->
+  <tdml:parserTestCase name="nameDOB_test_bad_1" root="file"
+                       model="s1">
+    <tdml:document><![CDATA[last,first,middle,DOB
+smith,robert,brandon,03/24/1988
+johnson,john,henry,01/23/1986
+jones,arya,cat,1986-02-19
+]]></tdml:document>
+    <tdml:errors>
+      <tdml:error>xs:date</tdml:error>
+    </tdml:errors>
+  </tdml:parserTestCase>
+
+  <!--
+  This test shows that if you model this CSV-like data using
+  only terminators, not separators, then the discriminator works
+  as expected.
+  -->
+  <tdml:parserTestCase name="nameDOB_test_bad_using_terminators" root="file2"
+                       model="s1">
+    <tdml:document><![CDATA[last,first,middle,DOB
+smith,robert,brandon,03/24/1988
+johnson,john,henry,01/23/1986
+jones,arya,cat,1986-02-19
+]]></tdml:document>
+    <tdml:errors>
+      <tdml:error>xs:date</tdml:error>
+    </tdml:errors>
+  </tdml:parserTestCase>
+
+</testSuite>
\ No newline at end of file
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/section14/sequence_groups/SequenceGroupNestedArray.tdml b/daffodil-test/src/test/resources/org/apache/daffodil/section14/sequence_groups/SequenceGroupNestedArray.tdml
new file mode 100644
index 0000000..5de3f30
--- /dev/null
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/section14/sequence_groups/SequenceGroupNestedArray.tdml
@@ -0,0 +1,287 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<tdml:testSuite
+  xmlns:tdml="http://www.ibm.com/xmlns/dfdl/testData"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema"
+  xmlns:ex="http://example.com"
+  xmlns:tns="http://example.com"
+  defaultRoundTrip="none">
+
+  <tdml:defineSchema name="s1">
+    <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+    <dfdl:format
+      ref="ex:GeneralFormat"
+      representation="text"
+      encoding="ASCII"
+      lengthKind="delimited"
+      separator=""
+      separatorPosition="infix"
+    />
+
+    <!--
+      A very basic CSV-like data.
+
+      Of note: the item array inside has minOccurs="1"
+      The point is to contrast behavior of this (which seems working)
+      to that of a variant that has minOccurs="0".
+    -->
+    <xs:element name="file">
+      <xs:complexType>
+        <xs:sequence dfdl:separator="%NL;" dfdl:separatorPosition="postfix">
+          <xs:element name="header" minOccurs="0" maxOccurs="1"
+                      dfdl:occursCountKind="implicit">
+            <xs:complexType>
+              <xs:sequence dfdl:separator=",">
+                <xs:element name="title" type="xs:string" maxOccurs="unbounded" />
+              </xs:sequence>
+            </xs:complexType>
+          </xs:element>
+          <xs:element name="record" maxOccurs="unbounded">
+            <xs:complexType>
+              <xs:sequence dfdl:separator=",">
+                <xs:element name="item" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
+              </xs:sequence>
+            </xs:complexType>
+          </xs:element>
+        </xs:sequence>
+      </xs:complexType>
+    </xs:element>
+
+    <!--
+    Identical to element file above, excepting that the item array has
+    minOccurs="0", not "1".
+
+    This should allow rows containing things like
+
+        ,a,b,
+
+     To work. Bug DAFFODIL-2487 is that this hangs.
+    -->
+    <xs:element name="file2">
+      <xs:complexType>
+        <xs:sequence dfdl:separator="%NL;" dfdl:separatorPosition="postfix">
+          <xs:element name="header" minOccurs="0" maxOccurs="1"
+                      dfdl:occursCountKind="implicit">
+            <xs:complexType>
+              <xs:sequence dfdl:separator=",">
+                <xs:element name="title" type="xs:string" maxOccurs="unbounded" />
+              </xs:sequence>
+            </xs:complexType>
+          </xs:element>
+          <xs:element name="record" maxOccurs="unbounded">
+            <xs:complexType>
+              <xs:sequence dfdl:separator=",">
+                <!--
+                Note: This is the difference. This element below has
+                minOccurs="0"
+                -->
+                <xs:element name="item" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+              </xs:sequence>
+            </xs:complexType>
+          </xs:element>
+        </xs:sequence>
+      </xs:complexType>
+    </xs:element>
+
+  </tdml:defineSchema>
+
+  <!--
+  Test shows that with the item array having minOccurs="1"
+  The parse works on this data.
+  Including suppressing trailing separators.
+  It does not suppress leading empty elements that have separators, because one
+  such element is required.
+  -->
+  <tdml:parserTestCase name="csv_nohang_1"
+    model="s1">
+    <tdml:document><![CDATA[last,first,middle,DOB
+this line has excess separators,,,,,,,,
+smith,robert,brandon,1988-03-24
+,preceded by an empty field,
+,,preceded by two empty fields,
+notice lines of all commas are not skipped
+,,,,,,,
+notice blank lines are not skipped
+
+johnson,john,henry,1986-01-23
+
+jones,arya,cat,1986-02-19
+
+]]></tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <ex:file xmlns:ex="http://example.com">
+          <ex:header>
+            <ex:title>last</ex:title>
+            <ex:title>first</ex:title>
+            <ex:title>middle</ex:title>
+            <ex:title>DOB</ex:title>
+          </ex:header>
+          <ex:record>
+            <ex:item>this line has excess separators</ex:item>
+          </ex:record>
+          <ex:record>
+            <ex:item>smith</ex:item>
+            <ex:item>robert</ex:item>
+            <ex:item>brandon</ex:item>
+            <ex:item>1988-03-24</ex:item>
+          </ex:record>
+          <ex:record>
+            <ex:item></ex:item><!-- Notice 1 empty field here -->
+            <ex:item>preceded by an empty field</ex:item>
+          </ex:record>
+          <ex:record>
+            <ex:item></ex:item><!-- Notice 1 (not 2) empty field here -->
+            <ex:item>preceded by two empty fields</ex:item>
+          </ex:record>
+          <ex:record>
+            <ex:item>notice lines of all commas are not skipped</ex:item>
+          </ex:record>
+          <ex:record>
+            <ex:item></ex:item>
+          </ex:record>
+          <ex:record>
+            <ex:item>notice blank lines are not skipped</ex:item>
+          </ex:record>
+          <ex:record>
+            <ex:item></ex:item>
+          </ex:record>
+          <ex:record>
+            <ex:item>johnson</ex:item>
+            <ex:item>john</ex:item>
+            <ex:item>henry</ex:item>
+            <ex:item>1986-01-23</ex:item>
+          </ex:record>
+          <ex:record>
+            <ex:item></ex:item>
+          </ex:record>
+          <ex:record>
+            <ex:item>jones</ex:item>
+            <ex:item>arya</ex:item>
+            <ex:item>cat</ex:item>
+            <ex:item>1986-02-19</ex:item>
+          </ex:record>
+          <ex:record>
+            <ex:item></ex:item>
+          </ex:record>
+        </ex:file>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <!--
+  Test shows that if we just change minOccurs on the item array to 0
+  then the test hangs.
+  -->
+  <tdml:parserTestCase name="csv_hang_1"
+                       model="s1">
+    <tdml:document><![CDATA[last,first,middle,DOB
+,preceded by an empty field,
+,,preceded by two empty fields,
+notice lines of all commas are skipped
+,,,,,,,
+notice blank lines are skipped
+
+]]></tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <ex:file2 xmlns:ex="http://example.com">
+          <ex:header>
+            <ex:title>last</ex:title>
+            <ex:title>first</ex:title>
+            <ex:title>middle</ex:title>
+            <ex:title>DOB</ex:title>
+          </ex:header>
+          <ex:record>
+            <ex:item>preceded by an empty field</ex:item>
+          </ex:record>
+          <ex:record>
+            <ex:item>preceded by two empty fields</ex:item>
+          </ex:record>
+          <ex:record>
+            <ex:item>notice lines of all commas are skipped</ex:item>
+          </ex:record>
+          <ex:record>
+            <ex:item>notice blank lines are skipped</ex:item>
+          </ex:record>
+        </ex:file2>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <!--
+ Test shows that if we just change minOccurs on the item array to 0
+ then the test hangs.
+ -->
+  <tdml:parserTestCase name="csv_hang_2"
+                       model="s1">
+    <tdml:document><![CDATA[last,first,middle,DOB
+,preceded by an empty field,
+,,preceded by two empty fields,
+]]></tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <ex:file2 xmlns:ex="http://example.com">
+          <ex:header>
+            <ex:title>last</ex:title>
+            <ex:title>first</ex:title>
+            <ex:title>middle</ex:title>
+            <ex:title>DOB</ex:title>
+          </ex:header>
+          <ex:record>
+            <ex:item>preceded by an empty field</ex:item>
+          </ex:record>
+          <ex:record>
+            <ex:item>preceded by two empty fields</ex:item>
+          </ex:record>
+        </ex:file2>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+  <!--
+Test shows that if we just change minOccurs on the item array to 0
+then the test hangs.
+-->
+  <tdml:parserTestCase name="csv_hang_3"
+                       model="s1">
+    <tdml:document><![CDATA[last,first,middle,DOB
+,preceded by an empty field,
+]]></tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <ex:file2 xmlns:ex="http://example.com">
+          <ex:header>
+            <ex:title>last</ex:title>
+            <ex:title>first</ex:title>
+            <ex:title>middle</ex:title>
+            <ex:title>DOB</ex:title>
+          </ex:header>
+          <ex:record>
+            <ex:item>preceded by an empty field</ex:item>
+          </ex:record>
+        </ex:file2>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+  </tdml:parserTestCase>
+
+
+</tdml:testSuite>
diff --git a/daffodil-test/src/test/scala/org/apache/daffodil/section07/discriminators/TestDiscriminators.scala b/daffodil-test/src/test/scala/org/apache/daffodil/section07/discriminators/TestDiscriminators.scala
index c19f503..9d6598f 100644
--- a/daffodil-test/src/test/scala/org/apache/daffodil/section07/discriminators/TestDiscriminators.scala
+++ b/daffodil-test/src/test/scala/org/apache/daffodil/section07/discriminators/TestDiscriminators.scala
@@ -25,6 +25,7 @@ object TestDiscriminators {
   val testDir = "/org/apache/daffodil/section07/discriminators/"
   val runner = Runner(testDir, "discriminator.tdml")
   val runner2 = Runner(testDir, "multipleDiscriminators.tdml")
+  val runner3 = Runner(testDir, "discriminator2.tdml")
 
   @AfterClass def shutDown(): Unit = {
     runner.reset
@@ -83,4 +84,11 @@ class TestDiscriminators {
   @Test def test_discrimPlacementSDW(): Unit = { runner.runOneTest("discrimPlacementSDW") }
   @Test def test_assertPlacementSDW(): Unit = { runner.runOneTest("assertPlacementSDW") }
 
+  @Test def test_nameDOB_test1(): Unit = { runner3.runOneTest("nameDOB_test1") }
+  @Test def test_nameDOB_test_bad_date_first_row(): Unit = { runner3.runOneTest("nameDOB_test_bad_date_first_row") }
+
+  // DAFFODIL-2486 - discriminator bug - interaction with separators
+  // @Test def test_nameDOB_test_bad_1(): Unit = { runner3.runOneTest("nameDOB_test_bad_1") }
+
+  @Test def test_nameDOB_test_bad_using_terminators(): Unit = { runner3.runOneTest("nameDOB_test_bad_using_terminators") }
 }
diff --git a/daffodil-test/src/test/scala/org/apache/daffodil/section14/sequence_groups/TestSequenceGroupNestedArray.scala b/daffodil-test/src/test/scala/org/apache/daffodil/section14/sequence_groups/TestSequenceGroupNestedArray.scala
new file mode 100644
index 0000000..7271d8e
--- /dev/null
+++ b/daffodil-test/src/test/scala/org/apache/daffodil/section14/sequence_groups/TestSequenceGroupNestedArray.scala
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.daffodil.section14.sequence_groups
+
+import org.junit.Test
+import org.apache.daffodil.tdml.Runner
+import org.junit.AfterClass
+
+object TestSequenceGroupNestedArray {
+
+  val testDir_01 = "/org/apache/daffodil/section14/sequence_groups/"
+
+  val runner = Runner(testDir_01, "SequenceGroupNestedArray.tdml")
+
+  @AfterClass def shutDown: Unit = {
+    runner.reset
+  }
+
+}
+
+class TestSequenceGroupNestedArray {
+
+  import TestSequenceGroupNestedArray._
+
+  @Test def test_csv_nohang_1(): Unit = { runner.runOneTest("csv_nohang_1") }
+  // DAFFODIL-2487 hang when minOccurs="0"
+  // @Test def test_csv_hang_1(): Unit = { runner.runOneTest("csv_hang_1") }
+  // @Test def test_csv_hang_2(): Unit = { runner.runOneTest("csv_hang_2") }
+  // @Test def test_csv_hang_3(): Unit = { runner.runOneTest("csv_hang_3") }
+
+
+}