public void ThePowerOperatorIsLeftAssociative()
        {
            // There is no unique standard:
            // https://codeplea.com/exponentiation-associativity-options
            var parseTree  = _parser.Parse("2^2^3");
            var calculator = new CalculateVisitor();

            parseTree.Accept(calculator);

            // Left Associative
            Assert.Equal(64, calculator.Result);

            // Right Associative
            Assert.NotEqual(256, calculator.Result);

            var fullParenthesisVisitor = new FullParenthesisVisitor();

            parseTree.Accept(fullParenthesisVisitor);

            Assert.Equal("((2^2)^3)", fullParenthesisVisitor.Result);

            var minimalParenthesisVisitor = new MinimalParenthesisVisitor();

            parseTree.Accept(minimalParenthesisVisitor);

            Assert.Equal("2^2^3", minimalParenthesisVisitor.Result);
        }
        public void ParseComplexArithmeticExampleCorrectly()
        {
            var parseTree = _parser.Parse("145.2/3+7-(8*45+22*(2-19))-88/8 + 17");

            var calculator = new CalculateVisitor();

            parseTree.Accept(calculator);

            Assert.Equal(75.4, calculator.Result);

            var parenthesisVisitor = new FullParenthesisVisitor();

            parseTree.Accept(parenthesisVisitor);

            Assert.Equal("(((((145.2/3)+7)-((8*45)+(22*(2-19))))-(88/8))+17)", parenthesisVisitor.Result);
        }
        public void ParseSimpleFloatCorrectly()
        {
            var parseTree = _parser.Parse("3.14159265");

            var number = parseTree as NumberNode;

            Assert.NotNull(number);
            Assert.Equal(3.14159265, number?.Number);

            var calculator = new CalculateVisitor();

            parseTree.Accept(calculator);

            Assert.Equal(3.14159265, calculator.Result);

            var parenthesisVisitor = new FullParenthesisVisitor();

            parseTree.Accept(parenthesisVisitor);

            Assert.Equal("3.14159265", parenthesisVisitor.Result);
        }
        public void ParseSingleNumberCorrectly()
        {
            var parseTree = _parser.Parse("22");

            var number = parseTree as NumberNode;

            Assert.NotNull(number);
            Assert.Equal(22.0, number?.Number);

            var calculator = new CalculateVisitor();

            parseTree.Accept(calculator);

            Assert.Equal(22.0, calculator.Result);

            var parenthesisVisitor = new FullParenthesisVisitor();

            parseTree.Accept(parenthesisVisitor);

            Assert.Equal("22", parenthesisVisitor.Result);
        }