public MainWindow()
        {
            DataContext = this;

            Graph = new PlotModel();
            chart = new ChartAdapter(Graph);
            chart.SetLinearScale(AxisProperty.Both);

            loader = new SchemeLoader();
            loader.Import(@"Scheme.rkt");

            var evaluator = new ProxySchemeEvaluator();
            var schemeCalculator = new SchemeCalculator(evaluator);
            transformer = new LineSeriesTransformer((IFunctionPlotter)schemeCalculator,(ICalculate)schemeCalculator);

            modelCollection = new ObservableLineSeriesModelCollection();
            modelCollection.CollectionChanged += ModelChanged;

            ModelViewCollection = new ObservableLineSeriesViewModelCollection();
            ModelViewCollection.AddModel(new LineSeriesViewModel
                                      {
                                          Function = "(lambda (x) x)",
                                          Name = "Example 1",
                                      });
            InitializeComponent();
        }
        public void IntegrateWith0RectsFrom1To5()
        {
            // Arrange
            var schemeCalc = new SchemeCalculator(evaluator) as ICalculate;
            double expected = 20.0;

            // Act
            schemeCalc.Integrate("(lambda (x) (* x x))", 1, 5, 0);
        }
        public void PlotDerivativeWithDx0()
        {
            // Arrange
            var plotter = new SchemeCalculator(evaluator);

            // Act
            var actual = plotter.PlotDerivative("(lambda (x) (* x x))", 0, 1, 3, 3);

            // Assert
            Assert.AreEqual(actual, null);
        }
        public void IntegrateWith5RectanglesAtSpecificPosition()
        {
            // Arrange
            var schemeCalc = new SchemeCalculator(evaluator) as ICalculate;
            double expected = 0.0;

            // Act
            var actual = schemeCalc.Integrate("(lambda (x) (* x x))",1,1,5);

            // Assert
            Assert.AreEqual(expected, actual);
        }
        public void IntegrateWith2RectsFrom1To5()
        {
            // Arrange
            var schemeCalc = new SchemeCalculator(evaluator) as ICalculate;
            double expected = 20.0;

            // Act
            var actual = schemeCalc.Integrate("(lambda (x) (* x x))", 1, 5, 2);

            // Assert
            Assert.AreEqual(expected, actual);
        }
        public void PlotLinearFunctionFrom1To3()
        {
            // Arrange
            var plotter = new SchemeCalculator(evaluator);
            var expected = new List<KeyValuePair<double, double>>
            {
                new KeyValuePair<double, double>(1, 1),
                new KeyValuePair<double, double>(2, 2),
                new KeyValuePair<double, double>(3, 3),
            };

            // Act
            var actual = plotter.PlotFunction("(lambda (x) x)", 1, 3, 3);

            // Assert
            Assert.AreEqual(expected, actual);
        }
        public void PlotDerivative1To33Samples()
        {
            // Arrange
            double dx = 0.001;
            var plotter = new SchemeCalculator(evaluator);
            var expected = new List<KeyValuePair<double, double>>
            {
                new KeyValuePair<double, double>(1, 2),
                new KeyValuePair<double, double>(2, 4),
                new KeyValuePair<double, double>(3, 6),
            };

            // Act
            var actual = plotter.PlotDerivative("(lambda (x) (* x x))", dx, 1, 3, 3);

            // Assert
            for (int i = 0; i < 3; i++)
            {
                var expectedI = expected[i];
                var actualI = actual.ElementAt(i);
                Assert.That(actualI.Value, Is.EqualTo(expectedI.Value).Within(dx));
                Assert.AreEqual(expectedI.Key, actualI.Key);
            }
        }
        public void PlotLinearFunctionsFrom1To3InNegativeSamples()
        {
            // Arrange
            var plotter = new SchemeCalculator(evaluator);

            // Act
            var actual = plotter.PlotFunction("(lambda (x) x)", 1, 3, -1);

            // Assert
            Assert.AreEqual(actual, null);
        }