mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-27 00:07:58 +01:00
182 lines
5.3 KiB
C#
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;
|
|
}
|
|
}
|
|
} |