PageRenderTime 43ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

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

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