AutocompleteTests.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using System.Threading.Tasks;
  7. using Terminal.Gui;
  8. using Xunit;
  9. using Xunit.Abstractions;
  10. namespace Terminal.Gui.ViewTests {
  11. public class AutocompleteTests {
  12. readonly ITestOutputHelper output;
  13. public AutocompleteTests (ITestOutputHelper output)
  14. {
  15. this.output = output;
  16. }
  17. [Fact]
  18. public void Test_GenerateSuggestions_Simple ()
  19. {
  20. var ac = new TextViewAutocomplete ();
  21. ac.AllSuggestions = new List<string> { "fish", "const", "Cobble" };
  22. var tv = new TextView ();
  23. tv.InsertText ("co");
  24. ac.HostControl = tv;
  25. ac.GenerateSuggestions ();
  26. Assert.Equal (2, ac.Suggestions.Count);
  27. Assert.Equal ("const", ac.Suggestions [0]);
  28. Assert.Equal ("Cobble", ac.Suggestions [1]);
  29. }
  30. [Fact]
  31. [AutoInitShutdown]
  32. public void TestSettingColorSchemeOnAutocomplete ()
  33. {
  34. var tv = new TextView ();
  35. // to begin with we should be using the default menu color scheme
  36. Assert.Same (Colors.Menu, tv.Autocomplete.ColorScheme);
  37. // allocate a new custom scheme
  38. tv.Autocomplete.ColorScheme = new ColorScheme () {
  39. Normal = Application.Driver.MakeAttribute (Color.Black, Color.Blue),
  40. Focus = Application.Driver.MakeAttribute (Color.Black, Color.Cyan),
  41. };
  42. // should be separate instance
  43. Assert.NotSame (Colors.Menu, tv.Autocomplete.ColorScheme);
  44. // with the values we set on it
  45. Assert.Equal (Color.Black, tv.Autocomplete.ColorScheme.Normal.Foreground);
  46. Assert.Equal (Color.Blue, tv.Autocomplete.ColorScheme.Normal.Background);
  47. Assert.Equal (Color.Black, tv.Autocomplete.ColorScheme.Focus.Foreground);
  48. Assert.Equal (Color.Cyan, tv.Autocomplete.ColorScheme.Focus.Background);
  49. }
  50. [Fact]
  51. [AutoInitShutdown]
  52. public void KeyBindings_Command ()
  53. {
  54. var tv = new TextView () {
  55. Width = 10,
  56. Height = 2,
  57. Text = " Fortunately super feature."
  58. };
  59. var top = Application.Top;
  60. top.Add (tv);
  61. Application.Begin (top);
  62. Assert.Equal (Point.Empty, tv.CursorPosition);
  63. Assert.NotNull (tv.Autocomplete);
  64. Assert.Empty (tv.Autocomplete.AllSuggestions);
  65. tv.Autocomplete.AllSuggestions = Regex.Matches (tv.Text.ToString (), "\\w+")
  66. .Select (s => s.Value)
  67. .Distinct ().ToList ();
  68. Assert.Equal (3, tv.Autocomplete.AllSuggestions.Count);
  69. Assert.Equal ("Fortunately", tv.Autocomplete.AllSuggestions [0]);
  70. Assert.Equal ("super", tv.Autocomplete.AllSuggestions [1]);
  71. Assert.Equal ("feature", tv.Autocomplete.AllSuggestions [^1]);
  72. Assert.Equal (0, tv.Autocomplete.SelectedIdx);
  73. Assert.Empty (tv.Autocomplete.Suggestions);
  74. Assert.True (tv.ProcessKey (new KeyEvent (Key.F, new KeyModifiers ())));
  75. top.Redraw (tv.Bounds);
  76. Assert.Equal ($"F Fortunately super feature.", tv.Text);
  77. Assert.Equal (new Point (1, 0), tv.CursorPosition);
  78. Assert.Equal (2, tv.Autocomplete.Suggestions.Count);
  79. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions [0]);
  80. Assert.Equal ("feature", tv.Autocomplete.Suggestions [^1]);
  81. Assert.Equal (0, tv.Autocomplete.SelectedIdx);
  82. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions [tv.Autocomplete.SelectedIdx]);
  83. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  84. top.Redraw (tv.Bounds);
  85. Assert.Equal ($"F Fortunately super feature.", tv.Text);
  86. Assert.Equal (new Point (1, 0), tv.CursorPosition);
  87. Assert.Equal (2, tv.Autocomplete.Suggestions.Count);
  88. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions [0]);
  89. Assert.Equal ("feature", tv.Autocomplete.Suggestions [^1]);
  90. Assert.Equal (1, tv.Autocomplete.SelectedIdx);
  91. Assert.Equal ("feature", tv.Autocomplete.Suggestions [tv.Autocomplete.SelectedIdx]);
  92. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  93. top.Redraw (tv.Bounds);
  94. Assert.Equal ($"F Fortunately super feature.", tv.Text);
  95. Assert.Equal (new Point (1, 0), tv.CursorPosition);
  96. Assert.Equal (2, tv.Autocomplete.Suggestions.Count);
  97. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions [0]);
  98. Assert.Equal ("feature", tv.Autocomplete.Suggestions [^1]);
  99. Assert.Equal (0, tv.Autocomplete.SelectedIdx);
  100. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions [tv.Autocomplete.SelectedIdx]);
  101. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  102. top.Redraw (tv.Bounds);
  103. Assert.Equal ($"F Fortunately super feature.", tv.Text);
  104. Assert.Equal (new Point (1, 0), tv.CursorPosition);
  105. Assert.Equal (2, tv.Autocomplete.Suggestions.Count);
  106. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions [0]);
  107. Assert.Equal ("feature", tv.Autocomplete.Suggestions [^1]);
  108. Assert.Equal (1, tv.Autocomplete.SelectedIdx);
  109. Assert.Equal ("feature", tv.Autocomplete.Suggestions [tv.Autocomplete.SelectedIdx]);
  110. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  111. top.Redraw (tv.Bounds);
  112. Assert.Equal ($"F Fortunately super feature.", tv.Text);
  113. Assert.Equal (new Point (1, 0), tv.CursorPosition);
  114. Assert.Equal (2, tv.Autocomplete.Suggestions.Count);
  115. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions [0]);
  116. Assert.Equal ("feature", tv.Autocomplete.Suggestions [^1]);
  117. Assert.Equal (0, tv.Autocomplete.SelectedIdx);
  118. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions [tv.Autocomplete.SelectedIdx]);
  119. Assert.True (tv.Autocomplete.Visible);
  120. top.Redraw (tv.Bounds);
  121. Assert.True (tv.ProcessKey (new KeyEvent (tv.Autocomplete.CloseKey, new KeyModifiers ())));
  122. Assert.Equal ($"F Fortunately super feature.", tv.Text);
  123. Assert.Equal (new Point (1, 0), tv.CursorPosition);
  124. Assert.Empty (tv.Autocomplete.Suggestions);
  125. Assert.Equal (3, tv.Autocomplete.AllSuggestions.Count);
  126. Assert.False (tv.Autocomplete.Visible);
  127. top.Redraw (tv.Bounds);
  128. Assert.True (tv.ProcessKey (new KeyEvent (tv.Autocomplete.Reopen, new KeyModifiers ())));
  129. Assert.Equal ($"F Fortunately super feature.", tv.Text);
  130. Assert.Equal (new Point (1, 0), tv.CursorPosition);
  131. Assert.Equal (2, tv.Autocomplete.Suggestions.Count);
  132. Assert.Equal (3, tv.Autocomplete.AllSuggestions.Count);
  133. Assert.True (tv.ProcessKey (new KeyEvent (tv.Autocomplete.SelectionKey, new KeyModifiers ())));
  134. Assert.Equal ($"Fortunately Fortunately super feature.", tv.Text);
  135. Assert.Equal (new Point (11, 0), tv.CursorPosition);
  136. Assert.Equal (2, tv.Autocomplete.Suggestions.Count);
  137. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions [0]);
  138. Assert.Equal ("feature", tv.Autocomplete.Suggestions [^1]);
  139. Assert.Equal (0, tv.Autocomplete.SelectedIdx);
  140. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions [tv.Autocomplete.SelectedIdx]);
  141. Assert.True (tv.ProcessKey (new KeyEvent (tv.Autocomplete.CloseKey, new KeyModifiers ())));
  142. Assert.Equal ($"Fortunately Fortunately super feature.", tv.Text);
  143. Assert.Equal (new Point (11, 0), tv.CursorPosition);
  144. Assert.Empty (tv.Autocomplete.Suggestions);
  145. Assert.Equal (3, tv.Autocomplete.AllSuggestions.Count);
  146. }
  147. [Fact, AutoInitShutdown]
  148. public void CursorLeft_CursorRight_Mouse_Button_Pressed_Does_Not_Show_Popup ()
  149. {
  150. var tv = new TextView () {
  151. Width = 50,
  152. Height = 5,
  153. Text = "This a long line and against TextView."
  154. };
  155. tv.Autocomplete.AllSuggestions = Regex.Matches (tv.Text.ToString (), "\\w+")
  156. .Select (s => s.Value)
  157. .Distinct ().ToList ();
  158. var top = Application.Top;
  159. top.Add (tv);
  160. Application.Begin (top);
  161. for (int i = 0; i < 7; i++) {
  162. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  163. Application.Refresh ();
  164. TestHelpers.AssertDriverContentsWithFrameAre (@"
  165. This a long line and against TextView.", output);
  166. }
  167. Assert.True (tv.MouseEvent (new MouseEvent () {
  168. X = 6,
  169. Y = 0,
  170. Flags = MouseFlags.Button1Pressed
  171. }));
  172. Application.Refresh ();
  173. TestHelpers.AssertDriverContentsWithFrameAre (@"
  174. This a long line and against TextView.", output);
  175. Assert.True (tv.ProcessKey (new KeyEvent (Key.g, new KeyModifiers ())));
  176. Application.Refresh ();
  177. TestHelpers.AssertDriverContentsWithFrameAre (@"
  178. This ag long line and against TextView.
  179. against ", output);
  180. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  181. Application.Refresh ();
  182. TestHelpers.AssertDriverContentsWithFrameAre (@"
  183. This ag long line and against TextView.
  184. against ", output);
  185. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  186. Application.Refresh ();
  187. TestHelpers.AssertDriverContentsWithFrameAre (@"
  188. This ag long line and against TextView.
  189. against ", output);
  190. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  191. Application.Refresh ();
  192. TestHelpers.AssertDriverContentsWithFrameAre (@"
  193. This ag long line and against TextView.", output);
  194. for (int i = 0; i < 3; i++) {
  195. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  196. Application.Refresh ();
  197. TestHelpers.AssertDriverContentsWithFrameAre (@"
  198. This ag long line and against TextView.", output);
  199. }
  200. Assert.True (tv.ProcessKey (new KeyEvent (Key.Backspace, new KeyModifiers ())));
  201. Application.Refresh ();
  202. TestHelpers.AssertDriverContentsWithFrameAre (@"
  203. This a long line and against TextView.", output);
  204. Assert.True (tv.ProcessKey (new KeyEvent (Key.n, new KeyModifiers ())));
  205. Application.Refresh ();
  206. TestHelpers.AssertDriverContentsWithFrameAre (@"
  207. This an long line and against TextView.
  208. and ", output);
  209. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  210. Application.Refresh ();
  211. TestHelpers.AssertDriverContentsWithFrameAre (@"
  212. This an long line and against TextView.", output);
  213. }
  214. }
  215. }