SliderTests.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Xunit;
  5. namespace Terminal.Gui.ViewsTests;
  6. public class SliderOptionTests {
  7. [Fact]
  8. public void Slider_Option_Default_Constructor ()
  9. {
  10. var o = new SliderOption<int> ();
  11. Assert.Null (o.Legend);
  12. Assert.Equal (default, o.LegendAbbr);
  13. Assert.Equal (default, o.Data);
  14. }
  15. [Fact]
  16. public void Slider_Option_Values_Constructor ()
  17. {
  18. var o = new SliderOption<int> ("1 thousand", new Rune ('y'), 1000);
  19. Assert.Equal ("1 thousand", o.Legend);
  20. Assert.Equal (new Rune ('y'), o.LegendAbbr);
  21. Assert.Equal (1000, o.Data);
  22. }
  23. [Fact]
  24. public void OnSet_Should_Raise_SetEvent ()
  25. {
  26. // Arrange
  27. var sliderOption = new SliderOption<int> ();
  28. var eventRaised = false;
  29. sliderOption.Set += (sender, args) => eventRaised = true;
  30. // Act
  31. sliderOption.OnSet ();
  32. // Assert
  33. Assert.True (eventRaised);
  34. }
  35. [Fact]
  36. public void OnUnSet_Should_Raise_UnSetEvent ()
  37. {
  38. // Arrange
  39. var sliderOption = new SliderOption<int> ();
  40. var eventRaised = false;
  41. sliderOption.UnSet += (sender, args) => eventRaised = true;
  42. // Act
  43. sliderOption.OnUnSet ();
  44. // Assert
  45. Assert.True (eventRaised);
  46. }
  47. [Fact]
  48. public void OnChanged_Should_Raise_ChangedEvent ()
  49. {
  50. // Arrange
  51. var sliderOption = new SliderOption<int> ();
  52. var eventRaised = false;
  53. sliderOption.Changed += (sender, args) => eventRaised = true;
  54. // Act
  55. sliderOption.OnChanged (true);
  56. // Assert
  57. Assert.True (eventRaised);
  58. }
  59. [Fact]
  60. public void SliderOption_ToString_WhenEmpty ()
  61. {
  62. var sliderOption = new SliderOption<object> ();
  63. Assert.Equal ("{Legend=, LegendAbbr=\0, Data=}", sliderOption.ToString ());
  64. }
  65. [Fact]
  66. public void SliderOption_ToString_WhenPopulated_WithInt ()
  67. {
  68. var sliderOption = new SliderOption<int> {
  69. Legend = "Lord flibble",
  70. LegendAbbr = new Rune ('l'),
  71. Data = 1
  72. };
  73. Assert.Equal ("{Legend=Lord flibble, LegendAbbr=l, Data=1}", sliderOption.ToString ());
  74. }
  75. [Fact]
  76. public void SliderOption_ToString_WhenPopulated_WithSizeF ()
  77. {
  78. var sliderOption = new SliderOption<SizeF> {
  79. Legend = "Lord flibble",
  80. LegendAbbr = new Rune ('l'),
  81. Data = new SizeF (32, 11)
  82. };
  83. Assert.Equal ("{Legend=Lord flibble, LegendAbbr=l, Data={Width=32, Height=11}}", sliderOption.ToString ());
  84. }
  85. }
  86. public class SliderEventArgsTests {
  87. [Fact]
  88. public void Constructor_Sets_Options ()
  89. {
  90. // Arrange
  91. var options = new Dictionary<int, SliderOption<int>> ();
  92. // Act
  93. var sliderEventArgs = new SliderEventArgs<int> (options);
  94. // Assert
  95. Assert.Equal (options, sliderEventArgs.Options);
  96. }
  97. [Fact]
  98. public void Constructor_Sets_Focused ()
  99. {
  100. // Arrange
  101. var options = new Dictionary<int, SliderOption<int>> ();
  102. var focused = 42;
  103. // Act
  104. var sliderEventArgs = new SliderEventArgs<int> (options, focused);
  105. // Assert
  106. Assert.Equal (focused, sliderEventArgs.Focused);
  107. }
  108. [Fact]
  109. public void Constructor_Sets_Cancel_Default_To_False ()
  110. {
  111. // Arrange
  112. var options = new Dictionary<int, SliderOption<int>> ();
  113. var focused = 42;
  114. // Act
  115. var sliderEventArgs = new SliderEventArgs<int> (options, focused);
  116. // Assert
  117. Assert.False (sliderEventArgs.Cancel);
  118. }
  119. }
  120. public class SliderTests {
  121. [Fact]
  122. public void Constructor_Default ()
  123. {
  124. // Arrange & Act
  125. var slider = new Slider<int> ();
  126. // Assert
  127. Assert.NotNull (slider);
  128. Assert.NotNull (slider.Options);
  129. Assert.Empty (slider.Options);
  130. Assert.Equal (Orientation.Horizontal, slider.Orientation);
  131. Assert.False (slider.AllowEmpty);
  132. Assert.True (slider.ShowLegends);
  133. Assert.False (slider.ShowEndSpacing);
  134. Assert.Equal (SliderType.Single, slider.Type);
  135. Assert.Equal (0, slider.InnerSpacing);
  136. Assert.False (slider.AutoSize);
  137. Assert.Equal (0, slider.FocusedOption);
  138. }
  139. [Fact]
  140. public void Constructor_With_Options ()
  141. {
  142. // Arrange
  143. var options = new List<int> { 1, 2, 3 };
  144. // Act
  145. var slider = new Slider<int> (options);
  146. // Assert
  147. Assert.NotNull (slider);
  148. Assert.NotNull (slider.Options);
  149. Assert.Equal (options.Count, slider.Options.Count);
  150. }
  151. [Fact]
  152. public void OnOptionsChanged_Event_Raised ()
  153. {
  154. // Arrange
  155. var slider = new Slider<int> ();
  156. var eventRaised = false;
  157. slider.OptionsChanged += (sender, args) => eventRaised = true;
  158. // Act
  159. slider.OnOptionsChanged ();
  160. // Assert
  161. Assert.True (eventRaised);
  162. }
  163. [Fact]
  164. public void OnOptionFocused_Event_Raised ()
  165. {
  166. // Arrange
  167. var slider = new Slider<int> (new List<int> { 1, 2, 3 });
  168. var eventRaised = false;
  169. slider.OptionFocused += (sender, args) => eventRaised = true;
  170. var newFocusedOption = 1;
  171. var args = new SliderEventArgs<int> (new Dictionary<int, SliderOption<int>> (), newFocusedOption);
  172. // Act
  173. slider.OnOptionFocused (newFocusedOption, args);
  174. // Assert
  175. Assert.True (eventRaised);
  176. }
  177. [Fact]
  178. public void OnOptionFocused_Event_Cancelled ()
  179. {
  180. // Arrange
  181. var slider = new Slider<int> (new List<int> { 1, 2, 3 });
  182. var eventRaised = false;
  183. var cancel = false;
  184. slider.OptionFocused += (sender, args) => eventRaised = true;
  185. var newFocusedOption = 1;
  186. // Create args with cancel set to false
  187. cancel = false;
  188. var args = new SliderEventArgs<int> (new Dictionary<int, SliderOption<int>> (), newFocusedOption) {
  189. Cancel = cancel
  190. };
  191. Assert.Equal (0, slider.FocusedOption);
  192. // Act
  193. slider.OnOptionFocused (newFocusedOption, args);
  194. // Assert
  195. Assert.True (eventRaised); // Event should be raised
  196. Assert.Equal (newFocusedOption, slider.FocusedOption); // Focused option should change
  197. // Create args with cancel set to true
  198. cancel = true;
  199. args = new SliderEventArgs<int> (new Dictionary<int, SliderOption<int>> (), newFocusedOption) {
  200. Cancel = cancel
  201. };
  202. // Act
  203. slider.OnOptionFocused (2, args);
  204. // Assert
  205. Assert.True (eventRaised); // Event should be raised
  206. Assert.Equal (newFocusedOption, slider.FocusedOption); // Focused option should not change
  207. }
  208. [Theory]
  209. [InlineData (0, 0, 0)]
  210. [InlineData (1, 3, 0)]
  211. [InlineData (3, 9, 0)]
  212. public void TryGetPositionByOption_ValidOptionHorizontal_Success (int option, int expectedX, int expectedY)
  213. {
  214. // Arrange
  215. var slider = new Slider<int> (new List<int> { 1, 2, 3, 4 });
  216. slider.AutoSize = true; // Set auto size to true to enable testing
  217. slider.InnerSpacing = 2;
  218. // 0123456789
  219. // 1--2--3--4
  220. // Act
  221. var result = slider.TryGetPositionByOption (option, out var position);
  222. // Assert
  223. Assert.True (result);
  224. Assert.Equal (expectedX, position.x);
  225. Assert.Equal (expectedY, position.y);
  226. }
  227. [Theory]
  228. [InlineData (0, 0, 0)]
  229. [InlineData (1, 0, 3)]
  230. [InlineData (3, 0, 9)]
  231. public void TryGetPositionByOption_ValidOptionVertical_Success (int option, int expectedX, int expectedY)
  232. {
  233. // Arrange
  234. var slider = new Slider<int> (new List<int> { 1, 2, 3, 4 });
  235. slider.Orientation = Orientation.Vertical;
  236. slider.AutoSize = true; // Set auto size to true to enable testing
  237. slider.InnerSpacing = 2;
  238. // Act
  239. var result = slider.TryGetPositionByOption (option, out var position);
  240. // Assert
  241. Assert.True (result);
  242. Assert.Equal (expectedX, position.x);
  243. Assert.Equal (expectedY, position.y);
  244. }
  245. [Fact]
  246. public void TryGetPositionByOption_InvalidOption_Failure ()
  247. {
  248. // Arrange
  249. var slider = new Slider<int> (new List<int> { 1, 2, 3 });
  250. var option = -1;
  251. var expectedPosition = (-1, -1);
  252. // Act
  253. var result = slider.TryGetPositionByOption (option, out var position);
  254. // Assert
  255. Assert.False (result);
  256. Assert.Equal (expectedPosition, position);
  257. }
  258. [Theory]
  259. [InlineData (0, 0, 0, 1)]
  260. [InlineData (3, 0, 0, 2)]
  261. [InlineData (9, 0, 0, 4)]
  262. [InlineData (0, 0, 1, 1)]
  263. [InlineData (3, 0, 1, 2)]
  264. [InlineData (9, 0, 1, 4)]
  265. public void TryGetOptionByPosition_ValidPositionHorizontal_Success (int x, int y, int threshold, int expectedData)
  266. {
  267. // Arrange
  268. var slider = new Slider<int> (new List<int> { 1, 2, 3, 4 });
  269. slider.AutoSize = true; // Set auto size to true to enable testing
  270. slider.InnerSpacing = 2;
  271. // 0123456789
  272. // 1--2--3--4
  273. // Arrange
  274. // Act
  275. var result = slider.TryGetOptionByPosition (x, y, threshold, out var option);
  276. // Assert
  277. Assert.True (result);
  278. Assert.Equal (expectedData, slider.Options [option].Data);
  279. }
  280. [Theory]
  281. [InlineData (0, 0, 0, 1)]
  282. [InlineData (0, 3, 0, 2)]
  283. [InlineData (0, 9, 0, 4)]
  284. [InlineData (0, 0, 1, 1)]
  285. [InlineData (0, 3, 1, 2)]
  286. [InlineData (0, 9, 1, 4)]
  287. public void TryGetOptionByPosition_ValidPositionVertical_Success (int x, int y, int threshold, int expectedData)
  288. {
  289. // Arrange
  290. var slider = new Slider<int> (new List<int> { 1, 2, 3, 4 });
  291. slider.Orientation = Orientation.Vertical;
  292. slider.AutoSize = true; // Set auto size to true to enable testing
  293. slider.InnerSpacing = 2;
  294. // 0 1
  295. // 1 |
  296. // 2 |
  297. // 3 2
  298. // 4 |
  299. // 5 |
  300. // 6 3
  301. // 7 |
  302. // 8 |
  303. // 9 4
  304. // Act
  305. var result = slider.TryGetOptionByPosition (x, y, threshold, out var option);
  306. // Assert
  307. Assert.True (result);
  308. Assert.Equal (expectedData, slider.Options [option].Data);
  309. }
  310. [Fact]
  311. public void TryGetOptionByPosition_InvalidPosition_Failure ()
  312. {
  313. // Arrange
  314. var slider = new Slider<int> (new List<int> { 1, 2, 3 });
  315. var x = 10;
  316. var y = 10;
  317. var threshold = 2;
  318. var expectedOption = -1;
  319. // Act
  320. var result = slider.TryGetOptionByPosition (x, y, threshold, out var option);
  321. // Assert
  322. Assert.False (result);
  323. Assert.Equal (expectedOption, option);
  324. }
  325. [Fact]
  326. public void MovePlus_Should_MoveFocusRight_When_OptionIsAvailable ()
  327. {
  328. // Arrange
  329. var slider = new Slider<int> (new List<int> { 1, 2, 3, 4 });
  330. slider.AutoSize = true;
  331. // Act
  332. var result = slider.MovePlus ();
  333. // Assert
  334. Assert.True (result);
  335. Assert.Equal (1, slider.FocusedOption);
  336. }
  337. [Fact]
  338. public void MovePlus_Should_NotMoveFocusRight_When_AtEnd ()
  339. {
  340. // Arrange
  341. var slider = new Slider<int> (new List<int> { 1, 2, 3, 4 });
  342. slider.AutoSize = true;
  343. slider.FocusedOption = 3;
  344. // Act
  345. var result = slider.MovePlus ();
  346. // Assert
  347. Assert.False (result);
  348. Assert.Equal (3, slider.FocusedOption);
  349. }
  350. // Add similar tests for other methods like MoveMinus, MoveStart, MoveEnd, Set, etc.
  351. [Fact]
  352. public void Set_Should_SetFocusedOption ()
  353. {
  354. // Arrange
  355. var slider = new Slider<int> (new List<int> { 1, 2, 3, 4 });
  356. slider.AutoSize = true;
  357. // Act
  358. slider.FocusedOption = 2;
  359. var result = slider.Set ();
  360. // Assert
  361. Assert.True (result);
  362. Assert.Equal (2, slider.FocusedOption);
  363. Assert.Single (slider.GetSetOptions ());
  364. }
  365. [Fact]
  366. public void Set_Should_Not_UnSetFocusedOption_When_EmptyNotAllowed ()
  367. {
  368. // Arrange
  369. var slider = new Slider<int> (new List<int> { 1, 2, 3, 4 }) {
  370. AllowEmpty = false
  371. };
  372. slider.AutoSize = true;
  373. Assert.NotEmpty (slider.GetSetOptions ());
  374. // Act
  375. var result = slider.UnSetOption (slider.FocusedOption);
  376. // Assert
  377. Assert.False (result);
  378. Assert.NotEmpty (slider.GetSetOptions ());
  379. }
  380. [Fact]
  381. void Set_Options_Throws_If_Null ()
  382. {
  383. // Arrange
  384. var slider = new Slider<int> ();
  385. // Act/Assert
  386. Assert.Throws<ArgumentNullException> (() => slider.Options = null);
  387. }
  388. [Fact]
  389. void Set_Options_No_Legend_Throws ()
  390. {
  391. // Arrange
  392. var slider = new Slider<int> ();
  393. // Act/Assert
  394. Assert.Throws<ArgumentNullException> (() => slider.Options = null);
  395. }
  396. // https://github.com/gui-cs/Terminal.Gui/issues/3099
  397. [Fact]
  398. void One_Option_Does_Not_Throw ()
  399. {
  400. // Arrange
  401. var slider = new Slider<int> ();
  402. slider.BeginInit ();
  403. slider.EndInit ();
  404. // Act/Assert
  405. slider.Options = new List<SliderOption<int>> { new () };
  406. }
  407. // Add more tests for different scenarios and edge cases.
  408. }