AutocompleteTests.cs 12 KB

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