Пример #1
0
        public void GetValue_DivRemainder_Decimal()
        {
            var expressionUnit = new ExpressionUnit(new ValueUnit(7.8M), Operation.DivRem, new ValueUnit(5.2M));
            var result         = expressionUnit.GetResult();

            Assert.AreEqual(2.6, result);
        }
Пример #2
0
        /// <summary>
        /// Высчитывает ответ из текстового математического выражения
        /// <para>Допустимые символы:</para>
        /// <para>Цифры [0 - 9];</para>
        /// <para>Знак точки для обозначения дробной части</para>
        /// <para>Знаки арифметических операций: + - * / %</para>
        /// <para>Круглые скобочки для обозначения приоритета одной операции над другой</para>
        /// </summary>
        /// <param name="input"></param>
        /// <exception cref="Exception"></exception>
        /// <returns></returns>
        public decimal Evaluate(string input)
        {
            var unexpectedCharacter = InputValidationService.FindUnexpectedCharacters(input).FirstOrDefault();

            if (unexpectedCharacter != null)
            {
                throw new Exception($"Unexpected character: \'{unexpectedCharacter.Character}\', position: \'{unexpectedCharacter.Index}\'");
            }

            var invalidBracket = InputValidationService.FindInvalidBracket(input).FirstOrDefault();

            if (invalidBracket != null)
            {
                throw new Exception($"Invalid bracket: \'{invalidBracket.Character}\', position: \'{invalidBracket.Index}\'");
            }

            var normalizedInput = input.RemoveExcessSpacebar().RemoveExcessLeadingSign().AddSpacebars().AddBracers();

            if (ExpressionUnit.TryParse(normalizedInput, out var expressionUnit))
            {
                return(expressionUnit.GetResult());
            }

            throw new Exception("Parsing Error");
        }
Пример #3
0
        public void GetValue_Division_Decimal()
        {
            var expressionUnit = new ExpressionUnit(new ValueUnit(8.2M), Operation.Div, new ValueUnit(1.6M));
            var result         = expressionUnit.GetResult();

            Assert.AreEqual(5.125, result);
        }
Пример #4
0
        public void GetValue_Multiplication_Decimal()
        {
            var expressionUnit = new ExpressionUnit(new ValueUnit(1.5M), Operation.Multiply, new ValueUnit(3.3M));
            var result         = expressionUnit.GetResult();

            Assert.AreEqual(4.95, result);
        }
Пример #5
0
        public void GetValue_Subtraction_Integer()
        {
            var expressionUnit = new ExpressionUnit(new ValueUnit(1), Operation.Minus, new ValueUnit(2));
            var result         = expressionUnit.GetResult();

            Assert.AreEqual(-1, result);
        }
Пример #6
0
        public void GetValue_Addition_Integer()
        {
            var expressionUnit = new ExpressionUnit(new ValueUnit(1), Operation.Plus, new ValueUnit(2));
            var result         = expressionUnit.GetResult();

            Assert.AreEqual(3, result);
        }
Пример #7
0
        public void GetValue_Addition_Decimal()
        {
            var expressionUnit = new ExpressionUnit(new ValueUnit(1.1M), Operation.Plus, new ValueUnit(1.2M));
            var result         = expressionUnit.GetResult();

            Assert.AreEqual(2.3, result);
        }
Пример #8
0
        public void GetValue_Multiplication_Integer()
        {
            var expressionUnit = new ExpressionUnit(new ValueUnit(2), Operation.Multiply, new ValueUnit(2));
            var result         = expressionUnit.GetResult();

            Assert.AreEqual(4, result);
        }
Пример #9
0
        public void GetValue_DivRemainder_Integer()
        {
            var expressionUnit = new ExpressionUnit(new ValueUnit(6), Operation.DivRem, new ValueUnit(4));
            var result         = expressionUnit.GetResult();

            Assert.AreEqual(2, result);
        }
Пример #10
0
        public void GetValue_Subtraction_Decimal()
        {
            var expressionUnit = new ExpressionUnit(new ValueUnit(3.3M), Operation.Minus, new ValueUnit(1.1M));
            var result         = expressionUnit.GetResult();

            Assert.AreEqual(2.2, result);
        }
Пример #11
0
        public void TryParse_SecondValueIsValue_ExpressionAndValue()
        {
            var input         = "(1 + 2) + 1";
            var isSuccessfull = ExpressionUnit.TryParse(input, out var expressionUnit);

            Assert.IsTrue(isSuccessfull);
            Assert.AreEqual(typeof(ValueUnit), expressionUnit.SecondValue.GetType());
        }
Пример #12
0
        public void TryParse_PlusOperation_ValueAndValue()
        {
            var input         = "1 + 2";
            var isSuccessfull = ExpressionUnit.TryParse(input, out var expressionUnit);

            Assert.IsTrue(isSuccessfull);
            Assert.AreEqual(Operation.Plus, expressionUnit.Operation);
        }
Пример #13
0
        public void TryParse_MinusOperation_ExpressionAndValue()
        {
            var input         = "(1 * 8) - 2";
            var isSuccessfull = ExpressionUnit.TryParse(input, out var expressionUnit);

            Assert.IsTrue(isSuccessfull);
            Assert.AreEqual(Operation.Minus, expressionUnit.Operation);
        }
Пример #14
0
        public void TryParse_DivRemainderOperation_ValueAndValue()
        {
            var input         = "1 % 2";
            var isSuccessfull = ExpressionUnit.TryParse(input, out var expressionUnit);

            Assert.IsTrue(isSuccessfull);
            Assert.AreEqual(Operation.DivRem, expressionUnit.Operation);
        }
Пример #15
0
        public void TryParse_DivRemainderOperation_ExpressionAndExpression()
        {
            var input         = "(1 + 5) % (2 - 1)";
            var isSuccessfull = ExpressionUnit.TryParse(input, out var expressionUnit);

            Assert.IsTrue(isSuccessfull);
            Assert.AreEqual(Operation.DivRem, expressionUnit.Operation);
        }
Пример #16
0
        public void TryParse_DivideOperation_ExpressionAndValue()
        {
            var input         = "(1 + 1) / 2";
            var isSuccessfull = ExpressionUnit.TryParse(input, out var expressionUnit);

            Assert.IsTrue(isSuccessfull);
            Assert.AreEqual(Operation.Div, expressionUnit.Operation);
        }
Пример #17
0
        public void TryParse_MultiplyOperation_ExpressionAndValue()
        {
            var input         = "(1 - 0) * 2";
            var isSuccessfull = ExpressionUnit.TryParse(input, out var expressionUnit);

            Assert.IsTrue(isSuccessfull);
            Assert.AreEqual(Operation.Multiply, expressionUnit.Operation);
        }
Пример #18
0
        public void TryParse_PlusOperation_ExpressionAndExpression()
        {
            var input         = "(1 + 5) + (2 - 1)";
            var isSuccessfull = ExpressionUnit.TryParse(input, out var expressionUnit);

            Assert.IsTrue(isSuccessfull);
            Assert.AreEqual(Operation.Plus, expressionUnit.Operation);
        }
Пример #19
0
        public void TryParse_ExpressionBothValueIsExpression_ExpressionAndExpression()
        {
            var input         = "(1 + 5) * (2 - 1)";
            var isSuccessfull = ExpressionUnit.TryParse(input, out var expressionUnit);

            Assert.IsTrue(isSuccessfull);
            Assert.AreEqual(typeof(ExpressionUnit), expressionUnit.FirstValue.GetType());
            Assert.AreEqual(typeof(ExpressionUnit), expressionUnit.SecondValue.GetType());
        }
Пример #20
0
        public void TryParse_ExpressionBothValuesIsValueUnit_ValueAndValue_Negative()
        {
            var input         = "-1 + -2";
            var isSuccessfull = ExpressionUnit.TryParse(input, out var expressionUnit);

            Assert.IsTrue(isSuccessfull);
            Assert.AreEqual(typeof(ValueUnit), expressionUnit.FirstValue.GetType());
            Assert.AreEqual(typeof(ValueUnit), expressionUnit.SecondValue.GetType());
        }
        private static MathOperation GetOperationByKeyword(ExpressionUnit item, IMathOperationsContainer mathOperationsContainer)
        {
            var operation = mathOperationsContainer.GetOperationOrDefault(item.Keyword);

            if (operation == null)
            {
                throw new ArgumentException("Invalid mathematical expression or unsupported operation.");
            }

            return(operation);
        }
Пример #22
0
        private static bool TryParseExpressionUnit(string expressionItem, OperationType operationType, IMathOperationsContainer mathOperationsContainer, out ExpressionUnit expressionUnit)
        {
            var keyword = mathOperationsContainer.GetKeywordOrDefault(new OperationCharacteristics(expressionItem, operationType));

            if (!string.IsNullOrEmpty(keyword))
            {
                expressionUnit = new OperationExpressionUnit(expressionItem, keyword);

                return(true);
            }

            var leftBracketExpressionUnit = new LeftBracketExpressionUnit();

            if (expressionItem == leftBracketExpressionUnit.Keyword)
            {
                expressionUnit = leftBracketExpressionUnit;

                return(true);
            }

            var rightBracketExpressionUnit = new RightBracketExpressionUnit();

            if (expressionItem == rightBracketExpressionUnit.Keyword)
            {
                expressionUnit = rightBracketExpressionUnit;

                return(true);
            }

            expressionUnit = default(ExpressionUnit);

            return(false);
        }
Пример #23
0
 public static void Equal(ExpressionUnit expectedItem, ExpressionUnit actualItem)
 {
     Assert.Equal(expectedItem.Type, actualItem.Type);
     Assert.Equal(expectedItem.Value, actualItem.Value);
     Assert.Equal(expectedItem.Keyword, actualItem.Keyword);
 }