2
0

AutocompleteTests.cs 13 KB

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