diff --git a/Example/Example.cs b/Example/Example.cs index c8b59dfd0..069e366d5 100644 --- a/Example/Example.cs +++ b/Example/Example.cs @@ -5,53 +5,68 @@ using Terminal.Gui; -// Initialize the console -Application.Init(); +Application.Run (); -// Creates the top-level window with border and title -var win = new Window("Example App (Ctrl+Q to quit)"); +System.Console.WriteLine ($"Username: {((ExampleWindow)Application.Top).usernameText.Text}"); -// Create input components and labels +// Before the application exits, reset Terminal.Gui for clean shutdown +Application.Shutdown (); -var usernameLabel = new Label("Username:"); -var usernameText = new TextField("") -{ - // Position text field adjacent to label - X = Pos.Right(usernameLabel) + 1, +// Defines a top-level window with border and title +public class ExampleWindow : Window { + public TextField usernameText; + + public ExampleWindow () + { + Title = "Example App (Ctrl+Q to quit)"; - // Fill remaining horizontal space with a margin of 1 - Width = Dim.Fill(1), -}; + // Create input components and labels + var usernameLabel = new Label () { + Text = "Username:" + }; -var passwordLabel = new Label(0,2,"Password:"); -var passwordText = new TextField("") -{ - Secret = true, - // align with the text box above - X = Pos.Left(usernameText), - Y = 2, - Width = Dim.Fill(1), -}; + usernameText = new TextField ("") { + // Position text field adjacent to the label + X = Pos.Right (usernameLabel) + 1, -// Create login button -var btnLogin = new Button("Login") -{ - Y = 4, - // center the login button horizontally - X = Pos.Center(), - IsDefault = true, -}; + // Fill remaining horizontal space + Width = Dim.Fill (), + }; -// When login button is clicked display a message popup -btnLogin.Clicked += () => MessageBox.Query("Logging In", "Login Successful", "Ok"); + var passwordLabel = new Label () { + Text = "Password:", + X = Pos.Left (usernameLabel), + Y = Pos.Bottom (usernameLabel) + 1 + }; -// Add all the views to the window -win.Add( - usernameLabel, usernameText, passwordLabel, passwordText,btnLogin -); + var passwordText = new TextField ("") { + Secret = true, + // align with the text box above + X = Pos.Left (usernameText), + Y = Pos.Top (passwordLabel), + Width = Dim.Fill (), + }; -// Show the application -Application.Run(win); + // Create login button + var btnLogin = new Button () { + Text = "Login", + Y = Pos.Bottom(passwordLabel) + 1, + // center the login button horizontally + X = Pos.Center (), + IsDefault = true, + }; -// After the application exits, release and reset console for clean shutdown -Application.Shutdown(); \ No newline at end of file + // When login button is clicked display a message popup + btnLogin.Clicked += () => { + if (usernameText.Text == "admin" && passwordText.Text == "password") { + MessageBox.Query ("Logging In", "Login Successful", "Ok"); + Application.RequestStop (); + } else { + MessageBox.ErrorQuery ("Logging In", "Incorrect username or password", "Ok"); + } + }; + + // Add the views to the Window + Add (usernameLabel, usernameText, passwordLabel, passwordText, btnLogin); + } +} \ No newline at end of file diff --git a/Terminal.Gui/Core/Application.cs b/Terminal.Gui/Core/Application.cs index 1b6cb2489..65c1c6778 100644 --- a/Terminal.Gui/Core/Application.cs +++ b/Terminal.Gui/Core/Application.cs @@ -309,6 +309,9 @@ namespace Terminal.Gui { /// public static bool UseSystemConsole; + // For Unit testing - ignores UseSystemConsole + internal static bool ForceFakeConsole; + /// /// Initializes a new instance of Application. /// @@ -385,7 +388,11 @@ namespace Terminal.Gui { if (Driver == null) { var p = Environment.OSVersion.Platform; - if (UseSystemConsole) { + if (ForceFakeConsole) { + // For Unit Testing only + Driver = new FakeDriver (); + mainLoopDriver = new FakeMainLoop (() => FakeConsole.ReadKey (true)); + } else if (UseSystemConsole) { Driver = new NetDriver (); mainLoopDriver = new NetMainLoop (Driver); } else if (p == PlatformID.Win32NT || p == PlatformID.Win32S || p == PlatformID.Win32Windows) { @@ -1262,7 +1269,7 @@ namespace Terminal.Gui { /// Runs the application by calling /// with a new instance of the specified -derived class. /// - /// Calling first is not needed as this function will initialze the + /// Calling first is not needed as this function will initialze the application. /// /// /// must be called when the application is closing (typically after Run> has @@ -1298,12 +1305,7 @@ namespace Terminal.Gui { } } else { // Init() has NOT been called. - if (driver != null) { - // Caller has provided a driver so call Init with it (but set calledViaRunT to true so we don't reset Application state). - InternalInit (() => new T (), driver, mainLoopDriver, calledViaRunT: true); - } else { - throw new ArgumentException ("A Driver must be specified when calling Run() when Init() has not been called."); - } + InternalInit (() => new T (), driver, mainLoopDriver, calledViaRunT: true); Run (Top, errorHandler); } } diff --git a/UnitTests/ApplicationTests.cs b/UnitTests/ApplicationTests.cs index 911154a66..5d2551fc2 100644 --- a/UnitTests/ApplicationTests.cs +++ b/UnitTests/ApplicationTests.cs @@ -287,21 +287,17 @@ namespace Terminal.Gui.Core { [Fact] public void Run_T_After_InitNullDriver_with_TestTopLevel_Throws () { - var p = Environment.OSVersion.Platform; - if (p == PlatformID.Win32NT || p == PlatformID.Win32S || p == PlatformID.Win32Windows) { - Assert.Throws (() => Application.Init (null, null)); - } else { - Application.Init (null, null); - Assert.Equal (typeof (CursesDriver), Application.Driver.GetType ()); - Application.Shutdown (); - } + Application.ForceFakeConsole = true; + + Application.Init (null, null); + Assert.Equal (typeof (FakeDriver), Application.Driver.GetType ()); Application.Iteration = () => { Application.RequestStop (); }; // Init has been called without selecting a driver and we're passing no driver to Run. Bad - Assert.Throws (() => Application.Run ()); + Application.Run (); Shutdown (); @@ -332,14 +328,16 @@ namespace Terminal.Gui.Core { } [Fact] - public void Run_T_NoInit_Throws () + public void Run_T_NoInit_DoesNotThrow () { + Application.ForceFakeConsole = true; + Application.Iteration = () => { Application.RequestStop (); }; - // Init has NOT been called and we're passing no driver to Run. This is an error. - Assert.Throws (() => Application.Run (errorHandler: null, driver: null, mainLoopDriver: null)); + Application.Run (); + Assert.Equal (typeof (FakeDriver), Application.Driver.GetType ()); Shutdown ();