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 (ColorName)).Cast<int> ().Distinct ().ToList();
  27. Attribute [] attrs = new Attribute [colorNames.Count];
  28. int idx = 0;
  29. foreach (ColorName bg in colorNames) {
  30. attrs [idx] = new Attribute (bg, colorNames.Count - 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.Yellow, 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.Yellow), 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_HasOnly16DistinctElements ()
  53. {
  54. Assert.Equal (16, Enum.GetValues (typeof (ColorName)).Cast<int> ().Distinct ().Count ());
  55. }
  56. [Fact]
  57. public void ColorNames_HaveCorrectOrdinals ()
  58. {
  59. Assert.Equal (0, (int)ColorName.Black);
  60. Assert.Equal (1, (int)ColorName.Blue);
  61. Assert.Equal (2, (int)ColorName.Green);
  62. Assert.Equal (3, (int)ColorName.Cyan);
  63. Assert.Equal (4, (int)ColorName.Red);
  64. Assert.Equal (5, (int)ColorName.Magenta);
  65. Assert.Equal (6, (int)ColorName.Yellow);
  66. Assert.Equal (7, (int)ColorName.Gray);
  67. Assert.Equal (8, (int)ColorName.DarkGray);
  68. Assert.Equal (9, (int)ColorName.BrightBlue);
  69. Assert.Equal (10, (int)ColorName.BrightGreen);
  70. Assert.Equal (11, (int)ColorName.BrightCyan);
  71. Assert.Equal (12, (int)ColorName.BrightRed);
  72. Assert.Equal (13, (int)ColorName.BrightMagenta);
  73. Assert.Equal (14, (int)ColorName.BrightYellow);
  74. Assert.Equal (15, (int)ColorName.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 (expectedR, expectedG, expectedB, expectedA);
  101. // Assert
  102. Assert.Equal (expectedR, color.R);
  103. Assert.Equal (expectedG, color.G);
  104. Assert.Equal (expectedB, color.B);
  105. Assert.Equal (expectedA, color.A);
  106. }
  107. [Fact]
  108. public void Color_Constructor_WithRgbaValue ()
  109. {
  110. // Arrange
  111. int expectedRgba = unchecked((int)0xFF804040); // R: 128, G: 64, B: 64, Alpha: 255
  112. // Act
  113. var color = new Color (expectedRgba);
  114. // Assert
  115. Assert.Equal (128, color.R);
  116. Assert.Equal (64, color.G);
  117. Assert.Equal (64, color.B);
  118. Assert.Equal (255, color.A);
  119. }
  120. [Fact]
  121. public void Color_Constructor_WithColorName ()
  122. {
  123. // Arrange
  124. ColorName colorName = ColorName.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 Rgba = unchecked((int)0xFF804020); // R: 128, G: 64, B: 32, Alpha: 255
  156. var expectedColor = new Color (128, 64, 32);
  157. // Act
  158. Color color = Rgba;
  159. // Assert
  160. Assert.Equal (expectedColor, color);
  161. }
  162. [Fact]
  163. public void Color_ExplicitOperator_ToInt ()
  164. {
  165. // Arrange
  166. var color = new Color (128, 64, 32);
  167. int expectedRgba = unchecked((int)0xFF804020); // R: 128, G: 64, B: 32, Alpha: 255
  168. // Act
  169. int Rgba = (int)color;
  170. // Assert
  171. Assert.Equal (expectedRgba, Rgba);
  172. }
  173. [Fact]
  174. public void Color_ImplicitOperator_FromColorNames ()
  175. {
  176. // Arrange
  177. ColorName colorName = ColorName.Blue;
  178. var expectedColor = new Color (0, 55, 218); // Blue
  179. // Act
  180. Color color = new 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. ColorName expectedColorName = ColorName.Blue;
  190. // Act
  191. ColorName colorName = (ColorName)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 (ColorName.Red);
  220. var color2 = new Color (197, 15, 31); // Red in RGB
  221. // Act & Assert
  222. Assert.True (ColorName.Red == color1);
  223. Assert.False (ColorName.Red != color1);
  224. Assert.True (color1 == ColorName.Red);
  225. Assert.False (color1 != ColorName.Red);
  226. Assert.True (color2 == ColorName.Red);
  227. Assert.False (color2 != ColorName.Red);
  228. }
  229. [Fact]
  230. public void Color_InequalityOperator_WithColorNamesAndColor ()
  231. {
  232. // Arrange
  233. var color1 = new Color (ColorName.Red);
  234. var color2 = new Color (58, 150, 221); // Cyan in RGB
  235. // Act & Assert
  236. Assert.False (ColorName.Red == color2);
  237. Assert.True (ColorName.Red != color2);
  238. Assert.False (color2 == ColorName.Red);
  239. Assert.True (color2 != ColorName.Red);
  240. }
  241. [Fact]
  242. public void Color_FromColorName_ConvertsColorNamesToColor ()
  243. {
  244. // Arrange
  245. var colorName = ColorName.Red;
  246. var expectedColor = new Color (197, 15, 31); // Red in RGB
  247. // Act
  248. var convertedColor = new 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 Yellow
  257. var expectedColorName = ColorName.Yellow;
  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), ColorName.Black),
  270. (new Color(255, 255, 255), ColorName.White),
  271. (new Color(5, 100, 255), ColorName.BrightBlue),
  272. (new Color(0, 255, 0), ColorName.BrightGreen),
  273. (new Color(255, 70, 8), ColorName.BrightRed),
  274. (new Color(0, 128, 128), ColorName.Cyan),
  275. (new Color(128, 64, 32), ColorName.Yellow),
  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 (ColorName.Magenta);
  290. // Act
  291. color.ColorName = ColorName.Magenta;
  292. // Assert
  293. Assert.Equal (expectedColor, color);
  294. }
  295. }