ColorTests.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. using System;
  2. using System.Linq;
  3. using Xunit;
  4. namespace Terminal.Gui.DrawingTests;
  5. public class ColorTests {
  6. [Fact]
  7. public void Color_Is_Value_Type () =>
  8. // prove that Color is a value type
  9. Assert.True (typeof (Color).IsValueType);
  10. [Fact]
  11. public void Colors_ColorSchemes_Property_Has_Private_Setter ()
  12. {
  13. // Resharper Code Cleanup likes to remove the `private set; `
  14. // from the ColorSchemes property. This test will fail if
  15. // that happens.
  16. var property = typeof (Colors).GetProperty ("ColorSchemes");
  17. Assert.NotNull (property);
  18. Assert.NotNull (property.SetMethod);
  19. Assert.True (property.GetSetMethod (true).IsPrivate);
  20. }
  21. [Fact, AutoInitShutdown]
  22. public void ColorScheme_New ()
  23. {
  24. var scheme = new ColorScheme ();
  25. var lbl = new Label ();
  26. lbl.ColorScheme = scheme;
  27. lbl.Draw ();
  28. }
  29. [Fact]
  30. public void TestAllColors ()
  31. {
  32. var colorNames = Enum.GetValues (typeof (ColorName)).Cast<int> ().Distinct ().ToList ();
  33. var attrs = new Attribute [colorNames.Count];
  34. var idx = 0;
  35. foreach (ColorName bg in colorNames) {
  36. attrs [idx] = new Attribute (bg, colorNames.Count - 1 - bg);
  37. idx++;
  38. }
  39. Assert.Equal (16, attrs.Length);
  40. Assert.Equal (new Attribute (Color.Black, Color.White), attrs [0]);
  41. Assert.Equal (new Attribute (Color.Blue, Color.BrightYellow), attrs [1]);
  42. Assert.Equal (new Attribute (Color.Green, Color.BrightMagenta), attrs [2]);
  43. Assert.Equal (new Attribute (Color.Cyan, Color.BrightRed), attrs [3]);
  44. Assert.Equal (new Attribute (Color.Red, Color.BrightCyan), attrs [4]);
  45. Assert.Equal (new Attribute (Color.Magenta, Color.BrightGreen), attrs [5]);
  46. Assert.Equal (new Attribute (Color.Yellow, Color.BrightBlue), attrs [6]);
  47. Assert.Equal (new Attribute (Color.Gray, Color.DarkGray), attrs [7]);
  48. Assert.Equal (new Attribute (Color.DarkGray, Color.Gray), attrs [8]);
  49. Assert.Equal (new Attribute (Color.BrightBlue, Color.Yellow), attrs [9]);
  50. Assert.Equal (new Attribute (Color.BrightGreen, Color.Magenta), attrs [10]);
  51. Assert.Equal (new Attribute (Color.BrightCyan, Color.Red), attrs [11]);
  52. Assert.Equal (new Attribute (Color.BrightRed, Color.Cyan), attrs [12]);
  53. Assert.Equal (new Attribute (Color.BrightMagenta, Color.Green), attrs [13]);
  54. Assert.Equal (new Attribute (Color.BrightYellow, Color.Blue), attrs [14]);
  55. Assert.Equal (new Attribute (Color.White, Color.Black), attrs [^1]);
  56. }
  57. [Fact]
  58. public void ColorNames_HasOnly16DistinctElements () => Assert.Equal (16, Enum.GetValues (typeof (ColorName)).Cast<int> ().Distinct ().Count ());
  59. [Fact]
  60. public void ColorNames_HaveCorrectOrdinals ()
  61. {
  62. Assert.Equal (0, (int)ColorName.Black);
  63. Assert.Equal (1, (int)ColorName.Blue);
  64. Assert.Equal (2, (int)ColorName.Green);
  65. Assert.Equal (3, (int)ColorName.Cyan);
  66. Assert.Equal (4, (int)ColorName.Red);
  67. Assert.Equal (5, (int)ColorName.Magenta);
  68. Assert.Equal (6, (int)ColorName.Yellow);
  69. Assert.Equal (7, (int)ColorName.Gray);
  70. Assert.Equal (8, (int)ColorName.DarkGray);
  71. Assert.Equal (9, (int)ColorName.BrightBlue);
  72. Assert.Equal (10, (int)ColorName.BrightGreen);
  73. Assert.Equal (11, (int)ColorName.BrightCyan);
  74. Assert.Equal (12, (int)ColorName.BrightRed);
  75. Assert.Equal (13, (int)ColorName.BrightMagenta);
  76. Assert.Equal (14, (int)ColorName.BrightYellow);
  77. Assert.Equal (15, (int)ColorName.White);
  78. }
  79. [Fact]
  80. public void Color_Constructor_WithRGBValues ()
  81. {
  82. // Arrange
  83. var expectedR = 255;
  84. var expectedG = 0;
  85. var expectedB = 128;
  86. // Act
  87. var color = new Color (expectedR, expectedG, expectedB);
  88. // Assert
  89. Assert.Equal (expectedR, color.R);
  90. Assert.Equal (expectedG, color.G);
  91. Assert.Equal (expectedB, color.B);
  92. Assert.Equal (0xFF, color.A); // Alpha should be FF by default
  93. }
  94. [Fact]
  95. public void Color_Constructor_WithAlphaAndRGBValues ()
  96. {
  97. // Arrange
  98. var expectedA = 128;
  99. var expectedR = 255;
  100. var expectedG = 0;
  101. var expectedB = 128;
  102. // Act
  103. var color = new Color (expectedR, expectedG, expectedB, expectedA);
  104. // Assert
  105. Assert.Equal (expectedR, color.R);
  106. Assert.Equal (expectedG, color.G);
  107. Assert.Equal (expectedB, color.B);
  108. Assert.Equal (expectedA, color.A);
  109. }
  110. [Fact]
  111. public void Color_Constructor_WithRgbaValue ()
  112. {
  113. // Arrange
  114. var expectedRgba = unchecked((int)0xFF804040); // R: 128, G: 64, B: 64, Alpha: 255
  115. // Act
  116. var color = new Color (expectedRgba);
  117. // Assert
  118. Assert.Equal (128, color.R);
  119. Assert.Equal (64, color.G);
  120. Assert.Equal (64, color.B);
  121. Assert.Equal (255, color.A);
  122. }
  123. [Fact]
  124. public void Color_Constructor_WithColorName ()
  125. {
  126. // Arrange
  127. var colorName = ColorName.Blue;
  128. var expectedColor = new Color (0, 55, 218); // Blue
  129. // Act
  130. var color = new Color (colorName);
  131. // Assert
  132. Assert.Equal (expectedColor, color);
  133. }
  134. [Fact]
  135. public void Color_ToString_WithNamedColor ()
  136. {
  137. // Arrange
  138. var color = new Color (0, 55, 218); // Blue
  139. // Act
  140. var colorString = color.ToString ();
  141. // Assert
  142. Assert.Equal ("Blue", colorString);
  143. }
  144. [Fact]
  145. public void Color_ToString_WithRGBColor ()
  146. {
  147. // Arrange
  148. var color = new Color (1, 64, 32); // Custom RGB color
  149. // Act
  150. var colorString = color.ToString ();
  151. // Assert
  152. Assert.Equal ("#014020", colorString);
  153. }
  154. [Fact]
  155. public void Color_ImplicitOperator_FromInt ()
  156. {
  157. // Arrange
  158. var Rgba = unchecked((int)0xFF804020); // R: 128, G: 64, B: 32, Alpha: 255
  159. var expectedColor = new Color (128, 64, 32);
  160. // Act
  161. Color color = Rgba;
  162. // Assert
  163. Assert.Equal (expectedColor, color);
  164. }
  165. [Fact]
  166. public void Color_ExplicitOperator_ToInt ()
  167. {
  168. // Arrange
  169. var color = new Color (128, 64, 32);
  170. var expectedRgba = unchecked((int)0xFF804020); // R: 128, G: 64, B: 32, Alpha: 255
  171. // Act
  172. var Rgba = (int)color;
  173. // Assert
  174. Assert.Equal (expectedRgba, Rgba);
  175. }
  176. [Fact]
  177. public void Color_ImplicitOperator_FromColorNames ()
  178. {
  179. // Arrange
  180. var colorName = ColorName.Blue;
  181. var expectedColor = new Color (0, 55, 218); // Blue
  182. // Act
  183. var color = new Color (colorName);
  184. // Assert
  185. Assert.Equal (expectedColor, color);
  186. }
  187. [Fact]
  188. public void Color_ExplicitOperator_ToColorNames ()
  189. {
  190. // Arrange
  191. var color = new Color (0, 0, 0x80); // Blue
  192. var expectedColorName = ColorName.Blue;
  193. // Act
  194. var colorName = (ColorName)color;
  195. // Assert
  196. Assert.Equal (expectedColorName, colorName);
  197. }
  198. [Fact]
  199. public void Color_EqualityOperator_WithColorAndColor ()
  200. {
  201. // Arrange
  202. var color1 = new Color (255, 128, 64, 32);
  203. var color2 = new Color (255, 128, 64, 32);
  204. // Act & Assert
  205. Assert.True (color1 == color2);
  206. Assert.False (color1 != color2);
  207. }
  208. [Fact]
  209. public void Color_InequalityOperator_WithColorAndColor ()
  210. {
  211. // Arrange
  212. var color1 = new Color (255, 128, 64, 32);
  213. var color2 = new Color (128, 64, 32, 16);
  214. // Act & Assert
  215. Assert.False (color1 == color2);
  216. Assert.True (color1 != color2);
  217. }
  218. [Fact]
  219. public void Color_EqualityOperator_WithColorNamesAndColor ()
  220. {
  221. // Arrange
  222. var color1 = new Color (ColorName.Red);
  223. var color2 = new Color (197, 15, 31); // Red in RGB
  224. // Act & Assert
  225. Assert.True (ColorName.Red == color1);
  226. Assert.False (ColorName.Red != color1);
  227. Assert.True (color1 == ColorName.Red);
  228. Assert.False (color1 != ColorName.Red);
  229. Assert.True (color2 == ColorName.Red);
  230. Assert.False (color2 != ColorName.Red);
  231. }
  232. [Fact]
  233. public void Color_InequalityOperator_WithColorNamesAndColor ()
  234. {
  235. // Arrange
  236. var color1 = new Color (ColorName.Red);
  237. var color2 = new Color (58, 150, 221); // Cyan in RGB
  238. // Act & Assert
  239. Assert.False (ColorName.Red == color2);
  240. Assert.True (ColorName.Red != color2);
  241. Assert.False (color2 == ColorName.Red);
  242. Assert.True (color2 != ColorName.Red);
  243. }
  244. [Fact]
  245. public void Color_FromColorName_ConvertsColorNamesToColor ()
  246. {
  247. // Arrange
  248. var colorName = ColorName.Red;
  249. var expectedColor = new Color (197, 15, 31); // Red in RGB
  250. // Act
  251. var convertedColor = new Color (colorName);
  252. // Assert
  253. Assert.Equal (expectedColor, convertedColor);
  254. }
  255. [Fact]
  256. public void Color_ColorName_Get_ReturnsClosestColorName ()
  257. {
  258. // Arrange
  259. var color = new Color (128, 64, 40); // Custom RGB color, closest to Yellow
  260. var expectedColorName = ColorName.Yellow;
  261. // Act
  262. var colorName = color.ColorName;
  263. // Assert
  264. Assert.Equal (expectedColorName, colorName);
  265. }
  266. [Fact]
  267. public void FindClosestColor_ReturnsClosestColor ()
  268. {
  269. // Test cases with RGB values and expected closest color names
  270. var testCases = new [] {
  271. (new Color (0, 0, 0), ColorName.Black),
  272. (new Color (255, 255, 255), ColorName.White),
  273. (new Color (5, 100, 255), ColorName.BrightBlue),
  274. (new Color (0, 255, 0), ColorName.BrightGreen),
  275. (new Color (255, 70, 8), ColorName.BrightRed),
  276. (new Color (0, 128, 128), ColorName.Cyan),
  277. (new Color (128, 64, 32), ColorName.Yellow)
  278. };
  279. foreach (var testCase in testCases) {
  280. var inputColor = testCase.Item1;
  281. var expectedColorName = testCase.Item2;
  282. var actualColorName = Color.FindClosestColor (inputColor);
  283. Assert.Equal (expectedColorName, actualColorName);
  284. }
  285. }
  286. }