public void TestTerminationWithAsyncTimeout() { var lin = new Linearization(); lin.Enable(); var log = new List <int>(); var task = Task.Run(() => { var first = lt.TryExecute(() => { log.Add(0); Assert.AreEqual(LifetimeStatus.Alive, lt.Status); Assert.True(lt.IsAlive); lin.Point(0); log.Add(1); SpinWaitEx.SpinUntil(() => def.Status == LifetimeStatus.Canceling); Assert.False(lt.IsAlive); }); //shouldn't execute var second = lt.TryExecute(() => { log.Add(2); }); Assert.True(first.Succeed); Assert.False(second.Succeed); }); def.Lifetime.OnTermination(() => { log.Add(-1); }); lin.Point(1); def.Terminate(); lin.Point(2); task.Wait(); Assert.AreEqual(new [] { 0, 1, -1 }, log.ToArray()); }
/// <summary> /// sdr linerization conversion formulas. /// </summary> /// <param name="linearType">linerization enum type</param> /// <param name="val">raw input value</param> /// <returns>converted value</returns> internal static Double Linearize(Linearization linearType, Double val) { Double value = val; switch (linearType) { case Linearization.Linear: value = val; break; case Linearization.Ln: // natural logarithm value = Math.Log(val); break; case Linearization.Log10: // logarithm with base 10 value = Math.Log10(val); break; case Linearization.Log2: // logarithm with base 2 value = Math.Log(val) / Math.Log(2); break; case Linearization.E: // exponential function value = Math.Exp(val); break; case Linearization.Exp10: // exponential function 10 value = Math.Pow(10.0, val); break; case Linearization.Exp2: // exponential function 2 value = Math.Pow(2.0, val); break; case Linearization.OneX: // reciprocal value = 1 / val; break; case Linearization.Sqr: // square value = Math.Pow(val, 2.0); break; case Linearization.Cube: // Cube value = Math.Pow(val, 3.0); break; case Linearization.Sqrt: // square root value = Math.Sqrt(val); break; case Linearization.OverCube: // cube-1 value = (1.0 / Math.Pow(val, 3.0)); break; default: break; } return(value); }