ColorTests.Constructors.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. namespace Terminal.Gui.DrawingTests;
  2. public partial class ColorTests
  3. {
  4. [Fact]
  5. public void Constructor_Empty_ReturnsColorWithZeroValue ()
  6. {
  7. Color color = new ();
  8. Assert.Multiple (
  9. () => Assert.Equal (0, color.Rgba),
  10. () => Assert.Equal (0u, color.Argb),
  11. () => Assert.Equal (0, color.R),
  12. () => Assert.Equal (0, color.G),
  13. () => Assert.Equal (0, color.B),
  14. () => Assert.Equal (0, color.A)
  15. );
  16. }
  17. [Theory]
  18. [CombinatorialData]
  19. public void Constructor_WithByteRGBAValues_AllValuesCorrect (
  20. [CombinatorialValues (0, 1, 254)] byte r,
  21. [CombinatorialValues (0, 1, 253)] byte g,
  22. [CombinatorialValues (0, 1, 252)] byte b,
  23. [CombinatorialValues (0, 1, 251)] byte a
  24. )
  25. {
  26. var color = new Color (r, g, b, a);
  27. ReadOnlySpan<byte> bytes = [b, g, r, a];
  28. var expectedRgba = BitConverter.ToInt32 (bytes);
  29. var expectedArgb = BitConverter.ToUInt32 (bytes);
  30. Assert.Multiple (
  31. () => Assert.Equal (r, color.R),
  32. () => Assert.Equal (g, color.G),
  33. () => Assert.Equal (b, color.B),
  34. () => Assert.Equal (a, color.A),
  35. () => Assert.Equal (expectedRgba, color.Rgba),
  36. () => Assert.Equal (expectedArgb, color.Argb)
  37. );
  38. }
  39. [Theory]
  40. [CombinatorialData]
  41. public void Constructor_WithByteRGBValues_AllValuesCorrect (
  42. [CombinatorialValues (0, 1, 254)] byte r,
  43. [CombinatorialValues (0, 1, 253)] byte g,
  44. [CombinatorialValues (0, 1, 252)] byte b
  45. )
  46. {
  47. var color = new Color (r, g, b);
  48. ReadOnlySpan<byte> bytes = [b, g, r, 255];
  49. var expectedRgba = BitConverter.ToInt32 (bytes);
  50. var expectedArgb = BitConverter.ToUInt32 (bytes);
  51. Assert.Multiple (
  52. () => Assert.Equal (r, color.R),
  53. () => Assert.Equal (g, color.G),
  54. () => Assert.Equal (b, color.B),
  55. () => Assert.Equal (byte.MaxValue, color.A),
  56. () => Assert.Equal (expectedRgba, color.Rgba),
  57. () => Assert.Equal (expectedArgb, color.Argb)
  58. );
  59. }
  60. [Theory]
  61. [MemberData (
  62. nameof (ColorTestsTheoryDataGenerators.Constructor_WithColorName_AllChannelsCorrect),
  63. MemberType = typeof (ColorTestsTheoryDataGenerators)
  64. )]
  65. public void Constructor_WithColorName_AllChannelsCorrect (
  66. ColorName cname,
  67. ValueTuple<byte, byte, byte> expectedColorValues
  68. )
  69. {
  70. var color = new Color (cname);
  71. (byte r, byte g, byte b) = expectedColorValues;
  72. Assert.Multiple (
  73. () => Assert.Equal (r, color.R),
  74. () => Assert.Equal (g, color.G),
  75. () => Assert.Equal (b, color.B),
  76. () => Assert.Equal (byte.MaxValue, color.A)
  77. );
  78. }
  79. [Theory]
  80. [CombinatorialData]
  81. public void Constructor_WithInt32_AllValuesCorrect (
  82. [CombinatorialValues (0, 1, 254)] byte r,
  83. [CombinatorialValues (0, 1, 253)] byte g,
  84. [CombinatorialValues (0, 1, 252)] byte b,
  85. [CombinatorialValues (0, 1, 251)] byte a
  86. )
  87. {
  88. ReadOnlySpan<byte> bytes = [b, g, r, a];
  89. var expectedRgba = BitConverter.ToInt32 (bytes);
  90. var expectedArgb = BitConverter.ToUInt32 (bytes);
  91. var color = new Color (expectedRgba);
  92. Assert.Multiple (
  93. () => Assert.Equal (r, color.R),
  94. () => Assert.Equal (g, color.G),
  95. () => Assert.Equal (b, color.B),
  96. () => Assert.Equal (a, color.A),
  97. () => Assert.Equal (expectedRgba, color.Rgba),
  98. () => Assert.Equal (expectedArgb, color.Argb)
  99. );
  100. }
  101. [Theory]
  102. [CombinatorialData]
  103. public void Constructor_WithInt32RGBAValues_AllValuesCorrect (
  104. [CombinatorialRandomData (Count = 4, Minimum = 0, Maximum = 255)]
  105. int r,
  106. [CombinatorialRandomData (Count = 4, Minimum = 0, Maximum = 255)]
  107. int g,
  108. [CombinatorialRandomData (Count = 4, Minimum = 0, Maximum = 255)]
  109. int b,
  110. [CombinatorialRandomData (Count = 4, Minimum = 0, Maximum = 255)]
  111. int a
  112. )
  113. {
  114. var color = new Color (r, g, b, a);
  115. Assert.Multiple (
  116. () => Assert.Equal (r, color.R),
  117. () => Assert.Equal (g, color.G),
  118. () => Assert.Equal (b, color.B),
  119. () => Assert.Equal (a, color.A)
  120. );
  121. }
  122. [Theory]
  123. [CombinatorialData]
  124. public void Constructor_WithInt32RGBValues_AllValuesCorrect (
  125. [CombinatorialRandomData (Count = 4, Minimum = 0, Maximum = 255)]
  126. int r,
  127. [CombinatorialRandomData (Count = 4, Minimum = 0, Maximum = 255)]
  128. int g,
  129. [CombinatorialRandomData (Count = 4, Minimum = 0, Maximum = 255)]
  130. int b
  131. )
  132. {
  133. var color = new Color (r, g, b);
  134. Assert.Multiple (
  135. () => Assert.Equal (r, color.R),
  136. () => Assert.Equal (g, color.G),
  137. () => Assert.Equal (b, color.B),
  138. () => Assert.Equal (byte.MaxValue, color.A)
  139. );
  140. }
  141. [Theory]
  142. [CombinatorialData]
  143. public void Constructor_WithString_EmptyOrWhitespace_ThrowsArgumentException (
  144. [CombinatorialValues ("", "\t", " ", "\r", "\r\n", "\n", " ")]
  145. string badString
  146. )
  147. {
  148. Assert.Throws<ArgumentException> (() => Color.Parse (badString));
  149. }
  150. [Fact]
  151. public void Constructor_WithString_Null_ThrowsArgumentNullException () { Assert.Throws<ArgumentNullException> (static () => Color.Parse (null)); }
  152. [Theory]
  153. [CombinatorialData]
  154. public void Constructor_WithUInt32_AllChannelsCorrect (
  155. [CombinatorialValues (0, 1, 254)] byte r,
  156. [CombinatorialValues (0, 1, 253)] byte g,
  157. [CombinatorialValues (0, 1, 252)] byte b,
  158. [CombinatorialValues (0, 1, 251)] byte a
  159. )
  160. {
  161. ReadOnlySpan<byte> bytes = [b, g, r, a];
  162. var expectedArgb = BitConverter.ToUInt32 (bytes);
  163. var color = new Color (expectedArgb);
  164. Assert.Multiple (
  165. () => Assert.Equal (r, color.R),
  166. () => Assert.Equal (g, color.G),
  167. () => Assert.Equal (b, color.B),
  168. () => Assert.Equal (a, color.A)
  169. );
  170. }
  171. }
  172. public static partial class ColorTestsTheoryDataGenerators
  173. {
  174. public static TheoryData<ColorName, ValueTuple<byte, byte, byte>> Constructor_WithColorName_AllChannelsCorrect ()
  175. {
  176. TheoryData<ColorName, ValueTuple<byte, byte, byte>> data = [];
  177. data.Add (ColorName.Black, new ValueTuple<byte, byte, byte> (12, 12, 12));
  178. data.Add (ColorName.Blue, new ValueTuple<byte, byte, byte> (0, 55, 218));
  179. data.Add (ColorName.Green, new ValueTuple<byte, byte, byte> (19, 161, 14));
  180. data.Add (ColorName.Cyan, new ValueTuple<byte, byte, byte> (58, 150, 221));
  181. data.Add (ColorName.Red, new ValueTuple<byte, byte, byte> (197, 15, 31));
  182. data.Add (ColorName.Magenta, new ValueTuple<byte, byte, byte> (136, 23, 152));
  183. data.Add (ColorName.Yellow, new ValueTuple<byte, byte, byte> (128, 64, 32));
  184. data.Add (ColorName.Gray, new ValueTuple<byte, byte, byte> (204, 204, 204));
  185. data.Add (ColorName.DarkGray, new ValueTuple<byte, byte, byte> (118, 118, 118));
  186. data.Add (ColorName.BrightBlue, new ValueTuple<byte, byte, byte> (59, 120, 255));
  187. data.Add (ColorName.BrightGreen, new ValueTuple<byte, byte, byte> (22, 198, 12));
  188. data.Add (ColorName.BrightCyan, new ValueTuple<byte, byte, byte> (97, 214, 214));
  189. data.Add (ColorName.BrightRed, new ValueTuple<byte, byte, byte> (231, 72, 86));
  190. data.Add (ColorName.BrightMagenta, new ValueTuple<byte, byte, byte> (180, 0, 158));
  191. data.Add (ColorName.BrightYellow, new ValueTuple<byte, byte, byte> (249, 241, 165));
  192. data.Add (ColorName.White, new ValueTuple<byte, byte, byte> (242, 242, 242));
  193. return data;
  194. }
  195. }