Files
Terminal.Gui/UnitTests/Views/AppendAutocompleteTests.cs
BDisp ea24de3a27 Fixes #2482. Refactor Redraw - Non-virtual with the right set of virtual OnXXX methods. (#2577)
* Fixes #2482. Refactor Redraw - Non-virtual with the right set of virtual OnXXX methods.

* Change documentation comments.

* Fixes #2575 - TableView to use interface instead of System.Data.DataTable (#2576)

* WIP: Add ITableDataSource

* WIP: Refactor TableView

* WIP: Port CSVEditor

* WIP: Port TableEditor

* WIP: Port MultiColouredTable scenario

* Fix bug of adding duplicate column styles

* Update tests to use DataTableSource

* Tidy up

* Add EnumerableTableDataSource<T>

* Add test for EnumerableTableDataSource

* Add test for EnumerableTableDataSource

* Add code example to xmldoc

* Add ProcessTable scenario

* Rename ITableDataSource to ITableSource and update docs

* Rename EnumerableTableDataSource to EnumerableTableSource

* Fixed Frame != Bounds; changed UICat Scenarios list to use tableview!

* Fix scroll resetting in ProcessTable scenario

* Fix unit tests by setting Frame to same as Bounds

* Document why we have to measure our data for use with TableView

---------

Co-authored-by: Tig Kindel <tig@users.noreply.github.com>

* Fixes #2582 - Refactors FileDialog for cleaner data model (#2583)

* WIP: Add ITableDataSource

* WIP: Refactor TableView

* WIP: Port CSVEditor

* WIP: Port TableEditor

* WIP: Port MultiColouredTable scenario

* Fix bug of adding duplicate column styles

* Update tests to use DataTableSource

* Tidy up

* Add EnumerableTableDataSource<T>

* Add test for EnumerableTableDataSource

* Add test for EnumerableTableDataSource

* Add code example to xmldoc

* Add ProcessTable scenario

* Rename ITableDataSource to ITableSource and update docs

* Rename EnumerableTableDataSource to EnumerableTableSource

* Fixed Frame != Bounds; changed UICat Scenarios list to use tableview!

* Fix scroll resetting in ProcessTable scenario

* Fix unit tests by setting Frame to same as Bounds

* Document why we have to measure our data for use with TableView

* WIP: Simplify FileDialogs use of TableView

* WIP start migrating sorter

* WIP new filedialog table source mostly working

* WIP remove sorter class

* Refactor GetOrderByValue to be adjacent to GetColumnValue

* Fix collection navigator back so it ignores icon

* Fix unit tests

* Tidy up

* Fix UseColors

* Add test for UseColors

---------

Co-authored-by: Tig Kindel <tig@users.noreply.github.com>

* Fixes #2196. TextView: Setting Text places cursor at beginning, unlike TextField (#2572)

* Fixes #2196. TextView: Setting Text places cursor at beginning, unlike TextField

* Change all private members to have the _prefix.

* Renamed local member to prevLayoutStyle.

* Helper function for SetNeedsDisplay.

* Fixes #2569. Borders scenarios needed to be refactored. (#2570)

* Fixes #2569. Borders scenarios needed to be refactored.

* Fix border title with width equal to 4 and thickness top grater than 1.

* Improves border manipulation on borders scenarios.

* Prevents null value on the margin, border and padding thickness on the border scenarios.

* Remove NStack using dependence and fix prior commit.

* Refactoring the Frames scenario.

* Deleted borders scenarios.

* I did not realize that it was changed to SetSubViewNeedsDisplay.

* Re-layout; fixed colorpicker; fixed radio group

* Remove Thickness.IsEmpty as requested.

* Change the Frames scenario as requested.

---------

Co-authored-by: Tig Kindel <tig@users.noreply.github.com>

* Builds CollectionNavigator support into UI Catalog for TableView (#2584)

* Builds collectionnav support into UI cat for TableView

* Fixes keyboard mapping

* MultiSelect = false for TableView

* MultiSelect = false doesn't unbind ctrl-a

* Fixes #2581 Refactor CollectionNavigator so it supports TableView (#2586)

* Refactor CollectionNavigator to a base and a collection implementation

* Refactor CollectionNavigatorBase to look for first match smartly

* Add TableCollectionNavigator

* Make TableCollectionNavigator a core part of TableView

* Fix bad merge

* Added tests for tableview collection navigator

* Add FileDialogCollectionNavigator which ignores . and directory separator prefixes on file names

* whitespace fixes

---------

Co-authored-by: Tig <tig@users.noreply.github.com>

* Resolving merge conflicts.

* Fix merge errors.

* Fix merge errors.

* Add Command.Accept and snap to the selected glyph when ShowHorizontalScrollIndicator change to true.

* Reformat.

* Reformat again.

---------

Co-authored-by: Thomas Nind <31306100+tznind@users.noreply.github.com>
Co-authored-by: Tig Kindel <tig@users.noreply.github.com>
2023-05-04 13:17:59 +02:00

248 lines
7.8 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.TextTests {
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.Draw ();
TestHelpers.AssertDriverContentsAre ("", output);
tf.ProcessKey (new KeyEvent (Key.f, new KeyModifiers ()));
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("fish", output);
Assert.Equal ("f", tf.Text.ToString ());
Application.Driver.SendKeys ('\t', ConsoleKey.Tab, false, false, false);
tf.Draw ();
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_ShowThenAccept_CasesDiffer ()
{
var tf = GetTextFieldsInView ();
tf.Autocomplete = new AppendAutocomplete (tf);
var generator = (SingleWordSuggestionGenerator)tf.Autocomplete.SuggestionGenerator;
generator.AllSuggestions = new List<string> { "FISH" };
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("", output);
tf.ProcessKey (new KeyEvent (Key.m, new KeyModifiers ()));
tf.ProcessKey (new KeyEvent (Key.y, new KeyModifiers ()));
tf.ProcessKey (new KeyEvent (Key.Space, new KeyModifiers ()));
tf.ProcessKey (new KeyEvent (Key.f, new KeyModifiers ()));
// Even though there is no match on case we should still get the suggestion
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("my fISH", output);
Assert.Equal ("my f", tf.Text.ToString ());
// When tab completing the case of the whole suggestion should be applied
Application.Driver.SendKeys ('\t', ConsoleKey.Tab, false, false, false);
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("my FISH", output);
Assert.Equal ("my FISH", tf.Text.ToString ());
}
[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.Draw ();
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.Draw ();
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.Draw ();
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.Draw ();
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.Draw ();
// BUGBUG: v2 - I broke this test and don't have time to figure out why. @tznind - help!
//TestHelpers.AssertDriverContentsAre ("fish", output);
Assert.Equal ("fi", tf.Text.ToString ());
}
[Theory, AutoInitShutdown]
[InlineData ("ffffffffffffffffffffffffff", "ffffffffff")]
[InlineData ("f234567890", "f234567890")]
[InlineData ("fisérables", "fisérables")]
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.Draw ();
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.Draw ();
TestHelpers.AssertDriverContentsAre ("fish", output);
Assert.Equal ("f", tf.Text.ToString ());
// When cycling autocomplete
Application.Driver.SendKeys (' ', cycleKey, false, false, false);
tf.Draw ();
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.Draw ();
TestHelpers.AssertDriverContentsAre ("fish", output);
Assert.Equal ("f", tf.Text.ToString ());
}
[Fact, AutoInitShutdown]
public void TestAutoAppend_NoRender_WhenNoMatch ()
{
var tf = GetTextFieldsInViewSuggesting ("fish");
// f is typed and suggestion is "fish"
Application.Driver.SendKeys ('f', ConsoleKey.F, false, false, false);
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("fish", output);
Assert.Equal ("f", tf.Text.ToString ());
// x is typed and suggestion should disapear
Application.Driver.SendKeys ('x', ConsoleKey.F, false, false, false);
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("fx", output);
Assert.Equal ("fx", tf.Text.ToString ());
}
[Fact, AutoInitShutdown]
public void TestAutoAppend_NoRender_WhenCursorNotAtEnd ()
{
var tf = GetTextFieldsInViewSuggesting ("fish");
// f is typed and suggestion is "fish"
Application.Driver.SendKeys ('f', ConsoleKey.F, false, false, false);
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("fish", output);
Assert.Equal ("f", tf.Text.ToString ());
// add a space then go back 1
Application.Driver.SendKeys (' ', ConsoleKey.Spacebar, false, false, false);
Application.Driver.SendKeys ('<', ConsoleKey.LeftArrow, false, false, false);
tf.Draw ();
TestHelpers.AssertDriverContentsAre ("f", 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.Draw ();
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;
}
}
}