Files
Terminal.Gui/UnitTests/Views/AppendAutocompleteTests.cs
2023-04-01 07:59:18 +01:00

182 lines
5.3 KiB
C#

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<string>{"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("ffffffffffffffffffffffffff","ffffffffff")]
[InlineData("fffffffffff","ffffffffff")]
public void TestAutoAppendRendering_ShouldNotOverspill(string overspillUsing,string expectRender)
{
var tf = GetTextFieldsInViewSuggesting(overspillUsing);
// f is typed we should only see 'f' up to size of View (10)
Application.Driver.SendKeys('f',ConsoleKey.F,false,false,false);
tf.Redraw(tf.Bounds);
TestHelpers.AssertDriverContentsAre(expectRender,output);
Assert.Equal("f",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;
}
}
}