public IEnumerator PerFameTest() { var firstFrame = Time.frameCount; var countedFunc = new CountedFunc <int>(() => Time.frameCount); var perFrame = Per.Frame(countedFunc.Invoke); Assert.That(perFrame.Peek(), Is.EqualTo(default(int)), $"Before any retrievals of {nameof(perFrame.Value)}, the value should be default"); for (int f = 0; f < 10; f++) { // LogUtils.Log($"frame: {f}, {Time.frameCount}"); Assert.That(countedFunc, Has.Property(nameof(countedFunc.InvocationCount)).EqualTo(f)); Assert.That(perFrame, Has.Property(nameof(perFrame.Freshness)).EqualTo(Freshness.Stale)); Assert.That(perFrame, Has.Property(nameof(perFrame.RefreshCount)).EqualTo(f)); for (int intraframe = 0; intraframe < 10; intraframe++) { // LogUtils.Log($"{nameof(frame)}: {frame}.{intraframe}"); Assert.That(perFrame, Has.Property(nameof(perFrame.Value)).EqualTo(f + firstFrame)); Assert.That(perFrame, Has.Property(nameof(perFrame.RefreshCount)).EqualTo(f + 1)); Assert.That(perFrame, Has.Property(nameof(perFrame.Freshness)).EqualTo(Freshness.Fresh)); Assert.That(countedFunc, Has.Property(nameof(countedFunc.InvocationCount)).EqualTo(f + 1)); } yield return(null); } }
public void MultipleSecondsButOnlyOneInvocation() { var invoker = new CountedFunc <string>(() => "swag: " + DateTime.Now); var perSecond = new Refreshing <string, DateTime>( invoker.Invoke, () => DateTime.Now, (prev, cur) => cur - prev >= TimeSpan.FromSeconds(1) ); Assert.That(perSecond, Has.Property(nameof(perSecond.Freshness)).EqualTo(Freshness.Stale)); Assert.That(invoker, Has.Property(nameof(invoker.InvocationCount)).EqualTo(0)); }
public void ForcedRefreshTest() { var countedFunc = new CountedFunc <int>(() => Time.frameCount); var perFrame = Per.Frame(countedFunc.Invoke); for (int intraframe = 0; intraframe < 10; intraframe++) { Assert.That(countedFunc, Has.Property(nameof(countedFunc.InvocationCount)).EqualTo(intraframe)); Validations.ForcedRefresh(perFrame); Assert.That(countedFunc, Has.Property(nameof(countedFunc.InvocationCount)).EqualTo(intraframe + 1)); } }
public void PristineUntilFirstRetrieval() { const string str = "yolo"; var invoker = new CountedFunc <string>(() => str); var refreshing = new Refreshing <string, long>( invoker.Invoke, () => DateTime.Now.Ticks, (prev, cur) => cur - prev >= TimeSpan.TicksPerSecond ); Assert.That(invoker, Has.Property(nameof(invoker.InvocationCount)).EqualTo(0)); Assert.That(refreshing, Has.Property(nameof(refreshing.Freshness)).EqualTo(Freshness.Stale)); 10.Repeat( () => { Assert.That(refreshing.Value, Is.EqualTo(str)); Assert.That(invoker, Has.Property(nameof(invoker.InvocationCount)).EqualTo(1)); Assert.That(refreshing, Has.Property(nameof(refreshing.Freshness)).EqualTo(Freshness.Fresh)); } ); }
public void EverySecond() { var timeKeeper = new CountedFunc <DateTime>(() => DateTime.Now); var perSecond = new Refreshing <DateTime, DateTime>( () => timeKeeper.Invoke(), () => DateTime.Now, (prev, current) => current >= (prev + TimeSpan.FromSeconds(1)) ); Assert.That(timeKeeper.InvocationCount, Is.EqualTo(0)); Assert.That(perSecond.Freshness, Is.EqualTo(Freshness.Stale)); Console.WriteLine(perSecond.Value); Assert.That(perSecond.Freshness, Is.EqualTo(Freshness.Fresh)); Assert.That(timeKeeper.InvocationCount, Is.EqualTo(1)); int hertz = 10; int seconds = 5; for (int s = 0; s < seconds; s++) { for (int i = 0; i < hertz; i++) { Thread.Sleep(TimeSpan.FromSeconds(1f / hertz)); var v = perSecond.Value; v = perSecond.Value; v = perSecond.Value; v = perSecond.Value; v = perSecond.Value; Assert.That(perSecond.Freshness, Is.EqualTo(Freshness.Fresh)); } Console.WriteLine(perSecond.Value); Assert.That(timeKeeper.InvocationCount, Is.EqualTo(s + 2)); } }