Files
Terminal.Gui/Tests/UnitTests/FileServices/FileDialogTests.cs
Tig 1eb5a4e1b9 Fixes #4305 - 'FileDialog` TreeView (#4306)
* Partial fix - probably breaks stuff

Refactored `FileDialog.cs` by replacing `treeViewContainer` with `_treeView`, adjusting UI component positions, and adding style properties to `_tableView`. Improved user interaction with new event handlers and key bindings. Rearranged `base.Add` calls to reflect the updated UI hierarchy.

* Tweaked Dialog and FileDialog attribute handling

Removed setting of _tableView.Style.InvertSelectedCellFirstCharacter = true;

Commented out custom attribute handling in Dialog.cs for VisualRole.Normal and VisualRole.Focus, reverting to base method. Removed InvertSelectedCellFirstCharacter setting in FileDialog.cs.

* Add tree view toggle to FileDialog

Introduced a new `_btnTreeToggle` button in `FileDialog.cs` to manage the visibility of a tree view within the file dialog interface. Added a new localized string `fdTree` in `Strings.Designer.cs` and `Strings.resx` for UI elements related to the tree view. Adjusted the layout and visibility of the tree and table views to accommodate the toggle functionality. Implemented methods `ToggleTreeVisibility`, `SetTreeVisible`, and `GetTreeToggleText` to handle tree view visibility logic. Cleaned up code and comments for clarity.

* Update localization and test logic for FileDialog

Updated `fdSearchCaption` localization from "Enter search string" to "Find" in `Strings.Designer.cs` and `Strings.resx`. Modified `FileDialogFluentTests.cs` to reflect UI changes by updating button text and removing skip conditions. Adjusted `FileDialogTests.cs` to change `TextField` caption and commented out certain test logic related to path confirmation.

* Moved Search view to be inside the table view container for better usability.

Refactor FileDialog to use nullable reference types

Updated the `FileDialog` class to adopt nullable reference types for improved null safety, marking fields, properties, and methods as nullable where appropriate. Simplified UI component initialization, including repositioning `_tbFind` and `_spinnerView` into `_tableViewContainer` and assigning `Id` properties to `_tableViewContainer` and `_tableView`.

Refactored methods like `TryAcceptMulti` and `GetFocusedFiles` to handle nullability. Simplified `Task.Run` calls and removed unused code, such as the `GetTextField` method and `FileDialogPart` enum, in `FileDialogTests.cs`. Updated tests to directly access subviews using `Id` properties. Minor layout and property adjustments were made to improve maintainability.

* Refactor Dialog class and improve null safety

- Enabled nullable reference types in `Dialog.cs` for better null safety.
- Removed and reintroduced static configuration properties with `[ConfigurationProperty]` attributes for configurability.
- Refactored `Dialog` constructor to use `base.ShadowStyle` and improved button management with alignment logic.
- Updated `Canceled` property with a private backing field and debug assertions.
- Added null-forgiving operators (`!`) across the codebase for nullable reference type compatibility.
- Introduced new test cases to verify `Dialog` behavior, including modal mouse capture and `Canceled` property access.
- Refactored and modernized existing test cases for consistency and readability.
- Removed redundant test cases and performed general code cleanup.
- Improved code comments and debug assertions for clarity and robustness.

* Refactor DialogTests to replace null with empty array

Updated the `BeginButtonTestDialog` method call in `DialogTests.cs`
to replace the `null!` argument with an empty array `[]`. This
improves type safety and ensures explicit handling of the argument.
2025-10-23 14:54:06 -06:00

813 lines
30 KiB
C#

using System.IO.Abstractions.TestingHelpers;
using System.Runtime.InteropServices;
using UnitTests;
using Xunit.Abstractions;
namespace UnitTests.FileServicesTests;
public class FileDialogTests ()
{
[Theory]
[InlineData (true)]
[InlineData (false)]
[AutoInitShutdown]
public void CancelSelection (bool cancel)
{
FileDialog dlg = GetInitializedFileDialog ();
string openIn = Path.Combine (Environment.CurrentDirectory, "zz");
Directory.CreateDirectory (openIn);
dlg.Path = openIn + Path.DirectorySeparatorChar;
dlg.FilesSelected += (s, e) => e.Cancel = cancel;
//pressing enter will complete the current selection
// unless the event cancels the confirm
Application.RaiseKeyDownEvent (Key.Enter);
Assert.Equal (cancel, dlg.Canceled);
dlg.Dispose ();
}
[Fact]
[AutoInitShutdown]
public void DirectTyping_Allowed ()
{
FileDialog dlg = GetInitializedFileDialog ();
TextField tf = dlg.SubViews.OfType<TextField> ().First (t => t.HasFocus);
tf.ClearAllSelection ();
tf.CursorPosition = tf.Text.Length;
Assert.True (tf.HasFocus);
SendSlash ();
Assert.Equal (
new DirectoryInfo (Environment.CurrentDirectory + Path.DirectorySeparatorChar).FullName,
new DirectoryInfo (dlg.Path + Path.DirectorySeparatorChar).FullName
);
// continue typing the rest of the path
Send ("Bob");
Application.RaiseKeyDownEvent ('.');
Send ("csv");
Assert.True (dlg.Canceled);
Application.RaiseKeyDownEvent (Key.Enter);
Assert.False (dlg.Canceled);
Assert.Equal ("Bob.csv", Path.GetFileName (dlg.Path));
dlg.Dispose ();
}
[Fact]
[AutoInitShutdown]
public void DirectTyping_AutoComplete ()
{
FileDialog dlg = GetInitializedFileDialog ();
string openIn = Path.Combine (Environment.CurrentDirectory, "zz");
Directory.CreateDirectory (openIn);
string expectedDest = Path.Combine (openIn, "xx");
Directory.CreateDirectory (expectedDest);
dlg.Path = openIn + Path.DirectorySeparatorChar;
Send ("x");
// nothing selected yet
Assert.True (dlg.Canceled);
Assert.Equal ("x", Path.GetFileName (dlg.Path));
// complete auto typing
Application.RaiseKeyDownEvent ('\t');
// but do not close dialog
Assert.True (dlg.Canceled);
Assert.EndsWith ("xx" + Path.DirectorySeparatorChar, dlg.Path);
// press enter again to confirm the dialog
Application.RaiseKeyDownEvent (Key.Enter);
Assert.False (dlg.Canceled);
Assert.EndsWith ("xx" + Path.DirectorySeparatorChar, dlg.Path);
dlg.Dispose ();
}
[Fact]
[AutoInitShutdown]
public void DoNotConfirmSelectionWhenFindFocused ()
{
FileDialog dlg = GetInitializedFileDialog ();
string openIn = Path.Combine (Environment.CurrentDirectory, "zz");
Directory.CreateDirectory (openIn);
dlg.Path = openIn + Path.DirectorySeparatorChar;
var tf = dlg.SubViews.First (view => view.Id == "_tableViewContainer").SubViews.First (v => v.Id == "_tbFind") as TextField;
tf.SetFocus ();
Assert.IsType<TextField> (dlg.MostFocused);
Assert.Same (tf, dlg.MostFocused);
Assert.Equal ("Find", tf.Caption);
// Dialog has not yet been confirmed with a choice
Assert.True (dlg.Canceled);
//pressing enter while search focused should not confirm path
Application.RaiseKeyDownEvent (Key.Enter);
Assert.True (dlg.Canceled);
//// tabbing out of search
//Application.RaiseKeyDownEvent ('\t');
////should allow enter to confirm path
//Application.RaiseKeyDownEvent (Key.Enter);
//// Dialog has not yet been confirmed with a choice
//Assert.False (dlg.Canceled);
dlg.Dispose ();
}
[Fact]
[AutoInitShutdown]
public void DotDot_MovesToRoot_ThenPressBack ()
{
FileDialog dlg = GetDialog ();
dlg.OpenMode = OpenMode.Directory;
dlg.AllowsMultipleSelection = true;
var selected = false;
dlg.FilesSelected += (s, e) => { selected = true; };
AssertIsTheStartingDirectory (dlg.Path);
Assert.IsType<TextField> (dlg.MostFocused);
Application.RaiseKeyDownEvent (Key.CursorDown);
var tv = GetTableView(dlg);
tv.SetFocus ();
Assert.IsType<TableView> (dlg.MostFocused);
// ".." should be the first thing selected
// ".." should not mess with the displayed path
AssertIsTheStartingDirectory (dlg.Path);
// Accept navigation up a directory
Application.RaiseKeyDownEvent (Key.Enter);
AssertIsTheRootDirectory (dlg.Path);
Assert.True (dlg.Canceled);
Assert.False (selected);
Assert.IsType<TableView> (dlg.MostFocused);
// Now press Backspace (in table view)
Application.RaiseKeyDownEvent (Key.Backspace);
// Should move us back to the root
AssertIsTheStartingDirectory (dlg.Path);
Assert.True (dlg.Canceled);
Assert.False (selected);
dlg.Dispose ();
}
[Theory]
[AutoInitShutdown]
[InlineData (true)]
[InlineData (false)]
public void MultiSelectDirectory_CannotToggleDotDot (bool acceptWithEnter)
{
FileDialog dlg = GetDialog ();
dlg.OpenMode = OpenMode.Directory;
dlg.AllowsMultipleSelection = true;
IReadOnlyCollection<string> eventMultiSelected = null;
dlg.FilesSelected += (s, e) => { eventMultiSelected = e.Dialog.MultiSelected; };
var tv = GetTableView (dlg);
tv.SetFocus ();
Assert.IsType<TableView> (dlg.MostFocused);
// Try to toggle '..'
Application.RaiseKeyDownEvent (' ');
Application.RaiseKeyDownEvent (Key.CursorDown);
// Toggle subfolder
Application.RaiseKeyDownEvent (' ');
Assert.True (dlg.Canceled);
if (acceptWithEnter)
{
Application.RaiseKeyDownEvent (Key.Enter);
}
else
{
Application.RaiseKeyDownEvent ('O');
}
Assert.False (dlg.Canceled);
Assert.Multiple (
() =>
{
// Only the subfolder should be selected
Assert.Single (dlg.MultiSelected);
AssertIsTheSubfolder (dlg.Path);
AssertIsTheSubfolder (dlg.MultiSelected.Single ());
},
() =>
{
// Event should also agree with the final state
Assert.NotNull (eventMultiSelected);
Assert.Single (eventMultiSelected);
AssertIsTheSubfolder (eventMultiSelected.Single ());
}
);
dlg.Dispose ();
}
[Theory]
[AutoInitShutdown]
[InlineData (true)]
[InlineData (false)]
public void MultiSelectDirectory_CanToggleThenAccept (bool acceptWithEnter)
{
FileDialog dlg = GetDialog ();
dlg.OpenMode = OpenMode.Directory;
dlg.AllowsMultipleSelection = true;
IReadOnlyCollection<string> eventMultiSelected = null;
dlg.FilesSelected += (s, e) => { eventMultiSelected = e.Dialog.MultiSelected; };
var tv = GetTableView (dlg);
tv.SetFocus ();
Assert.IsType<TableView> (dlg.MostFocused);
// Move selection to subfolder
Application.RaiseKeyDownEvent (Key.CursorDown);
// Toggle subfolder
Application.RaiseKeyDownEvent (' ');
Assert.True (dlg.Canceled);
if (acceptWithEnter)
{
Application.RaiseKeyDownEvent (Key.Enter);
}
else
{
Application.RaiseKeyDownEvent (Key.O.WithAlt);
}
Assert.False (dlg.Canceled);
Assert.Multiple (
() =>
{
// Only the subfolder should be selected
Assert.Single (dlg.MultiSelected);
AssertIsTheSubfolder (dlg.Path);
AssertIsTheSubfolder (dlg.MultiSelected.Single ());
},
() =>
{
// Event should also agree with the final state
Assert.NotNull (eventMultiSelected);
Assert.Single (eventMultiSelected);
AssertIsTheSubfolder (eventMultiSelected.Single ());
}
);
dlg.Dispose ();
}
[Fact]
[AutoInitShutdown]
public void MultiSelectDirectory_EnterOpensFolder ()
{
FileDialog dlg = GetDialog ();
dlg.OpenMode = OpenMode.Directory;
dlg.AllowsMultipleSelection = true;
IReadOnlyCollection<string> eventMultiSelected = null;
dlg.FilesSelected += (s, e) => { eventMultiSelected = e.Dialog.MultiSelected; };
var tv = GetTableView (dlg);
tv.SetFocus ();
Assert.IsType<TableView> (dlg.MostFocused);
// Move selection to subfolder
Application.RaiseKeyDownEvent (Key.CursorDown);
Application.RaiseKeyDownEvent (Key.Enter);
// Path should update to the newly opened folder
AssertIsTheSubfolder (dlg.Path);
// No selection will have been confirmed
Assert.True (dlg.Canceled);
Assert.Empty (dlg.MultiSelected);
Assert.Null (eventMultiSelected);
dlg.Dispose ();
}
[Fact]
[AutoInitShutdown]
public void OnLoad_TextBoxIsFocused ()
{
FileDialog dlg = GetInitializedFileDialog ();
View tf = dlg.SubViews.FirstOrDefault (t => t.HasFocus);
Assert.NotNull (tf);
Assert.IsType<TextField> (tf);
dlg.Dispose ();
}
[Theory]
[AutoInitShutdown]
[InlineData (true, true)]
[InlineData (true, false)]
[InlineData (false, true)]
[InlineData (false, false)]
public void PickDirectory_ArrowNavigation (bool openModeMixed, bool multiple)
{
FileDialog dlg = GetDialog ();
dlg.OpenMode = openModeMixed ? OpenMode.Mixed : OpenMode.Directory;
dlg.AllowsMultipleSelection = multiple;
var tv = GetTableView (dlg);
tv.SetFocus ();
Assert.IsType<TableView> (dlg.MostFocused);
// Should be selecting ..
Application.RaiseKeyDownEvent (Key.CursorDown);
// Down to the directory
Assert.True (dlg.Canceled);
// Alt+O to open (enter would just navigate into the child dir)
Application.RaiseKeyDownEvent (Key.O.WithAlt);
Assert.False (dlg.Canceled);
AssertIsTheSubfolder (dlg.Path);
dlg.Dispose ();
}
[Theory]
[AutoInitShutdown]
[InlineData (true, true)]
[InlineData (true, false)]
[InlineData (false, true)]
[InlineData (false, false)]
public void PickDirectory_DirectTyping (bool openModeMixed, bool multiple)
{
FileDialog dlg = GetDialog ();
dlg.OpenMode = openModeMixed ? OpenMode.Mixed : OpenMode.Directory;
dlg.AllowsMultipleSelection = multiple;
// whe first opening the text field will have select all on
// so to add to current path user must press End or right
Application.RaiseKeyDownEvent (Key.CursorLeft);
Application.RaiseKeyDownEvent (Key.CursorRight);
Send ("subfolder");
// Dialog has not yet been confirmed with a choice
Assert.True (dlg.Canceled);
// Now it has
Application.RaiseKeyDownEvent (Key.Enter);
Assert.False (dlg.Canceled);
AssertIsTheSubfolder (dlg.Path);
dlg.Dispose ();
}
[Theory]
[InlineData (".csv", null, false)]
[InlineData (".csv", "", false)]
[InlineData (".csv", "c:\\MyFile.csv", true)]
[InlineData (".csv", "c:\\MyFile.CSV", true)]
[InlineData (".csv", "c:\\MyFile.csv.bak", false)]
public void TestAllowedType_Basic (string allowed, string candidate, bool expected)
{
Assert.Equal (expected, new AllowedType ("Test", allowed).IsAllowed (candidate));
}
[Theory]
[InlineData (".Designer.cs", "c:\\MyView.Designer.cs", true)]
[InlineData (".Designer.cs", "c:\\temp/MyView.Designer.cs", true)]
[InlineData (".Designer.cs", "MyView.Designer.cs", true)]
[InlineData (".Designer.cs", "c:\\MyView.DESIGNER.CS", true)]
[InlineData (".Designer.cs", "MyView.cs", false)]
public void TestAllowedType_DoubleBarreled (string allowed, string candidate, bool expected)
{
Assert.Equal (expected, new AllowedType ("Test", allowed).IsAllowed (candidate));
}
[Theory]
[InlineData ("Dockerfile", "c:\\temp\\Dockerfile", true)]
[InlineData ("Dockerfile", "Dockerfile", true)]
[InlineData ("Dockerfile", "someimg.Dockerfile", true)]
public void TestAllowedType_SpecificFile (string allowed, string candidate, bool expected)
{
Assert.Equal (expected, new AllowedType ("Test", allowed).IsAllowed (candidate));
}
[Fact]
[AutoInitShutdown]
public void TestDirectoryContents_Linux ()
{
if (IsWindows ())
{
return;
}
FileDialog fd = GetLinuxDialog ();
fd.Title = string.Empty;
fd.Style.Culture = new ("en-US");
fd.Draw ();
/*
*
*
┌─────────────────────────────────────────────────────────────────────────┐
│/demo/ │
│⟦▲⟧ │
│┌────────────┬──────────┬──────────────────────────────┬────────────────┐│
││Filename (▲)│Size │Modified │Type ││
│├────────────┼──────────┼──────────────────────────────┼────────────────┤│
││.. │ │ │<Directory> ││
││/subfolder │ │2002-01-01T22:42:10 │<Directory> ││
││image.gif │4.00 B │2002-01-01T22:42:10 │.gif ││
││jQuery.js │7.00 B │2001-01-01T11:44:42 │.js ││
│ │
│ │
│ │
│⟦ ►► ⟧ Enter Search ⟦► OK ◄⟧ ⟦ Cancel ⟧ │
└─────────────────────────────────────────────────────────────────────────┘
*
*/
var path = fd.SubViews.OfType<TextField> ().ElementAt (0);
Assert.Equal ("/demo/", path.Text);
var tv = GetTableView (fd);
// Asserting the headers
Assert.Equal ("Filename (▲)", tv.Table.ColumnNames.ElementAt (0));
Assert.Equal ("Size", tv.Table.ColumnNames.ElementAt (1));
Assert.Equal ("Modified", tv.Table.ColumnNames.ElementAt (2));
Assert.Equal ("Type", tv.Table.ColumnNames.ElementAt (3));
// Asserting the table contents
Assert.Equal ("..", tv.Style.GetOrCreateColumnStyle (0).GetRepresentation (tv.Table [0, 0]));
Assert.Equal ("/subfolder", tv.Style.GetOrCreateColumnStyle (0).GetRepresentation (tv.Table [1, 0]));
Assert.Equal ("image.gif", tv.Style.GetOrCreateColumnStyle (0).GetRepresentation (tv.Table [2, 0]));
Assert.Equal ("jQuery.js", tv.Style.GetOrCreateColumnStyle (0).GetRepresentation (tv.Table [3, 0]));
Assert.Equal ("", tv.Style.GetOrCreateColumnStyle (1).GetRepresentation (tv.Table [0, 1]));
Assert.Equal ("", tv.Style.GetOrCreateColumnStyle (1).GetRepresentation (tv.Table [1, 1]));
Assert.Equal ("4.00 B", tv.Style.GetOrCreateColumnStyle (1).GetRepresentation (tv.Table [2, 1]));
Assert.Equal ("7.00 B", tv.Style.GetOrCreateColumnStyle (1).GetRepresentation (tv.Table [3, 1]));
Assert.Equal ("", tv.Style.GetOrCreateColumnStyle (2).GetRepresentation (tv.Table [0, 2]));
Assert.Equal ("2002-01-01T22:42:10", tv.Style.GetOrCreateColumnStyle (2).GetRepresentation (tv.Table [1, 2]));
Assert.Equal ("2002-01-01T22:42:10", tv.Style.GetOrCreateColumnStyle (2).GetRepresentation (tv.Table [2, 2]));
Assert.Equal ("2001-01-01T11:44:42", tv.Style.GetOrCreateColumnStyle (2).GetRepresentation (tv.Table [3, 2]));
Assert.Equal ("<Directory>", tv.Style.GetOrCreateColumnStyle (3).GetRepresentation (tv.Table [0, 3]));
Assert.Equal ("<Directory>", tv.Style.GetOrCreateColumnStyle (3).GetRepresentation (tv.Table [1, 3]));
Assert.Equal (".gif", tv.Style.GetOrCreateColumnStyle (3).GetRepresentation (tv.Table [2, 3]));
Assert.Equal (".js", tv.Style.GetOrCreateColumnStyle (3).GetRepresentation (tv.Table [3, 3]));
fd.Dispose ();
}
[Fact]
[AutoInitShutdown]
public void TestDirectoryContents_Windows ()
{
if (!IsWindows ())
{
return;
}
FileDialog fd = GetWindowsDialog ();
fd.Title = string.Empty;
fd.Style.Culture = new ("en-US");
fd.Draw ();
/*
*
*
┌─────────────────────────────────────────────────────────────────────────┐
│c:\demo\ │
│⟦▲⟧ │
│┌────────────┬──────────┬──────────────────────────────┬────────────────┐│
││Filename (▲)│Size │Modified │Type ││
│├────────────┼──────────┼──────────────────────────────┼────────────────┤│
││.. │ │ │<Directory> ││
││\subfolder │ │2002-01-01T22:42:10 │<Directory> ││
││image.gif │4.00 B │2002-01-01T22:42:10 │.gif ││
││jQuery.js │7.00 B │2001-01-01T11:44:42 │.js ││
││mybinary.exe│7.00 B │2001-01-01T11:44:42 │.exe ││
│ │
│ │
│⟦ ►► ⟧ Enter Search ⟦► OK ◄⟧ ⟦ Cancel ⟧ │
└─────────────────────────────────────────────────────────────────────────┘
*
*/
var path = fd.SubViews.OfType<TextField> ().ElementAt (0);
Assert.Equal ("c:\\demo\\",path.Text);
var tv = GetTableView (fd);
// Asserting the headers
Assert.Equal ("Filename (▲)", tv.Table.ColumnNames.ElementAt (0));
Assert.Equal ("Size", tv.Table.ColumnNames.ElementAt (1));
Assert.Equal ("Modified", tv.Table.ColumnNames.ElementAt (2));
Assert.Equal ("Type", tv.Table.ColumnNames.ElementAt (3));
// Asserting the table contents
Assert.Equal ("..", tv.Style.GetOrCreateColumnStyle (0).GetRepresentation (tv.Table [0, 0]));
Assert.Equal (@"\subfolder", tv.Style.GetOrCreateColumnStyle (0).GetRepresentation (tv.Table [1, 0]));
Assert.Equal ("image.gif", tv.Style.GetOrCreateColumnStyle (0).GetRepresentation (tv.Table [2, 0]));
Assert.Equal ("jQuery.js", tv.Style.GetOrCreateColumnStyle (0).GetRepresentation (tv.Table [3, 0]));
Assert.Equal ("mybinary.exe", tv.Style.GetOrCreateColumnStyle (0).GetRepresentation (tv.Table [4, 0]));
Assert.Equal ("", tv.Style.GetOrCreateColumnStyle (1).GetRepresentation (tv.Table [0, 1]));
Assert.Equal ("", tv.Style.GetOrCreateColumnStyle (1).GetRepresentation (tv.Table [1, 1]));
Assert.Equal ("4.00 B", tv.Style.GetOrCreateColumnStyle (1).GetRepresentation (tv.Table [2, 1]));
Assert.Equal ("7.00 B", tv.Style.GetOrCreateColumnStyle (1).GetRepresentation (tv.Table [3, 1]));
Assert.Equal ("7.00 B", tv.Style.GetOrCreateColumnStyle (1).GetRepresentation (tv.Table [4, 1]));
Assert.Equal ("", tv.Style.GetOrCreateColumnStyle (2).GetRepresentation (tv.Table [0, 2]));
Assert.Equal ("2002-01-01T22:42:10", tv.Style.GetOrCreateColumnStyle (2).GetRepresentation (tv.Table [1, 2]));
Assert.Equal ("2002-01-01T22:42:10", tv.Style.GetOrCreateColumnStyle (2).GetRepresentation (tv.Table [2, 2]));
Assert.Equal ("2001-01-01T11:44:42", tv.Style.GetOrCreateColumnStyle (2).GetRepresentation (tv.Table [3, 2]));
Assert.Equal ("2001-01-01T11:44:42", tv.Style.GetOrCreateColumnStyle (2).GetRepresentation (tv.Table [4, 2]));
Assert.Equal ("<Directory>", tv.Style.GetOrCreateColumnStyle (3).GetRepresentation (tv.Table [0, 3]));
Assert.Equal ("<Directory>", tv.Style.GetOrCreateColumnStyle (3).GetRepresentation (tv.Table [1, 3]));
Assert.Equal (".gif", tv.Style.GetOrCreateColumnStyle (3).GetRepresentation (tv.Table [2, 3]));
Assert.Equal (".js", tv.Style.GetOrCreateColumnStyle (3).GetRepresentation (tv.Table [3, 3]));
Assert.Equal (".exe", tv.Style.GetOrCreateColumnStyle (3).GetRepresentation (tv.Table [4, 3]));
fd.Dispose ();
}
private void AssertIsTheRootDirectory (string path)
{
if (IsWindows ())
{
Assert.Equal (@"c:\", path);
}
else
{
Assert.Equal ("/", path);
}
}
private void AssertIsTheStartingDirectory (string path)
{
if (IsWindows ())
{
Assert.Equal (@"c:\demo\", path);
}
else
{
Assert.Equal ("/demo/", path);
}
}
private void AssertIsTheSubfolder (string path)
{
if (IsWindows ())
{
Assert.Equal (@"c:\demo\subfolder", path);
}
else
{
Assert.Equal ("/demo/subfolder", path);
}
}
private void Begin (FileDialog dlg)
{
dlg.BeginInit ();
dlg.EndInit ();
Application.Begin (dlg);
}
private FileDialog GetDialog () { return IsWindows () ? GetWindowsDialog () : GetLinuxDialog (); }
private FileDialog GetInitializedFileDialog ()
{
Window.DefaultBorderStyle = LineStyle.Single;
Dialog.DefaultButtonAlignment = Alignment.Center;
Dialog.DefaultBorderStyle = LineStyle.Single;
Dialog.DefaultShadow = ShadowStyle.None;
Button.DefaultShadow = ShadowStyle.None;
var dlg = new FileDialog ();
Begin (dlg);
return dlg;
}
private FileDialog GetLinuxDialog ()
{
Window.DefaultBorderStyle = LineStyle.Single;
Dialog.DefaultButtonAlignment = Alignment.Center;
Dialog.DefaultBorderStyle = LineStyle.Single;
Dialog.DefaultShadow = ShadowStyle.None;
Button.DefaultShadow = ShadowStyle.None;
// Arrange
var fileSystem = new MockFileSystem (new Dictionary<string, MockFileData> (), "/");
fileSystem.MockTime (() => new (2010, 01, 01, 11, 12, 43));
fileSystem.AddFile (
@"/myfile.txt",
new ("Testing is meh.") { LastWriteTime = new DateTime (2001, 01, 01, 11, 12, 11) }
);
fileSystem.AddFile (
@"/demo/jQuery.js",
new ("some js") { LastWriteTime = new DateTime (2001, 01, 01, 11, 44, 42) }
);
fileSystem.AddFile (
@"/demo/image.gif",
new (new byte [] { 0x12, 0x34, 0x56, 0xd2 })
{
LastWriteTime = new DateTime (2002, 01, 01, 22, 42, 10)
}
);
var m = (MockDirectoryInfo)fileSystem.DirectoryInfo.New (@"/demo/subfolder");
m.Create ();
m.LastWriteTime = new (2002, 01, 01, 22, 42, 10);
fileSystem.AddFile (
@"/demo/subfolder/image2.gif",
new (new byte [] { 0x12, 0x34, 0x56, 0xd2 })
{
LastWriteTime = new DateTime (2002, 01, 01, 22, 42, 10)
}
);
var fd = new FileDialog (fileSystem) { Height = 15, Width = 75 };
fd.Path = @"/demo/";
Begin (fd);
return fd;
}
private FileDialog GetWindowsDialog ()
{
// Override CM
Window.DefaultBorderStyle = LineStyle.Single;
Dialog.DefaultButtonAlignment = Alignment.Center;
Dialog.DefaultBorderStyle = LineStyle.Single;
Dialog.DefaultShadow = ShadowStyle.None;
Button.DefaultShadow = ShadowStyle.None;
// Arrange
var fileSystem = new MockFileSystem (new Dictionary<string, MockFileData> (), @"c:\");
fileSystem.MockTime (() => new (2010, 01, 01, 11, 12, 43));
fileSystem.AddFile (
@"c:\myfile.txt",
new ("Testing is meh.") { LastWriteTime = new DateTime (2001, 01, 01, 11, 12, 11) }
);
fileSystem.AddFile (
@"c:\demo\jQuery.js",
new ("some js") { LastWriteTime = new DateTime (2001, 01, 01, 11, 44, 42) }
);
fileSystem.AddFile (
@"c:\demo\mybinary.exe",
new ("some js") { LastWriteTime = new DateTime (2001, 01, 01, 11, 44, 42) }
);
fileSystem.AddFile (
@"c:\demo\image.gif",
new (new byte [] { 0x12, 0x34, 0x56, 0xd2 })
{
LastWriteTime = new DateTime (2002, 01, 01, 22, 42, 10)
}
);
var m = (MockDirectoryInfo)fileSystem.DirectoryInfo.New (@"c:\demo\subfolder");
m.Create ();
m.LastWriteTime = new (2002, 01, 01, 22, 42, 10);
fileSystem.AddFile (
@"c:\demo\subfolder\image2.gif",
new (new byte [] { 0x12, 0x34, 0x56, 0xd2 })
{
LastWriteTime = new DateTime (2002, 01, 01, 22, 42, 10)
}
);
var fd = new FileDialog (fileSystem) { Height = 15, Width = 75 };
fd.Path = @"c:\demo\";
Begin (fd);
return fd;
}
/*
[Fact, AutoInitShutdown]
public void Autocomplete_NoSuggestion_WhenTextMatchesExactly ()
{
var tb = new TextFieldWithAppendAutocomplete ();
ForceFocus (tb);
tb.Text = "/bob/fish";
tb.CursorPosition = tb.Text.Length;
tb.GenerateSuggestions (null, "fish", "fishes");
// should not report success for autocompletion because we already have that exact
// string
Assert.False (tb.AcceptSelectionIfAny ());
}
[Fact, AutoInitShutdown]
public void Autocomplete_AcceptSuggstion ()
{
var tb = new TextFieldWithAppendAutocomplete ();
ForceFocus (tb);
tb.Text = @"/bob/fi";
tb.CursorPosition = tb.Text.Length;
tb.GenerateSuggestions (null, "fish", "fishes");
Assert.True (tb.AcceptSelectionIfAny ());
Assert.Equal (@"/bob/fish", tb.Text);
}*/
private bool IsWindows () { return RuntimeInformation.IsOSPlatform (OSPlatform.Windows); }
private void Send (string chars)
{
foreach (char ch in chars)
{
Application.RaiseKeyDownEvent (ch);
}
}
private void SendSlash ()
{
if (Path.DirectorySeparatorChar == '/')
{
Application.RaiseKeyDownEvent ('/');
}
else
{
Application.RaiseKeyDownEvent ('\\');
}
}
private TableView GetTableView (FileDialog dlg)
{
// The table view is in the _tableViewContainer which is a direct subview of the dialog
// We need to search through all subviews recursively
TableView FindTableView (View view)
{
if (view is TableView tv)
{
return tv;
}
foreach (View subview in view.SubViews)
{
TableView result = FindTableView (subview);
if (result != null)
{
return result;
}
}
return null;
}
return FindTableView (dlg);
}
}