using XFEEDToolBox.Core.Navigation; using XFEExtension.NetCore.XUnit.Attributes; namespace XFEEDToolBox.Test; [TestFixture] public sealed class ManualTakeoverKeyboardPolicyTests { private const uint W=0x57,S=0x53,X=0x58; [Test]public void WRequiresStrictlyMoreThanOneContinuousSecond() { var policy=new ManualTakeoverKeyboardPolicy();policy.Key(W,true,100,true); Check.Equal("",policy.Evaluate(1099,true));Check.Equal("",policy.Evaluate(1100,true)); Check.Equal("physical-key-W-held",policy.Evaluate(1101,true)); } [Test]public void SRequiresStrictlyMoreThanOneContinuousSecond() { var policy=new ManualTakeoverKeyboardPolicy();policy.Key(S,true,300,true); Check.Equal("",policy.Evaluate(1299,true));Check.Equal("",policy.Evaluate(1300,true)); Check.Equal("physical-key-S-held",policy.Evaluate(1301,true)); } [Test]public void XTapRemainsRequestedAfterKeyUpUntilTheScopeIsReset() { var policy=new ManualTakeoverKeyboardPolicy();policy.Key(X,true,100,true);policy.Key(X,false,101,true); Check.Equal("physical-key-X",policy.Evaluate(101,true));Check.Equal("physical-key-X",policy.Evaluate(10000,true)); policy.Key(0x41,true,10001,true);Check.Equal("physical-key-X",policy.Evaluate(10002,true)); } [Test]public void ShortWAndSHoldsDoNotAccumulateAcrossPresses() { foreach(var key in new[]{W,S}) { var policy=new ManualTakeoverKeyboardPolicy(); policy.Key(key,true,100,true);policy.Key(key,false,1099,true);Check.Equal("",policy.Evaluate(5000,true)); policy.Key(key,true,6000,true);Check.Equal("",policy.Evaluate(7000,true)); policy.Key(key,false,7000,true);Check.Equal("",policy.Evaluate(9000,true)); } } [Test]public void SwitchingWToSStartsAnIndependentHold() { var policy=new ManualTakeoverKeyboardPolicy();policy.Key(W,true,100,true);policy.Key(W,false,900,true);policy.Key(S,true,900,true); Check.Equal("",policy.Evaluate(1101,true));Check.Equal("",policy.Evaluate(1900,true)); Check.Equal("physical-key-S-held",policy.Evaluate(1901,true)); } [Test]public void KeyRepeatDoesNotRestartThePhysicalHoldClock() { foreach(var key in new[]{W,S}) { var policy=new ManualTakeoverKeyboardPolicy();policy.Key(key,true,100,true); foreach(var at in new ulong[]{400,800,1000,1100})policy.Key(key,true,at,true); Check.Equal("",policy.Evaluate(1100,true));Check.Equal(key==W?"physical-key-W-held":"physical-key-S-held",policy.Evaluate(1101,true)); } } [Test]public void OtherKeysAndMouseVirtualKeysNeverRequestTakeover() { var policy=new ManualTakeoverKeyboardPolicy(); foreach(var key in new uint[]{0x41,0x44,0x51,0x45,0x20,0x1B,0x01,0x02,0x04,0x05,0x06}) {policy.Key(key,true,100,true);Check.Equal("",policy.Evaluate(5000,true));policy.Key(key,false,5001,true);} Check.Equal("",policy.Evaluate(10000,true)); } [Test]public void LosingFocusDuringEvaluationClearsHoldsAndLatchedX() { foreach(var key in new[]{W,S,X}) { var policy=new ManualTakeoverKeyboardPolicy();policy.Key(key,true,100,true); Check.Equal("",policy.Evaluate(200,false));Check.Equal("",policy.Evaluate(10000,true)); } } [Test]public void AnEventOutsideTheGameAlsoResetsThePreviousScopeState() { var policy=new ManualTakeoverKeyboardPolicy();policy.Key(X,true,100,true);policy.Key(X,false,110,true); policy.Key(0x41,true,200,false);Check.Equal("",policy.Evaluate(300,true)); policy.Key(W,true,400,true);policy.Key(0x41,true,900,false);Check.Equal("",policy.Evaluate(5000,true)); } [Test]public void InjectedWSTapsOrHoldsAndXCannotTriggerThePolicy() { foreach(var key in new[]{W,S,X}) { var policy=new ManualTakeoverKeyboardPolicy();policy.Key(key,true,100,true,injected:true); Check.Equal("",policy.Evaluate(5000,true));policy.Key(key,false,5001,true,injected:true); Check.Equal("",policy.Evaluate(10000,true)); } } [Test]public void InjectedEventsCannotEraseOrRestartARealPhysicalHold() { var policy=new ManualTakeoverKeyboardPolicy();policy.Key(W,true,100,true); policy.Key(W,false,300,true,injected:true);policy.Key(W,true,900,true,injected:true); Check.Equal("",policy.Evaluate(1100,true));Check.Equal("physical-key-W-held",policy.Evaluate(1101,true)); } [Test]public void ResetClearsOldXAndHeldKeysBeforeANewControlScope() { var policy=new ManualTakeoverKeyboardPolicy();policy.Key(W,true,100,true);policy.Key(S,true,100,true); policy.Key(X,true,200,true);policy.Key(X,false,201,true);policy.Reset(); Check.Equal("",policy.Evaluate(10000,true)); policy.Key(S,true,11000,true);Check.Equal("",policy.Evaluate(12000,true));Check.Equal("physical-key-S-held",policy.Evaluate(12001,true)); } [Test]public void XKeyUpWithoutAnObservedPhysicalPressDoesNotCreateAnIntent() { var policy=new ManualTakeoverKeyboardPolicy();policy.Key(X,false,100,true);Check.Equal("",policy.Evaluate(10000,true)); } [Test]public void AClockBeforeThePressDoesNotUnderflowIntoTakeover() { var policy=new ManualTakeoverKeyboardPolicy();policy.Key(W,true,1000,true); Check.Equal("",policy.Evaluate(999,true));Check.Equal("",policy.Evaluate(2000,true)); Check.Equal("physical-key-W-held",policy.Evaluate(2001,true)); } }