Fixes #3692++ - Rearchitects drivers (#3837)

This commit is contained in:
Thomas Nind
2025-02-28 19:09:29 +00:00
committed by GitHub
parent 3a240ecbe5
commit c88c772462
101 changed files with 7662 additions and 658 deletions

View File

@@ -58,47 +58,47 @@ public class MainLoopTests
ml.AddIdle (fnTrue);
ml.AddIdle (fnFalse);
Assert.Equal (2, ml.IdleHandlers.Count);
Assert.Equal (fnTrue, ml.IdleHandlers [0]);
Assert.NotEqual (fnFalse, ml.IdleHandlers [0]);
Assert.Equal (2, ml.TimedEvents.IdleHandlers.Count);
Assert.Equal (fnTrue, ml.TimedEvents.IdleHandlers [0]);
Assert.NotEqual (fnFalse, ml.TimedEvents.IdleHandlers[0]);
Assert.True (ml.RemoveIdle (fnTrue));
Assert.Single (ml.IdleHandlers);
Assert.True (ml.TimedEvents.RemoveIdle (fnTrue));
Assert.Single (ml.TimedEvents.IdleHandlers);
// BUGBUG: This doesn't throw or indicate an error. Ideally RemoveIdle would either
// throw an exception in this case, or return an error.
// No. Only need to return a boolean.
Assert.False (ml.RemoveIdle (fnTrue));
Assert.False (ml.TimedEvents.RemoveIdle (fnTrue));
Assert.True (ml.RemoveIdle (fnFalse));
Assert.True (ml.TimedEvents.RemoveIdle (fnFalse));
// BUGBUG: This doesn't throw an exception or indicate an error. Ideally RemoveIdle would either
// throw an exception in this case, or return an error.
// No. Only need to return a boolean.
Assert.False (ml.RemoveIdle (fnFalse));
Assert.False (ml.TimedEvents.RemoveIdle (fnFalse));
// Add again, but with dupe
ml.AddIdle (fnTrue);
ml.AddIdle (fnTrue);
Assert.Equal (2, ml.IdleHandlers.Count);
Assert.Equal (fnTrue, ml.IdleHandlers [0]);
Assert.True (ml.IdleHandlers [0] ());
Assert.Equal (fnTrue, ml.IdleHandlers [1]);
Assert.True (ml.IdleHandlers [1] ());
Assert.Equal (2, ml.TimedEvents.IdleHandlers.Count);
Assert.Equal (fnTrue, ml.TimedEvents.IdleHandlers[0]);
Assert.True (ml.TimedEvents.IdleHandlers[0] ());
Assert.Equal (fnTrue, ml.TimedEvents.IdleHandlers[1]);
Assert.True (ml.TimedEvents.IdleHandlers[1] ());
Assert.True (ml.RemoveIdle (fnTrue));
Assert.Single (ml.IdleHandlers);
Assert.Equal (fnTrue, ml.IdleHandlers [0]);
Assert.NotEqual (fnFalse, ml.IdleHandlers [0]);
Assert.True (ml.TimedEvents.RemoveIdle (fnTrue));
Assert.Single (ml.TimedEvents.IdleHandlers);
Assert.Equal (fnTrue, ml.TimedEvents.IdleHandlers[0]);
Assert.NotEqual (fnFalse, ml.TimedEvents.IdleHandlers[0]);
Assert.True (ml.RemoveIdle (fnTrue));
Assert.Empty (ml.IdleHandlers);
Assert.True (ml.TimedEvents.RemoveIdle (fnTrue));
Assert.Empty (ml.TimedEvents.IdleHandlers);
// BUGBUG: This doesn't throw an exception or indicate an error. Ideally RemoveIdle would either
// throw an exception in this case, or return an error.
// No. Only need to return a boolean.
Assert.False (ml.RemoveIdle (fnTrue));
Assert.False (ml.TimedEvents.RemoveIdle (fnTrue));
}
[Fact]
@@ -153,9 +153,9 @@ public class MainLoopTests
ml.AddIdle (fn1);
ml.AddIdle (fn1);
ml.Run ();
Assert.True (ml.RemoveIdle (fnStop));
Assert.False (ml.RemoveIdle (fn1));
Assert.False (ml.RemoveIdle (fn1));
Assert.True (ml.TimedEvents.RemoveIdle (fnStop));
Assert.False (ml.TimedEvents.RemoveIdle (fn1));
Assert.False (ml.TimedEvents.RemoveIdle (fn1));
Assert.Equal (2, functionCalled);
}
@@ -178,20 +178,20 @@ public class MainLoopTests
ml.AddIdle (fn);
ml.RunIteration ();
Assert.Equal (2, functionCalled);
Assert.Equal (2, ml.IdleHandlers.Count);
Assert.Equal (2, ml.TimedEvents.IdleHandlers.Count);
functionCalled = 0;
Assert.True (ml.RemoveIdle (fn));
Assert.Single (ml.IdleHandlers);
Assert.True (ml.TimedEvents.RemoveIdle (fn));
Assert.Single (ml.TimedEvents.IdleHandlers);
ml.RunIteration ();
Assert.Equal (1, functionCalled);
functionCalled = 0;
Assert.True (ml.RemoveIdle (fn));
Assert.Empty (ml.IdleHandlers);
Assert.True (ml.TimedEvents.RemoveIdle (fn));
Assert.Empty (ml.TimedEvents.IdleHandlers);
ml.RunIteration ();
Assert.Equal (0, functionCalled);
Assert.False (ml.RemoveIdle (fn));
Assert.False (ml.TimedEvents.RemoveIdle (fn));
}
[Fact]
@@ -209,7 +209,7 @@ public class MainLoopTests
};
ml.AddIdle (fn);
Assert.True (ml.RemoveIdle (fn));
Assert.True (ml.TimedEvents.RemoveIdle (fn));
ml.RunIteration ();
Assert.Equal (0, functionCalled);
}
@@ -230,13 +230,13 @@ public class MainLoopTests
return true;
};
object token = ml.AddTimeout (TimeSpan.FromMilliseconds (ms), callback);
object token = ml.TimedEvents.AddTimeout (TimeSpan.FromMilliseconds (ms), callback);
Assert.True (ml.RemoveTimeout (token));
Assert.True (ml.TimedEvents.RemoveTimeout (token));
// BUGBUG: This should probably fault?
// Must return a boolean.
Assert.False (ml.RemoveTimeout (token));
Assert.False (ml.TimedEvents.RemoveTimeout (token));
}
[Fact]
@@ -260,8 +260,8 @@ public class MainLoopTests
return true;
};
var task1 = new Task (() => token1 = ml.AddTimeout (TimeSpan.FromMilliseconds (ms), callback));
var task2 = new Task (() => token2 = ml.AddTimeout (TimeSpan.FromMilliseconds (ms), callback));
var task1 = new Task (() => token1 = ml.TimedEvents.AddTimeout (TimeSpan.FromMilliseconds (ms), callback));
var task2 = new Task (() => token2 = ml.TimedEvents.AddTimeout (TimeSpan.FromMilliseconds (ms), callback));
Assert.Null (token1);
Assert.Null (token2);
task1.Start ();
@@ -270,8 +270,8 @@ public class MainLoopTests
Assert.NotNull (token1);
Assert.NotNull (token2);
await Task.WhenAll (task1, task2);
Assert.True (ml.RemoveTimeout (token1));
Assert.True (ml.RemoveTimeout (token2));
Assert.True (ml.TimedEvents.RemoveTimeout (token1));
Assert.True (ml.TimedEvents.RemoveTimeout (token2));
Assert.Equal (2, callbackCount);
}
@@ -297,15 +297,15 @@ public class MainLoopTests
object sender = null;
TimeoutEventArgs args = null;
ml.TimeoutAdded += (s, e) =>
ml.TimedEvents.TimeoutAdded += (s, e) =>
{
sender = s;
args = e;
};
object token = ml.AddTimeout (TimeSpan.FromMilliseconds (ms), callback);
object token = ml.TimedEvents.AddTimeout (TimeSpan.FromMilliseconds (ms), callback);
Assert.Same (ml, sender);
Assert.Same (ml.TimedEvents, sender);
Assert.NotNull (args.Timeout);
Assert.True (args.Ticks - originTicks >= 100 * TimeSpan.TicksPerMillisecond);
}
@@ -332,14 +332,14 @@ public class MainLoopTests
};
Parallel.Invoke (
() => token1 = ml.AddTimeout (TimeSpan.FromMilliseconds (ms), callback),
() => token2 = ml.AddTimeout (TimeSpan.FromMilliseconds (ms), callback)
() => token1 = ml.TimedEvents.AddTimeout (TimeSpan.FromMilliseconds (ms), callback),
() => token2 = ml.TimedEvents.AddTimeout (TimeSpan.FromMilliseconds (ms), callback)
);
ml.Run ();
Assert.NotNull (token1);
Assert.NotNull (token2);
Assert.True (ml.RemoveTimeout (token1));
Assert.True (ml.RemoveTimeout (token2));
Assert.True (ml.TimedEvents.RemoveTimeout (token1));
Assert.True (ml.TimedEvents.RemoveTimeout (token2));
Assert.Equal (2, callbackCount);
}
@@ -375,8 +375,8 @@ public class MainLoopTests
return true;
};
object token = ml.AddTimeout (ms, callback);
Assert.True (ml.RemoveTimeout (token));
object token = ml.TimedEvents.AddTimeout (ms, callback);
Assert.True (ml.TimedEvents.RemoveTimeout (token));
ml.Run ();
Assert.Equal (0, callbackCount);
}
@@ -413,11 +413,11 @@ public class MainLoopTests
return false;
};
object token = ml.AddTimeout (ms, callback);
object token = ml.TimedEvents.AddTimeout (ms, callback);
ml.Run ();
Assert.Equal (1, callbackCount);
Assert.Equal (10, stopCount);
Assert.False (ml.RemoveTimeout (token));
Assert.False (ml.TimedEvents.RemoveTimeout (token));
}
[Fact]
@@ -436,9 +436,9 @@ public class MainLoopTests
return true;
};
object token = ml.AddTimeout (TimeSpan.FromMilliseconds (ms), callback);
object token = ml.TimedEvents.AddTimeout (TimeSpan.FromMilliseconds (ms), callback);
ml.Run ();
Assert.True (ml.RemoveTimeout (token));
Assert.True (ml.TimedEvents.RemoveTimeout (token));
Assert.Equal (1, callbackCount);
}
@@ -461,7 +461,7 @@ public class MainLoopTests
return true;
};
object token = ml.AddTimeout (ms, callback);
object token = ml.TimedEvents.AddTimeout (ms, callback);
watch.Start ();
ml.Run ();
@@ -469,7 +469,7 @@ public class MainLoopTests
// https://github.com/xunit/assert.xunit/pull/25
Assert.Equal (ms * callbackCount, watch.Elapsed, new MillisecondTolerance (100));
Assert.True (ml.RemoveTimeout (token));
Assert.True (ml.TimedEvents.RemoveTimeout (token));
Assert.Equal (1, callbackCount);
}
@@ -495,7 +495,7 @@ public class MainLoopTests
return true;
};
object token = ml.AddTimeout (ms, callback);
object token = ml.TimedEvents.AddTimeout (ms, callback);
watch.Start ();
ml.Run ();
@@ -503,7 +503,7 @@ public class MainLoopTests
// https://github.com/xunit/assert.xunit/pull/25
Assert.Equal (ms * callbackCount, watch.Elapsed, new MillisecondTolerance (100));
Assert.True (ml.RemoveTimeout (token));
Assert.True (ml.TimedEvents.RemoveTimeout (token));
Assert.Equal (2, callbackCount);
}
@@ -511,7 +511,7 @@ public class MainLoopTests
public void CheckTimersAndIdleHandlers_NoTimers_Returns_False ()
{
var ml = new MainLoop (new FakeMainLoop ());
bool retVal = ml.CheckTimersAndIdleHandlers (out int waitTimeOut);
bool retVal = ml.TimedEvents.CheckTimersAndIdleHandlers (out int waitTimeOut);
Assert.False (retVal);
Assert.Equal (-1, waitTimeOut);
}
@@ -523,7 +523,7 @@ public class MainLoopTests
Func<bool> fnTrue = () => true;
ml.AddIdle (fnTrue);
bool retVal = ml.CheckTimersAndIdleHandlers (out int waitTimeOut);
bool retVal = ml.TimedEvents.CheckTimersAndIdleHandlers (out int waitTimeOut);
Assert.True (retVal);
Assert.Equal (-1, waitTimeOut);
}
@@ -536,8 +536,8 @@ public class MainLoopTests
static bool Callback () { return false; }
_ = ml.AddTimeout (ms, Callback);
bool retVal = ml.CheckTimersAndIdleHandlers (out int waitTimeOut);
_ = ml.TimedEvents.AddTimeout (ms, Callback);
bool retVal = ml.TimedEvents.CheckTimersAndIdleHandlers (out int waitTimeOut);
Assert.True (retVal);
@@ -553,9 +553,9 @@ public class MainLoopTests
static bool Callback () { return false; }
_ = ml.AddTimeout (ms, Callback);
_ = ml.AddTimeout (ms, Callback);
bool retVal = ml.CheckTimersAndIdleHandlers (out int waitTimeOut);
_ = ml.TimedEvents.AddTimeout (ms, Callback);
_ = ml.TimedEvents.AddTimeout (ms, Callback);
bool retVal = ml.TimedEvents.CheckTimersAndIdleHandlers (out int waitTimeOut);
Assert.True (retVal);
@@ -600,8 +600,8 @@ public class MainLoopTests
ml.AddIdle (fnStop);
ml.AddIdle (fn1);
ml.Run ();
Assert.True (ml.RemoveIdle (fnStop));
Assert.False (ml.RemoveIdle (fn1));
Assert.True (ml.TimedEvents.RemoveIdle (fnStop));
Assert.False (ml.TimedEvents.RemoveIdle (fn1));
Assert.Equal (10, functionCalled);
Assert.Equal (20, stopCount);
@@ -612,8 +612,8 @@ public class MainLoopTests
{
var testMainloop = new TestMainloop ();
var mainloop = new MainLoop (testMainloop);
Assert.Empty (mainloop._timeouts);
Assert.Empty (mainloop._idleHandlers);
Assert.Empty (mainloop.TimedEvents.Timeouts);
Assert.Empty (mainloop.TimedEvents.IdleHandlers);
Assert.NotNull (
new Timeout { Span = new TimeSpan (), Callback = () => true }
@@ -748,7 +748,7 @@ public class MainLoopTests
return true;
};
Assert.False (ml.RemoveIdle (fn));
Assert.False (ml.TimedEvents.RemoveIdle (fn));
ml.RunIteration ();
Assert.Equal (0, functionCalled);
}
@@ -774,7 +774,7 @@ public class MainLoopTests
ml.AddIdle (fn);
ml.Run ();
Assert.True (ml.RemoveIdle (fn));
Assert.True (ml.TimedEvents.RemoveIdle (fn));
Assert.Equal (10, functionCalled);
}