소스 검색

AddTimeout now uses sender/event args

tznind 2 년 전
부모
커밋
83ed8ec958
3개의 변경된 파일62개의 추가작업 그리고 2개의 파일을 삭제
  1. 31 0
      Terminal.Gui/Core/EventArgs/TimeoutEventArgs.cs
  2. 2 2
      Terminal.Gui/Core/MainLoop.cs
  3. 29 0
      UnitTests/Application/MainLoopTests.cs

+ 31 - 0
Terminal.Gui/Core/EventArgs/TimeoutEventArgs.cs

@@ -0,0 +1,31 @@
+using System;
+using Terminal.Gui;
+using static Terminal.Gui.MainLoop;
+
+/// <summary>
+/// <see cref="EventArgs"/> for timeout events (e.g. <see cref="MainLoop.TimeoutAdded"/>)
+/// </summary>
+public class TimeoutEventArgs : EventArgs {
+	/// <summary>
+	/// Gets the timeout callback handler
+	/// </summary>
+	public Timeout Timeout { get; }
+
+	/// <summary>
+	/// Gets the <see cref="DateTime.Ticks"/> in UTC time when the 
+	/// <see cref="Timeout"/> will next execute after.
+	/// </summary>
+	public long Ticks { get; }
+
+
+	/// <summary>
+	/// Creates a new instance of the <see cref="TimeoutEventArgs"/> class.
+	/// </summary>
+	/// <param name="timeout"></param>
+	/// <param name="ticks"></param>
+	public TimeoutEventArgs (Timeout timeout, long ticks)
+	{
+		this.Timeout = timeout;
+		this.Ticks = ticks;
+	}
+}

+ 2 - 2
Terminal.Gui/Core/MainLoop.cs

@@ -97,7 +97,7 @@ namespace Terminal.Gui {
 		/// Invoked when a new timeout is added. To be used in the case
 		/// when <see cref="Application.ExitRunLoopAfterFirstIteration"/> is <see langword="true"/>.
 		/// </summary>
-		public event Action<long> TimeoutAdded;
+		public event EventHandler<TimeoutEventArgs> TimeoutAdded;
 
 		/// <summary>
 		///  Creates a new Mainloop. 
@@ -161,7 +161,7 @@ namespace Terminal.Gui {
 			lock (timeoutsLockToken) {
 				var k = (DateTime.UtcNow + time).Ticks;
 				timeouts.Add (NudgeToUniqueKey (k), timeout);
-				TimeoutAdded?.Invoke (k);
+				TimeoutAdded?.Invoke (this, new TimeoutEventArgs(timeout, k));
 			}
 		}
 

+ 29 - 0
UnitTests/Application/MainLoopTests.cs

@@ -264,6 +264,35 @@ namespace Terminal.Gui.ApplicationTests {
 			Assert.False (ml.RemoveTimeout (token));
 		}
 
+		// Timeout Handler Tests
+		[Fact]
+		public void AddTimer_EventFired ()
+		{
+			var ml = new MainLoop (new FakeMainLoop ());
+			var ms = 100;
+			
+			var originTicks = DateTime.UtcNow.Ticks;
+
+			var callbackCount = 0;
+			Func<MainLoop, bool> callback = (loop) => {
+				callbackCount++;
+				return true;
+			};
+
+			object sender = null;
+			TimeoutEventArgs args = null;
+			ml.TimeoutAdded += (s, e) => {
+				sender = s;
+				args = e;
+			};
+
+			var token = ml.AddTimeout (TimeSpan.FromMilliseconds (ms), callback);
+
+			Assert.Same (ml,sender);
+			Assert.NotNull (args.Timeout);
+			Assert.True (args.Ticks - originTicks >= 100 * TimeSpan.TicksPerMillisecond);
+
+		}
 		[Fact]
 		public void AddTimer_Run_Called ()
 		{