ColorTests.Constructors.cs 6.6 KB

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