public void CalculateTurningPointsTest()
 {
     //y = x*x + 2x -1
     //y' = 2x +2
     //Stationary point at x = - 1
     List<DPoint> points = new List<DPoint>();
     for (int i = -100; i < 101; i++)
     {
         double x = (double)i;
         double y = x * x + 2 * x - 1;
         points.Add(new DPoint(x, y));
     }
     StationaryPoints target = new StationaryPoints(points.ToArray());
     TurningPoint[] actual;
     actual = target.CalculateTurningPoints();
     Assert.AreEqual(1, actual.Length);
     Assert.IsFalse(actual[0].IsPeak);
     Assert.AreEqual(-1d, actual[0].Point.X);
     //Y = -2 at x = -1. Note turning point y value is NOT the differential
     Assert.AreEqual(-2d, actual[0].Point.Y);
     Assert.AreEqual(99, actual[0].Index);
 }
 public void CalculateTurningPointsTest2()
 {
     //y = x*x*x - x*x - x +1
     //y' = 3x*x -2x -1 = (3x+1)(x-1)
     //Stationary points solutions x = -1/3 (peak) , +1 (trough)
     List<DPoint> points = new List<DPoint>();
     for (double x = -10; x < 10; x=x+0.01)
     {
         double y = x * x * x - x * x - x + 1;
         points.Add(new DPoint(x, y));
     }
     Differentiator differentiator = new Differentiator(points);
     differentiator.SampleSize = 9;
     DPoint[] diffPoints = differentiator.Differentiate();
     StationaryPoints target = new StationaryPoints(points.ToArray(), diffPoints);
     target.Threshold = 0;
     TurningPoint[] actual;
     actual = target.CalculateTurningPoints();
     Assert.AreEqual(2, actual.Length);
     Assert.IsTrue(actual[0].IsPeak);
     Assert.AreEqual("-0.33", actual[0].Point.X.ToString("0.00"));
     Assert.IsFalse(actual[1].IsPeak);
     Assert.AreEqual("1.00", actual[1].Point.X.ToString("0.00"));
 }