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

https://bitbucket.org/mdavid/aspnetwebstack
C# | 175 lines | 151 code | 15 blank | 9 comment | 0 complexity | fa50aa3e9fdb5dea1634ca348ffa9797 MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Net.Http.Headers;
  4. using Xunit;
  5. using Xunit.Extensions;
  6. using Assert = Microsoft.TestCommon.AssertEx;
  7. namespace System.Net.Http.Formatting
  8. {
  9. public class MediaTypeWithQualityHeaderValueComparerTests
  10. {
  11. public static IEnumerable<object[]> EqualValues
  12. {
  13. get
  14. {
  15. yield return new[] { "text/xml", "text/xml" };
  16. yield return new[] { "text/xml", "TEXT/XML" };
  17. yield return new[] { "text/plain", "text/xml" };
  18. yield return new[] { "text/*", "text/*" };
  19. yield return new[] { "text/*", "TEXT/*" };
  20. yield return new[] { "*/*", "*/*" };
  21. yield return new[] { "text/xml", "text/xml; charset=utf8" };
  22. yield return new[] { "text/xml", "text/xml; parameter=value" };
  23. yield return new[] { "text/xml; parameter=value", "text/xml; parameter=value" };
  24. yield return new[] { "text/xml; parameter1=value1", "text/xml; parameter2=value2" };
  25. yield return new[] { "text/xml; q=0.5", "text/xml; q=0.50" };
  26. yield return new[] { "application/xml; q=0.5", "text/xml; q=0.5" };
  27. yield return new[] { "application/xml; q=0.1", "text/xml; q=0.1" };
  28. yield return new[] { "application/xml; parameter=value1; q=0.5", "text/xml; parameter=value2; q=0.5" };
  29. yield return new[] { "text/xml", "text/xml;q=1" };
  30. yield return new[] { "text/xml", "text/xml; q=1" };
  31. yield return new[] { "text/xml", "text/xml;q=1.0" };
  32. yield return new[] { "text/xml", "text/xml; q=1.0" };
  33. yield return new[] { "text/xml", "text/xml; q=1.00000" };
  34. yield return new[] { "text/xml; q=0.5", "text/xml; q=0.5" };
  35. yield return new[] { "text/xml; q=1.0", "text/xml; q=1.0" };
  36. yield return new[] { "*/*", "*/*;q=1" };
  37. yield return new[] { "*/*", "*/*; q=1" };
  38. yield return new[] { "*/*", "*/*;q=1.0" };
  39. yield return new[] { "*/*", "*/*; q=1.0" };
  40. yield return new[] { "*/*; q=0.5", "*/*; q=0.5" };
  41. yield return new[] { "*/*; q=1.0", "*/*; q=1.0" };
  42. yield return new[] { "text/xml", "text/xml;q=1" };
  43. yield return new[] { "text/xml", "text/xml; q=1" };
  44. yield return new[] { "text/xml", "text/xml;q=1.0" };
  45. yield return new[] { "text/xml", "text/xml; q=1.0" };
  46. }
  47. }
  48. public static IEnumerable<object[]> NonEqualValues
  49. {
  50. get
  51. {
  52. yield return new[] { "text/plain; q=0.5", "text/plain; q=1.0" };
  53. yield return new[] { "text/plain; q=0.5", "text/xml; q=1.0" };
  54. yield return new[] { "text/*", "text/plain" };
  55. yield return new[] { "*/*", "text/xml" };
  56. yield return new[] { "*/*", "text/*" };
  57. yield return new[] { "*/*;q=0.5", "*/*;q=0.6" };
  58. yield return new[] { "*/*;q=0.5", "text/*;q=0.5" };
  59. yield return new[] { "*/*;q=1", "text/plain" };
  60. yield return new[] { "*/*; q=1", "text/plain" };
  61. yield return new[] { "*/*;q=1.0", "text/plain" };
  62. yield return new[] { "*/*; q=1.0", "text/plain" };
  63. yield return new[] { "*/*; q=0.5", "text/plain; q=0.5" };
  64. yield return new[] { "*/*; q=1.0", "text/plain; q=1.0" };
  65. yield return new[] { "*/*; q=0.5", "text/*; q=0.6" };
  66. }
  67. }
  68. public static IEnumerable<object[]> BeforeAfterSortedValues
  69. {
  70. get
  71. {
  72. yield return new[]
  73. {
  74. new List<string>
  75. {
  76. "text/plain",
  77. "text/plain;q=1.0",
  78. "text/plain",
  79. "text/plain;q=0",
  80. "*/*;q=0.8",
  81. "*/*;q=1",
  82. "text/*;q=1",
  83. "text/plain;q=0.8",
  84. "text/*;q=0.8",
  85. "text/*;q=0.6",
  86. "text/*;q=1.0",
  87. "*/*;q=0.4",
  88. "text/plain;q=0.6",
  89. "text/xml",
  90. },
  91. new List<string>
  92. {
  93. "text/plain",
  94. "text/plain;q=1.0",
  95. "text/plain",
  96. "text/xml",
  97. "text/*;q=1",
  98. "text/*;q=1.0",
  99. "*/*;q=1",
  100. "text/plain;q=0.8",
  101. "text/*;q=0.8",
  102. "*/*;q=0.8",
  103. "text/plain;q=0.6",
  104. "text/*;q=0.6",
  105. "*/*;q=0.4",
  106. "text/plain;q=0",
  107. },
  108. };
  109. }
  110. }
  111. [Fact]
  112. public void StaticComparer_Returns_SameInstance()
  113. {
  114. MediaTypeWithQualityHeaderValueComparer comparer1 = MediaTypeWithQualityHeaderValueComparer.QualityComparer;
  115. MediaTypeWithQualityHeaderValueComparer comparer2 = MediaTypeWithQualityHeaderValueComparer.QualityComparer;
  116. Assert.NotNull(comparer1);
  117. Assert.Same(comparer1, comparer2);
  118. }
  119. [Theory]
  120. [PropertyData("EqualValues")]
  121. public void ComparerReturnsZeroForEqualValues(string mediaType1, string mediaType2)
  122. {
  123. // Arrange
  124. MediaTypeWithQualityHeaderValueComparer comparer = MediaTypeWithQualityHeaderValueComparer.QualityComparer;
  125. // Act
  126. MediaTypeWithQualityHeaderValue mediaTypeHeaderValue1 = MediaTypeWithQualityHeaderValue.Parse(mediaType1);
  127. MediaTypeWithQualityHeaderValue mediaTypeHeaderValue2 = MediaTypeWithQualityHeaderValue.Parse(mediaType2);
  128. // Assert
  129. Assert.Equal(0, comparer.Compare(mediaTypeHeaderValue1, mediaTypeHeaderValue2));
  130. Assert.Equal(0, comparer.Compare(mediaTypeHeaderValue2, mediaTypeHeaderValue1));
  131. }
  132. [Theory]
  133. [PropertyData("NonEqualValues")]
  134. public void ComparerReturnsNonZeroForNonEqualValues(string mediaType1, string mediaType2)
  135. {
  136. // Arrange
  137. MediaTypeWithQualityHeaderValueComparer comparer = MediaTypeWithQualityHeaderValueComparer.QualityComparer;
  138. // Act
  139. MediaTypeWithQualityHeaderValue mediaTypeHeaderValue1 = MediaTypeWithQualityHeaderValue.Parse(mediaType1);
  140. MediaTypeWithQualityHeaderValue mediaTypeHeaderValue2 = MediaTypeWithQualityHeaderValue.Parse(mediaType2);
  141. // Assert
  142. Assert.Equal(-1, comparer.Compare(mediaTypeHeaderValue1, mediaTypeHeaderValue2));
  143. Assert.Equal(1, comparer.Compare(mediaTypeHeaderValue2, mediaTypeHeaderValue1));
  144. }
  145. [Theory]
  146. [PropertyData("BeforeAfterSortedValues")]
  147. public void ComparerSortsListCorrectly(List<string> unsorted, List<string> expectedSorted)
  148. {
  149. // Arrange
  150. IEnumerable<MediaTypeWithQualityHeaderValue> unsortedValues =
  151. unsorted.Select(u => MediaTypeWithQualityHeaderValue.Parse(u));
  152. IEnumerable<MediaTypeWithQualityHeaderValue> expectedSortedValues =
  153. expectedSorted.Select(u => MediaTypeWithQualityHeaderValue.Parse(u));
  154. // Act
  155. IEnumerable<MediaTypeWithQualityHeaderValue> actualSorted = unsortedValues.OrderByDescending(m => m, MediaTypeWithQualityHeaderValueComparer.QualityComparer);
  156. // Assert
  157. Assert.True(expectedSortedValues.SequenceEqual(actualSorted));
  158. }
  159. }
  160. }