ColorTests.cs 8.8 KB

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