AutocompleteTests.cs 9.9 KB

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