AutocompleteTests.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  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. var g = (SingleWordSuggestionGenerator)tv.Autocomplete.SuggestionGenerator;
  68. Assert.Empty (g.AllSuggestions);
  69. g.AllSuggestions = Regex.Matches (tv.Text.ToString (), "\\w+")
  70. .Select (s => s.Value)
  71. .Distinct ().ToList ();
  72. Assert.Equal (3, g.AllSuggestions.Count);
  73. Assert.Equal ("Fortunately", g.AllSuggestions [0]);
  74. Assert.Equal ("super", g.AllSuggestions [1]);
  75. Assert.Equal ("feature", g.AllSuggestions [^1]);
  76. Assert.Equal (0, tv.Autocomplete.SelectedIdx);
  77. Assert.Empty (tv.Autocomplete.Suggestions);
  78. Assert.True (tv.ProcessKey (new KeyEvent (Key.F, new KeyModifiers ())));
  79. top.Redraw (tv.Bounds);
  80. Assert.Equal ($"F Fortunately super feature.", tv.Text);
  81. Assert.Equal (new Point (1, 0), tv.CursorPosition);
  82. Assert.Equal (2, tv.Autocomplete.Suggestions.Count);
  83. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions[0].Replacement);
  84. Assert.Equal ("feature", tv.Autocomplete.Suggestions[^1].Replacement);
  85. Assert.Equal (0, tv.Autocomplete.SelectedIdx);
  86. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions[tv.Autocomplete.SelectedIdx].Replacement);
  87. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  88. top.Redraw (tv.Bounds);
  89. Assert.Equal ($"F Fortunately super feature.", tv.Text);
  90. Assert.Equal (new Point (1, 0), tv.CursorPosition);
  91. Assert.Equal (2, tv.Autocomplete.Suggestions.Count);
  92. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions[0].Replacement);
  93. Assert.Equal ("feature", tv.Autocomplete.Suggestions[^1].Replacement);
  94. Assert.Equal (1, tv.Autocomplete.SelectedIdx);
  95. Assert.Equal ("feature", tv.Autocomplete.Suggestions[tv.Autocomplete.SelectedIdx].Replacement);
  96. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
  97. top.Redraw (tv.Bounds);
  98. Assert.Equal ($"F Fortunately super feature.", tv.Text);
  99. Assert.Equal (new Point (1, 0), tv.CursorPosition);
  100. Assert.Equal (2, tv.Autocomplete.Suggestions.Count);
  101. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions[0].Replacement);
  102. Assert.Equal ("feature", tv.Autocomplete.Suggestions[^1].Replacement);
  103. Assert.Equal (0, tv.Autocomplete.SelectedIdx);
  104. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions[tv.Autocomplete.SelectedIdx].Replacement);
  105. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  106. top.Redraw (tv.Bounds);
  107. Assert.Equal ($"F Fortunately super feature.", tv.Text);
  108. Assert.Equal (new Point (1, 0), tv.CursorPosition);
  109. Assert.Equal (2, tv.Autocomplete.Suggestions.Count);
  110. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions[0].Replacement);
  111. Assert.Equal ("feature", tv.Autocomplete.Suggestions[^1].Replacement);
  112. Assert.Equal (1, tv.Autocomplete.SelectedIdx);
  113. Assert.Equal ("feature", tv.Autocomplete.Suggestions[tv.Autocomplete.SelectedIdx].Replacement);
  114. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
  115. top.Redraw (tv.Bounds);
  116. Assert.Equal ($"F Fortunately super feature.", tv.Text);
  117. Assert.Equal (new Point (1, 0), tv.CursorPosition);
  118. Assert.Equal (2, tv.Autocomplete.Suggestions.Count);
  119. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions[0].Replacement);
  120. Assert.Equal ("feature", tv.Autocomplete.Suggestions[^1].Replacement);
  121. Assert.Equal (0, tv.Autocomplete.SelectedIdx);
  122. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions[tv.Autocomplete.SelectedIdx].Replacement);
  123. Assert.True (tv.Autocomplete.Visible);
  124. top.Redraw (tv.Bounds);
  125. Assert.True (tv.ProcessKey (new KeyEvent (tv.Autocomplete.CloseKey, new KeyModifiers ())));
  126. Assert.Equal ($"F Fortunately super feature.", tv.Text);
  127. Assert.Equal (new Point (1, 0), tv.CursorPosition);
  128. Assert.Empty (tv.Autocomplete.Suggestions);
  129. Assert.Equal (3, g.AllSuggestions.Count);
  130. Assert.False (tv.Autocomplete.Visible);
  131. top.Redraw (tv.Bounds);
  132. Assert.True (tv.ProcessKey (new KeyEvent (tv.Autocomplete.Reopen, new KeyModifiers ())));
  133. Assert.Equal ($"F Fortunately super feature.", tv.Text);
  134. Assert.Equal (new Point (1, 0), tv.CursorPosition);
  135. Assert.Equal (2, tv.Autocomplete.Suggestions.Count);
  136. Assert.Equal (3, g.AllSuggestions.Count);
  137. Assert.True (tv.ProcessKey (new KeyEvent (tv.Autocomplete.SelectionKey, new KeyModifiers ())));
  138. Assert.Equal ($"Fortunately Fortunately super feature.", tv.Text);
  139. Assert.Equal (new Point (11, 0), tv.CursorPosition);
  140. Assert.Equal (2, tv.Autocomplete.Suggestions.Count);
  141. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions[0].Replacement);
  142. Assert.Equal ("feature", tv.Autocomplete.Suggestions[^1].Replacement);
  143. Assert.Equal (0, tv.Autocomplete.SelectedIdx);
  144. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions[tv.Autocomplete.SelectedIdx].Replacement);
  145. Assert.True (tv.ProcessKey (new KeyEvent (tv.Autocomplete.CloseKey, new KeyModifiers ())));
  146. Assert.Equal ($"Fortunately Fortunately super feature.", tv.Text);
  147. Assert.Equal (new Point (11, 0), tv.CursorPosition);
  148. Assert.Empty (tv.Autocomplete.Suggestions);
  149. Assert.Equal (3, g.AllSuggestions.Count);
  150. }
  151. [Fact, AutoInitShutdown]
  152. public void CursorLeft_CursorRight_Mouse_Button_Pressed_Does_Not_Show_Popup ()
  153. {
  154. var tv = new TextView () {
  155. Width = 50,
  156. Height = 5,
  157. Text = "This a long line and against TextView."
  158. };
  159. var g = (SingleWordSuggestionGenerator)tv.Autocomplete.SuggestionGenerator;
  160. g.AllSuggestions = Regex.Matches (tv.Text.ToString (), "\\w+")
  161. .Select (s => s.Value)
  162. .Distinct ().ToList ();
  163. var top = Application.Top;
  164. top.Add (tv);
  165. Application.Begin (top);
  166. for (int i = 0; i < 7; i++) {
  167. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  168. Application.Refresh ();
  169. TestHelpers.AssertDriverContentsWithFrameAre (@"
  170. This a long line and against TextView.", output);
  171. }
  172. Assert.True (tv.MouseEvent (new MouseEvent () {
  173. X = 6,
  174. Y = 0,
  175. Flags = MouseFlags.Button1Pressed
  176. }));
  177. Application.Refresh ();
  178. TestHelpers.AssertDriverContentsWithFrameAre (@"
  179. This a long line and against TextView.", output);
  180. Assert.True (tv.ProcessKey (new KeyEvent (Key.g, 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.
  194. against ", output);
  195. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  196. Application.Refresh ();
  197. TestHelpers.AssertDriverContentsWithFrameAre (@"
  198. This ag long line and against TextView.", output);
  199. for (int i = 0; i < 3; i++) {
  200. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  201. Application.Refresh ();
  202. TestHelpers.AssertDriverContentsWithFrameAre (@"
  203. This ag long line and against TextView.", output);
  204. }
  205. Assert.True (tv.ProcessKey (new KeyEvent (Key.Backspace, new KeyModifiers ())));
  206. Application.Refresh ();
  207. TestHelpers.AssertDriverContentsWithFrameAre (@"
  208. This a long line and against TextView.", output);
  209. Assert.True (tv.ProcessKey (new KeyEvent (Key.n, new KeyModifiers ())));
  210. Application.Refresh ();
  211. TestHelpers.AssertDriverContentsWithFrameAre (@"
  212. This an long line and against TextView.
  213. and ", output);
  214. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  215. Application.Refresh ();
  216. TestHelpers.AssertDriverContentsWithFrameAre (@"
  217. This an long line and against TextView.", output);
  218. }
  219. }
  220. }