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); }
/// <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"); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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()); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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()); }
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); }
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); }
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); }