using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; namespace Terminal.Gui.ViewTests { public class AppendAutocompleteTests { readonly ITestOutputHelper output; public AppendAutocompleteTests (ITestOutputHelper output) { this.output = output; } [Fact, AutoInitShutdown] public void TestAutoAppend_ShowThenAccept_MatchCase() { var tf = GetTextFieldsInView(); tf.Autocomplete = new AppendAutocomplete(tf); var generator = (SingleWordSuggestionGenerator)tf.Autocomplete.SuggestionGenerator; generator.AllSuggestions = new List{"fish"}; tf.Redraw(tf.Bounds); TestHelpers.AssertDriverContentsAre("",output); tf.ProcessKey(new KeyEvent(Key.f,new KeyModifiers())); tf.Redraw(tf.Bounds); TestHelpers.AssertDriverContentsAre("fish",output); Assert.Equal("f",tf.Text.ToString()); Application.Driver.SendKeys('\t',ConsoleKey.Tab,false,false,false); tf.Redraw(tf.Bounds); TestHelpers.AssertDriverContentsAre("fish",output); Assert.Equal("fish",tf.Text.ToString()); // Tab should autcomplete but not move focus Assert.Same(tf,Application.Top.Focused); // Second tab should move focus (nothing to autocomplete) Application.Driver.SendKeys('\t',ConsoleKey.Tab,false,false,false); Assert.NotSame(tf,Application.Top.Focused); } [Fact, AutoInitShutdown] public void TestAutoAppend_AfterCloseKey_NoAutocomplete() { var tf = GetTextFieldsInViewSuggesting("fish"); // f is typed and suggestion is "fish" Application.Driver.SendKeys('f',ConsoleKey.F,false,false,false); tf.Redraw(tf.Bounds); TestHelpers.AssertDriverContentsAre("fish",output); Assert.Equal("f",tf.Text.ToString()); // When cancelling autocomplete Application.Driver.SendKeys('e',ConsoleKey.Escape,false,false,false); // Suggestion should disapear tf.Redraw(tf.Bounds); TestHelpers.AssertDriverContentsAre("f",output); Assert.Equal("f",tf.Text.ToString()); // Still has focus though Assert.Same(tf,Application.Top.Focused); // But can tab away Application.Driver.SendKeys('\t',ConsoleKey.Tab,false,false,false); Assert.NotSame(tf,Application.Top.Focused); } [Fact, AutoInitShutdown] public void TestAutoAppend_AfterCloseKey_ReapearsOnLetter() { var tf = GetTextFieldsInViewSuggesting("fish"); // f is typed and suggestion is "fish" Application.Driver.SendKeys('f',ConsoleKey.F,false,false,false); tf.Redraw(tf.Bounds); TestHelpers.AssertDriverContentsAre("fish",output); Assert.Equal("f",tf.Text.ToString()); // When cancelling autocomplete Application.Driver.SendKeys('e',ConsoleKey.Escape,false,false,false); // Suggestion should disapear tf.Redraw(tf.Bounds); TestHelpers.AssertDriverContentsAre("f",output); Assert.Equal("f",tf.Text.ToString()); // Should reapear when you press next letter Application.Driver.SendKeys('i',ConsoleKey.I,false,false,false); tf.Redraw(tf.Bounds); TestHelpers.AssertDriverContentsAre("fish",output); Assert.Equal("fi",tf.Text.ToString()); } [Theory, AutoInitShutdown] [InlineData(ConsoleKey.UpArrow)] [InlineData(ConsoleKey.DownArrow)] public void TestAutoAppend_CycleSelections(ConsoleKey cycleKey) { var tf = GetTextFieldsInViewSuggesting("fish","friend"); // f is typed and suggestion is "fish" Application.Driver.SendKeys('f',ConsoleKey.F,false,false,false); tf.Redraw(tf.Bounds); TestHelpers.AssertDriverContentsAre("fish",output); Assert.Equal("f",tf.Text.ToString()); // When cycling autocomplete Application.Driver.SendKeys(' ',cycleKey,false,false,false); tf.Redraw(tf.Bounds); TestHelpers.AssertDriverContentsAre("friend",output); Assert.Equal("f",tf.Text.ToString()); // Should be able to cycle in circles endlessly Application.Driver.SendKeys(' ',cycleKey,false,false,false); tf.Redraw(tf.Bounds); TestHelpers.AssertDriverContentsAre("fish",output); Assert.Equal("f",tf.Text.ToString()); } private TextField GetTextFieldsInViewSuggesting (params string[] suggestions) { var tf = GetTextFieldsInView(); tf.Autocomplete = new AppendAutocomplete(tf); var generator = (SingleWordSuggestionGenerator)tf.Autocomplete.SuggestionGenerator; generator.AllSuggestions = suggestions.ToList(); tf.Redraw(tf.Bounds); TestHelpers.AssertDriverContentsAre("",output); return tf; } private TextField GetTextFieldsInView () { var tf = new TextField{ Width = 10 }; var tf2 = new TextField{ Y = 1, Width = 10 }; var top = Application.Top; top.Add (tf); top.Add (tf2); Application.Begin (top); Assert.Same(tf,top.Focused); return tf; } } }