| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.daffodil.dsom |
| |
| import scala.xml.{ XML, Utility, Node } |
| import org.junit.Test |
| import org.apache.daffodil.compiler._ |
| import org.apache.daffodil.Implicits._; object INoWarnDSOM1 { ImplicitsSuppressUnusedImportWarning() } |
| import org.apache.daffodil.schema.annotation.props.gen.{ YesNo, TextNumberRep, SeparatorPosition, Representation, OccursCountKind, NilKind, LengthKind, ChoiceLengthKind, ByteOrder, BinaryNumberRep, AlignmentUnits } |
| |
| import org.apache.daffodil.schema.annotation.props.AlignmentType |
| import org.apache.daffodil.util.{ Misc, Logging } |
| import org.apache.daffodil.xml.XMLUtils |
| import org.junit.Assert._ |
| import org.apache.daffodil.api.Diagnostic |
| import org.apache.daffodil.util._ |
| import org.junit.Test |
| import org.apache.daffodil.schema.annotation.props.Found |
| |
| class TestDsomCompiler extends Logging { |
| |
| val xsd = XMLUtils.XSD_NAMESPACE |
| val dfdl = XMLUtils.dfdlAppinfoSource // XMLUtils.DFDL_NAMESPACE |
| val xsi = XMLUtils.XSI_NAMESPACE |
| val example = XMLUtils.EXAMPLE_NAMESPACE |
| |
| // The below is lazy for a reason. |
| // It defers evaluation until used. This is nice because suppose there is a bug |
| // in the Fakes stuff. Then you want tests that use that to fail. But lots of |
| // these tests don't use this. If you make this an eager val, then if there |
| // is any problem in the Fakes, the whole class can't be constructed, and None |
| // of the tests will run. Lazy lets this class be constructed no matter what. |
| |
| @Test def testHasProps(): Unit = { |
| val testSchema = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format ref="tns:GeneralFormat"/>, |
| <xs:element name="list" type="tns:example1"/> |
| <xs:complexType name="example1"> |
| <xs:sequence> |
| <xs:element name="w" type="xs:int" dfdl:length="1" dfdl:lengthKind="explicit"/> |
| </xs:sequence> |
| </xs:complexType>) |
| |
| val compiler = Compiler() |
| val sset = compiler.compileNode(testSchema).sset |
| val Seq(schema) = sset.schemas |
| val Seq(schemaDoc, _) = schema.schemaDocuments |
| val Seq(decl) = schemaDoc.globalElementDecls.map { _.asRoot } |
| |
| val tnr = decl.textNumberRep |
| assertEquals(TextNumberRep.Standard, tnr) |
| } |
| |
| @Test def testSchemaValidationSubset(): Unit = { |
| val sch: Node = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format ref="tns:GeneralFormat"/>, |
| <xs:element name="list"> |
| <xs:complexType> |
| <xs:sequence maxOccurs="2"> |
| <!-- DFDL SUBSET DOESN'T ALLOW MULTIPLE RECURRING SEQUENCE OR CHOICE --> |
| <xs:element name="w" type="xsd:int" dfdl:lengthKind="explicit" dfdl:length="{ 1 }"/> |
| </xs:sequence> |
| </xs:complexType> |
| </xs:element>) |
| |
| val compiler = Compiler().withCheckAllTopLevel(true) |
| val sset = compiler.compileNode(sch).sset |
| assertTrue(sset.isError) |
| val diagnostics = sset.getDiagnostics.asInstanceOf[Seq[Diagnostic]] |
| val msgs = diagnostics.map { _.getMessage() } |
| val msg = msgs.mkString("\n") |
| val hasErrorText = msg.contains("maxOccurs"); |
| if (!hasErrorText) fail("Didn't get expected error. Got: " + msg) |
| } |
| |
| // FIXME: convert this test to TDML or discard. It is testing internal APIs |
| // and not defending itself from thrown exceptions the way the real APIs do (or |
| // are supposed to anyway. |
| @Test def testTypeReferentialError(): Unit = { |
| // LoggingDefaults.setLoggingLevel(LogLevel.OOLAGDebug) |
| val sch: Node = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format ref="tns:GeneralFormat"/>, |
| <xs:element name="list" type="typeDoesNotExist"/>) |
| val pf = Compiler().compileNode(sch) |
| assertTrue(pf.isError) |
| val msg = pf.getDiagnostics.toString |
| val hasErrorText = msg.contains("typeDoesNotExist"); |
| if (!hasErrorText) fail("Didn't get expected error. Got: " + msg) |
| } |
| |
| // FIXME - convert this test to TDML or drop if there is coverage other places. |
| @Test def testTypeReferentialError2(): Unit = { |
| val sch: Node = <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.com" xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/"> |
| <element name="foo" type="bar"/><!-- Illegal: no prefix on name of the type. --> |
| <complexType name="bar"> |
| <sequence/> |
| </complexType> |
| </schema> |
| val pf = Compiler().compileNode(sch) |
| assertTrue(pf.isError) |
| val msg = pf.getDiagnostics.toString |
| val hasErrorText = msg.contains("bar"); |
| if (!hasErrorText) fail("Didn't get expected error. Got: " + msg) |
| } |
| |
| @Test def testSchemaValidationPropertyChecking(): Unit = { |
| val s: Node = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format ref="tns:GeneralFormat"/>, |
| <xs:element name="list"> |
| <xs:complexType> |
| <xs:sequence> |
| <xs:element name="w" type="xsd:int" dfdl:byteOrder="invalidValue" dfdl:lengthKind="explicit" dfdl:length="{ 1 }"/> |
| </xs:sequence> |
| </xs:complexType> |
| </xs:element>) |
| val compiler = Compiler().withCheckAllTopLevel(true) |
| val sset = Compiler().compileNode(s).sset |
| sset.isError // forces compilation |
| val diags = sset.getDiagnostics |
| val msg = diags.toString |
| assertTrue(sset.isError) |
| val hasErrorText = msg.contains("invalidValue"); |
| if (!hasErrorText) fail("Didn't get expected error. Got: " + msg) |
| } |
| |
| @Test def test2(): Unit = { |
| val sc = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format ref="tns:GeneralFormat"/>, |
| |
| <xs:element name="list" type="tns:example1"> |
| <xs:annotation> |
| <xs:appinfo source={ dfdl }> |
| <dfdl:element encoding="US-ASCII" alignmentUnits="bytes"/> |
| </xs:appinfo> |
| </xs:annotation> |
| </xs:element> |
| <xs:complexType name="example1"> |
| <xs:sequence dfdl:separator=""> |
| <xs:element name="w" type="xs:int" dfdl:length="1" dfdl:lengthKind="explicit"/> |
| </xs:sequence> |
| </xs:complexType>) |
| |
| val sset = Compiler().compileNode(sc).sset |
| |
| val Seq(schema) = sset.schemas |
| val Seq(schemaDoc, _) = schema.schemaDocuments |
| val Seq(decl) = schemaDoc.globalElementDecls.map { _.asRoot } |
| val Seq(ct) = schemaDoc.globalComplexTypeDefs |
| assertEquals("example1", ct.name) |
| |
| decl.formatAnnotation.asInstanceOf[DFDLElement] |
| assertEquals(AlignmentUnits.Bytes, decl.alignmentUnits) |
| } |
| |
| @Test def testSequence1(): Unit = { |
| val testSchema = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format ref="tns:GeneralFormat"/>, |
| |
| <xs:element name="list" type="tns:example1"> |
| <xs:annotation> |
| <xs:appinfo source={ dfdl }> |
| <dfdl:element encoding="US-ASCII" alignmentUnits="bytes"/> |
| </xs:appinfo> |
| </xs:annotation> |
| </xs:element> |
| <xs:complexType name="example1"> |
| <xs:sequence dfdl:separatorSuppressionPolicy="never" dfdl:separator=""> |
| <xs:element name="w" type="xs:int" maxOccurs="1" dfdl:lengthKind="explicit" dfdl:length="1" dfdl:occursCountKind="fixed"/> |
| </xs:sequence> |
| </xs:complexType>) |
| |
| val w = Utility.trim(testSchema) |
| |
| val sset = Compiler().compileNode(w).sset |
| val Seq(schema) = sset.schemas |
| val Seq(schemaDoc, _) = schema.schemaDocuments |
| val geds @ Seq(_) = schemaDoc.globalElementDecls; assertNotNull(geds) |
| val Seq(ct) = schemaDoc.globalComplexTypeDefs |
| assertEquals("example1", ct.name) |
| |
| val mg = ct.modelGroup.asInstanceOf[Sequence] |
| assertTrue(mg.isInstanceOf[Sequence]) |
| |
| val Seq(elem) = mg.groupMembers |
| assertTrue(elem.isInstanceOf[LocalElementDecl]) |
| } |
| |
| @Test def test3: Unit = { |
| val testSchema = XML.load(Misc.getRequiredResource("/test/example-of-most-dfdl-constructs.dfdl.xml").toURL) |
| |
| val sset = new SchemaSet(testSchema) |
| val Seq(sch) = sset.schemas |
| val Seq(sd, _) = sch.schemaDocuments |
| |
| // No annotations |
| val Seq(gct) = sd.globalComplexTypeDefs |
| assertNotNull(gct) |
| |
| // Explore global element decl |
| val Seq(e1d, e2d, e3d, _, _) = sd.globalElementDecls // there are 3 factories |
| val e1 = e1d.asRoot |
| val e2 = e2d.asRoot |
| val e3 = e3d.asRoot |
| assertEquals( |
| ByteOrder.BigEndian.toString.toLowerCase(), |
| e1d.formatAnnotation.asInstanceOf[DFDLElement].getPropertyForUnitTest("byteOrder").toLowerCase()) |
| val Seq(_, a2) = e3d.annotationObjs // third one has two annotations |
| assertTrue(a2.isInstanceOf[DFDLAssert]) // second annotation is newVariableInstance |
| assertEquals(OccursCountKind.Implicit.toString, e3.getProperty("occursCountKind")) |
| // Explore local complex type def |
| val seq = e1.complexType.modelGroup.asInstanceOf[Sequence] //... which is a sequence |
| seq.formatAnnotation.asInstanceOf[DFDLSequence] //...annotated with... |
| assertEquals(YesNo.No, seq.initiatedContent) // initiatedContent="no" |
| |
| val Seq(e1a: DFDLElement) = e1d.annotationObjs |
| assertEquals("UTF-8", e1a.getPropertyForUnitTest("encoding")) |
| |
| // Explore global simple type defs |
| val Seq(st1, _, _, _) = sd.globalSimpleTypeDefs // there are two. |
| val Seq(b1, b2, _, b4) = st1.annotationObjs // first one has 4 annotations |
| assertEquals(AlignmentUnits.Bytes.toString.toLowerCase, b1.asInstanceOf[DFDLSimpleType].getPropertyForUnitTest("alignmentUnits")) // first has alignmentUnits |
| assertEquals("tns:myVar1", b2.asInstanceOf[DFDLSetVariable].ref) // second is setVariable with a ref |
| assertEquals("yadda yadda yadda", b4.asInstanceOf[DFDLAssert].messageAttrib.get) // fourth is an assert with yadda message |
| |
| // Explore define formats |
| val Seq(df1, _) = sd.defineFormats // there are two |
| val def1 = df1.asInstanceOf[DFDLDefineFormat] |
| assertEquals("def1", def1.name) // first is named "def1" |
| assertEquals(Representation.Text.toString.toLowerCase, def1.formatAnnotation.getPropertyForUnitTest("representation")) // has representation="text" |
| |
| // Explore define variables |
| val Seq(dv1, _) = sd.defineVariables // there are two |
| assertNotNull(dv1) |
| //assertEquals("2003年08月27日", dv2.asInstanceOf[DFDLDefineVariable].defaultValue) // second has kanji chars in default value |
| |
| // Explore define escape schemes |
| val Seq(desc1) = sd.defineEscapeSchemes // only one of these |
| val es = desc1.forComponent(e1a).escapeScheme.escapeCharacterRaw.asInstanceOf[Found].value |
| assertEquals("%%", es) // has escapeCharacter="%%" (note: string literals not digested yet, so %% is %%, not %. |
| |
| // Explore global group defs |
| val Seq(_, root, _*) = sd.globalElementDecls |
| val seq1 = root.complexType.modelGroup.asInstanceOf[SequenceGroupRef] |
| |
| val Seq(e1r: ElementRef, cgr: ChoiceGroupRef) = seq1.groupMembers |
| |
| val Seq(ggd1, ggd2, _, _, _) = sd.globalGroupDefs // there are two |
| assertEquals("gr", ggd1.namedQName.local) |
| assertEquals("hiddenGroup", ggd2.namedQName.local) |
| |
| //Explore LocalSimpleTypeDef |
| val Seq(c1: LocalElementDecl, _: LocalElementDecl, c3: LocalElementDecl, rest @ _*) = cgr.groupMembers |
| val ist = c3.asInstanceOf[LocalElementDecl].immediateType.get.asInstanceOf[LocalSimpleTypeDef] |
| val istBase = ist.optRestriction.get.baseQName.toQNameString |
| assertEquals("tns:aType", istBase) |
| |
| //Explore LocalElementDecl |
| assertEquals(1, c1.maxOccurs) |
| val Seq(c1a) = c1.annotationObjs |
| assertEquals("{ $myVar1 eq (+47 mod 4) }", c1a.asInstanceOf[DFDLDiscriminator].testBody.get) |
| |
| // Explore sequence |
| val Seq(ann: DFDLGroup) = seq1.annotationObjs // one format annotation with a property |
| assertNotNull(ann) |
| assertEquals(SeparatorPosition.Infix, seq1.separatorPosition) |
| assertEquals(2, e1r.maxOccurs) |
| assertEquals("ex:a", e1r.ref) |
| } |
| |
| @Test def test4: Unit = { |
| val testSchema = XML.load(Misc.getRequiredResource("/test/example-of-most-dfdl-constructs.dfdl.xml").toURL) |
| |
| val sset = new SchemaSet(testSchema) |
| val Seq(sch) = sset.schemas |
| val Seq(sd, _) = sch.schemaDocuments |
| |
| // Explore global group defs |
| val Seq(_, root, _*) = sd.globalElementDecls |
| val seq1 = root.complexType.modelGroup.asInstanceOf[SequenceGroupRef] |
| |
| val Seq(_: ElementRef, cgr: ChoiceGroupRef) = seq1.groupMembers |
| val cgd = cgr.groupDef |
| val Seq(_, cd2: LocalElementDecl, rest @ _*) = cgd.groupMembersNotShared // Children nodes of Choice-node, there are 3 |
| |
| // val Seq(a1: DFDLChoice) = ch1.annotationObjs // Obtain the annotation object that is a child |
| // of the group node. |
| |
| assertEquals(AlignmentType.Implicit, cgr.alignment) |
| assertEquals(ChoiceLengthKind.Implicit, cgr.choiceLengthKind) |
| |
| val Seq(asrt1: DFDLAssert) = cd2.annotationObjs // Obtain Annotation object that is child |
| // of cd2. |
| |
| assertEquals("{ $myVar1 eq xs:int(xs:string(fn:round-half-to-even(8.5))) }", asrt1.testTxt) |
| } |
| |
| @Test def test_named_format_chaining: Unit = { |
| val testSchema = |
| XML.load( |
| Misc.getRequiredResource( |
| "/test/example-of-named-format-chaining-and-element-simpleType-property-combining.dfdl.xml").toURL) |
| |
| val sset = new SchemaSet(testSchema) |
| val Seq(sch) = sset.schemas |
| val Seq(sd) = sch.schemaDocuments |
| |
| val Seq(a1d, _, _, _, _, _) = sd.globalElementDecls // Obtain global element nodes |
| val a1 = a1d.asRoot |
| assertEquals(true, a1.verifyPropValue("occursCountKind", "parsed")) |
| assertEquals(true, a1.verifyPropValue("lengthKind", "pattern")) |
| assertEquals(true, a1.verifyPropValue("representation", "text")) |
| assertEquals(true, a1.verifyPropValue("binaryNumberRep", "packed")) |
| } |
| |
| @Test def test_simple_types_access_works: Unit = { |
| val testSchema = |
| XML.load( |
| Misc.getRequiredResource( |
| "/test/example-of-named-format-chaining-and-element-simpleType-property-combining.dfdl.xml").toURL) |
| |
| val sset = new SchemaSet(testSchema) |
| val Seq(sch) = sset.schemas |
| val Seq(sd) = sch.schemaDocuments |
| |
| val Seq(_, x, _, _, _, _) = sd.globalElementDecls.map { _.asRoot } // Obtain global element nodes |
| |
| assertEquals(AlignmentUnits.Bytes, x.alignmentUnits) |
| } |
| |
| @Test def test_simple_types_property_combining: Unit = { |
| val testSchema = |
| XML.load( |
| Misc.getRequiredResource( |
| "/test/example-of-named-format-chaining-and-element-simpleType-property-combining.dfdl.xml").toURL) |
| |
| val sset = new SchemaSet(testSchema) |
| val Seq(sch) = sset.schemas |
| val Seq(sd) = sch.schemaDocuments |
| |
| val Seq(_, ge2, ge3, ge4, ge5, ge6) = sd.globalElementDecls.map { _.asRoot } // Obtain global element nodes |
| |
| assertEquals(AlignmentUnits.Bytes, ge2.alignmentUnits) |
| |
| assertEquals(AlignmentUnits.Bytes, ge3.alignmentUnits) |
| assertEquals(NilKind.LiteralValue, ge3.nilKind) |
| |
| // Tests overlapping properties |
| ge4.lengthKind |
| assertTrue(ge4.isError) |
| |
| assertEquals(AlignmentUnits.Bytes, ge5.alignmentUnits) // local |
| assertEquals(OccursCountKind.Parsed, ge5.occursCountKind) // def1 |
| assertEquals(BinaryNumberRep.Packed, ge5.binaryNumberRep) // def3 |
| assertEquals(NilKind.LiteralValue, ge5.nilKind) // local |
| assertEquals(Representation.Text, ge5.representation) // def3 |
| assertEquals(LengthKind.Pattern, ge5.lengthKind) // superseded by local |
| |
| // Test Defaulting |
| assertEquals(BinaryNumberRep.Packed, ge6.binaryNumberRep) |
| } |
| |
| @Test def test_simpleType_base_combining: Unit = { |
| val testSchema = XML.load(Misc.getRequiredResource("/test/example-of-most-dfdl-constructs.dfdl.xml").toURL) |
| |
| val sset = new SchemaSet(testSchema) |
| val Seq(sch) = sset.schemas |
| val root = sset.root |
| val Seq(sd, _) = sch.schemaDocuments |
| |
| // No annotations |
| val Seq(gct) = sd.globalComplexTypeDefs |
| assertNotNull(gct) |
| |
| // Explore global element decl |
| val Seq(e1f, e2f, e3f, _, _) = sd.globalElementDecls // there are 3 factories |
| val e1 = e1f.asRoot |
| e2f.asRoot |
| e3f.asRoot |
| |
| val Seq(gs1f, _, gs3f, _) = sd.globalSimpleTypeDefs |
| |
| val gs1 = gs1f // Global Simple Type - aType |
| |
| val baseQName = gs1.optRestriction.get.baseQName |
| |
| assertEquals("ex", baseQName.prefix.get) |
| assertEquals("aaType", baseQName.local) |
| |
| assertTrue(gs1.formatAnnotation.verifyPropValue("alignmentUnits", "bytes")) // SimpleType - Local |
| |
| assertTrue(e1.verifyPropValue("byteOrder", "bigEndian")) // SimpleType - Base |
| assertTrue(e1.verifyPropValue("occursCountKind", "implicit")) // Default Format |
| assertTrue(e1.verifyPropValue("representation", "text")) // Define Format - def1 |
| assertTrue(e1.verifyPropValue("encoding", "UTF-8")) // Define Format - def1 |
| assertTrue(e1.verifyPropValue("textStandardBase", "10")) // Define Format - def2 |
| assertTrue(e1.verifyPropValue("escapeSchemeRef", "tns:quotingScheme")) // Define Format - def2 |
| |
| val gs3 = gs3f // Global SimpleType - aTypeError - overlapping base props |
| |
| // Tests overlapping properties |
| // because these unit tests are outside the normal framework, |
| // we sometimes have to demand things in order for errors to be noticed. |
| assertTrue(root.isError) |
| val msgs = root.getDiagnostics.mkString("\n").toLowerCase |
| assertTrue(msgs.contains("overlap")) |
| assertTrue(msgs.contains("initiator".toLowerCase)) |
| } |
| |
| @Test def test_group_references: Unit = { |
| val testSchema = XML.load(Misc.getRequiredResource("/test/example-of-most-dfdl-constructs.dfdl.xml").toURL) |
| |
| val sset = new SchemaSet(testSchema) |
| val Seq(sch) = sset.schemas |
| val Seq(sd, _) = sch.schemaDocuments |
| |
| // No annotations |
| val Seq(g) = sd.globalComplexTypeDefs; |
| assertNotNull(g) |
| |
| // Explore global element decl |
| val Seq(_, _, _, e4f, e5f) = sd.globalElementDecls // there are 3 factories |
| |
| // GroupRefTest |
| val e4 = e4f.asRoot // groupRefTest |
| |
| val e4ct = e4.complexType |
| |
| val e4ctgref = e4ct.modelGroup.asInstanceOf[GroupRef] |
| |
| val myGlobal1Seq = e4ctgref.asInstanceOf[SequenceTermBase] |
| |
| val myGlobal2Seq = myGlobal1Seq.groupMembers(0).asInstanceOf[SequenceGroupRef] |
| |
| // myGlobal1 Properties |
| assertTrue(myGlobal1Seq.verifyPropValue("separator", ",")) |
| |
| // myGlobal2 Properties |
| assertTrue(myGlobal2Seq.verifyPropValue("separator", ";")) |
| assertTrue(myGlobal2Seq.verifyPropValue("separatorPosition", "infix")) |
| |
| // GroupRefTestOverlap |
| |
| val e5 = e5f.asRoot // groupRefTestOverlap |
| |
| val e5ct = e5.complexType |
| |
| val e5ctgref = e5ct.modelGroup.asInstanceOf[SequenceGroupRef] |
| val myGlobal3 = e5ctgref.groupDef |
| // val myGlobal3Seq = |
| myGlobal3.asInstanceOf[GlobalSequenceGroupDef] |
| |
| // Tests overlapping properties |
| assertTrue(e5.isError) |
| |
| val msg = e5.getDiagnostics.mkString("\n").toLowerCase |
| val res = msg.contains("overlap") |
| if (!res) println(msg) |
| assertTrue(res) |
| |
| } |
| |
| @Test def test_ibm_7132: Unit = { |
| val ibm7132Schema = XML.load(Misc.getRequiredResource("/test/TestRefChainingIBM7132.dfdl.xml").toURL) |
| // val ibm7132Schema = "test/TestRefChainingIBM7132.dfdl.xml" |
| val sset = new SchemaSet(ibm7132Schema) |
| // val Seq(sch) = sset.schemas |
| val Seq(sd) = sset.allSchemaDocuments |
| |
| val Seq(ge1f) = sd.globalElementDecls // Obtain global element nodes |
| val ge1 = ge1f.asRoot |
| |
| val f1 = ge1 |
| |
| assertTrue(f1.verifyPropValue("separatorPosition", "infix")) |
| assertTrue(f1.verifyPropValue("lengthKind", "implicit")) |
| assertFalse(f1.verifyPropValue("representation", "text")) |
| assertTrue(f1.verifyPropValue("textNumberRep", "standard")) |
| |
| val ct = ge1.complexType |
| val seq = ct.sequence |
| |
| val Seq(e1: ElementBase, _: ElementBase) = seq.groupMembers |
| // |
| assertTrue(e1.verifyPropValue("initiator", "")) |
| assertTrue(e1.verifyPropValue("representation", "text")) |
| |
| e1.lengthKind |
| } |
| |
| @Test def testDfdlRef(): Unit = { |
| val testSchema = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:defineFormat name="ref1"> <dfdl:format initiator=":"/> </dfdl:defineFormat>, |
| <xs:element name="e1" dfdl:lengthKind="implicit" dfdl:ref="tns:ref1" type="xs:string"> |
| </xs:element>) |
| val sset = new SchemaSet(testSchema) |
| val Seq(sch) = sset.schemas |
| val Seq(sd, _) = sch.schemaDocuments |
| |
| val Seq(ge1f) = sd.globalElementDecls // Obtain global element nodes |
| val ge1 = ge1f.asRoot |
| ge1.formatAnnotation.properties |
| |
| } |
| |
| @Test def testGetQName = { |
| val testSchema = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:defineFormat name="ref1"> |
| <dfdl:format initiator=":" alignmentUnits="bits"/> |
| </dfdl:defineFormat>, |
| <xs:element name="e1" dfdl:lengthKind="implicit" dfdl:ref="tns:ref1" type="xs:string"> |
| </xs:element>) |
| val sset = new SchemaSet(testSchema) |
| val Seq(sch) = sset.schemas |
| val Seq(sd, _) = sch.schemaDocuments |
| |
| val Seq(ge1f) = sd.globalElementDecls // Obtain global element nodes |
| val ge1 = ge1f.asRoot.referencedElement |
| |
| val qn = ge1.formatAnnotation.resolveQName("tns:ref1") |
| val nsURI = qn.namespace |
| val localName = qn.local |
| |
| assertEquals("ref1", localName) |
| assertEquals(XMLUtils.EXAMPLE_NAMESPACE, nsURI) |
| } |
| |
| @Test def testGetAllNamespaces(): Unit = { |
| val xml = <bar xmlns:foo="fooNS" xmlns:bar="barNS"> |
| <quux xmlns:baz="bazNS" attr1="x"/> |
| </bar> |
| |
| val scope = (xml \ "quux")(0).scope |
| scala.xml.Elem("dfdl", "element", scala.xml.Null, scope, true) |
| } |
| |
| @Test def test_escapeSchemeOverride = { |
| val testSchema = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format separator="" initiator="" terminator="" emptyValueDelimiterPolicy="none" textNumberRep="standard" representation="text" occursStopValue="-1" occursCountKind="expression" escapeSchemeRef="pound"/> |
| <dfdl:defineEscapeScheme name="pound"> |
| <dfdl:escapeScheme escapeCharacter='#' escapeKind="escapeCharacter"/> |
| </dfdl:defineEscapeScheme> |
| <dfdl:defineEscapeScheme name='cStyleComment'> |
| <dfdl:escapeScheme escapeBlockStart='/*' escapeBlockEnd='*/' escapeKind="escapeBlock"/> |
| </dfdl:defineEscapeScheme>, |
| <xs:element name="list"> |
| <xs:complexType> |
| <xs:sequence dfdl:sequenceKind="ordered"> |
| <xs:element name="character" type="xsd:string" maxOccurs="unbounded" dfdl:representation="text" dfdl:separator="," dfdl:terminator="%NL;"/> |
| <xs:element name="block" type="xsd:string" maxOccurs="unbounded" dfdl:representation="text" dfdl:separator="," dfdl:terminator="%NL;" dfdl:escapeSchemeRef="cStyleComment"/> |
| </xs:sequence> |
| </xs:complexType> |
| </xs:element>) |
| val sset = new SchemaSet(testSchema) |
| val Seq(sch) = sset.schemas |
| val Seq(sd, _) = sch.schemaDocuments |
| |
| val Seq(ge1f) = sd.globalElementDecls // Obtain global element nodes |
| val ge1 = ge1f.asRoot.referencedElement |
| |
| val seq = ge1.sequence |
| |
| val Seq(e1: LocalElementDecl, e2: LocalElementDecl) = seq.groupMembers |
| e1.formatAnnotation.asInstanceOf[DFDLElement] |
| // val props = e1.properties |
| |
| val e1f_esref = e1.getProperty("escapeSchemeRef") |
| |
| assertEquals("pound", e1f_esref) |
| |
| // Should have escapeCharacter and escapeKind |
| |
| e2.formatAnnotation.asInstanceOf[DFDLElement] |
| val e2f_esref = e2.getProperty("escapeSchemeRef") |
| // escapeBlockStart/End escapeBlockKind (NOTHING ELSE) |
| assertEquals("cStyleComment", e2f_esref) |
| } |
| |
| @Test def test_element_references: Unit = { |
| val testSchema = XML.load(Misc.getRequiredResource("/test/example-of-most-dfdl-constructs.dfdl.xml").toURL) |
| |
| val sset = new SchemaSet(testSchema) |
| val Seq(sch) = sset.schemas |
| val Seq(sd, _) = sch.schemaDocuments |
| |
| val Seq(_, gedf, _*) = sd.globalElementDecls |
| val root = gedf.asRoot |
| val sgr = root.complexType.modelGroup.asInstanceOf[SequenceGroupRef] |
| |
| val Seq(e1r: ElementRef, cgr: ChoiceGroupRef) = sgr.groupMembers |
| |
| assertEquals("hiddenGroup", cgr.groupDef.namedQName.local) |
| assertEquals(AlignmentType.Implicit, cgr.alignment) |
| |
| assertEquals(2, e1r.maxOccurs) |
| assertEquals(1, e1r.minOccurs) |
| assertEquals(AlignmentUnits.Bytes, e1r.alignmentUnits) |
| //assertEquals(true, e1.nillable) // TODO: e1.nillable doesn't exist? |
| //assertEquals("%ES; %% %#0; %NUL;%ACK; foo%#rF2;%#rF7;bar %WSP*; %#2024;%#xAABB; &ߧ쳝 -1", e1.nilValue) // TODO: Do not equal each other! |
| assertEquals(NilKind.LiteralValue, e1r.nilKind) |
| } |
| |
| @Test def testPathWithIndexes(): Unit = { |
| val testSchema = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format ref="tns:GeneralFormat"/>, |
| <xs:element name="r" type="tns:myType"/> |
| <xs:complexType name="myType"> |
| <xs:sequence> |
| <xs:sequence/> |
| <xs:sequence/> |
| <xs:sequence> |
| <xs:element name="s" type="xs:int"/> |
| </xs:sequence> |
| </xs:sequence> |
| </xs:complexType>) |
| val sset = new SchemaSet(testSchema) |
| val Seq(sch) = sset.schemas |
| val Seq(sd, _) = sch.schemaDocuments |
| |
| val Seq(ge1f) = sd.globalElementDecls // Obtain global element nodes |
| val ge1 = ge1f.asRoot.referencedElement |
| |
| val seq = ge1.sequence |
| |
| val Seq(_, _, s3) = seq.groupMembers |
| val s3s = s3.asInstanceOf[Sequence] |
| val Seq(es) = s3s.groupMembers |
| val ese = es.asInstanceOf[LocalElementDecl] |
| assertTrue(ese.path.contains("sequence[3]")) |
| } |
| |
| val dummyGroupRef = null // just because otherwise we have to construct too many things. |
| |
| def FindValue(collection: Map[String, String], key: String, value: String): Boolean = { |
| val found: Boolean = Option(collection.find(x => x._1 == key && x._2 == value)) match { |
| case Some(_) => true |
| case None => false |
| } |
| found |
| } |
| |
| @Test def testInitiator(): Unit = { |
| val testSchema = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format ref="tns:GeneralFormat"/>, |
| <xs:element name="data" type="xs:string" dfdl:initiator="*" dfdl:lengthKind="explicit" dfdl:length="{ 4 }"/>) |
| // val actual = TestUtils.testString(testSchema, "*word") |
| // val actualString = actual.result.toString |
| // assertTrue(actualString.startsWith("<data")) |
| // assertTrue(actualString.endsWith(">word</data>")) |
| |
| val infoset = <data xmlns={ example }>word</data> |
| TestUtils.testUnparsing(testSchema, infoset, "*word") |
| } |
| |
| @Test def testTerminator(): Unit = { |
| // LoggingDefaults.setLoggingLevel(LogLevel.Debug) |
| val testSchema = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format ref="tns:GeneralFormat"/>, |
| <xs:element name="data" type="xs:string" dfdl:terminator="!" dfdl:lengthKind="explicit" dfdl:length="{ 2 }"/>) |
| // val actual = TestUtils.testString(testSchema, "37!") |
| // val actualString = actual.result.toString |
| // assertTrue(actualString.startsWith("<data")) |
| // assertTrue(actualString.endsWith(">37</data>")) |
| |
| val infoset = <data xmlns={ example }>37</data> |
| TestUtils.testUnparsing(testSchema, infoset, "37!") |
| } |
| |
| @Test def testDelims(): Unit = { |
| val testSchema = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format ref="tns:GeneralFormat"/>, |
| <xs:element name="data" type="xs:string" dfdl:initiator="*" dfdl:terminator="! $" dfdl:lengthKind="explicit" dfdl:length="{ 2 }"/>) |
| // val actual = TestUtils.testString(testSchema, "*37$") |
| // val actualString = actual.result.toString |
| // assertTrue(actualString.startsWith("<data")) |
| // assertTrue(actualString.endsWith(">37</data>")) |
| |
| val infoset = <data xmlns={ example }>37</data> |
| TestUtils.testUnparsing(testSchema, infoset, "*37!") |
| } |
| |
| // @Test def testUnparseMultiElem1() { |
| // val testSchema = SchemaUtils.dfdlTestSchema( |
| // <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| // <dfdl:format ref="tns:GeneralFormat"/>, |
| // |
| // <xs:element name="list" type="tns:example1"> |
| // <xs:annotation> |
| // <xs:appinfo source={ dfdl }> |
| // <dfdl:element alignmentUnits="bytes"/> |
| // </xs:appinfo> |
| // </xs:annotation> |
| // </xs:element> |
| // <xs:complexType name="example1"> |
| // <xs:sequence> |
| // <xs:element name="somedata" type="xs:float" dfdl:length="6" dfdl:lengthKind="explicit"/> |
| // <xs:element name="moredata" type="xs:int" dfdl:length="2" dfdl:lengthKind="explicit"/> |
| // </xs:sequence> |
| // </xs:complexType>) |
| // // val actual = TestUtils.testString(testSchema, "943.2801") |
| // // val actualString = actual.result.toString |
| // // assertTrue(actualString.startsWith("<list")) |
| // // assertTrue(actualString.endsWith("><somedata>943.28</somedata><moredata>1</moredata></list>")) |
| // |
| // val infoset = <list xmlns={ example }><somedata>943.28</somedata><moredata>1</moredata></list> |
| // // TODO: unparse needs to restore leading zeros removed in parse? |
| // //testUnparsing(testSchema, infoset, "943.2801") |
| // TestUtils.testUnparsing(testSchema, infoset, "943.281") |
| // } |
| |
| @Test def testUnparseMultiElem2(): Unit = { |
| val testSchema = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format ref="tns:GeneralFormat"/>, |
| |
| <xs:element name="list" type="tns:example1"> |
| <xs:annotation> |
| <xs:appinfo source={ dfdl }> |
| <dfdl:element alignmentUnits="bytes"/> |
| </xs:appinfo> |
| </xs:annotation> |
| </xs:element> |
| <xs:complexType name="example1"> |
| <xs:sequence dfdl:separator="^"> |
| <xs:element name="somedata" type="xs:double" dfdl:length="5" dfdl:lengthKind="explicit"/> |
| <xs:element name="moredata" type="xs:string" dfdl:length="3" dfdl:lengthKind="explicit" dfdl:initiator="%%"/> |
| <xs:element name="anddata" type="xs:int" dfdl:length="2" dfdl:lengthKind="explicit"/> |
| </xs:sequence> |
| </xs:complexType>) |
| // val actual = TestUtils.testString(testSchema, "50.93^%XYZ^42") |
| // val actualString = actual.result.toString |
| // assertTrue(actualString.startsWith("<list")) |
| // assertTrue(actualString.endsWith("><somedata>50.93</somedata><moredata>XYZ</moredata><anddata>42</anddata></list>")) |
| |
| val infoset = <list xmlns={ example }><somedata>50.93</somedata><moredata>XYZ</moredata><anddata>42</anddata></list> |
| TestUtils.testUnparsing(testSchema, infoset, "50.93^%XYZ^42") |
| } |
| |
| // @Test def testUnparseNested() { |
| // val testSchema = SchemaUtils.dfdlTestSchema( |
| // <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| // <dfdl:format ref="tns:GeneralFormat"/>, |
| // |
| // <xs:element name="list" type="tns:example1"> |
| // <xs:annotation> |
| // <xs:appinfo source={ dfdl }> |
| // <dfdl:element alignmentUnits="bytes"/> |
| // </xs:appinfo> |
| // </xs:annotation> |
| // </xs:element> |
| // <xs:complexType name="example1"> |
| // <xs:sequence> |
| // <xs:element name="somedata" type="tns:example2"> |
| // <xs:annotation> |
| // <xs:appinfo source={ dfdl }> |
| // <dfdl:element alignmentUnits="bytes"/> |
| // </xs:appinfo> |
| // </xs:annotation> |
| // </xs:element> |
| // </xs:sequence> |
| // </xs:complexType> |
| // <xs:complexType name="example2"> |
| // <xs:sequence> |
| // <xs:element name="moredata" type="xs:double" dfdl:length="7" dfdl:lengthKind="explicit"/> |
| // <xs:element name="anddata" type="xs:string" dfdl:length="6" dfdl:lengthKind="explicit"/> |
| // </xs:sequence> |
| // </xs:complexType>) |
| // // val actual = TestUtils.testString(testSchema, "11235.8qwerty") |
| // // val actualString = actual.result.toString |
| // // assertTrue(actualString.startsWith("<list")) |
| // // assertTrue(actualString.endsWith("><somedata><moredata>11235.8</moredata><anddata>qwerty</anddata></somedata></list>")) |
| // |
| // val infoset = <list xmlns={ example }><somedata><moredata>11235.8</moredata><anddata>qwerty</anddata></somedata></list> |
| // TestUtils.testUnparsing(testSchema, infoset, "11235.8qwerty") |
| // } |
| |
| // // @Test def testUnparseNestedChildren() { |
| // val testSchema = SchemaUtils.dfdlTestSchema( |
| // <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| // <dfdl:format ref="tns:GeneralFormat"/>, |
| // |
| // <xs:element name="list" type="tns:example1"> |
| // <xs:annotation> |
| // <xs:appinfo source={ dfdl }> |
| // <dfdl:element alignmentUnits="bytes"/> |
| // </xs:appinfo> |
| // </xs:annotation> |
| // </xs:element> |
| // <xs:complexType name="example1"> |
| // <xs:sequence> |
| // <xs:element name="data" type="tns:example2"> |
| // <xs:annotation> |
| // <xs:appinfo source={ dfdl }> |
| // <dfdl:element alignmentUnits="bytes"/> |
| // </xs:appinfo> |
| // </xs:annotation> |
| // </xs:element> |
| // </xs:sequence> |
| // </xs:complexType> |
| // <xs:complexType name="example2"> |
| // <xs:sequence> |
| // <xs:element name="somedata" type="xs:string" dfdl:length="3" dfdl:lengthKind="explicit"/> |
| // <xs:element name="moredata" type="xs:int" dfdl:length="8" dfdl:lengthKind="explicit"/> |
| // </xs:sequence> |
| // </xs:complexType>) |
| // // val actual = TestUtils.testString(testSchema, "abc87654321") |
| // // val actualString = actual.result.toString |
| // // assertTrue(actualString.startsWith("<list")) |
| // // assertTrue(actualString.endsWith("><data><somedata>abc</somedata><moredata>87654321</moredata></data></list>")) |
| // |
| // val infoset = <list xmlns={ example }><data><somedata>abc</somedata><moredata>87654321</moredata></data></list> |
| // TestUtils.testUnparsing(testSchema, infoset, "abc87654321") |
| // } |
| |
| // @Test def testUnparseDelimited() { |
| // val testSchema = SchemaUtils.dfdlTestSchema( |
| // <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| // <dfdl:format ref="tns:GeneralFormat"/>, |
| // |
| // <xs:element name="list" type="tns:example1"> |
| // <xs:annotation> |
| // <xs:appinfo source={ dfdl }> |
| // <dfdl:element alignmentUnits="bytes"/> |
| // </xs:appinfo> |
| // </xs:annotation> |
| // </xs:element> |
| // <xs:complexType name="example1"> |
| // <xs:sequence dfdl:separator=","> |
| // <xs:element name="a" type="xs:int" dfdl:lengthKind="delimited"/> |
| // <xs:element name="b" type="xs:double" dfdl:lengthKind="delimited"/> |
| // <xs:element name="c" type="xs:string" dfdl:lengthKind="delimited"/> |
| // <xs:element name="d" type="xs:int" dfdl:lengthKind="delimited"/> |
| // </xs:sequence> |
| // </xs:complexType>) |
| // // val actual = TestUtils.testString(testSchema, "246813579,90.3761,hello,100") |
| // // val actualString = actual.result.toString |
| // // assertTrue(actualString.startsWith("<list")) |
| // // assertTrue(actualString.endsWith("><a>246813579</a><b>90.3761</b><c>hello</c><d>100</d></list>")) |
| // |
| // val infoset = <list xmlns={ example }><a>246813579</a><b>90.3761</b><c>hello</c><d>100</d></list> |
| // TestUtils.testUnparsing(testSchema, infoset, "246813579,90.3761,hello,100") |
| // } |
| |
| // @Test def testUnparseAlignmentBits() { |
| // val testSchema = SchemaUtils.dfdlTestSchema( |
| // <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| // <dfdl:format ref="tns:GeneralFormat"/>, |
| // |
| // <xs:element name="list" type="tns:example1"> |
| // <xs:annotation> |
| // <xs:appinfo source={ dfdl }> |
| // <dfdl:element alignmentUnits="bits"/> |
| // </xs:appinfo> |
| // </xs:annotation> |
| // </xs:element> |
| // <xs:complexType name="example1"> |
| // <xs:sequence dfdl:separator=","> |
| // <xs:element name="a" type="xs:int" dfdl:lengthKind="delimited"/> |
| // <xs:element name="b" type="xs:double" dfdl:lengthKind="delimited"/> |
| // <xs:element name="c" type="xs:string" dfdl:length="3" dfdl:lengthKind="explicit"/> |
| // <xs:element name="d" type="xs:int" dfdl:length="8" dfdl:lengthKind="explicit"/> |
| // </xs:sequence> |
| // </xs:complexType>) |
| // |
| // val infoset = <list xmlns={ example }><a>246813579</a><b>90.3761</b><c>abc</c><d>10034567</d></list> |
| // TestUtils.testUnparsing(testSchema, infoset, "246813579,90.3761,abc,10034567") |
| // } |
| |
| // @Test def testUnparseChoice1() { |
| // val testSchema = SchemaUtils.dfdlTestSchema( |
| // <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| // <dfdl:format ref="tns:GeneralFormat"/>, |
| // |
| // <xs:element name="list" type="tns:example1"> |
| // <xs:annotation> |
| // <xs:appinfo source={ dfdl }> |
| // <dfdl:element alignmentUnits="bits"/> |
| // </xs:appinfo> |
| // </xs:annotation> |
| // </xs:element> |
| // <xs:complexType name="example1"> |
| // <xs:sequence dfdl:separator=","> |
| // <xs:element name="a" type="xs:int" dfdl:lengthKind="explicit" dfdl:length="3"/> |
| // <xs:element name="b" type="xs:string" dfdl:lengthKind="explicit" dfdl:length="4"/> |
| // <xs:element name="choice"> |
| // <xs:complexType> |
| // <xs:choice dfdl:choiceLengthKind="implicit"> |
| // <xs:element name="c" type="xs:int" dfdl:initiator="choice1:" dfdl:lengthKind="explicit" dfdl:length="{ 7 }"/> |
| // <xs:element name="d" type="xs:double" dfdl:initiator="choice2:" dfdl:lengthKind="explicit" dfdl:length="{ 7 }"/> |
| // </xs:choice> |
| // </xs:complexType> |
| // </xs:element> |
| // </xs:sequence> |
| // </xs:complexType>) |
| // // val actual = TestUtils.testString(testSchema, "567,word,choice1:203867") |
| // // val actualString = actual.result.toString |
| // // assertTrue(actualString.startsWith("<list")) |
| // // assertTrue(actualString.endsWith("><a>567</a><b>word</b><choice><c>203867</c></choice></list>")) |
| // |
| // val infoset = <list xmlns={ example }><a>567</a><b>word</b><choice><c>203867</c></choice></list> |
| // TestUtils.testUnparsing(testSchema, infoset, "567,word,choice1:203867") |
| // } |
| |
| // @Test def testUnparseChoice2() { |
| // val testSchema = SchemaUtils.dfdlTestSchema( |
| // <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| // <dfdl:format ref="tns:GeneralFormat"/>, |
| // |
| // <xs:element name="list" type="tns:example1"> |
| // <xs:annotation> |
| // <xs:appinfo source={ dfdl }> |
| // <dfdl:element alignmentUnits="bits"/> |
| // </xs:appinfo> |
| // </xs:annotation> |
| // </xs:element> |
| // <xs:complexType name="example1"> |
| // <xs:sequence dfdl:separator=","> |
| // <xs:element name="a" type="xs:int" dfdl:lengthKind="explicit" dfdl:length="3"/> |
| // <xs:element name="b" type="xs:string" dfdl:lengthKind="explicit" dfdl:length="4"/> |
| // <xs:element name="choice"> |
| // <xs:complexType> |
| // <xs:choice dfdl:choiceLengthKind="implicit"> |
| // <xs:element name="c" type="xs:int" dfdl:initiator="choice1:" dfdl:lengthKind="explicit" dfdl:length="{ 7 }"/> |
| // <xs:element name="d" type="xs:double" dfdl:initiator="choice2:" dfdl:lengthKind="explicit" dfdl:length="{ 7 }"/> |
| // </xs:choice> |
| // </xs:complexType> |
| // </xs:element> |
| // </xs:sequence> |
| // </xs:complexType>) |
| // // val actual = TestUtils.testString(testSchema, "567,word,choice2:2038.67") |
| // // val actualString = actual.result.toString |
| // // assertTrue(actualString.startsWith("<list")) |
| // // assertTrue(actualString.endsWith("><a>567</a><b>word</b><choice><d>2038.67</d></choice></list>")) |
| // |
| // val infoset = <list xmlns={ example }><a>567</a><b>word</b><choice><d>2038.67</d></choice></list> |
| // TestUtils.testUnparsing(testSchema, infoset, "567,word,choice2:2038.67") |
| // } |
| |
| @Test def testUnparseBinaryIntBE(): Unit = { |
| val testSchema = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format ref="tns:GeneralFormat"/>, |
| <xs:element name="data" type="xs:int" dfdl:representation="binary"/>) |
| // val actual = TestUtils.testBinary(testSchema, "0000000F") |
| // val actualString = actual.result.toString |
| // assertTrue(actualString.startsWith("<data")) |
| // assertTrue(actualString.endsWith(">15</data>")) |
| |
| val infoset = <data xmlns={ example }>15</data> |
| val bytes = List[Byte](0, 0, 0, 15).toArray |
| TestUtils.testUnparsingBinary(testSchema, infoset, bytes) |
| } |
| |
| @Test def testUnparseBinaryIntLE(): Unit = { |
| val testSchema = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format ref="tns:GeneralFormat"/>, |
| <xs:element name="data" type="xs:int" dfdl:representation="binary" dfdl:byteOrder='littleEndian'/>) |
| // val actual = TestUtils.testBinary(testSchema, "0F000000") |
| // val actualString = actual.result.toString |
| // assertTrue(actualString.startsWith("<data")) |
| // assertTrue(actualString.endsWith(">15</data>")) |
| |
| val infoset = <data xmlns={ example }>15</data> |
| val bytes = List[Byte](15, 0, 0, 0).toArray |
| TestUtils.testUnparsingBinary(testSchema, infoset, bytes) |
| } |
| |
| // @Test def testUnparseBinary1() { |
| // val testSchema = SchemaUtils.dfdlTestSchema( |
| // <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| // <dfdl:format ref="tns:GeneralFormat"/>, |
| // |
| // <xs:element name="list" type="tns:example1"> |
| // <xs:annotation> |
| // <xs:appinfo source={ dfdl }> |
| // <dfdl:element alignmentUnits="bytes"/> |
| // </xs:appinfo> |
| // </xs:annotation> |
| // </xs:element> |
| // <xs:complexType name="example1"> |
| // <xs:sequence dfdl:separator=""> |
| // <xs:element name="byte" type="xs:byte" dfdl:length="2" dfdl:lengthKind="explicit" dfdl:representation="binary"/> |
| // <xs:element name="short" type="xs:short" dfdl:length="4" dfdl:lengthKind="explicit" dfdl:representation="binary"/> |
| // <xs:element name="long" type="xs:long" dfdl:length="4" dfdl:lengthKind="explicit" dfdl:representation="binary"/> |
| // </xs:sequence> |
| // </xs:complexType>) |
| // |
| // val infoset = <list xmlns={ example }><byte>31</byte><short>-112</short><long>1030</long></list> |
| // val bytes = List[Byte](31, -1, -112, 0, 0, 0, 0, 0, 0, 4, 6).toArray |
| // TestUtils.testUnparsingBinary(testSchema, infoset, bytes) |
| // } |
| |
| @Test def testHasPatternFacets(): Unit = { |
| val testSchema = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format ref="tns:GeneralFormat"/>, |
| <xs:element name="e1" type="tns:st1" dfdl:lengthKind="explicit" dfdl:length="1"/> |
| <xs:simpleType name="st1"> |
| <xs:restriction base="xs:string"> |
| <xs:pattern value="1"/> |
| <xs:pattern value="2"/> |
| <xs:pattern value="3"/> |
| </xs:restriction> |
| </xs:simpleType>) |
| |
| val compiler = Compiler() |
| val sset = compiler.compileNode(testSchema).sset |
| val Seq(schema) = sset.schemas |
| val Seq(schemaDoc, _) = schema.schemaDocuments |
| val Seq(declf) = schemaDoc.globalElementDecls |
| val decl = declf.asRoot |
| |
| assertEquals(1, decl.patternValues.length) |
| val (_, pattern) = decl.patternValues(0) |
| assertEquals("1|2|3", pattern.toString()) |
| } |
| |
| @Test def testPatternFacetsInheritance(): Unit = { |
| val testSchema = SchemaUtils.dfdlTestSchema( |
| <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>, |
| <dfdl:format ref="tns:GeneralFormat"/>, |
| <xs:element name="e1" type="tns:st1" dfdl:lengthKind="explicit" dfdl:length="1"/> |
| <xs:simpleType name="st1"> |
| <xs:restriction base="tns:st2"> |
| <xs:pattern value="1"/> |
| <xs:pattern value="2"/> |
| <xs:pattern value="3"/> |
| </xs:restriction> |
| </xs:simpleType> |
| <xs:simpleType name="st2"> |
| <xs:restriction base="tns:st3"> |
| <xs:pattern value="4"/> |
| <xs:pattern value="5"/> |
| <xs:pattern value="6"/> |
| </xs:restriction> |
| </xs:simpleType> |
| <xs:simpleType name="st3"> |
| <xs:restriction base="xs:string"> |
| <xs:pattern value="7"/> |
| <xs:pattern value="8"/> |
| <xs:pattern value="9"/> |
| </xs:restriction> |
| </xs:simpleType>) |
| |
| val compiler = Compiler() |
| val sset = compiler.compileNode(testSchema).sset |
| val Seq(schema) = sset.schemas |
| val Seq(schemaDoc, _) = schema.schemaDocuments |
| val Seq(declf) = schemaDoc.globalElementDecls |
| val decl = declf.asRoot |
| |
| assertEquals(3, decl.patternValues.length) |
| val (_, st1) = decl.patternValues(0) |
| val (_, st2) = decl.patternValues(1) |
| val (_, st3) = decl.patternValues(2) |
| |
| assertEquals("1|2|3", st1.toString()) |
| assertEquals("4|5|6", st2.toString()) |
| assertEquals("7|8|9", st3.toString()) |
| } |
| |
| } |