Files
Terminal.Gui/UnitTests/Dialogs/MessageBoxTests.cs
Tig 6851b42a49 Fixes #2921 - MainLoop refactoring (#2922)
* Adds basic MainLoop unit tests

* Remove WinChange action from Curses

* Remove WinChange action from Curses

* Remove ProcessInput action from Windows MainLoop

* Simplified MainLoop/ConsoleDriver by making MainLoop internal and moving impt fns to Application

* Modernized Terminal resize events

* Modernized Terminal resize events

* Removed un used property

* for _isWindowsTerminal devenv->wininit; not sure what changed

* Modernized mouse/keyboard events (Action->EventHandler)

* Updated OnMouseEvent API docs

* Using WT_SESSION to detect WT

* removes hacky GetParentProcess

* Updates to fix #2634 (clear last line)

* removes hacky GetParentProcess2

* Addressed mac resize issue

* Addressed mac resize issue

* Removes ConsoleDriver.PrepareToRun, has Init return MainLoop

* Removes unneeded Attribute methods

* Removed GetProcesssName

* Removed GetProcesssName

* Refactored KeyEvent and KeyEventEventArgs into a single class

* Revert "Refactored KeyEvent and KeyEventEventArgs into a single class"

This reverts commit 88a00658db.

* Fixed key repeat issue; reverted stupidity on 1049/1047 confusion

* Updated CSI API Docs

* merge
2023-10-21 08:06:04 -07:00

577 lines
18 KiB
C#

using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;
using System.Text;
using Terminal.Gui;
using Microsoft.VisualStudio.TestPlatform.CommunicationUtilities;
namespace Terminal.Gui.DialogTests {
public class MessageBoxTests {
readonly ITestOutputHelper output;
public MessageBoxTests (ITestOutputHelper output)
{
this.output = output;
}
[Fact]
[AutoInitShutdown]
public void Size_Default ()
{
var iterations = -1;
Application.Begin (Application.Top);
((FakeDriver)Application.Driver).SetBufferSize (100, 100);
Application.Iteration += (s, a) => {
iterations++;
if (iterations == 0) {
MessageBox.Query (string.Empty, string.Empty, null);
Application.RequestStop ();
} else if (iterations == 1) {
Application.Refresh ();
Assert.IsType<Dialog> (Application.Current);
// Default size is Percent(60)
Assert.Equal (new Size ((int)(100 * .60), 5), Application.Current.Frame.Size);
Application.RequestStop ();
}
};
Application.Run ();
}
[Fact]
[AutoInitShutdown]
public void Location_Default ()
{
var iterations = -1;
Application.Begin (Application.Top);
((FakeDriver)Application.Driver).SetBufferSize (100, 100);
Application.Iteration += (s, a) => {
iterations++;
if (iterations == 0) {
MessageBox.Query (string.Empty, string.Empty, null);
Application.RequestStop ();
} else if (iterations == 1) {
Application.Refresh ();
Assert.IsType<Dialog> (Application.Current);
// Default location is centered, so
// X = (100 / 2) - (60 / 2) = 20
// Y = (100 / 2) - (5 / 2) = 47
Assert.Equal (new Point (20, 47), Application.Current.Frame.Location);
Application.RequestStop ();
}
};
Application.Run ();
}
[Theory]
[InlineData (0, 0)]
[InlineData (1, 1)]
[InlineData (7, 5)]
[InlineData (50, 50)]
[AutoInitShutdown]
public void Size_Not_Default_No_Message (int height, int width)
{
var iterations = -1;
Application.Begin (Application.Top);
((FakeDriver)Application.Driver).SetBufferSize (100, 100);
Application.Iteration += (s, a) => {
iterations++;
if (iterations == 0) {
MessageBox.Query (height, width, string.Empty, string.Empty, null);
Application.RequestStop ();
} else if (iterations == 1) {
Application.Refresh ();
Assert.IsType<Dialog> (Application.Current);
Assert.Equal (new Size (height, width), Application.Current.Frame.Size);
Application.RequestStop ();
}
};
}
[Theory]
[InlineData (0, 0, "1")]
[InlineData (1, 1, "1")]
[InlineData (7, 5, "1")]
[InlineData (50, 50, "1")]
[InlineData (0, 0, "message")]
[InlineData (1, 1, "message")]
[InlineData (7, 5, "message")]
[InlineData (50, 50, "message")]
[AutoInitShutdown]
public void Size_Not_Default_Message (int height, int width, string message)
{
var iterations = -1;
Application.Begin (Application.Top);
((FakeDriver)Application.Driver).SetBufferSize (100, 100);
Application.Iteration += (s, a) => {
iterations++;
if (iterations == 0) {
MessageBox.Query (height, width, string.Empty, message, null);
Application.RequestStop ();
} else if (iterations == 1) {
Application.Refresh ();
Assert.IsType<Dialog> (Application.Current);
Assert.Equal (new Size (height, width), Application.Current.Frame.Size);
Application.RequestStop ();
}
};
}
[Theory]
[InlineData (0, 0, "1")]
[InlineData (1, 1, "1")]
[InlineData (7, 5, "1")]
[InlineData (50, 50, "1")]
[InlineData (0, 0, "message")]
[InlineData (1, 1, "message")]
[InlineData (7, 5, "message")]
[InlineData (50, 50, "message")]
[AutoInitShutdown]
public void Size_Not_Default_Message_Button (int height, int width, string message)
{
var iterations = -1;
Application.Begin (Application.Top);
((FakeDriver)Application.Driver).SetBufferSize (100, 100);
Application.Iteration += (s, a) => {
iterations++;
if (iterations == 0) {
MessageBox.Query (height, width, string.Empty, message, "_Ok");
Application.RequestStop ();
} else if (iterations == 1) {
Application.Refresh ();
Assert.IsType<Dialog> (Application.Current);
Assert.Equal (new Size (height, width), Application.Current.Frame.Size);
Application.RequestStop ();
}
};
}
[Fact, AutoInitShutdown]
public void Size_None_No_Buttons ()
{
var iterations = -1;
Application.Begin (Application.Top);
Application.Iteration += (s, a) => {
iterations++;
if (iterations == 0) {
MessageBox.Query ("Title", "Message");
Application.RequestStop ();
} else if (iterations == 1) {
Application.Refresh ();
TestHelpers.AssertDriverContentsWithFrameAre (@"
┌┤Title├───────────────────────────────────────┐
│ Message │
│ │
│ │
└──────────────────────────────────────────────┘
", output);
Application.RequestStop ();
}
};
Application.Run ();
}
[Fact, AutoInitShutdown]
public void Size_No_With_Button ()
{
Application.Top.BorderStyle = LineStyle.Double;
var iterations = -1;
Application.Begin (Application.Top);
var aboutMessage = new StringBuilder ();
aboutMessage.AppendLine (@"0123456789012345678901234567890123456789");
aboutMessage.AppendLine (@"https://github.com/gui-cs/Terminal.Gui");
var message = aboutMessage.ToString ();
var btn = $"{CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} Ok {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket}";
((FakeDriver)Application.Driver).SetBufferSize (40 + 4, 8);
Application.Iteration += (s, a) => {
iterations++;
if (iterations == 0) {
MessageBox.Query (string.Empty, message, "_Ok");
Application.RequestStop ();
} else if (iterations == 1) {
Application.Refresh ();
TestHelpers.AssertDriverContentsWithFrameAre (@$"
╔══════════════════════════════════════════╗
║┌────────────────────────────────────────┐║
║│0123456789012345678901234567890123456789│║
║│ https://github.com/gui-cs/Terminal.Gui │║
║│ │║
║│ {btn} │║
║└────────────────────────────────────────┘║
╚══════════════════════════════════════════╝
", output);
Application.RequestStop ();
}
};
Application.Run ();
}
[Fact, AutoInitShutdown]
public void Size_Tiny_Fixed_Size ()
{
var iterations = -1;
Application.Begin (Application.Top);
Application.Iteration += (s, a) => {
iterations++;
if (iterations == 0) {
MessageBox.Query (7, 5, string.Empty, "Message", "_Ok");
Application.RequestStop ();
} else if (iterations == 1) {
Application.Refresh ();
Assert.Equal (new Size (7, 5), Application.Current.Frame.Size);
TestHelpers.AssertDriverContentsWithFrameAre (@$"
┌─────┐
│Messa│
│ ge │
│ Ok {CM.Glyphs.RightDefaultIndicator}│
└─────┘
", output);
Application.RequestStop ();
}
};
Application.Run ();
}
[Fact, AutoInitShutdown]
public void Size_JustBigEnough_Fixed_Size ()
{
var iterations = -1;
Application.Begin (Application.Top);
var btn = $"{CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} Ok {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket}";
Application.Iteration += (s, a) => {
iterations++;
if (iterations == 0) {
MessageBox.Query (11, 5, string.Empty, "Message", "_Ok");
Application.RequestStop ();
} else if (iterations == 1) {
Application.Refresh ();
TestHelpers.AssertDriverContentsWithFrameAre (@$"
┌─────────┐
│ Message │
│ │
│{btn} │
└─────────┘
", output);
Application.RequestStop ();
}
};
Application.Run ();
}
[Fact, AutoInitShutdown]
public void Message_Long_Without_Spaces_WrapMessage_True ()
{
var iterations = -1;
Application.Begin (Application.Top);
Application.Top.BorderStyle = LineStyle.Double;
((FakeDriver)Application.Driver).SetBufferSize (20, 10);
var btn = $"{CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} btn {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket}";
Application.Iteration += (s, a) => {
iterations++;
if (iterations == 0) {
// 50 characters should make the height of the wrapped text 7
MessageBox.Query (string.Empty, new string ('f', 50), defaultButton: 0, wrapMessage: true, "btn");
Application.RequestStop ();
} else if (iterations == 1) {
Application.Refresh ();
TestHelpers.AssertDriverContentsWithFrameAre (@$"
╔══════════════════╗
║┌────────────────┐║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ ff │║
║│ │║
║│ {btn} │║
║└────────────────┘║
╚══════════════════╝", output);
Assert.Equal (new Size (20 - 2, 10 - 2), Application.Current.Frame.Size);
Application.RequestStop ();
// Really long text
MessageBox.Query (string.Empty, new string ('f', 500), defaultButton: 0, wrapMessage: true, "btn");
} else if (iterations == 2) {
Application.Refresh ();
TestHelpers.AssertDriverContentsWithFrameAre (@$"
╔┌────────────────┐╗
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ {btn} │║
╚└────────────────┘╝", output);
Application.RequestStop ();
}
};
Application.Run ();
}
[Fact, AutoInitShutdown]
public void Message_With_Spaces_WrapMessage_True ()
{
var iterations = -1;
Application.Begin (Application.Top);
Application.Top.BorderStyle = LineStyle.Double;
((FakeDriver)Application.Driver).SetBufferSize (20, 10);
var btn = $"{CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} btn {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket}";
Application.Iteration += (s, a) => {
iterations++;
if (iterations == 0) {
var sb = new StringBuilder ();
for (int i = 0; i < 17; i++)
sb.Append ("ff ");
MessageBox.Query (string.Empty, sb.ToString (), defaultButton: 0, wrapMessage: true, "btn");
Application.RequestStop ();
} else if (iterations == 1) {
Application.Refresh ();
TestHelpers.AssertDriverContentsWithFrameAre (@$"
╔══════════════════╗
║ ┌──────────────┐ ║
║ │ff ff ff ff ff│ ║
║ │ff ff ff ff ff│ ║
║ │ff ff ff ff ff│ ║
║ │ ff ff │ ║
║ │ │ ║
║ │ {btn} │ ║
║ └──────────────┘ ║
╚══════════════════╝", output);
Application.RequestStop ();
// Really long text
MessageBox.Query (string.Empty, new string ('f', 500), defaultButton: 0, wrapMessage: true, "btn");
} else if (iterations == 2) {
Application.Refresh ();
TestHelpers.AssertDriverContentsWithFrameAre (@$"
╔┌────────────────┐╗
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ {btn} │║
╚└────────────────┘╝", output);
Application.RequestStop ();
}
};
Application.Run ();
}
[Fact, AutoInitShutdown]
public void Message_Without_Spaces_WrapMessage_False ()
{
var iterations = -1;
Application.Begin (Application.Top);
Application.Top.BorderStyle = LineStyle.Double;
((FakeDriver)Application.Driver).SetBufferSize (20, 10);
var btn = $"{CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} btn {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket}";
Application.Iteration += (s, a) => {
iterations++;
if (iterations == 0) {
MessageBox.Query (string.Empty, new string ('f', 50), defaultButton: 0, wrapMessage: true, "btn");
Application.RequestStop ();
} else if (iterations == 1) {
Application.Refresh ();
TestHelpers.AssertDriverContentsWithFrameAre (@$"
╔══════════════════╗
║┌────────────────┐║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ ff │║
║│ │║
║│ {btn} │║
║└────────────────┘║
╚══════════════════╝", output);
Application.RequestStop ();
// Really long text
MessageBox.Query (string.Empty, new string ('f', 500), defaultButton: 0, wrapMessage: true, "btn");
} else if (iterations == 2) {
Application.Refresh ();
TestHelpers.AssertDriverContentsWithFrameAre (@$"
╔┌────────────────┐╗
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ {btn} │║
╚└────────────────┘╝", output);
Application.RequestStop ();
}
};
Application.Run ();
}
[Fact, AutoInitShutdown]
public void Message_With_Spaces_WrapMessage_False ()
{
var iterations = -1;
Application.Begin (Application.Top);
Application.Top.BorderStyle = LineStyle.Double;
((FakeDriver)Application.Driver).SetBufferSize (20, 10);
var btn = $"{CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} btn {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket}";
Application.Iteration += (s, a) => {
iterations++;
if (iterations == 0) {
var sb = new StringBuilder ();
for (int i = 0; i < 17; i++)
sb.Append ("ff ");
MessageBox.Query (string.Empty, sb.ToString (), defaultButton: 0, wrapMessage: false, "btn");
Application.RequestStop ();
} else if (iterations == 1) {
Application.Refresh ();
TestHelpers.AssertDriverContentsWithFrameAre (@$"
╔══════════════════╗
║ ┌──────────────┐ ║
║ │ff ff ff ff ff│ ║
║ │ff ff ff ff ff│ ║
║ │ff ff ff ff ff│ ║
║ │ ff ff │ ║
║ │ │ ║
║ │ {btn} │ ║
║ └──────────────┘ ║
╚══════════════════╝", output);
Application.RequestStop ();
// Really long text
MessageBox.Query (string.Empty, new string ('f', 500), defaultButton: 0, wrapMessage: false, "btn");
} else if (iterations == 2) {
Application.Refresh ();
TestHelpers.AssertDriverContentsWithFrameAre (@$"
╔┌────────────────┐╗
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ffffffffffffffff│║
║│ {btn} │║
╚└────────────────┘╝", output);
Application.RequestStop ();
}
};
Application.Run ();
}
[Theory, AutoInitShutdown]
[InlineData (" ", true)]
[InlineData (" ", false)]
[InlineData ("", true)]
[InlineData ("", false)]
[InlineData ("\n", true)]
[InlineData ("\n", false)]
[InlineData (" \n", true)]
[InlineData (" \n", false)]
public void Message_Empty_Or_A_NewLline_WrapMessagge_True_Or_False (string message, bool wrapMessage)
{
var iterations = -1;
Application.Begin (Application.Top);
Application.Iteration += (s, a) => {
iterations++;
if (iterations == 0) {
MessageBox.Query (string.Empty, message, 0, wrapMessage, "ok");
Application.RequestStop ();
} else if (iterations == 1) {
Application.Refresh ();
TestHelpers.AssertDriverContentsWithFrameAre (@$"
┌──────────────────────────────────────────────┐
│ │
│ │
│ {CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} ok {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket} │
└──────────────────────────────────────────────┘", output);
Application.RequestStop ();
}
};
Application.Run ();
}
}
}