/// <summary> /// Visits a collection start. /// </summary> /// <param name="collection">The collection start to visit.</param> protected override ODataPayloadElement VisitCollectionStart(ODataCollectionStart collection) { ExceptionUtilities.CheckArgumentNotNull(collection, "collection"); // NOTE the Taupo OM does not currently support heterogenous collections; we determine the // type of the collection by looking at the first non-null item ODataCollectionItemsObjectModelAnnotation itemsAnnotation = collection.GetAnnotation <ODataCollectionItemsObjectModelAnnotation>(); ExceptionUtilities.Assert(itemsAnnotation != null, "itemsAnnotation != null"); // NOTE we assume that it is a primitive collection; if we find a collection of only null items we treat it as primitive bool isComplexCollection = false; foreach (object item in itemsAnnotation) { if (item != null) { isComplexCollection = item is ODataComplexValue; break; } } if (isComplexCollection) { ComplexInstanceCollection complexCollection = PayloadBuilder.ComplexCollection(collection.Name); foreach (object item in itemsAnnotation) { ComplexInstance complexInstance = item == null ? new ComplexInstance(null, /*isNull*/ true) : (ComplexInstance)this.Visit((ODataComplexValue)item); complexCollection.Add(complexInstance); } return(complexCollection); } else { PrimitiveCollection primitiveCollection = PayloadBuilder.PrimitiveCollection(collection.Name); foreach (object item in itemsAnnotation) { PrimitiveValue primitiveValue = (PrimitiveValue)this.Visit(item); primitiveCollection.Add(primitiveValue); } return(primitiveCollection); } }
public void NoMetadataTest() { EdmModel model = new EdmModel(); var container = new EdmEntityContainer("TestModel", "DefaultContainer"); model.AddElement(container); var testDescriptors = new[] { new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.EntitySet(), SkipTestConfiguration = tc => !tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightInputContext_ModelRequiredForReading"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.EntitySet(), SkipTestConfiguration = tc => tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightDeserializer_ContextLinkNotFoundAsFirstProperty"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.EntitySet(), PayloadEdmModel = model, SkipTestConfiguration = tc => !tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightInputContext_NoEntitySetForRequest"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.Entity(), SkipTestConfiguration = tc => !tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightInputContext_ModelRequiredForReading"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.Entity(), SkipTestConfiguration = tc => tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightDeserializer_ContextLinkNotFoundAsFirstProperty"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.Entity(), PayloadEdmModel = model, SkipTestConfiguration = tc => !tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightInputContext_NoEntitySetForRequest"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.PrimitiveProperty("propertyName", 42), SkipTestConfiguration = tc => !tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightInputContext_ModelRequiredForReading"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.Property("propertyName", PayloadBuilder.ComplexValue()), SkipTestConfiguration = tc => !tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightInputContext_ModelRequiredForReading"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.Property("propertyName", PayloadBuilder.PrimitiveMultiValue()), SkipTestConfiguration = tc => !tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightInputContext_ModelRequiredForReading"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.PrimitiveCollection(), SkipTestConfiguration = tc => !tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightInputContext_ModelRequiredForReading"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.PrimitiveCollection(), SkipTestConfiguration = tc => tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightDeserializer_ContextLinkNotFoundAsFirstProperty"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.PrimitiveCollection(), //PayloadModel = model, PayloadEdmModel = model, SkipTestConfiguration = tc => !tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightInputContext_ItemTypeRequiredForCollectionReaderInRequests"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.ComplexCollection(), SkipTestConfiguration = tc => !tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightInputContext_ModelRequiredForReading"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.ComplexCollection(), SkipTestConfiguration = tc => tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightDeserializer_ContextLinkNotFoundAsFirstProperty"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.ComplexCollection(), PayloadEdmModel = model, SkipTestConfiguration = tc => !tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightInputContext_ItemTypeRequiredForCollectionReaderInRequests"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.ServiceDocument().Workspace(PayloadBuilder.Workspace()), SkipTestConfiguration = tc => tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightDeserializer_ContextLinkNotFoundAsFirstProperty"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.DeferredLink("http://odata.org/deferred"), SkipTestConfiguration = tc => !tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightInputContext_ModelRequiredForReading"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.DeferredLink("http://odata.org/deferred"), SkipTestConfiguration = tc => tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightDeserializer_ContextLinkNotFoundAsFirstProperty"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.LinkCollection(), SkipTestConfiguration = tc => tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightDeserializer_ContextLinkNotFoundAsFirstProperty"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.ComplexValue(), SkipTestConfiguration = tc => !tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightInputContext_ModelRequiredForReading"), }, new PayloadReaderTestDescriptor(this.Settings) { PayloadElement = PayloadBuilder.ComplexValue(), PayloadEdmModel = model, SkipTestConfiguration = tc => !tc.IsRequest, ExpectedException = ODataExpectedExceptions.ArgumentNullException("ODataJsonLightInputContext_OperationCannotBeNullForCreateParameterReader", "operation") }, }; this.CombinatorialEngineProvider.RunCombinations( testDescriptors, this.ReaderTestConfigurationProvider.JsonLightFormatConfigurations, (testDescriptor, testConfiguration) => { // These descriptors are already tailored specifically for Json Light and // do not require normalization. testDescriptor.TestDescriptorNormalizers.Clear(); testDescriptor.RunTest(testConfiguration); }); }
public void CollectionWithODataTypeReaderTest() { IEdmModel model = Test.OData.Utils.Metadata.TestModels.BuildTestModel(); IEdmEntityContainer container = model.FindEntityContainer("DefaultContainer"); EdmOperationImport primitiveCollectionResultOperation = container.FindOperationImports("PrimitiveCollectionResultOperation").Single() as EdmOperationImport; EdmOperationImport complexCollectionResultOperation = container.FindOperationImports("ComplexCollectionResultOperation").Single() as EdmOperationImport; var primitiveCollection = PayloadBuilder.PrimitiveCollection("PrimitiveCollectionResultOperation"); primitiveCollection.Add(PayloadBuilder.PrimitiveValue(1)); primitiveCollection.Add(PayloadBuilder.PrimitiveValue(2)); primitiveCollection.Add(PayloadBuilder.PrimitiveValue(3)); var complexCollection = PayloadBuilder.ComplexCollection("ComplexCollectionResultOperation"); var complexValue1 = PayloadBuilder.ComplexValue("TestModel.Address") .PrimitiveProperty("Street", "Am Euro Platz") .AddAnnotation(new SerializationTypeNameTestAnnotation() { TypeName = null }); complexCollection.Add(complexValue1); // NOTE: tests to cover consistency between the expected function import and the function import // in the payload exist in the ContextUriValidationJsonLightTests. IEnumerable <PayloadReaderTestDescriptor> testDescriptors = new[] { new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Non-collection type specified in odata.type - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"TestModel.Address\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ]" + "}") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_InvalidCollectionTypeName", "TestModel.Address"), }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Expected primitive item type and odata.type consistent - should work.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(Edm.Int32)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ]" + "}") .ExpectedFunctionImport(primitiveCollectionResultOperation), }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Context URI (primitive collection) and odata.type consistent - should work.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(Edm.Int32)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ]" + "}") .ExpectedFunctionImport(primitiveCollectionResultOperation) }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Expected primitive item type and odata.type NOT consistent - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(Edm.Single)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ]" + "}") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_IncompatibleType", "Edm.Single", "Edm.Int32") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Expected primitive item type and odata.type NOT consistent (2) - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(TestModel.Address)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(Edm.Int32)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ]" + "}") .ExpectedFunctionImport(complexCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "Edm.Int32", "Complex", "Primitive") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Expected complex item type and odata.type NOT consistent - should fail.", PayloadEdmModel = model, PayloadElement = complexCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(TestModel.Address)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(TestModel.OfficeType)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ { \"Street\": \"Am Euro Platz\"} ]" + "}") .ExpectedFunctionImport(complexCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "TestModel.OfficeType", "Complex", "Entity") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Expected primitive item type and odata.type NOT consistent (2) - should fail.", PayloadEdmModel = model, PayloadElement = complexCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(TestModel.Address)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ { \"Street\": \"Am Euro Platz\"} ]" + "}") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "TestModel.Address", "Primitive", "Complex") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Complex item type in context URI and odata.type NOT consistent - should fail.", PayloadEdmModel = model, PayloadElement = complexCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(TestModel.Address)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(TestModel.OfficeType)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ { \"Street\": \"Am Euro Platz\"} ]" + "}"), SkipTestConfiguration = tc => tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "TestModel.OfficeType", "Complex", "Entity") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Primitive item type in context URI and odata.type NOT consistent - should fail.", PayloadEdmModel = model, PayloadElement = complexCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightUtils.GetPropertyAnnotationName(JsonLightConstants.ODataValuePropertyName, JsonLightConstants.ODataTypeAnnotationName) + "\":\"Collection(TestModel.Address)\"," + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[ { \"Street\": \"Am Euro Platz\"} ]" + "}"), SkipTestConfiguration = tc => tc.IsRequest, ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "TestModel.Address", "Primitive", "Complex") }, }; this.CombinatorialEngineProvider.RunCombinations( testDescriptors, this.ReaderTestConfigurationProvider.JsonLightFormatConfigurations, (testDescriptor, testConfiguration) => { // These descriptors are already tailored specifically for Json Light and // do not require normalization. testDescriptor.TestDescriptorNormalizers.Clear(); testDescriptor.RunTest(testConfiguration); }); }
public void CollectionReaderTest() { IEdmModel model = Test.OData.Utils.Metadata.TestModels.BuildTestModel(); IEdmEntityContainer container = model.FindEntityContainer("DefaultContainer"); EdmOperationImport primitiveCollectionResultOperation = container.FindOperationImports("PrimitiveCollectionResultOperation").Single() as EdmOperationImport; EdmOperationImport complexCollectionResultOperation = container.FindOperationImports("ComplexCollectionResultOperation").Single() as EdmOperationImport; var primitiveCollection = PayloadBuilder.PrimitiveCollection("PrimitiveCollectionResultOperation"); primitiveCollection.Add(PayloadBuilder.PrimitiveValue(1)); primitiveCollection.Add(PayloadBuilder.PrimitiveValue(2)); primitiveCollection.Add(PayloadBuilder.PrimitiveValue(3)); var complexCollection = PayloadBuilder.ComplexCollection("ComplexCollectionResultOperation"); var complexValue1 = PayloadBuilder.ComplexValue("TestModel.Address") .PrimitiveProperty("Street", "Am Euro Platz") .AddAnnotation(new SerializationTypeNameTestAnnotation() { TypeName = null }); complexCollection.Add(complexValue1); IEnumerable <PayloadReaderTestDescriptor> testDescriptors = new[] { new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Primitive collection - should work.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ] }") .ExpectedFunctionImport(primitiveCollectionResultOperation), }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Complex collection - should work.", PayloadEdmModel = model, PayloadElement = complexCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(TestModel.Address)\", \"" + JsonLightConstants.ODataValuePropertyName + "\":[ { \"Street\":\"Am Euro Platz\" } ] }") .ExpectedFunctionImport(complexCollectionResultOperation), }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "null collection - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy().JsonRepresentation("null") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("JsonReaderExtensions_UnexpectedNodeDetected", "StartObject", "PrimitiveValue") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Primitive value for collection - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy().JsonRepresentation("42") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("JsonReaderExtensions_UnexpectedNodeDetected", "StartObject", "PrimitiveValue") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Array value for collection - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy().JsonRepresentation("[]") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("JsonReaderExtensions_UnexpectedNodeDetected", "StartObject", "StartArray") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Extra property before collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"extra\": null, \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ] }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightPropertyAndValueDeserializer_InvalidTopLevelPropertyName", "extra", "value") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Extra property after collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ], \"extra\": null }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_CannotReadCollectionEnd", "extra") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Custom instance annotation before collection property - should work.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"@my.extra\": null, \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ] }") .ExpectedFunctionImport(primitiveCollectionResultOperation), }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Custom instance annotation after collection property - should work.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ], \"@my.extra\": null }") .ExpectedFunctionImport(primitiveCollectionResultOperation), }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Custom property annotation before collection property - should work.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"[email protected]\": null, \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ] }") .ExpectedFunctionImport(primitiveCollectionResultOperation), }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Custom property annotation on 'value' after collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ], \"[email protected]\": null }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_CannotReadCollectionEnd", "value") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Custom property annotation on 'extra' before collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"[email protected]\": null, \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ] }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightPropertyAndValueDeserializer_TopLevelPropertyAnnotationWithoutProperty", "extra") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Custom property annotation on 'extra' after collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"" + JsonLightConstants.ODataValuePropertyName + "\":[ 1, 2, 3 ], \"[email protected]\": null }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_CannotReadCollectionEnd", "extra") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Invalid collection property name - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"invalid\":[ 1, 2, 3 ] }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightPropertyAndValueDeserializer_InvalidTopLevelPropertyName", "invalid", JsonLightConstants.ODataValuePropertyName) }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Missing collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\" }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_ExpectedCollectionPropertyNotFound", JsonLightConstants.ODataValuePropertyName) }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Invalid collection property value - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", \"" + JsonLightConstants.ODataValuePropertyName + "\":{} }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_CannotReadCollectionContentStart", "StartObject") }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Invalid OData instance annotation before collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataCountAnnotationName + "\":null, " + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[] }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightPropertyAndValueDeserializer_UnexpectedAnnotationProperties", JsonLightConstants.ODataCountAnnotationName) }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Invalid OData instance annotation after collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[], " + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataCountAnnotationName + "\":null }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_CannotReadCollectionEnd", JsonLightConstants.ODataCountAnnotationName) }, new PayloadReaderTestDescriptor(this.Settings) { DebugDescription = "Invalid OData instance annotation after collection property - should fail.", PayloadEdmModel = model, PayloadElement = primitiveCollection.DeepCopy() .JsonRepresentation("{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#Collection(Edm.Int32)\", " + "\"" + JsonLightConstants.ODataValuePropertyName + "\":[], " + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataCountAnnotationName + "\":null }") .ExpectedFunctionImport(primitiveCollectionResultOperation), ExpectedException = ODataExpectedExceptions.ODataException("ODataJsonLightCollectionDeserializer_CannotReadCollectionEnd", JsonLightConstants.ODataCountAnnotationName) }, }; this.CombinatorialEngineProvider.RunCombinations( testDescriptors, this.ReaderTestConfigurationProvider.JsonLightFormatConfigurations, (testDescriptor, testConfiguration) => { // These descriptors are already tailored specifically for Json Light and // do not require normalization. testDescriptor.TestDescriptorNormalizers.Clear(); testDescriptor.RunTest(testConfiguration); }); }
public void HeterogeneousCollectionReaderWithoutMetadataAtomTest() { IEnumerable <PayloadReaderTestDescriptor> testDescriptors = new[] { // Collection with different item type kinds (complex instead of primitive) new PayloadReaderTestDescriptor(this.PayloadTestDescriptorSettings) { PayloadElement = PayloadBuilder.PrimitiveCollection() .XmlRepresentation(@"<m:value> <m:element>0</m:element> <m:element> <d:bar>2</d:bar> </m:element> </m:value>"), ExpectedException = ODataExpectedExceptions.ODataException("CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeKind", "Complex", "Primitive"), }, // Collection where item type kind does not match item type name (primitive and complex items) new PayloadReaderTestDescriptor(this.PayloadTestDescriptorSettings) { PayloadElement = PayloadBuilder.ComplexCollection() .XmlRepresentation(@"<m:value> <m:element></m:element> <m:element> <d:bar>2</d:bar> </m:element> </m:value>"), ExpectedException = ODataExpectedExceptions.ODataException("CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeKind", "Complex", "Primitive"), }, // Collection where item type names don't match (Edm.String and Edm.Int32) new PayloadReaderTestDescriptor(this.PayloadTestDescriptorSettings) { PayloadElement = PayloadBuilder.ComplexCollection() .XmlRepresentation(@"<m:value> <m:element></m:element> <m:element m:type='Edm.Int32'>2</m:element> </m:value>"), ExpectedException = ODataExpectedExceptions.ODataException("CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeName", "Edm.Int32", "Edm.String"), }, // Collection where item type names don't match (Edm.String and Edm.Int32); including some null items new PayloadReaderTestDescriptor(this.PayloadTestDescriptorSettings) { PayloadElement = PayloadBuilder.ComplexCollection() .XmlRepresentation(@"<m:value> <m:element m:null='true' /> <m:element></m:element> <m:element m:null='true' /> <m:element m:type='Edm.Int32'>2</m:element> <m:element m:null='true' /> </m:value>"), ExpectedException = ODataExpectedExceptions.ODataException("CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeName", "Edm.Int32", "Edm.String"), }, // Collection where item type names don't match (TestModel.SomeComplexType and TestModel.OtherComplexType) new PayloadReaderTestDescriptor(this.PayloadTestDescriptorSettings) { PayloadElement = PayloadBuilder.ComplexCollection() .XmlRepresentation(@"<m:value> <m:element m:type='TestModel.SomeComplexType'><d:StringProperty>abc</d:StringProperty></m:element> <m:element m:type='TestModel.OtherComplexType'><d:IntProperty>42</d:IntProperty></m:element> </m:value>"), ExpectedException = ODataExpectedExceptions.ODataException("CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeName", "TestModel.OtherComplexType", "TestModel.SomeComplexType"), }, // Collection where item type names don't match (TestModel.SomeComplexType and TestModel.OtherComplexType); including some null items new PayloadReaderTestDescriptor(this.PayloadTestDescriptorSettings) { PayloadElement = PayloadBuilder.ComplexCollection() .XmlRepresentation(@"<m:value> <m:element m:null='true' /> <m:element m:type='TestModel.SomeComplexType'><d:StringProperty>abc</d:StringProperty></m:element> <m:element m:null='true' /> <m:element m:type='TestModel.OtherComplexType'><d:IntProperty>42</d:IntProperty></m:element> <m:element m:null='true' /> </m:value>"), ExpectedException = ODataExpectedExceptions.ODataException("CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeName", "TestModel.OtherComplexType", "TestModel.SomeComplexType"), }, // Collection where different item type kinds (primitive instead of complex) new PayloadReaderTestDescriptor(this.PayloadTestDescriptorSettings) { PayloadElement = PayloadBuilder.ComplexCollection() .XmlRepresentation(@"<m:value> <m:element m:type='TestModel.SomeComplexType'> <d:bar>2</d:bar> </m:element> <m:element>0</m:element> </m:value>"), ExpectedException = ODataExpectedExceptions.ODataException("CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeKind", "Primitive", "Complex"), }, // Collection with primitive and complex elements new PayloadReaderTestDescriptor(this.PayloadTestDescriptorSettings) { PayloadElement = PayloadBuilder.PrimitiveCollection() .XmlRepresentation(@"<m:value> <m:element m:type='Edm.String'>Foo</m:element> <m:element m:type='TestModel.CityType'> <d:Name m:type='Edm.String'>Perth</d:Name> </m:element> </m:value>"), ExpectedException = ODataExpectedExceptions.ODataException("CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeKind", "Complex", "Primitive"), }, }; this.CombinatorialEngineProvider.RunCombinations( testDescriptors, this.ReaderTestConfigurationProvider.AtomFormatConfigurations, (testDescriptor, testConfiguration) => { testDescriptor.RunTest(testConfiguration); }); }
public void HeterogeneousCollectionReaderAtomTest() { EdmModel edmModel = new EdmModel(); EdmComplexType edmComplexTypeEmpty = new EdmComplexType(ModelNamespace, "EmptyComplexType"); edmModel.AddElement(edmComplexTypeEmpty); EdmComplexType edmComplexTypeCity = new EdmComplexType(ModelNamespace, "CityType"); edmComplexTypeCity.AddStructuralProperty("Name", EdmCoreModel.Instance.GetString(true)); edmModel.AddElement(edmComplexTypeCity); EdmComplexType edmComplexTypeAddress = new EdmComplexType(ModelNamespace, "AddressType"); edmComplexTypeAddress.AddStructuralProperty("Street", EdmCoreModel.Instance.GetString(true)); edmModel.AddElement(edmComplexTypeAddress); edmModel.Fixup(); IEnumerable <PayloadReaderTestDescriptor> testDescriptors = new[] { new PayloadReaderTestDescriptor(this.PayloadTestDescriptorSettings) { PayloadElement = new ComplexInstanceCollection( PayloadBuilder.ComplexValue("TestModel.CityType").Property("Name", PayloadBuilder.PrimitiveValue("Vienna")), PayloadBuilder.ComplexValue("TestModel.AddressType").Property("Street", PayloadBuilder.PrimitiveValue("Am Euro Platz")) ).ExpectedCollectionItemType(edmComplexTypeCity).CollectionName(null), PayloadEdmModel = edmModel, ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_IncompatibleType", "TestModel.AddressType", "TestModel.CityType"), }, // primitive collection with primitive and complex elements (with metadata, with expected types) new PayloadReaderTestDescriptor(this.PayloadTestDescriptorSettings) { PayloadElement = PayloadBuilder.PrimitiveCollection() .ExpectedCollectionItemType(EdmDataTypes.String()) .XmlRepresentation(@"<m:value> <m:element m:type='Edm.String'>Foo</m:element> <m:element m:type='TestModel.CityType'> <d:Name m:type='Edm.String'>Perth</d:Name> </m:element> </m:value>"), PayloadEdmModel = edmModel, ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "TestModel.CityType", "Primitive", "Complex"), }, // complex collection with complex and primitive elements (with metadata, with expected types) new PayloadReaderTestDescriptor(this.PayloadTestDescriptorSettings) { PayloadElement = PayloadBuilder.ComplexCollection() .ExpectedCollectionItemType(edmComplexTypeCity) .XmlRepresentation(@"<m:value> <m:element m:type='TestModel.CityType'> <d:Name m:type='Edm.String'>Perth</d:Name> </m:element> <m:element m:type='Edm.Int32'>123</m:element> </m:value>"), PayloadEdmModel = edmModel, ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_IncorrectTypeKind", "Edm.Int32", "Complex", "Primitive"), }, }; this.CombinatorialEngineProvider.RunCombinations( testDescriptors, this.ReaderTestConfigurationProvider.AtomFormatConfigurations, (testDescriptor, testConfiguration) => { testDescriptor.RunTest(testConfiguration); }); }