AutocompleteTests.cs 9.8 KB

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