PageRenderTime 54ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/test/System.Web.OData.Test/OData/Formatter/Serialization/ODataPrimitiveSerializerTests.cs

https://github.com/huyq2002/aspnetwebstack
C# | 245 lines | 202 code | 30 blank | 13 comment | 2 complexity | 0471121c79e5963330df641be5c31e1e MD5 | raw file
Possible License(s): Apache-2.0
  1. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
  2. using System.Collections.Generic;
  3. using System.Data.Linq;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Xml.Linq;
  7. using Microsoft.OData.Core;
  8. using Microsoft.OData.Edm;
  9. using Microsoft.OData.Edm.Library;
  10. using Microsoft.TestCommon;
  11. using Moq;
  12. namespace System.Web.OData.Formatter.Serialization
  13. {
  14. public class ODataPrimitiveSerializerTests
  15. {
  16. public static IEnumerable<object[]> NonEdmPrimitiveConversionData
  17. {
  18. get
  19. {
  20. return EdmPrimitiveHelpersTest
  21. .ConvertPrimitiveValue_NonStandardPrimitives_Data
  22. .Select(data => new[] { data[1], data[0] });
  23. }
  24. }
  25. public static TheoryDataSet<object> NonEdmPrimitiveData
  26. {
  27. get
  28. {
  29. return new TheoryDataSet<object>
  30. {
  31. null,
  32. (char)'1',
  33. (char[]) new char[] {'1' },
  34. (UInt16)1,
  35. (UInt32)1,
  36. (UInt64)1,
  37. //(Stream) new MemoryStream(new byte[] { 1 }), // TODO: Enable once we have support for streams
  38. new XElement(XName.Get("element","namespace")),
  39. new Binary(new byte[] {1})
  40. };
  41. }
  42. }
  43. public static TheoryDataSet<object> EdmPrimitiveData
  44. {
  45. get
  46. {
  47. return new TheoryDataSet<object>
  48. {
  49. null,
  50. (string)"1",
  51. (Boolean)true,
  52. (Byte)1,
  53. // TODO: Investigate how to add support for DataTime in webapi.odata, ODataLib v4 does not support it.
  54. // (DateTime)DateTime.Now,
  55. (Decimal)1,
  56. (Double)1,
  57. (Guid)Guid.Empty,
  58. (Int16)1,
  59. (Int32)1,
  60. (Int64)1,
  61. (SByte)1,
  62. (Single)1,
  63. new byte[] { 1 },
  64. new TimeSpan(),
  65. new DateTimeOffset()
  66. };
  67. }
  68. }
  69. [Fact]
  70. public void Property_ODataPayloadKind()
  71. {
  72. var serializer = new ODataPrimitiveSerializer();
  73. Assert.Equal(serializer.ODataPayloadKind, ODataPayloadKind.Property);
  74. }
  75. [Fact]
  76. public void WriteObject_Throws_RootElementNameMissing()
  77. {
  78. ODataSerializerContext writeContext = new ODataSerializerContext();
  79. ODataPrimitiveSerializer serializer = new ODataPrimitiveSerializer();
  80. Assert.Throws<ArgumentException>(
  81. () => serializer.WriteObject(42, typeof(int), ODataTestUtil.GetMockODataMessageWriter(), writeContext),
  82. "The 'RootElementName' property is required on 'ODataSerializerContext'.\r\nParameter name: writeContext");
  83. }
  84. [Fact]
  85. public void WriteObject_Calls_CreateODataPrimitiveValue()
  86. {
  87. ODataSerializerContext writeContext = new ODataSerializerContext { RootElementName = "Property", Model = EdmCoreModel.Instance };
  88. Mock<ODataPrimitiveSerializer> serializer = new Mock<ODataPrimitiveSerializer>();
  89. serializer.CallBase = true;
  90. serializer.Setup(s => s.CreateODataPrimitiveValue(
  91. 42, It.Is<IEdmPrimitiveTypeReference>(t => t.PrimitiveKind() == EdmPrimitiveTypeKind.Int32), writeContext))
  92. .Returns(new ODataPrimitiveValue(42)).Verifiable();
  93. serializer.Object.WriteObject(42, typeof(int), ODataTestUtil.GetMockODataMessageWriter(), writeContext);
  94. serializer.Verify();
  95. }
  96. [Fact]
  97. public void CreateODataValue_PrimitiveValue()
  98. {
  99. IEdmPrimitiveTypeReference edmPrimitiveType = EdmLibHelpers.GetEdmPrimitiveTypeReferenceOrNull(typeof(int));
  100. var serializer = new ODataPrimitiveSerializer();
  101. var odataValue = serializer.CreateODataValue(20, edmPrimitiveType, writeContext: null);
  102. Assert.NotNull(odataValue);
  103. ODataPrimitiveValue primitiveValue = Assert.IsType<ODataPrimitiveValue>(odataValue);
  104. Assert.Equal(primitiveValue.Value, 20);
  105. }
  106. [Fact]
  107. public void CreateODataValue_ReturnsODataNullValue_ForNullValue()
  108. {
  109. IEdmPrimitiveTypeReference edmPrimitiveType = EdmLibHelpers.GetEdmPrimitiveTypeReferenceOrNull(typeof(string));
  110. var serializer = new ODataPrimitiveSerializer();
  111. var odataValue = serializer.CreateODataValue(null, edmPrimitiveType, new ODataSerializerContext());
  112. Assert.IsType<ODataNullValue>(odataValue);
  113. }
  114. [Theory]
  115. [PropertyData("EdmPrimitiveData")]
  116. [PropertyData("NonEdmPrimitiveData")]
  117. public void WriteObject_EdmPrimitives(object graph)
  118. {
  119. IEdmPrimitiveTypeReference edmPrimitiveType = EdmLibHelpers.GetEdmPrimitiveTypeReferenceOrNull(typeof(int));
  120. var serializer = new ODataPrimitiveSerializer();
  121. ODataSerializerContext writecontext = new ODataSerializerContext() { RootElementName = "PropertyName", Model = EdmCoreModel.Instance };
  122. ODataMessageWriterSettings settings = new ODataMessageWriterSettings
  123. {
  124. ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/"), }
  125. };
  126. ODataMessageWriter writer = new ODataMessageWriter(
  127. new ODataMessageWrapper(new MemoryStream()) as IODataResponseMessage,
  128. settings);
  129. Assert.DoesNotThrow(() => serializer.WriteObject(graph, typeof(int), writer, writecontext));
  130. }
  131. [Fact]
  132. public void AddTypeNameAnnotationAsNeeded_AddsAnnotation_InJsonLightMetadataMode()
  133. {
  134. // Arrange
  135. IEdmPrimitiveTypeReference edmPrimitiveType = EdmLibHelpers.GetEdmPrimitiveTypeReferenceOrNull(typeof(short));
  136. ODataPrimitiveValue primitive = new ODataPrimitiveValue((short)1);
  137. // Act
  138. ODataPrimitiveSerializer.AddTypeNameAnnotationAsNeeded(primitive, edmPrimitiveType, ODataMetadataLevel.FullMetadata);
  139. // Assert
  140. SerializationTypeNameAnnotation annotation = primitive.GetAnnotation<SerializationTypeNameAnnotation>();
  141. Assert.NotNull(annotation); // Guard
  142. Assert.Equal("Edm.Int16", annotation.TypeName);
  143. }
  144. [Theory]
  145. [InlineData(true, true)]
  146. [InlineData(0, true)]
  147. [InlineData("", true)]
  148. [InlineData(0.1D, true)]
  149. [InlineData(double.PositiveInfinity, false)]
  150. [InlineData(double.NegativeInfinity, false)]
  151. [InlineData(double.NaN, false)]
  152. [InlineData((short)1, false)]
  153. public void CanTypeBeInferredInJson(object value, bool expectedResult)
  154. {
  155. // Act
  156. bool actualResult = ODataPrimitiveSerializer.CanTypeBeInferredInJson(value);
  157. // Assert
  158. Assert.Equal(expectedResult, actualResult);
  159. }
  160. [Fact]
  161. public void CreatePrimitive_ReturnsNull_ForNullValue()
  162. {
  163. // Act
  164. IEdmPrimitiveTypeReference edmPrimitiveType = EdmLibHelpers.GetEdmPrimitiveTypeReferenceOrNull(typeof(int));
  165. ODataValue value = ODataPrimitiveSerializer.CreatePrimitive(null, edmPrimitiveType, writeContext: null);
  166. // Assert
  167. Assert.Null(value);
  168. }
  169. [Theory]
  170. [PropertyData("EdmPrimitiveData")]
  171. public void ConvertUnsupportedPrimitives_DoesntChangeStandardEdmPrimitives(object graph)
  172. {
  173. Assert.Equal(
  174. graph,
  175. ODataPrimitiveSerializer.ConvertUnsupportedPrimitives(graph));
  176. }
  177. [Theory]
  178. [PropertyData("NonEdmPrimitiveConversionData")]
  179. public void ConvertUnsupportedPrimitives_NonStandardEdmPrimitives(object graph, object result)
  180. {
  181. Assert.Equal(
  182. result,
  183. ODataPrimitiveSerializer.ConvertUnsupportedPrimitives(graph));
  184. }
  185. [Theory]
  186. [InlineData(0, TestODataMetadataLevel.FullMetadata, true)]
  187. [InlineData((short)1, TestODataMetadataLevel.FullMetadata, false)]
  188. [InlineData((short)1, TestODataMetadataLevel.MinimalMetadata, true)]
  189. [InlineData((short)1, TestODataMetadataLevel.NoMetadata, true)]
  190. public void ShouldSuppressTypeNameSerialization(object value, TestODataMetadataLevel metadataLevel,
  191. bool expectedResult)
  192. {
  193. // Act
  194. bool actualResult = ODataPrimitiveSerializer.ShouldSuppressTypeNameSerialization(value,
  195. (ODataMetadataLevel)metadataLevel);
  196. // Assert
  197. Assert.Equal(expectedResult, actualResult);
  198. }
  199. public static TheoryDataSet<EdmPrimitiveTypeKind> EdmPrimitiveKinds
  200. {
  201. get
  202. {
  203. TheoryDataSet<EdmPrimitiveTypeKind> dataset = new TheoryDataSet<EdmPrimitiveTypeKind>();
  204. var primitiveKinds = Enum.GetValues(typeof(EdmPrimitiveTypeKind))
  205. .OfType<EdmPrimitiveTypeKind>()
  206. .Where(primitiveKind => primitiveKind != EdmPrimitiveTypeKind.None);
  207. foreach (var primitiveKind in primitiveKinds)
  208. {
  209. dataset.Add(primitiveKind);
  210. }
  211. return dataset;
  212. }
  213. }
  214. }
  215. }