/// <summary> /// Returns the type from the entity model type annotation for this payload element. /// </summary> /// <param name="payloadElement">The payload element to return the type for.</param> /// <returns>The type from the annotation or null if none was present.</returns> private static IEdmTypeReference GetEdmTypeFromEntityModelTypeAnnotation(ODataPayloadElement payloadElement) { Debug.Assert(payloadElement != null, "payloadElement != null"); EntityModelTypeAnnotation typeAnnotation = payloadElement.GetAnnotation <EntityModelTypeAnnotation>(); return(typeAnnotation == null ? null : typeAnnotation.EdmModelType); }
/// <summary> /// Gets the <see cref="EntityType"/> of the specified entry or feed payload element. /// </summary> /// <param name="payloadElement">The payload element to get the entity type for.</param> /// <param name="model">The model to find the entity type in.</param> /// <returns>The <see cref="EntityType"/> of the <paramref name="payloadElement"/>.</returns> public static IEdmEntityType GetPayloadElementEntityType(ODataPayloadElement payloadElement, IEdmModel model) { ExceptionUtilities.CheckArgumentNotNull(payloadElement, "payloadElement"); ExceptionUtilities.CheckArgumentNotNull(model, "model"); ODataPayloadKind payloadKind = payloadElement.GetPayloadKindFromPayloadElement(); ExceptionUtilities.Assert( payloadKind == ODataPayloadKind.Resource || payloadKind == ODataPayloadKind.ResourceSet, "Can only determine entity type for entry or feed payloads."); EntityModelTypeAnnotation typeAnnotation = payloadElement.GetAnnotation <EntityModelTypeAnnotation>(); if (typeAnnotation != null) { var entityDataType = typeAnnotation.EdmModelType; Debug.Assert(entityDataType != null, "entityDataType != null"); return(model.EntityTypes().Single(et => et.FullName() == entityDataType.FullName())); } string entityTypeName; if (payloadKind == ODataPayloadKind.Resource) { EntityInstance entity = payloadElement as EntityInstance; Debug.Assert(entity != null, "entity != null"); entityTypeName = entity.FullTypeName; return(model.EntityTypes().Single(et => et.TestFullName() == entityTypeName)); } else { //if feed has entries figure out type otherwise use first entity type EntitySetInstance feed = payloadElement as EntitySetInstance; Debug.Assert(feed != null, "feed != null"); if (feed.Count > 0) { return(model.EntityTypes().Single(et => et.TestFullName() == ((TypedValue)feed.First()).FullTypeName)); } else { return(model.EntityTypes().First()); } } }
/// <summary> /// Validator for spatial values. /// </summary> /// <param name="payloadElement">The payload element to validate.</param> /// <param name="testConfigLimits">The test configuration limits to modify.</param> public static void SpatialValueValidator(ODataPayloadElement payloadElement, TestConfigurationLimits testConfigLimits) { PrimitiveValue primitiveValue = payloadElement as PrimitiveValue; ExceptionUtilities.Assert(primitiveValue != null, "This validator only works on primitive values."); if (primitiveValue.ClrValue is ISpatial) { // Spatial values require V3. testConfigLimits.RaiseMinPayloadVersion(ODataVersion.V4); } else if (primitiveValue.ClrValue == null) { EntityModelTypeAnnotation typeAnnotation = primitiveValue.GetAnnotation <EntityModelTypeAnnotation>(); if (typeAnnotation != null && typeAnnotation.EdmModelType.Definition.IsSpatial()) { testConfigLimits.RaiseMinPayloadVersion(ODataVersion.V4); } } }
/// <summary> /// Determins the payload kind appropriate for the payload element used for this test. /// </summary> /// <param name="payloadElement">The payload element to get the kind for.</param> /// <returns>The payload kind to be used for this test.</returns> public static ODataPayloadKind GetPayloadKindFromPayloadElement(this ODataPayloadElement payloadElement) { if (payloadElement == null) { return(ODataPayloadKind.Unsupported); } switch (payloadElement.ElementType) { case ODataPayloadElementType.NullPropertyInstance: case ODataPayloadElementType.PrimitiveProperty: case ODataPayloadElementType.PrimitiveMultiValueProperty: case ODataPayloadElementType.NamedStreamInstance: case ODataPayloadElementType.NavigationPropertyInstance: return(ODataPayloadKind.Property); case ODataPayloadElementType.ComplexMultiValueProperty: case ODataPayloadElementType.EntitySetInstance: return(ODataPayloadKind.ResourceSet); case ODataPayloadElementType.ComplexProperty: case ODataPayloadElementType.EntityInstance: return(ODataPayloadKind.Resource); case ODataPayloadElementType.PrimitiveCollection: case ODataPayloadElementType.ComplexInstanceCollection: case ODataPayloadElementType.PrimitiveMultiValue: case ODataPayloadElementType.ComplexMultiValue: return(ODataPayloadKind.Collection); case ODataPayloadElementType.ODataErrorPayload: return(ODataPayloadKind.Error); case ODataPayloadElementType.DeferredLink: return(ODataPayloadKind.EntityReferenceLink); case ODataPayloadElementType.LinkCollection: return(ODataPayloadKind.EntityReferenceLinks); case ODataPayloadElementType.ServiceDocumentInstance: return(ODataPayloadKind.ServiceDocument); case ODataPayloadElementType.PrimitiveValue: EntityModelTypeAnnotation typeAnnotation = payloadElement.GetAnnotation <EntityModelTypeAnnotation>(); if (typeAnnotation != null && ((IEdmPrimitiveType)typeAnnotation.EdmModelType.Definition).PrimitiveKind == EdmPrimitiveTypeKind.Binary) { return(ODataPayloadKind.BinaryValue); } return(ODataPayloadKind.Value); case ODataPayloadElementType.BatchRequestPayload: case ODataPayloadElementType.BatchResponsePayload: return(ODataPayloadKind.Batch); case ODataPayloadElementType.ComplexInstance: // TODO: ODataLib test item: Add new ODataPayloadElement for parameters payload return(ODataPayloadKind.Parameter); default: ExceptionUtilities.Assert( false, "Payload element type '{0}' is not yet recognized by GetPayloadKindFromPayloadElement.", payloadElement.ElementType); return(ODataPayloadKind.Unsupported); } }