AutocompleteTests.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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. tv.Text.ToRuneList(),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.ToString (), "\\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. top.Draw ();
  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. Assert.Equal ($"Fortunately Fortunately super feature.", tv.Text);
  141. Assert.Equal (new Point (11, 0), tv.CursorPosition);
  142. Assert.Equal (2, tv.Autocomplete.Suggestions.Count);
  143. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions[0].Replacement);
  144. Assert.Equal ("feature", tv.Autocomplete.Suggestions[^1].Replacement);
  145. Assert.Equal (0, tv.Autocomplete.SelectedIdx);
  146. Assert.Equal ("Fortunately", tv.Autocomplete.Suggestions[tv.Autocomplete.SelectedIdx].Replacement);
  147. Assert.True (tv.ProcessKey (new KeyEvent (tv.Autocomplete.CloseKey, new KeyModifiers ())));
  148. Assert.Equal ($"Fortunately Fortunately super feature.", tv.Text);
  149. Assert.Equal (new Point (11, 0), tv.CursorPosition);
  150. Assert.Empty (tv.Autocomplete.Suggestions);
  151. Assert.Equal (3, g.AllSuggestions.Count);
  152. }
  153. [Fact, AutoInitShutdown]
  154. public void CursorLeft_CursorRight_Mouse_Button_Pressed_Does_Not_Show_Popup ()
  155. {
  156. var tv = new TextView () {
  157. Width = 50,
  158. Height = 5,
  159. Text = "This a long line and against TextView."
  160. };
  161. var g = (SingleWordSuggestionGenerator)tv.Autocomplete.SuggestionGenerator;
  162. g.AllSuggestions = Regex.Matches (tv.Text.ToString (), "\\w+")
  163. .Select (s => s.Value)
  164. .Distinct ().ToList ();
  165. var top = Application.Top;
  166. top.Add (tv);
  167. Application.Begin (top);
  168. // BUGBUG: v2 - I broke this test and don't have time to figure out why. @tznind - help!
  169. // for (int i = 0; i < 7; i++) {
  170. // Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  171. // Application.Refresh ();
  172. // TestHelpers.AssertDriverContentsWithFrameAre (@"
  173. //This a long line and against TextView.", output);
  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.", output);
  183. Assert.True (tv.ProcessKey (new KeyEvent (Key.g, 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.
  197. against ", output);
  198. Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())));
  199. Application.Refresh ();
  200. TestHelpers.AssertDriverContentsWithFrameAre (@"
  201. This ag long line and against TextView.", output);
  202. // BUGBUG: v2 - I broke this test and don't have time to figure out why. @tznind - help!
  203. // for (int i = 0; i < 3; i++) {
  204. // Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  205. // Application.Refresh ();
  206. // TestHelpers.AssertDriverContentsWithFrameAre (@"
  207. //This ag long line and against TextView.", output);
  208. // }
  209. // Assert.True (tv.ProcessKey (new KeyEvent (Key.Backspace, new KeyModifiers ())));
  210. // Application.Refresh ();
  211. // TestHelpers.AssertDriverContentsWithFrameAre (@"
  212. //This a long line and against TextView.", output);
  213. // Assert.True (tv.ProcessKey (new KeyEvent (Key.n, new KeyModifiers ())));
  214. // Application.Refresh ();
  215. // TestHelpers.AssertDriverContentsWithFrameAre (@"
  216. //This an long line and against TextView.
  217. // and ", output);
  218. // Assert.True (tv.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers ())));
  219. // Application.Refresh ();
  220. // TestHelpers.AssertDriverContentsWithFrameAre (@"
  221. //This an long line and against TextView.", output);
  222. }
  223. }
  224. }