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 TheMinimalParenthesisVisitorWorksCorrectlyWithPower()
        {
            var parseTree = _parser.Parse("1-2*2^3*3-2");

            var minimalParenthesisVisitor = new MinimalParenthesisVisitor();

            parseTree.Accept(minimalParenthesisVisitor);

            Assert.Equal("1-2*2^3*3-2", minimalParenthesisVisitor.Result);
        }
        public void ShouldCreateExpressionWithMinimalParenthesisGivenExpressionWithVariablesAndFunctions()
        {
            var parseTree = _parser.Parse("(((7*a)+(5*cos(Pi)))+(10/sqrt(c+(d*5))))");

            var parenthesisVisitor = new MinimalParenthesisVisitor();

            parseTree.Accept(parenthesisVisitor);

            Assert.Equal("7*a+5*cos(Pi)+10/sqrt(c+d*5)", parenthesisVisitor.Result);
        }
        public void ShouldSimplifyToExpressionWithoutParenthesis()
        {
            var parseTree = _parser.Parse("(((7*8)+(5*6))+(10/5))");

            var parenthesisVisitor = new MinimalParenthesisVisitor();

            parseTree.Accept(parenthesisVisitor);

            Assert.Equal("7*8+5*6+10/5", parenthesisVisitor.Result);
        }
        public void ShouldCreatesDivisionWithMinimalAmountOfParenthesis()
        {
            var parseTree = _parser.Parse("((24/1)/(2/3))");

            var parenthesisVisitor = new MinimalParenthesisVisitor();

            parseTree.Accept(parenthesisVisitor);

            Assert.Equal("24/1/(2/3)", parenthesisVisitor.Result);
        }
        public void ShouldCreateMultiplicationWithMinimalAmountOfParenthesis()
        {
            var parseTree = _parser.Parse("6*(1+2+3)");

            var parenthesisVisitor = new MinimalParenthesisVisitor();

            parseTree.Accept(parenthesisVisitor);

            Assert.Equal("6*(1+2+3)", parenthesisVisitor.Result);
        }
        public void TheMinimalParenthesisVisitorWorksWithDivideCorrectly()
        {
            var visitor = new MinimalParenthesisVisitor();

            _parser.Parse("1/(2/3)").Accept(visitor);
            Assert.Equal("1/(2/3)", visitor.Result);

            visitor.Clear();

            _parser.Parse("1/2/3").Accept(visitor);
            Assert.Equal("1/2/3", visitor.Result);
        }
        public void CreatesArithmeticExpressionWithMinimalAmountOfParenthesis()
        {
            var plusParseTree = _parser.Parse("(1+(2+(3+4)))");

            var parenthesisVisitor = new MinimalParenthesisVisitor();

            plusParseTree.Accept(parenthesisVisitor);

            Assert.Equal("1+2+3+4", parenthesisVisitor.Result);

            var minusParseTree = _parser.Parse("(-1-(2-(3-4)))");

            var minimalParenthesisVisitor = new MinimalParenthesisVisitor();

            minusParseTree.Accept(minimalParenthesisVisitor);

            Assert.Equal("-1-(2-(3-4))", minimalParenthesisVisitor.Result);
        }