PageRenderTime 49ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/test/System.Net.Http.Formatting.Test.Unit/Formatting/MediaTypeFormatterTests.cs

https://bitbucket.org/mdavid/aspnetwebstack
C# | 596 lines | 517 code | 70 blank | 9 comment | 6 complexity | 2e7e574597b6ab9ae1c0721b236be22b MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.Collections.ObjectModel;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Net.Http.Formatting.DataSets;
  6. using System.Net.Http.Formatting.Mocks;
  7. using System.Net.Http.Headers;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using Microsoft.TestCommon;
  11. using Moq;
  12. using Xunit;
  13. using Xunit.Extensions;
  14. using Assert = Microsoft.TestCommon.AssertEx;
  15. namespace System.Net.Http.Formatting
  16. {
  17. public class MediaTypeFormatterTests
  18. {
  19. [Fact]
  20. [Trait("Description", "MediaTypeFormatter is public, abstract, and unsealed.")]
  21. public void TypeIsCorrect()
  22. {
  23. Assert.Type.HasProperties(typeof(MediaTypeFormatter), TypeAssert.TypeProperties.IsPublicVisibleClass | TypeAssert.TypeProperties.IsAbstract);
  24. }
  25. [Fact]
  26. [Trait("Description", "MediaTypeFormatter() constructor (via derived class) sets SupportedMediaTypes and MediaTypeMappings.")]
  27. public void Constructor()
  28. {
  29. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter();
  30. Collection<MediaTypeHeaderValue> supportedMediaTypes = formatter.SupportedMediaTypes;
  31. Assert.NotNull(supportedMediaTypes);
  32. Assert.Equal(0, supportedMediaTypes.Count);
  33. Collection<MediaTypeMapping> mappings = formatter.MediaTypeMappings;
  34. Assert.NotNull(mappings);
  35. Assert.Equal(0, mappings.Count);
  36. }
  37. [Fact]
  38. [Trait("Description", "SupportedMediaTypes is a mutable collection.")]
  39. public void SupportedMediaTypesIsMutable()
  40. {
  41. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter();
  42. Collection<MediaTypeHeaderValue> supportedMediaTypes = formatter.SupportedMediaTypes;
  43. MediaTypeHeaderValue[] mediaTypes = HttpUnitTestDataSets.LegalMediaTypeHeaderValues.ToArray();
  44. foreach (MediaTypeHeaderValue mediaType in mediaTypes)
  45. {
  46. supportedMediaTypes.Add(mediaType);
  47. }
  48. Assert.True(mediaTypes.SequenceEqual(formatter.SupportedMediaTypes));
  49. }
  50. [Fact]
  51. [Trait("Description", "SupportedMediaTypes Add throws with a null media type.")]
  52. public void SupportedMediaTypesAddThrowsWithNullMediaType()
  53. {
  54. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter();
  55. Collection<MediaTypeHeaderValue> supportedMediaTypes = formatter.SupportedMediaTypes;
  56. Assert.ThrowsArgumentNull(() => supportedMediaTypes.Add(null), "item");
  57. }
  58. [Theory]
  59. [TestDataSet(typeof(HttpUnitTestDataSets), "LegalMediaRangeValues")]
  60. [Trait("Description", "SupportedMediaTypes Add throws with a media range.")]
  61. public void SupportedMediaTypesAddThrowsWithMediaRange(MediaTypeHeaderValue mediaType)
  62. {
  63. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter();
  64. Collection<MediaTypeHeaderValue> supportedMediaTypes = formatter.SupportedMediaTypes;
  65. Assert.ThrowsArgument(() => supportedMediaTypes.Add(mediaType), "item", RS.Format(Properties.Resources.CannotUseMediaRangeForSupportedMediaType, typeof(MediaTypeHeaderValue).Name, mediaType.MediaType));
  66. }
  67. [Fact]
  68. [Trait("Description", "SupportedMediaTypes Insert throws with a null media type.")]
  69. public void SupportedMediaTypesInsertThrowsWithNullMediaType()
  70. {
  71. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter();
  72. Collection<MediaTypeHeaderValue> supportedMediaTypes = formatter.SupportedMediaTypes;
  73. Assert.ThrowsArgumentNull(() => supportedMediaTypes.Insert(0, null), "item");
  74. }
  75. [Theory]
  76. [TestDataSet(typeof(HttpUnitTestDataSets), "LegalMediaRangeValues")]
  77. [Trait("Description", "SupportedMediaTypes Insert throws with a media range.")]
  78. public void SupportedMediaTypesInsertThrowsWithMediaRange(MediaTypeHeaderValue mediaType)
  79. {
  80. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter();
  81. Collection<MediaTypeHeaderValue> supportedMediaTypes = formatter.SupportedMediaTypes;
  82. Assert.ThrowsArgument(() => supportedMediaTypes.Insert(0, mediaType), "item", RS.Format(Properties.Resources.CannotUseMediaRangeForSupportedMediaType, typeof(MediaTypeHeaderValue).Name, mediaType.MediaType));
  83. }
  84. [Fact]
  85. [Trait("Description", "MediaTypeMappings is a mutable collection.")]
  86. public void MediaTypeMappingsIsMutable()
  87. {
  88. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter();
  89. Collection<MediaTypeMapping> mappings = formatter.MediaTypeMappings;
  90. MediaTypeMapping[] standardMappings = HttpUnitTestDataSets.StandardMediaTypeMappings.ToArray();
  91. foreach (MediaTypeMapping mapping in standardMappings)
  92. {
  93. mappings.Add(mapping);
  94. }
  95. Assert.True(standardMappings.SequenceEqual(formatter.MediaTypeMappings));
  96. }
  97. [Theory]
  98. [TestDataSet(typeof(HttpUnitTestDataSets), "StandardMediaTypesWithQuality")]
  99. [Trait("Description", "TryMatchSupportedMediaType(MediaTypeHeaderValue, out MediaTypeMatch) returns media type and quality.")]
  100. public void TryMatchSupportedMediaTypeWithQuality(MediaTypeWithQualityHeaderValue mediaTypeWithQuality)
  101. {
  102. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter();
  103. MediaTypeHeaderValue mediaTypeWithoutQuality = new MediaTypeHeaderValue(mediaTypeWithQuality.MediaType);
  104. formatter.SupportedMediaTypes.Add(mediaTypeWithoutQuality);
  105. MediaTypeMatch match;
  106. bool result = formatter.TryMatchSupportedMediaType(mediaTypeWithQuality, out match);
  107. Assert.True(result, String.Format("TryMatchSupportedMediaType should have succeeded for '{0}'.", mediaTypeWithQuality));
  108. Assert.NotNull(match);
  109. double quality = mediaTypeWithQuality.Quality.Value;
  110. Assert.Equal(quality, match.Quality);
  111. Assert.NotNull(match.MediaType);
  112. Assert.Equal(mediaTypeWithoutQuality.MediaType, match.MediaType.MediaType);
  113. }
  114. [Theory]
  115. [TestDataSet(typeof(HttpUnitTestDataSets), "StandardMediaTypesWithQuality")]
  116. [Trait("Description", "TryMatchSupportedMediaType(MediaTypeHeaderValue, out MediaTypeMatch) returns cloned media type, not original.")]
  117. public void TryMatchSupportedMediaTypeReturnsClone(MediaTypeWithQualityHeaderValue mediaTypeWithQuality)
  118. {
  119. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter();
  120. MediaTypeHeaderValue mediaTypeWithoutQuality = new MediaTypeHeaderValue(mediaTypeWithQuality.MediaType);
  121. formatter.SupportedMediaTypes.Add(mediaTypeWithoutQuality);
  122. MediaTypeMatch match;
  123. bool result = formatter.TryMatchSupportedMediaType(mediaTypeWithQuality, out match);
  124. Assert.True(result);
  125. Assert.NotNull(match);
  126. Assert.NotNull(match.MediaType);
  127. Assert.NotSame(mediaTypeWithoutQuality, match.MediaType);
  128. }
  129. [Theory]
  130. [TestDataSet(typeof(HttpUnitTestDataSets), "MediaRangeValuesWithQuality")]
  131. [Trait("Description", "TryMatchMediaTypeMapping(HttpRequestMessage, out MediaTypeMatch) returns media type and quality from media range with quality.")]
  132. public void TryMatchMediaTypeMappingWithQuality(MediaTypeWithQualityHeaderValue mediaRangeWithQuality)
  133. {
  134. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter();
  135. MediaTypeHeaderValue mediaRangeWithoutQuality = new MediaTypeHeaderValue(mediaRangeWithQuality.MediaType);
  136. MediaTypeHeaderValue mediaType = new MediaTypeHeaderValue("application/xml");
  137. MediaRangeMapping mapping = new MediaRangeMapping(mediaRangeWithoutQuality, mediaType);
  138. formatter.MediaTypeMappings.Add(mapping);
  139. HttpRequestMessage request = new HttpRequestMessage();
  140. request.Headers.Accept.Add(mediaRangeWithQuality);
  141. MediaTypeMatch match;
  142. bool result = formatter.TryMatchMediaTypeMapping(request, out match);
  143. Assert.True(result, String.Format("TryMatchMediaTypeMapping should have succeeded for '{0}'.", mediaRangeWithQuality));
  144. Assert.NotNull(match);
  145. double quality = mediaRangeWithQuality.Quality.Value;
  146. Assert.Equal(quality, match.Quality);
  147. Assert.NotNull(match.MediaType);
  148. Assert.Equal(mediaType.MediaType, match.MediaType.MediaType);
  149. }
  150. [Theory]
  151. [TestDataSet(typeof(HttpUnitTestDataSets), "MediaRangeValuesWithQuality")]
  152. [Trait("Description", "TryMatchMediaTypeMapping(HttpRequestMessage, out MediaTypeMatch) returns a clone of the original media type.")]
  153. public void TryMatchMediaTypeMappingClonesMediaType(MediaTypeWithQualityHeaderValue mediaRangeWithQuality)
  154. {
  155. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter();
  156. MediaTypeHeaderValue mediaRangeWithoutQuality = new MediaTypeHeaderValue(mediaRangeWithQuality.MediaType);
  157. MediaTypeHeaderValue mediaType = new MediaTypeHeaderValue("application/xml");
  158. MediaRangeMapping mapping = new MediaRangeMapping(mediaRangeWithoutQuality, mediaType);
  159. formatter.MediaTypeMappings.Add(mapping);
  160. HttpRequestMessage request = new HttpRequestMessage();
  161. request.Headers.Accept.Add(mediaRangeWithQuality);
  162. MediaTypeMatch match;
  163. formatter.TryMatchMediaTypeMapping(request, out match);
  164. Assert.NotNull(match);
  165. Assert.NotNull(match.MediaType);
  166. Assert.NotSame(mediaType, match.MediaType);
  167. }
  168. [Fact]
  169. [Trait("Description", "SelectResponseMediaType(Type, HttpRequestMessage) matches based only on type.")]
  170. public void SelectResponseMediaTypeMatchesType()
  171. {
  172. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter() { CallBase = true };
  173. HttpRequestMessage request = new HttpRequestMessage();
  174. ResponseMediaTypeMatch match = formatter.SelectResponseMediaType(typeof(string), request);
  175. Assert.NotNull(match);
  176. Assert.Equal(ResponseFormatterSelectionResult.MatchOnCanWriteType, match.ResponseFormatterSelectionResult);
  177. Assert.Null(match.MediaTypeMatch.MediaType);
  178. }
  179. [Theory]
  180. [TestDataSet(typeof(HttpUnitTestDataSets), "LegalMediaTypeHeaderValues")]
  181. [Trait("Description", "SelectResponseMediaType(Type, HttpRequestMessage) matches media type from request content type.")]
  182. public void SelectResponseMediaTypeMatchesRequestContentType(MediaTypeHeaderValue mediaType)
  183. {
  184. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter() { CallBase = true };
  185. formatter.SupportedMediaTypes.Add(mediaType);
  186. HttpRequestMessage request = new HttpRequestMessage() { Content = new StringContent("fred") };
  187. request.Content.Headers.ContentType = mediaType;
  188. HttpResponseMessage response = new HttpResponseMessage() { RequestMessage = request };
  189. ResponseMediaTypeMatch match = formatter.SelectResponseMediaType(typeof(string), request);
  190. Assert.NotNull(match);
  191. Assert.Equal(ResponseFormatterSelectionResult.MatchOnRequestContentType, match.ResponseFormatterSelectionResult);
  192. Assert.NotNull(match.MediaTypeMatch.MediaType);
  193. Assert.Equal(mediaType.MediaType, match.MediaTypeMatch.MediaType.MediaType);
  194. }
  195. [TestDataSet(typeof(HttpUnitTestDataSets), "LegalMediaTypeHeaderValues")]
  196. [Trait("Description", "SelectResponseMediaType(Type, HttpRequestMessage) matches media type from response content type.")]
  197. public void SelectResponseMediaTypeMatchesResponseContentType(MediaTypeHeaderValue mediaType)
  198. {
  199. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter() { CallBase = true };
  200. formatter.SupportedMediaTypes.Add(mediaType);
  201. HttpRequestMessage request = new HttpRequestMessage();
  202. HttpResponseMessage response = new HttpResponseMessage() { RequestMessage = request, Content = new StringContent("fred") };
  203. response.Content.Headers.ContentType = mediaType;
  204. ResponseMediaTypeMatch match = formatter.SelectResponseMediaType(typeof(string), request);
  205. Assert.NotNull(match);
  206. Assert.Equal(ResponseFormatterSelectionResult.MatchOnResponseContentType, match.ResponseFormatterSelectionResult);
  207. Assert.NotNull(match.MediaTypeMatch.MediaType);
  208. Assert.Equal(mediaType.MediaType, match.MediaTypeMatch.MediaType.MediaType);
  209. }
  210. [Theory]
  211. [TestDataSet(typeof(HttpUnitTestDataSets), "StandardMediaTypesWithQuality")]
  212. [Trait("Description", "SelectResponseMediaType(Type, HttpRequestMessage) matches supported media type from accept headers.")]
  213. public void SelectResponseMediaTypeMatchesAcceptHeaderToSupportedMediaTypes(MediaTypeWithQualityHeaderValue mediaTypeWithQuality)
  214. {
  215. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter() { CallBase = true };
  216. MediaTypeHeaderValue mediaTypeWithoutQuality = new MediaTypeHeaderValue(mediaTypeWithQuality.MediaType);
  217. formatter.SupportedMediaTypes.Add(mediaTypeWithoutQuality);
  218. HttpRequestMessage request = new HttpRequestMessage();
  219. request.Headers.Accept.Add(mediaTypeWithQuality);
  220. ResponseMediaTypeMatch match = formatter.SelectResponseMediaType(typeof(string), request);
  221. Assert.NotNull(match);
  222. Assert.Equal(ResponseFormatterSelectionResult.MatchOnRequestAcceptHeader, match.ResponseFormatterSelectionResult);
  223. double quality = mediaTypeWithQuality.Quality.Value;
  224. Assert.Equal(quality, match.MediaTypeMatch.Quality);
  225. Assert.NotNull(match.MediaTypeMatch.MediaType);
  226. Assert.Equal(mediaTypeWithoutQuality.MediaType, match.MediaTypeMatch.MediaType.MediaType);
  227. }
  228. [TestDataSet(typeof(HttpUnitTestDataSets), "MediaRangeValuesWithQuality")]
  229. [Trait("Description", "SelectResponseMediaType(Type, HttpRequestMessage) matches media type with quality from media type mapping.")]
  230. public void SelectResponseMediaTypeMatchesWithMediaTypeMapping(MediaTypeWithQualityHeaderValue mediaRangeWithQuality)
  231. {
  232. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter() { CallBase = true };
  233. MediaTypeHeaderValue mediaRangeWithoutQuality = new MediaTypeHeaderValue(mediaRangeWithQuality.MediaType);
  234. MediaTypeHeaderValue mediaType = new MediaTypeHeaderValue("application/xml");
  235. MediaRangeMapping mapping = new MediaRangeMapping(mediaRangeWithoutQuality, mediaType);
  236. formatter.MediaTypeMappings.Add(mapping);
  237. HttpRequestMessage request = new HttpRequestMessage();
  238. request.Headers.Accept.Add(mediaRangeWithQuality);
  239. ResponseMediaTypeMatch match = formatter.SelectResponseMediaType(typeof(string), request);
  240. Assert.NotNull(match);
  241. Assert.Equal(ResponseFormatterSelectionResult.MatchOnRequestWithMediaTypeMapping, match.ResponseFormatterSelectionResult);
  242. double quality = mediaRangeWithQuality.Quality.Value;
  243. Assert.Equal(quality, match.MediaTypeMatch.Quality);
  244. Assert.NotNull(match.MediaTypeMatch.MediaType);
  245. Assert.Equal(mediaType.MediaType, match.MediaTypeMatch.MediaType.MediaType);
  246. }
  247. public static IEnumerable<object[]> SelectCharacterEncodingTestData
  248. {
  249. get
  250. {
  251. yield return new object[]
  252. {
  253. null,
  254. new[] { "utf-8", "utf-16"},
  255. "utf-8"
  256. };
  257. yield return new object[]
  258. {
  259. null,
  260. new[] { "utf-16", "utf-8"},
  261. "utf-16"
  262. };
  263. yield return new object[]
  264. {
  265. "utf-32",
  266. new[] { "utf-8", "utf-16"},
  267. "utf-8"
  268. };
  269. yield return new object[]
  270. {
  271. "utf-32",
  272. new[] { "utf-8", "utf-16", "utf-32"},
  273. "utf-32"
  274. };
  275. }
  276. }
  277. public static IEnumerable<object[]> SelectResponseCharacterEncodingTestData
  278. {
  279. get
  280. {
  281. yield return new object[]
  282. {
  283. new[] { "*;q=0.5", "utf-8;q=0.8", "utf-16;q=0.7" },
  284. null,
  285. new[] { "utf-16", "utf-8"},
  286. "utf-8"
  287. };
  288. yield return new object[]
  289. {
  290. new[] { "*;q=0.5", "utf-8;q=0.8", "utf-16;q=0.9" },
  291. null,
  292. new[] { "utf-8", "utf-16"},
  293. "utf-16"
  294. };
  295. yield return new object[]
  296. {
  297. new[] { "*;q=0.9", "utf-8;q=0.5", "utf-16;q=0.5" },
  298. null,
  299. new[] { "utf-8", "utf-16"},
  300. "utf-8"
  301. };
  302. yield return new object[]
  303. {
  304. new string[] { },
  305. "utf-16",
  306. new[] { "utf-8", "utf-16"},
  307. "utf-16"
  308. };
  309. yield return new object[]
  310. {
  311. new[] { "*;q=0.5" },
  312. "utf-16",
  313. new[] { "utf-8", "utf-16"},
  314. "utf-8"
  315. };
  316. yield return new object[]
  317. {
  318. new[] { "*;q=0.5", "utf-16;q=0.7", "utf-8;q=0.8" },
  319. "utf-16",
  320. new[] { "utf-8", "utf-16"},
  321. "utf-8"
  322. };
  323. }
  324. }
  325. [Fact]
  326. public void SelectCharacterEncoding_ThrowsIfNoSupportedEncodings()
  327. {
  328. // Arrange
  329. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter { CallBase = true };
  330. HttpContent content = new StringContent("Hello World", Encoding.UTF8, "text/plain");
  331. // Act
  332. Assert.Throws<InvalidOperationException>(() => formatter.SelectCharacterEncoding(content.Headers));
  333. }
  334. [Theory]
  335. [PropertyData("SelectCharacterEncodingTestData")]
  336. public void SelectCharacterEncoding_ReturnsBestEncoding(string bodyEncoding, string[] supportedEncodings, string expectedEncoding)
  337. {
  338. // Arrange
  339. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter { CallBase = true };
  340. foreach (string supportedEncoding in supportedEncodings)
  341. {
  342. formatter.SupportedEncodings.Add(Encoding.GetEncoding(supportedEncoding));
  343. }
  344. HttpContentHeaders contentHeaders = null;
  345. if (bodyEncoding != null)
  346. {
  347. Encoding bodyEnc = Encoding.GetEncoding(bodyEncoding);
  348. HttpContent content = new StringContent("Hello World", bodyEnc, "text/plain");
  349. contentHeaders = content.Headers;
  350. }
  351. // Act
  352. Encoding actualEncoding = formatter.SelectCharacterEncoding(contentHeaders);
  353. // Assert
  354. Encoding expectedEnc = expectedEncoding != null ? Encoding.GetEncoding(expectedEncoding) : null;
  355. Assert.Equal(expectedEnc, actualEncoding);
  356. }
  357. [Theory]
  358. [PropertyData("SelectResponseCharacterEncodingTestData")]
  359. public void SelectResponseCharacterEncoding_ReturnsBestEncodingBasedOnAcceptCharsetMatch(string[] acceptCharsetValues, string bodyEncoding, string[] supportedEncodings, string expectedEncoding)
  360. {
  361. // Arrange
  362. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter() { CallBase = true };
  363. HttpRequestMessage request = new HttpRequestMessage();
  364. foreach (var acceptCharsetValue in acceptCharsetValues)
  365. {
  366. request.Headers.AcceptCharset.Add(StringWithQualityHeaderValue.Parse(acceptCharsetValue));
  367. }
  368. foreach (var supportedEncoding in supportedEncodings)
  369. {
  370. Encoding supportedEnc = Encoding.GetEncoding(supportedEncoding);
  371. formatter.SupportedEncodings.Add(supportedEnc);
  372. }
  373. if (bodyEncoding != null)
  374. {
  375. Encoding bodyEnc = Encoding.GetEncoding(bodyEncoding);
  376. request.Method = HttpMethod.Post;
  377. request.Content = new StringContent("Hello World", bodyEnc, "text/plain");
  378. }
  379. // Act
  380. Encoding actualEncoding = formatter.SelectResponseCharacterEncoding(request);
  381. // Assert
  382. Encoding expectedEnc = expectedEncoding != null ? Encoding.GetEncoding(expectedEncoding) : null;
  383. Assert.Equal(expectedEnc, actualEncoding);
  384. }
  385. [Theory]
  386. [TestDataSet(
  387. typeof(CommonUnitTestDataSets), "RepresentativeValueAndRefTypeTestDataCollection",
  388. typeof(HttpUnitTestDataSets), "LegalMediaTypeStrings")]
  389. [Trait("Description", "CanReadAs(Type, MediaTypeHeaderValue) returns true for all standard media types.")]
  390. public void CanReadAsReturnsTrue(Type variationType, object testData, string mediaType)
  391. {
  392. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter() { CallBase = true };
  393. string[] legalMediaTypeStrings = HttpUnitTestDataSets.LegalMediaTypeStrings.ToArray();
  394. foreach (string legalMediaType in legalMediaTypeStrings)
  395. {
  396. formatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue(legalMediaType));
  397. }
  398. MediaTypeHeaderValue contentType = new MediaTypeHeaderValue(mediaType);
  399. Assert.True(formatter.CanReadAs(variationType, contentType));
  400. }
  401. [Fact]
  402. [Trait("Description", "CanReadAs(Type, MediaTypeHeaderValue) throws with null type.")]
  403. public void CanReadAsThrowsWithNullType()
  404. {
  405. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter();
  406. Assert.ThrowsArgumentNull(() => formatter.CanReadAs(type: null, mediaType: null), "type");
  407. }
  408. [Fact]
  409. [Trait("Description", "CanReadAs(Type, MediaTypeHeaderValue) throws with null formatter context.")]
  410. public void CanReadAsThrowsWithNullMediaType()
  411. {
  412. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter();
  413. Assert.ThrowsArgumentNull(() => formatter.CanReadAs(typeof(int), mediaType: null), "mediaType");
  414. }
  415. [Theory]
  416. [TestDataSet(typeof(CommonUnitTestDataSets), "RepresentativeValueAndRefTypeTestDataCollection")]
  417. [Trait("Description", "CanWriteAs(Type, MediaTypeHeaderValue, out MediaTypeHeaderValue) returns true always for supported media types.")]
  418. public void CanWriteAsReturnsTrue(Type variationType, object testData)
  419. {
  420. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter() { CallBase = true };
  421. foreach (string mediaType in HttpUnitTestDataSets.LegalMediaTypeStrings)
  422. {
  423. formatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue(mediaType));
  424. }
  425. MediaTypeHeaderValue matchedMediaType = null;
  426. Assert.True(formatter.CanWriteAs(variationType, formatter.SupportedMediaTypes[0], out matchedMediaType));
  427. }
  428. [Fact]
  429. [Trait("Description", "CanWriteAs(Type, MediaTypeHeaderValue, out MediaTypeHeaderValue) throws with null content.")]
  430. public void CanWriteAsThrowsWithNullContent()
  431. {
  432. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter();
  433. MediaTypeHeaderValue mediaType = null;
  434. Assert.ThrowsArgumentNull(() => formatter.CanWriteAs(typeof(int), null, out mediaType), "mediaType");
  435. }
  436. [Theory]
  437. [TestDataSet(typeof(CommonUnitTestDataSets), "RepresentativeValueAndRefTypeTestDataCollection")]
  438. [Trait("Description", "CanWriteAs(Type, MediaTypeHeaderValue, out MediaTypeHeaderValue) returns true always for supported media types.")]
  439. public void CanWriteAsUsingRequestReturnsTrue(Type variationType, object testData)
  440. {
  441. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter() { CallBase = true };
  442. foreach (string mediaType in HttpUnitTestDataSets.LegalMediaTypeStrings)
  443. {
  444. formatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue(mediaType));
  445. }
  446. MediaTypeHeaderValue matchedMediaType = null;
  447. Assert.True(formatter.CanWriteAs(variationType, formatter.SupportedMediaTypes[0], out matchedMediaType));
  448. }
  449. [Theory]
  450. [TestDataSet(
  451. typeof(CommonUnitTestDataSets), "RepresentativeValueAndRefTypeTestDataCollection",
  452. typeof(HttpUnitTestDataSets), "LegalMediaTypeStrings")]
  453. [Trait("Description", "CanReadType(Type) base implementation returns true for all types.")]
  454. public void CanReadTypeReturnsTrue(Type variationType, object testData, string mediaType)
  455. {
  456. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter() { CallBase = true };
  457. string[] legalMediaTypeStrings = HttpUnitTestDataSets.LegalMediaTypeStrings.ToArray();
  458. foreach (string mediaTypeTmp in legalMediaTypeStrings)
  459. {
  460. formatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue(mediaTypeTmp));
  461. }
  462. // Invoke CanReadAs because it invokes CanReadType
  463. Assert.True(formatter.CanReadAs(variationType, new MediaTypeHeaderValue(mediaType)));
  464. }
  465. [Theory]
  466. [TestDataSet(typeof(CommonUnitTestDataSets), "RepresentativeValueAndRefTypeTestDataCollection")]
  467. [Trait("Description", "CanWriteType() base implementation returns true always.")]
  468. public void CanWriteTypeReturnsTrue(Type variationType, object testData)
  469. {
  470. MockMediaTypeFormatter formatter = new MockMediaTypeFormatter() { CallBase = true };
  471. foreach (string mediaType in HttpUnitTestDataSets.LegalMediaTypeStrings)
  472. {
  473. formatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue(mediaType));
  474. }
  475. MediaTypeHeaderValue matchedMediaType = null;
  476. Assert.True(formatter.CanWriteAs(variationType, formatter.SupportedMediaTypes[0], out matchedMediaType));
  477. }
  478. [Fact]
  479. public void ReadFromStreamAsync_ThrowsNotSupportedException()
  480. {
  481. var formatter = new Mock<MediaTypeFormatter> { CallBase = true }.Object;
  482. Assert.Throws<NotSupportedException>(() => formatter.ReadFromStreamAsync(null, null, null, null),
  483. "The media type formatter of type 'MediaTypeFormatterProxy' does not support reading because it does not implement the ReadFromStreamAsync method.");
  484. }
  485. [Fact]
  486. public void WriteToStreamAsync_ThrowsNotSupportedException()
  487. {
  488. var formatter = new Mock<MediaTypeFormatter> { CallBase = true }.Object;
  489. Assert.Throws<NotSupportedException>(() => formatter.WriteToStreamAsync(null, null, null, null, null),
  490. "The media type formatter of type 'MediaTypeFormatterProxy' does not support writing because it does not implement the WriteToStreamAsync method.");
  491. }
  492. [Theory]
  493. [InlineData(typeof(object))]
  494. [InlineData(typeof(string))]
  495. [InlineData(typeof(Nullable<int>))]
  496. public void GetDefaultValueForType_ReturnsNullForReferenceTypes(Type referenceType)
  497. {
  498. Assert.Null(MediaTypeFormatter.GetDefaultValueForType(referenceType));
  499. }
  500. [Theory]
  501. [InlineData(false)]
  502. [InlineData(0)]
  503. [InlineData('a')]
  504. public void GetDefaultValueForType_ReturnsValueForValueTypes<T>(T value)
  505. {
  506. Type valueType = value.GetType();
  507. T defaultValue = default(T);
  508. Assert.Equal(defaultValue, MediaTypeFormatter.GetDefaultValueForType(valueType));
  509. }
  510. [Fact]
  511. public void GetDefaultValueForType_ReturnsValueForStruct()
  512. {
  513. TestStruct s = new TestStruct();
  514. TestStruct result = (TestStruct)MediaTypeFormatter.GetDefaultValueForType(typeof(TestStruct));
  515. Assert.Equal(s, result);
  516. }
  517. public struct TestStruct
  518. {
  519. private int I;
  520. public TestStruct(int i)
  521. {
  522. I = i + 1;
  523. }
  524. }
  525. }
  526. }