// check simple summation
        public void CheckSimpleSummation()
        {
            string s = "d3u(x-2*h) - du(x-h)";

            Assert.True(FiniteDifference.GetFiniteDifferenceByOrderAndMinH(3, -2) -
                        FiniteDifference.GetFiniteDifferenceByOrderAndMinH(1, -1)
                        == DifferenceExpressionEvaluator.Evaluate(s));
        }
        // check summation of multiple summands with coefficients
        public void CheckSummation()
        {
            string s = "  d3 u(x-2*h) - 2 * du(x-h) + u(x+2*h) - 1 * d^2 u(x)   ";

            Assert.True(FiniteDifference.GetFiniteDifferenceByOrderAndMinH(3, -2)
                        - 2 * FiniteDifference.GetFiniteDifferenceByOrderAndMinH(1, -1)
                        + FiniteDifference.GetFiniteDifferenceByOrderAndMinH(0, 2)
                        - FiniteDifference.GetFiniteDifferenceByOrder(2)
                        == DifferenceExpressionEvaluator.Evaluate(s));

            s = "  - d^3u(x-2*h) - 2 * du(x-h) + u(x+2*h) - 1 * d^2 u(x) ";
            Assert.True(-FiniteDifference.GetFiniteDifferenceByOrderAndMinH(3, -2)
                        - 2 * FiniteDifference.GetFiniteDifferenceByOrderAndMinH(1, -1)
                        + FiniteDifference.GetFiniteDifferenceByOrderAndMinH(0, 2)
                        - FiniteDifference.GetFiniteDifferenceByOrder(2)
                        == DifferenceExpressionEvaluator.Evaluate(s));
        }
        // check whether the DifferenceExpressionEvaluator provide valid error info on summation
        public void CheckSummationErrors()
        {
            // check summation errors
            try
            {
                DifferenceExpressionEvaluator.Evaluate("++1d^5u(x-242h)+3*du(x-4223h)");
                Assert.True(false); // report error here
            }
            catch (FormatException e)
            {
                Assert.Equal("++1d^5u(x-242h)", e.Message);
            }

            try
            {
                DifferenceExpressionEvaluator.Evaluate("1d^5u(x-242h)+-du(x-4223h)");
                Assert.True(false); // report error here
            }
            catch (FormatException e)
            {
                Assert.Equal("+-du(x-4223h)", e.Message);
            }

            try
            {
                DifferenceExpressionEvaluator.Evaluate("+1   d^5u(x-242h)+2+2du(x-4223h)");
                Assert.True(false); // report error here
            }
            catch (FormatException e)
            {
                Assert.Equal("+2+2du(x-4223h)", e.Message);
            }

            try
            {
                DifferenceExpressionEvaluator.Evaluate("1   d^5u(x-24+2)2h)+2*du(x-4223h)");
                Assert.True(false); // report error here
            }
            catch (FormatException e)
            {
                Assert.Equal("1   d^5u(x-24+2)", e.Message);
            }
        }
        // check whether the DifferenceExpressionEvaluator provide valid error info on big numbers
        public void CheckOverflowErrors()
        {
            // check arg overflow
            try
            {
                DifferenceExpressionEvaluator.Evaluate("-d^5u(x-242h)+3*du(x-42342341423h)");
                Assert.True(false); // report error here
            }
            catch (OverflowException e)
            {
                Assert.Equal("+3*du(x-42342341423h)", e.Message);
            }

            // check order overflow
            try
            {
                DifferenceExpressionEvaluator.Evaluate("-d^55646u(x-242h)+3*du(x-4223h)");
                Assert.True(false); // report error here
            }
            catch (OverflowException e)
            {
                Assert.Equal("-d^55646u(x-242h)", e.Message);
            }
        }
        // check whether the DifferenceExpressionEvaluator provide valid error info on multiplication
        public void CheckMultiplicationErrors()
        {
            // check multiplication errors
            try
            {
                DifferenceExpressionEvaluator.Evaluate("1 1d^5u(x-242h)+3*du(x-4223h)");
                Assert.True(false); // report error here
            }
            catch (FormatException e)
            {
                Assert.Equal("1 1d^5u(x-242h)", e.Message);
            }

            try
            {
                DifferenceExpressionEvaluator.Evaluate("1d^5u(x-242h)+*du(x-4223h)");
                Assert.True(false); // report error here
            }
            catch (FormatException e)
            {
                Assert.Equal("+*du(x-4223h)", e.Message);
            }

            try
            {
                DifferenceExpressionEvaluator.Evaluate("1   d^5u(x-242h)+2,3.3 *  d u(x-4223h)   ");
                Assert.True(false); // report error here
            }
            catch (FormatException e)
            {
                Assert.Equal("+2,3.3 *  d u(x-4223h)", e.Message);
            }

            try
            {
                DifferenceExpressionEvaluator.Evaluate("-.d^5u(x-242h)+2,3.3 *  d u(x-4223h)   ");
                Assert.True(false); // report error here
            }
            catch (FormatException e)
            {
                Assert.Equal("-.d^5u(x-242h)", e.Message);
            }

            try
            {
                DifferenceExpressionEvaluator.Evaluate("-.2d^5u(x-242h)+2,3.3 *  d u(x-4223h)   ");
                Assert.True(false); // report error here
            }
            catch (FormatException e)
            {
                Assert.Equal("-.2d^5u(x-242h)", e.Message);
            }
            try
            {
                DifferenceExpressionEvaluator.Evaluate("-2.d^5u(x-242h)+2,3.3 *  d u(x-4223h)   ");
                Assert.True(false); // report error here
            }
            catch (FormatException e)
            {
                Assert.Equal("-2.d^5u(x-242h)", e.Message);
            }

            try
            {
                DifferenceExpressionEvaluator.Evaluate("1   d^5u(x-242h)+2,3. *du(x-4223h)");
                Assert.True(false); // report error here
            }
            catch (FormatException e)
            {
                Assert.Equal("+2,3. *du(x-4223h)", e.Message);
            }

            try
            {
                DifferenceExpressionEvaluator.Evaluate("1   d^5u(x-242h)+2*2*du(x-4223h)");
                Assert.True(false); // report error here
            }
            catch (FormatException e)
            {
                Assert.Equal("+2*2*du(x-4223h)", e.Message);
            }
        }
        // check multiplication
        public void CheckSingleDifferenceMultiplication()
        {
            string s = " -20.2 * d3u (x-2*h) ";

            Assert.True(-20.2 * FiniteDifference.GetFiniteDifferenceByOrderAndMinH(3, -2) == DifferenceExpressionEvaluator.Evaluate(s));

            s = "  20,2d3u(x-2*h)";
            Assert.True(20.2 * FiniteDifference.GetFiniteDifferenceByOrderAndMinH(3, -2) == DifferenceExpressionEvaluator.Evaluate(s));
        }
        // test simple FiniteDifference parsing
        public void CheckSingleDifference()
        {
            string s = "d3u(x-h)";

            Assert.True(FiniteDifference.GetFiniteDifferenceByOrderAndMinH(3, -1) == DifferenceExpressionEvaluator.Evaluate(s));
        }