123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- using Xunit.Abstractions;
- // Alias Console to MockConsole so we don't accidentally use Console
- namespace Terminal.Gui.DriverTests;
- public class MainLoopDriverTests
- {
- public MainLoopDriverTests (ITestOutputHelper output) { ConsoleDriver.RunningUnitTests = true; }
- [Theory]
- [InlineData (typeof (FakeDriver), typeof (FakeMainLoop))]
- [InlineData (typeof (NetDriver), typeof (NetMainLoop))]
- [InlineData (typeof (CursesDriver), typeof (UnixMainLoop))]
- [InlineData (typeof (WindowsDriver), typeof (WindowsMainLoop))]
- //[InlineData (typeof (ANSIDriver), typeof (AnsiMainLoopDriver))]
- public void MainLoop_AddIdle_ValidIdleHandler_ReturnsToken (Type driverType, Type mainLoopDriverType)
- {
- var driver = (IConsoleDriver)Activator.CreateInstance (driverType);
- var mainLoopDriver = (IMainLoopDriver)Activator.CreateInstance (mainLoopDriverType, driver);
- var mainLoop = new MainLoop (mainLoopDriver);
- var idleHandlerInvoked = false;
- bool IdleHandler ()
- {
- idleHandlerInvoked = true;
- return false;
- }
- Func<bool> token = mainLoop.AddIdle (IdleHandler);
- Assert.NotNull (token);
- Assert.False (idleHandlerInvoked); // Idle handler should not be invoked immediately
- mainLoop.RunIteration (); // Run an iteration to process the idle handler
- Assert.True (idleHandlerInvoked); // Idle handler should be invoked after processing
- mainLoop.Dispose ();
- }
- [Theory]
- [InlineData (typeof (FakeDriver), typeof (FakeMainLoop))]
- [InlineData (typeof (NetDriver), typeof (NetMainLoop))]
- [InlineData (typeof (CursesDriver), typeof (UnixMainLoop))]
- [InlineData (typeof (WindowsDriver), typeof (WindowsMainLoop))]
- //[InlineData (typeof (ANSIDriver), typeof (AnsiMainLoopDriver))]
- public void MainLoop_AddTimeout_ValidParameters_ReturnsToken (Type driverType, Type mainLoopDriverType)
- {
- var driver = (IConsoleDriver)Activator.CreateInstance (driverType);
- var mainLoopDriver = (IMainLoopDriver)Activator.CreateInstance (mainLoopDriverType, driver);
- var mainLoop = new MainLoop (mainLoopDriver);
- var callbackInvoked = false;
- object token = mainLoop.TimedEvents.AddTimeout (
- TimeSpan.FromMilliseconds (100),
- () =>
- {
- callbackInvoked = true;
- return false;
- }
- );
- Assert.NotNull (token);
- mainLoop.RunIteration (); // Run an iteration to process the timeout
- Assert.False (callbackInvoked); // Callback should not be invoked immediately
- Thread.Sleep (200); // Wait for the timeout
- mainLoop.RunIteration (); // Run an iteration to process the timeout
- Assert.True (callbackInvoked); // Callback should be invoked after the timeout
- mainLoop.Dispose ();
- }
- [Theory]
- [InlineData (typeof (FakeDriver), typeof (FakeMainLoop))]
- [InlineData (typeof (NetDriver), typeof (NetMainLoop))]
- [InlineData (typeof (CursesDriver), typeof (UnixMainLoop))]
- [InlineData (typeof (WindowsDriver), typeof (WindowsMainLoop))]
- //[InlineData (typeof (ANSIDriver), typeof (AnsiMainLoopDriver))]
- public void MainLoop_CheckTimersAndIdleHandlers_IdleHandlersActive_ReturnsTrue (
- Type driverType,
- Type mainLoopDriverType
- )
- {
- var driver = (IConsoleDriver)Activator.CreateInstance (driverType);
- var mainLoopDriver = (IMainLoopDriver)Activator.CreateInstance (mainLoopDriverType, driver);
- var mainLoop = new MainLoop (mainLoopDriver);
- mainLoop.AddIdle (() => false);
- bool result = mainLoop.TimedEvents.CheckTimersAndIdleHandlers (out int waitTimeout);
- Assert.True (result);
- Assert.Equal (-1, waitTimeout);
- mainLoop.Dispose ();
- }
- [Theory]
- [InlineData (typeof (FakeDriver), typeof (FakeMainLoop))]
- [InlineData (typeof (NetDriver), typeof (NetMainLoop))]
- [InlineData (typeof (CursesDriver), typeof (UnixMainLoop))]
- [InlineData (typeof (WindowsDriver), typeof (WindowsMainLoop))]
- //[InlineData (typeof (ANSIDriver), typeof (AnsiMainLoopDriver))]
- public void MainLoop_CheckTimersAndIdleHandlers_NoTimersOrIdleHandlers_ReturnsFalse (
- Type driverType,
- Type mainLoopDriverType
- )
- {
- var driver = (IConsoleDriver)Activator.CreateInstance (driverType);
- var mainLoopDriver = (IMainLoopDriver)Activator.CreateInstance (mainLoopDriverType, driver);
- var mainLoop = new MainLoop (mainLoopDriver);
- bool result = mainLoop.TimedEvents.CheckTimersAndIdleHandlers (out int waitTimeout);
- Assert.False (result);
- Assert.Equal (-1, waitTimeout);
- mainLoop.Dispose ();
- }
- [Theory]
- [InlineData (typeof (FakeDriver), typeof (FakeMainLoop))]
- [InlineData (typeof (NetDriver), typeof (NetMainLoop))]
- [InlineData (typeof (CursesDriver), typeof (UnixMainLoop))]
- [InlineData (typeof (WindowsDriver), typeof (WindowsMainLoop))]
- //[InlineData (typeof (ANSIDriver), typeof (AnsiMainLoopDriver))]
- public void MainLoop_CheckTimersAndIdleHandlers_TimersActive_ReturnsTrue (
- Type driverType,
- Type mainLoopDriverType
- )
- {
- var driver = (IConsoleDriver)Activator.CreateInstance (driverType);
- var mainLoopDriver = (IMainLoopDriver)Activator.CreateInstance (mainLoopDriverType, driver);
- var mainLoop = new MainLoop (mainLoopDriver);
- mainLoop.TimedEvents.AddTimeout (TimeSpan.FromMilliseconds (100), () => false);
- bool result = mainLoop.TimedEvents.CheckTimersAndIdleHandlers (out int waitTimeout);
- Assert.True (result);
- Assert.True (waitTimeout >= 0);
- mainLoop.Dispose ();
- }
- [Theory]
- [InlineData (typeof (FakeDriver), typeof (FakeMainLoop))]
- [InlineData (typeof (NetDriver), typeof (NetMainLoop))]
- [InlineData (typeof (CursesDriver), typeof (UnixMainLoop))]
- [InlineData (typeof (WindowsDriver), typeof (WindowsMainLoop))]
- //[InlineData (typeof (ANSIDriver), typeof (AnsiMainLoopDriver))]
- public void MainLoop_Constructs_Disposes (Type driverType, Type mainLoopDriverType)
- {
- var driver = (IConsoleDriver)Activator.CreateInstance (driverType);
- var mainLoopDriver = (IMainLoopDriver)Activator.CreateInstance (mainLoopDriverType, driver);
- var mainLoop = new MainLoop (mainLoopDriver);
- // Check default values
- Assert.NotNull (mainLoop);
- Assert.Equal (mainLoopDriver, mainLoop.MainLoopDriver);
- Assert.Empty (mainLoop.TimedEvents.IdleHandlers);
- Assert.Empty (mainLoop.TimedEvents.Timeouts);
- Assert.False (mainLoop.Running);
- // Clean up
- mainLoop.Dispose ();
- // TODO: It'd be nice if we could really verify IMainLoopDriver.TearDown was called
- // and that it was actually cleaned up.
- Assert.Null (mainLoop.MainLoopDriver);
- Assert.Empty (mainLoop.TimedEvents.IdleHandlers);
- Assert.Empty (mainLoop.TimedEvents.Timeouts);
- Assert.False (mainLoop.Running);
- }
- [Theory]
- [InlineData (typeof (FakeDriver), typeof (FakeMainLoop))]
- [InlineData (typeof (NetDriver), typeof (NetMainLoop))]
- [InlineData (typeof (CursesDriver), typeof (UnixMainLoop))]
- [InlineData (typeof (WindowsDriver), typeof (WindowsMainLoop))]
- //[InlineData (typeof (ANSIDriver), typeof (AnsiMainLoopDriver))]
- public void MainLoop_RemoveIdle_InvalidToken_ReturnsFalse (Type driverType, Type mainLoopDriverType)
- {
- var driver = (IConsoleDriver)Activator.CreateInstance (driverType);
- var mainLoopDriver = (IMainLoopDriver)Activator.CreateInstance (mainLoopDriverType, driver);
- var mainLoop = new MainLoop (mainLoopDriver);
- bool result = mainLoop.TimedEvents.RemoveIdle (() => false);
- Assert.False (result);
- mainLoop.Dispose ();
- }
- [Theory]
- [InlineData (typeof (FakeDriver), typeof (FakeMainLoop))]
- [InlineData (typeof (NetDriver), typeof (NetMainLoop))]
- [InlineData (typeof (CursesDriver), typeof (UnixMainLoop))]
- [InlineData (typeof (WindowsDriver), typeof (WindowsMainLoop))]
- //[InlineData (typeof (ANSIDriver), typeof (AnsiMainLoopDriver))]
- public void MainLoop_RemoveIdle_ValidToken_ReturnsTrue (Type driverType, Type mainLoopDriverType)
- {
- var driver = (IConsoleDriver)Activator.CreateInstance (driverType);
- var mainLoopDriver = (IMainLoopDriver)Activator.CreateInstance (mainLoopDriverType, driver);
- var mainLoop = new MainLoop (mainLoopDriver);
- bool IdleHandler () { return false; }
- Func<bool> token = mainLoop.AddIdle (IdleHandler);
- bool result = mainLoop.TimedEvents.RemoveIdle (token);
- Assert.True (result);
- mainLoop.Dispose ();
- }
- [Theory]
- [InlineData (typeof (FakeDriver), typeof (FakeMainLoop))]
- [InlineData (typeof (NetDriver), typeof (NetMainLoop))]
- [InlineData (typeof (CursesDriver), typeof (UnixMainLoop))]
- [InlineData (typeof (WindowsDriver), typeof (WindowsMainLoop))]
- //[InlineData (typeof (ANSIDriver), typeof (AnsiMainLoopDriver))]
- public void MainLoop_RemoveTimeout_InvalidToken_ReturnsFalse (Type driverType, Type mainLoopDriverType)
- {
- var driver = (IConsoleDriver)Activator.CreateInstance (driverType);
- var mainLoopDriver = (IMainLoopDriver)Activator.CreateInstance (mainLoopDriverType, driver);
- var mainLoop = new MainLoop (mainLoopDriver);
- bool result = mainLoop.TimedEvents.RemoveTimeout (new object ());
- Assert.False (result);
- }
- [Theory]
- [InlineData (typeof (FakeDriver), typeof (FakeMainLoop))]
- [InlineData (typeof (NetDriver), typeof (NetMainLoop))]
- [InlineData (typeof (CursesDriver), typeof (UnixMainLoop))]
- [InlineData (typeof (WindowsDriver), typeof (WindowsMainLoop))]
- //[InlineData (typeof (ANSIDriver), typeof (AnsiMainLoopDriver))]
- public void MainLoop_RemoveTimeout_ValidToken_ReturnsTrue (Type driverType, Type mainLoopDriverType)
- {
- var driver = (IConsoleDriver)Activator.CreateInstance (driverType);
- var mainLoopDriver = (IMainLoopDriver)Activator.CreateInstance (mainLoopDriverType, driver);
- var mainLoop = new MainLoop (mainLoopDriver);
- object token = mainLoop.TimedEvents.AddTimeout (TimeSpan.FromMilliseconds (100), () => false);
- bool result = mainLoop.TimedEvents.RemoveTimeout (token);
- Assert.True (result);
- mainLoop.Dispose ();
- }
- [Theory]
- [InlineData (typeof (FakeDriver), typeof (FakeMainLoop))]
- [InlineData (typeof (NetDriver), typeof (NetMainLoop))]
- [InlineData (typeof (CursesDriver), typeof (UnixMainLoop))]
- [InlineData (typeof (WindowsDriver), typeof (WindowsMainLoop))]
- //[InlineData (typeof (ANSIDriver), typeof (AnsiMainLoopDriver))]
- public void MainLoop_RunIteration_ValidIdleHandler_CallsIdleHandler (Type driverType, Type mainLoopDriverType)
- {
- var driver = (IConsoleDriver)Activator.CreateInstance (driverType);
- var mainLoopDriver = (IMainLoopDriver)Activator.CreateInstance (mainLoopDriverType, driver);
- var mainLoop = new MainLoop (mainLoopDriver);
- var idleHandlerInvoked = false;
- Func<bool> idleHandler = () =>
- {
- idleHandlerInvoked = true;
- return false;
- };
- mainLoop.AddIdle (idleHandler);
- mainLoop.RunIteration (); // Run an iteration to process the idle handler
- Assert.True (idleHandlerInvoked);
- mainLoop.Dispose ();
- }
- //[Theory]
- //[InlineData (typeof (FakeDriver), typeof (FakeMainLoop))]
- //[InlineData (typeof (NetDriver), typeof (NetMainLoop))]
- //[InlineData (typeof (CursesDriver), typeof (UnixMainLoop))]
- //[InlineData (typeof (WindowsDriver), typeof (WindowsMainLoop))]
- //public void MainLoop_Invoke_ValidAction_RunsAction (Type driverType, Type mainLoopDriverType)
- //{
- // var driver = (IConsoleDriver)Activator.CreateInstance (driverType);
- // var mainLoopDriver = (IMainLoopDriver)Activator.CreateInstance (mainLoopDriverType, new object [] { driver });
- // var mainLoop = new MainLoop (mainLoopDriver);
- // var actionInvoked = false;
- // mainLoop.Invoke (() => { actionInvoked = true; });
- // mainLoop.RunIteration (); // Run an iteration to process the action.
- // Assert.True (actionInvoked);
- // mainLoop.Dispose ();
- //}
- }
|