public void CollectionWithHeterogenousItemsTest() { EdmModel edmModel = new EdmModel(); EdmComplexType edmComplexTypeMyComplexType = edmModel.ComplexType("MyComplexType", ModelNamespace); edmComplexTypeMyComplexType.Property("P1", EdmPrimitiveTypeKind.Int32, false).Property("P2", EdmPrimitiveTypeKind.String, true); edmModel.Fixup(); var edmCollectionTypeOfIntegerType = new EdmCollectionType(EdmCoreModel.Instance.GetInt32(false)); var edmCollectionTypeOfStringType = new EdmCollectionType(EdmCoreModel.Instance.GetString(true)); IEnumerable <PayloadReaderTestDescriptor> testDescriptors = new[] { // Primitive collection with complex item new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.PrimitiveMultiValue(EntityModelUtils.GetCollectionTypeName("Edm.String")) .XmlValueRepresentation("<m:element><d:P1>0</d:P1><d:P2>Foo</d:P2></m:element>", EntityModelUtils.GetCollectionTypeName("Edm.String"), null) .WithTypeAnnotation(edmCollectionTypeOfStringType), PayloadEdmModel = edmModel, ExpectedException = ODataExpectedExceptions.ODataException("XmlReaderExtension_InvalidNodeInStringValue", "Element"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.PrimitiveMultiValue(EntityModelUtils.GetCollectionTypeName("Edm.Int32")) .XmlValueRepresentation("<m:element>0</m:element><m:element><d:P1>0</d:P1><d:P2>Foo</d:P2></m:element>", EntityModelUtils.GetCollectionTypeName("Edm.Int32"), null) .WithTypeAnnotation(edmCollectionTypeOfIntegerType), PayloadEdmModel = edmModel, ExpectedException = ODataExpectedExceptions.ODataException("XmlReaderExtension_InvalidNodeInStringValue", "Element"), }, // Complex collection with primitive item // Note - the text nodes (of the primitive items) are ignored in complex values - leaving empty complex values new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.ComplexMultiValue(EntityModelUtils.GetCollectionTypeName("TestModel.MyComplexType")) .Item(PayloadBuilder.ComplexValue("TestModel.MyComplexType").PrimitiveProperty("P1", 987).AddAnnotation(new SerializationTypeNameTestAnnotation() { TypeName = null })) .Item(PayloadBuilder.ComplexValue("TestModel.MyComplexType").PrimitiveProperty("P1", 123).AddAnnotation(new SerializationTypeNameTestAnnotation() { TypeName = null })) .XmlValueRepresentation("<m:element>Foo<d:P1>987</d:P1></m:element><m:element><d:P1>123</d:P1>Bar</m:element>", EntityModelUtils.GetCollectionTypeName("TestModel.MyComplexType"), null), PayloadEdmModel = edmModel, }, // Primitive collection containing a primitive and a nested collection new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.PrimitiveMultiValue(EntityModelUtils.GetCollectionTypeName("Edm.String")) .XmlValueRepresentation("<m:element>Foo</m:element><m:element><m:element>0</m:element><m:element>1</m:element></m:element>", EntityModelUtils.GetCollectionTypeName("Edm.String"), null) .WithTypeAnnotation(edmCollectionTypeOfStringType), PayloadEdmModel = edmModel, ExpectedException = ODataExpectedExceptions.ODataException("XmlReaderExtension_InvalidNodeInStringValue", "Element"), }, }; testDescriptors = testDescriptors.Select(td => td.InProperty()); this.CombinatorialEngineProvider.RunCombinations( testDescriptors, this.ReaderTestConfigurationProvider.AtomFormatConfigurations, (testDescriptor, testConfiguration) => { testDescriptor.RunTest(testConfiguration); }); }
public void CollectionValueTest() { EdmModel edmModel = new EdmModel(); EdmComplexType edmComplexTypeMyComplexType = edmModel.ComplexType("MyComplexType", ModelNamespace); edmComplexTypeMyComplexType.Property("P1", EdmPrimitiveTypeKind.Int32, false).Property("P2", EdmPrimitiveTypeKind.String, true); edmModel.Fixup(); var edmCollectionTypeOfIntegerType = new EdmCollectionType(EdmCoreModel.Instance.GetInt32(false)); var edmCollectionTypeOfMyComplexType = new EdmCollectionType(new EdmComplexTypeReference(edmComplexTypeMyComplexType, true)); // Create payloads of the collection properties IEnumerable <PayloadReaderTestDescriptor> testDescriptors = new[] { // Empty element collection new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.PrimitiveMultiValue(EntityModelUtils.GetCollectionTypeName("Edm.Int32")) .XmlValueRepresentation(new XNode[0]) .WithTypeAnnotation(edmCollectionTypeOfIntegerType), PayloadEdmModel = edmModel, }, // Collections containing collections are not supported new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.PrimitiveMultiValue() .XmlValueRepresentation("<m:element />", EntityModelUtils.GetCollectionTypeName(EntityModelUtils.GetCollectionTypeName("Edm.String")), null) .WithTypeAnnotation(edmCollectionTypeOfIntegerType), PayloadEdmModel = edmModel, ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_NestedCollectionsAreNotSupported"), }, }; var primitivePayloadsWithPadding = new CollectionPaddingPayloadTextCase <PrimitiveMultiValue>[] { new CollectionPaddingPayloadTextCase <PrimitiveMultiValue> { XmlValue = "{0}", PayloadElement = PayloadBuilder.PrimitiveMultiValue(EntityModelUtils.GetCollectionTypeName("Edm.Int32")) .WithTypeAnnotation(edmCollectionTypeOfIntegerType) }, new CollectionPaddingPayloadTextCase <PrimitiveMultiValue> { XmlValue = "{0}<m:element>42</m:element>", PayloadElement = PayloadBuilder.PrimitiveMultiValue(EntityModelUtils.GetCollectionTypeName("Edm.Int32")) .Item(42) .WithTypeAnnotation(edmCollectionTypeOfIntegerType) }, new CollectionPaddingPayloadTextCase <PrimitiveMultiValue> { XmlValue = "<m:element>42</m:element>{0}", PayloadElement = PayloadBuilder.PrimitiveMultiValue(EntityModelUtils.GetCollectionTypeName("Edm.Int32")) .Item(42) .WithTypeAnnotation(edmCollectionTypeOfIntegerType) }, }; var complexPayloadsWithPadding = new CollectionPaddingPayloadTextCase <ComplexMultiValue>[] { new CollectionPaddingPayloadTextCase <ComplexMultiValue> { XmlValue = "<m:element><d:P1>42</d:P1></m:element>{0}<m:element><d:P2>test</d:P2></m:element>", PayloadElement = PayloadBuilder.ComplexMultiValue(EntityModelUtils.GetCollectionTypeName("TestModel.MyComplexType")) .Item(PayloadBuilder.ComplexValue("TestModel.MyComplexType").PrimitiveProperty("P1", 42).AddAnnotation(new SerializationTypeNameTestAnnotation() { TypeName = null })) .Item(PayloadBuilder.ComplexValue("TestModel.MyComplexType").PrimitiveProperty("P2", "test").AddAnnotation(new SerializationTypeNameTestAnnotation() { TypeName = null })) .WithTypeAnnotation(edmCollectionTypeOfMyComplexType) }, }; var xmlPadding = new CollectionXmlPadding[] { // Nothing new CollectionXmlPadding { Padding = string.Empty, }, // Whitespace only new CollectionXmlPadding { Padding = " \r\n\t", }, // Insignificant nodes new CollectionXmlPadding { Padding = "<!--s--> <?value?>", }, // Element in no namespace new CollectionXmlPadding { Padding = "<foo xmlns=''/>", }, // Element in custom namespace new CollectionXmlPadding { Padding = "<c:foo xmlns:c='uri' attr='1'><c:child/>text</c:foo>", }, // Element in metadata namespace (should be ignored as well) new CollectionXmlPadding { Padding = "<m:properties/>", }, // Element in atom namespace (should also be ignored) new CollectionXmlPadding { Padding = "<entry/>", }, // Significant nodes - will be ignored new CollectionXmlPadding { Padding = "some text <![CDATA[cdata]]>", }, // Element in the d namespace should fail new CollectionXmlPadding { Padding = "<d:foo/>", ExpectedException = ODataExpectedExceptions.ODataException("ODataAtomPropertyAndValueDeserializer_InvalidCollectionElement", "foo", "http://docs.oasis-open.org/odata/ns/metadata"), }, // Element in the d namespace should fail (wrong name) new CollectionXmlPadding { Padding = "<d:Element/>", ExpectedException = ODataExpectedExceptions.ODataException("ODataAtomPropertyAndValueDeserializer_InvalidCollectionElement", "Element", "http://docs.oasis-open.org/odata/ns/metadata"), }, }; testDescriptors = testDescriptors.Concat(this.CreatePayloadWithPaddingTestDescriptor( primitivePayloadsWithPadding, xmlPadding, edmModel)); testDescriptors = testDescriptors.Concat(this.CreatePayloadWithPaddingTestDescriptor( complexPayloadsWithPadding, xmlPadding, edmModel)); testDescriptors = testDescriptors.Select(td => td.InProperty()); this.CombinatorialEngineProvider.RunCombinations( testDescriptors, this.ReaderTestConfigurationProvider.AtomFormatConfigurations, (testDescriptor, testConfiguration) => { testDescriptor.RunTest(testConfiguration); }); }