Exemplo n.º 1
0
        public void ParseManyBrackets()
        {
            var expression = "(((tg(x)^2)))";
            var parameter  = new Parameter
            {
                VariableName = "x",
                Value        = 0
            };

            var variables = new List <Variable>()
            {
                parameter.GetVariable()
            };

            var result = _parser.TryParse(expression, variables);

            var computedResult = 0d;

            if (result.IsSuccessfulCreated)
            {
                computedResult = result.Expression.ComputeValue(new List <Parameter>()
                {
                    parameter
                });
            }
            var expectedResult = Math.Pow(Math.Tan(parameter.Value), 2);

            Assert.True(result.IsSuccessfulCreated);
            Assert.Equal("Pow", result.Expression.Name);
            Assert.Equal(expectedResult, computedResult);
        }
        public async Task <ComputeExpressionResponseModel> ComputeExpression(ComputeExpressionRequestModel request)
        {
            var errorMessage = MathParserServiceParametersChecker.CheckForComputeExpression(request, 5);

            if (!string.IsNullOrEmpty(errorMessage))
            {
                return(new ComputeExpressionResponseModel(false, errorMessage));
            }

            var variables   = request.Parameters.Select(p => p.GetVariable()).ToList();
            var parseResult = _mathParser.TryParse(request.Expression, variables);

            if (parseResult.IsSuccessfulCreated == false)
            {
                return(new ComputeExpressionResponseModel(false, parseResult.ErrorMessage));
            }

            var computeResult = parseResult.Expression.ComputeValue(request.Parameters);

            var expressionDAL = _expressionFactory
                                .Create(parseResult,
                                        variables,
                                        request.Parameters,
                                        computeResult);

            await _dataBaseService.SaveAsync(expressionDAL);

            return(new ComputeExpressionResponseModel(true)
            {
                Result = computeResult,
                Expression = parseResult.Expression
            });
        }
Exemplo n.º 3
0
        public void ParseSum()
        {
            var expression = "2 + 0.5 + 2.5*cos(pi) - log(2, 8) + sin(x) + tg(x)^2";
            var parameter  = new Parameter("x", 0);

            var variables = new List <Variable>()
            {
                parameter.GetVariable()
            };

            var result = _parser.TryParse(expression, variables);

            var computedResult = 0d;

            if (result.IsSuccessfulCreated)
            {
                computedResult = result.Expression.ComputeValue(new List <Parameter>()
                {
                    parameter
                });
            }

            var expectedResult = 2 + 0.5 + 2.5 * Math.Cos(Math.PI) - Math.Log(8, 2) + Math.Sin(parameter.Value) + Math.Pow(Math.Tan(parameter.Value), 2);

            Assert.True(result.IsSuccessfulCreated);
            Assert.Equal("Sum", result.Expression.Name);
            Assert.Equal(expectedResult, computedResult);
        }
Exemplo n.º 4
0
        public void ExeptionEnter()
        {
            string testReqwest = "one + six";
            var    answer      = MathParser.TryParse(testReqwest);

            Assert.AreEqual(false, answer);
        }
Exemplo n.º 5
0
        public void ParseFraction()
        {
            var expression = "1/2/3/4/x";
            var parameter  = new Parameter
            {
                VariableName = "x",
                Value        = 0
            };

            var variables = new List <Variable>()
            {
                parameter.GetVariable()
            };

            var result = _parser.TryParse(expression, variables);

            var computedResult = 0d;

            if (result.IsSuccessfulCreated)
            {
                computedResult = result.Expression.ComputeValue(new List <Parameter>()
                {
                    parameter
                });
            }
            var expectedResult = 1d / 2d / 3d / 4d / parameter.Value;

            Assert.True(result.IsSuccessfulCreated);
            Assert.Equal("Fraction", result.Expression.Name);
            Assert.Equal(expectedResult, computedResult);
        }
Exemplo n.º 6
0
        public void ParseProduct()
        {
            var expression = "2 * 0.5 * -2.5*cos(pi)* tg(x)^2 * log(-2, -8) * sin(x)*(2+3)*(cos(0)+sin(0))*(2*(x+1))";
            var parameter  = new Parameter
            {
                VariableName = "x",
                Value        = 1
            };

            var variables = new List <Variable>()
            {
                parameter.GetVariable()
            };

            var result = _parser.TryParse(expression, variables);

            var computedResult = 0d;

            if (result.IsSuccessfulCreated)
            {
                computedResult = result.Expression.ComputeValue(new List <Parameter>()
                {
                    parameter
                });
            }

            var expectedResult = 2 * 0.5 * -2.5
                                 * Math.Cos(Math.PI)
                                 * Math.Pow(Math.Tan(parameter.Value), 2)
                                 * Math.Log(-8, -2)
                                 * Math.Sin(parameter.Value)
                                 * (2 + 3)
                                 * (Math.Cos(0) + Math.Sin(0))
                                 * (2 * (parameter.Value + 1));


            Assert.True(result.IsSuccessfulCreated);
            Assert.Equal("Product", result.Expression.Name);
            Assert.Equal(expectedResult, computedResult);
        }
Exemplo n.º 7
0
        public void ExtensionTest()
        {
            var expression = "x+y+2*z";
            var x          = 0;
            var y          = 20;
            var z          = 1.1;

            var result = _parser.TryParse(expression, "x", "y", "z");

            var computedResult = 0d;

            if (result.IsSuccessfulCreated)
            {
                computedResult = result.Expression.ComputeValue(x, y, z);
            }

            var expectedResult = x + y + 2 * z;

            Assert.True(result.IsSuccessfulCreated);
            Assert.Equal("Sum", result.Expression.Name);
            Assert.Equal(expectedResult, computedResult);
        }
Exemplo n.º 8
0
        public MathTryParseResult TryParse(string expression, ICollection <Variable> variables = null)
        {
            var result = new Product()
            {
                Variables = variables
            };

            var balance = 0;
            var factor  = "";
            var counter = 0;

            var mathTryParseResult = new MathTryParseResult()
            {
                ErrorMessage        = "This is not product: " + expression,
                IsSuccessfulCreated = false
            };

            if (!expression.Contains("*") && !expression.StartsWith("-") ||
                expression.Last() == '*')
            {
                return(mathTryParseResult);
            }

            if (expression.StartsWith("-") && !char.IsDigit(expression[1]))
            {
                expression = "-1*" + expression.Substring(1);
            }

            foreach (var ch in expression)
            {
                counter++;
                if (ch == '(')
                {
                    balance--;
                }
                if (ch == ')')
                {
                    balance++;
                }

                if (ch == '*' && balance == 0)
                {
                    var parseResult = _mathParser.TryParse(factor, variables);
                    if (!parseResult.IsSuccessfulCreated)
                    {
                        return(parseResult);
                    }

                    if (parseResult.Expression is Sum && !Validate.IsExpressionInBrackets(factor))
                    {
                        return(mathTryParseResult);
                    }

                    result.Factors.Add(parseResult.Expression);
                    factor = "";
                    continue;
                }

                factor += ch;
                if (counter == expression.Length)
                {
                    if (result.Factors.Count == 0)
                    {
                        return(mathTryParseResult);
                    }

                    var parseResult = _mathParser.TryParse(factor, variables);
                    if (!parseResult.IsSuccessfulCreated)
                    {
                        return(parseResult);
                    }

                    if (parseResult.Expression is Sum && !Validate.IsExpressionInBrackets(factor))
                    {
                        return(mathTryParseResult);
                    }

                    result.Factors.Add(parseResult.Expression);
                    continue;
                }
            }

            if (result.Factors.Count == 1)
            {
                return(mathTryParseResult);
            }

            return(new MathTryParseResult
            {
                IsSuccessfulCreated = true,
                Expression = result
            });
        }
Exemplo n.º 9
0
        public MathTryParseResult TryParse(string expression, ICollection <Variable> variables = null)
        {
            var mathTryParseResult = new MathTryParseResult()
            {
                ErrorMessage        = $"This is not {Name}: " + expression,
                IsSuccessfulCreated = false
            };

            if (!expression.StartsWith(Name))
            {
                return(mathTryParseResult);
            }

            var argsString = expression.Substring(Name.Length);

            if (_argCount > 1 && !Validate.IsExpressionInBrackets(argsString))
            {
                mathTryParseResult = mathTryParseResult with {
                    ErrorMessage = $"Incorrect arguments in {Name}"
                };
                return(mathTryParseResult);
            }

            if (_argCount > 1)
            {
                argsString = argsString.Remove(0, 1);
                argsString = argsString.Remove(argsString.Length - 1, 1);
            }

            var arguments = new List <IExpression>();

            var balance        = 0;
            var argumentString = "";
            var counter        = 0;

            if (!expression.Contains(",") && _argCount != 1 ||
                expression.EndsWith(","))
            {
                return(mathTryParseResult);
            }

            foreach (var ch in argsString)
            {
                counter++;
                if (ch == '(')
                {
                    balance--;
                }
                if (ch == ')')
                {
                    balance++;
                }

                if (ch == ',' && balance == 0 && counter != 1)
                {
                    var parseResult = _mathParser.TryParse(argumentString, variables);

                    if (!parseResult.IsSuccessfulCreated)
                    {
                        return(parseResult);
                    }
                    arguments.Add(parseResult.Expression);
                    argumentString = "";
                    continue;
                }

                argumentString += ch;
                if (counter == argsString.Length)
                {
                    var parseResult = _mathParser.TryParse(argumentString, variables);

                    if (!parseResult.IsSuccessfulCreated)
                    {
                        return(parseResult);
                    }
                    arguments.Add(parseResult.Expression);
                }
            }

            if (arguments.Count != _argCount)
            {
                return(mathTryParseResult);
            }

            var result = new Function()
            {
                Arguments = arguments,
                Variables = variables
            };

            return(new MathTryParseResult
            {
                IsSuccessfulCreated = true,
                Expression = result
            });
        }
    }
Exemplo n.º 10
0
        public MathTryParseResult TryParse(string expression, ICollection <Variable> variables = null)
        {
            var mathTryParseResult = new MathTryParseResult()
            {
                ErrorMessage        = "This is not fraction: " + expression,
                IsSuccessfulCreated = false
            };

            if (!expression.Contains("/") || expression.EndsWith("/"))
            {
                return(mathTryParseResult);
            }

            for (var i = expression.Length - 1; i >= 0; i--)
            {
                var ch = expression[i];
                if (ch != '/')
                {
                    continue;
                }

                else if (i != 0 && i != expression.Length - 1)
                {
                    var numerator   = expression.Substring(0, i);
                    var denominator = expression.Substring(i + 1);

                    if (Validate.IsBracketsAreBalanced(numerator) &&
                        Validate.IsBracketsAreBalanced(denominator))
                    {
                        var numeratorParseResult = _mathParser.TryParse(numerator, variables);
                        if (!numeratorParseResult.IsSuccessfulCreated)
                        {
                            return(numeratorParseResult);
                        }

                        var denominatorParseResult = _mathParser.TryParse(denominator, variables);
                        if (!denominatorParseResult.IsSuccessfulCreated)
                        {
                            return(denominatorParseResult);
                        }

                        var types = new Type[] { typeof(Sum), typeof(Product) };
                        if (types.Contains(numeratorParseResult.Expression.GetType()) &&
                            !Validate.IsExpressionInBrackets(numerator))
                        {
                            return(mathTryParseResult);
                        }

                        if (types.Contains(denominatorParseResult.Expression.GetType()) &&
                            !Validate.IsExpressionInBrackets(denominator))
                        {
                            return(mathTryParseResult);
                        }

                        return(new MathTryParseResult
                        {
                            IsSuccessfulCreated = true,
                            ErrorMessage = "",
                            Expression = new Fraction()
                            {
                                Numerator = numeratorParseResult.Expression,
                                Denominator = denominatorParseResult.Expression,
                                Variables = variables
                            }
                        });
                    }
                }
            }

            return(mathTryParseResult);
        }
Exemplo n.º 11
0
        public MathTryParseResult TryParse(string expression, ICollection <Variable> variables = null)
        {
            var mathTryParseResult = new MathTryParseResult()
            {
                ErrorMessage        = "This is not pow: " + expression,
                IsSuccessfulCreated = false
            };

            if (!expression.Contains("^") || expression.EndsWith("^"))
            {
                return(mathTryParseResult);
            }

            var i = -1;

            foreach (var ch in expression)
            {
                i++;
                if (ch != '^')
                {
                    continue;
                }

                else if (i != 0 && i != expression.Length - 1)
                {
                    var @base = expression.Substring(0, i);
                    var log   = expression.Substring(i + 1);
                    if (Validate.IsBracketsAreBalanced(@base) && Validate.IsBracketsAreBalanced(log))
                    {
                        var baseParseResult = _mathParser.TryParse(@base, variables);
                        if (!baseParseResult.IsSuccessfulCreated)
                        {
                            return(baseParseResult);
                        }

                        var bracketTypes = new Type[] { typeof(Sum), typeof(Product) };

                        if (bracketTypes.Contains(baseParseResult.Expression.GetType()) &&
                            !Validate.IsExpressionInBrackets(@base))
                        {
                            return(mathTryParseResult);
                        }

                        var logParseResult = _mathParser.TryParse(log, variables);
                        if (!logParseResult.IsSuccessfulCreated)
                        {
                            return(mathTryParseResult);
                        }

                        if (bracketTypes.Contains(logParseResult.Expression.GetType()) &&
                            !Validate.IsExpressionInBrackets(log))
                        {
                            return(mathTryParseResult);
                        }

                        return(new MathTryParseResult
                        {
                            IsSuccessfulCreated = true,
                            ErrorMessage = "",
                            Expression = new Pow()
                            {
                                Base = baseParseResult.Expression,
                                Log = logParseResult.Expression,
                                Variables = variables
                            }
                        });
                    }
                }
            }

            return(mathTryParseResult);
        }
Exemplo n.º 12
0
        public MathTryParseResult TryParse(string expression, ICollection <Variable> variables = null)
        {
            var sum = new Sum()
            {
                Variables = variables
            };

            var balance = 0;
            var term    = "";
            var counter = 0;

            var mathTryParseResult = new MathTryParseResult()
            {
                ErrorMessage        = "This is not sum: " + expression,
                IsSuccessfulCreated = false
            };

            if (!expression.Contains("+") && !expression.Contains("-") ||
                (expression.Last() == '+' || expression.Last() == '-'))
            {
                return(mathTryParseResult);
            }

            foreach (var ch in expression)
            {
                counter++;
                if (ch == '(')
                {
                    balance--;
                }
                if (ch == ')')
                {
                    balance++;
                }

                if ((ch == '+' || ch == '-') && balance == 0 && counter != 1)
                {
                    var parseResult = _mathParser.TryParse(term, variables);

                    if (!parseResult.IsSuccessfulCreated)
                    {
                        return(parseResult);
                    }
                    sum.Terms.Add(parseResult.Expression);
                    term = ch == '-'? "-":"";
                    continue;
                }

                term += ch;
                if (counter == expression.Length)
                {
                    if (sum.Terms.Count == 0)
                    {
                        return(mathTryParseResult);
                    }

                    var parseResult = _mathParser.TryParse(term, variables);

                    if (!parseResult.IsSuccessfulCreated)
                    {
                        return(parseResult);
                    }
                    sum.Terms.Add(parseResult.Expression);
                }
            }

            if (sum.Terms.Count == 1)
            {
                return(mathTryParseResult);
            }

            return(new MathTryParseResult
            {
                IsSuccessfulCreated = true,
                Expression = sum
            });
        }