public ActionResult Get(string expr, int?precision = 2) { try { var parser = new Parser(); var calculator = new CalculatorRPN(); var retValue = Calculate(expr, parser, calculator, precision); return(Ok(retValue)); } catch (TokenException ex) { // If the expression is formed badly then we won't be able to recover return(BadRequest(ex.Message)); } catch (Exception ex) { try { var parser = new Parser(); var calculator = new CalculatorAPI(); // Try the calculation again by injecting a calculator object to this function that uses the third-party API var retValue = Calculate(expr, parser, calculator, precision); return(Ok(retValue)); } catch (Exception exInner) { return(BadRequest(exInner.Message)); } } }
[TestCase(-2, CalcOperatorType.Division, 3, 2, -0.67)] // 1 / 6 public void Precision(double op1, CalcOperatorType calcType, double op2, int precision, double expected) { var sut = new CalculatorRPN(); sut.AddNumber(op1); sut.AddOperator(new CalcOperator(calcType)); sut.AddNumber(op2); Assert.AreEqual(expected, sut.Value(precision)); }
[TestCase(6, CalcOperatorType.Division, 0.5, 12)] // 6 / 0.5 public void TwoOperands(double op1, CalcOperatorType calcType, double op2, double expected) { var sut = new CalculatorRPN(); sut.AddNumber(op1); sut.AddOperator(new CalcOperator(calcType)); sut.AddNumber(op2); Assert.AreEqual(expected, sut.Value()); }
[TestCase(3, CalcOperatorType.Addition)] // 3 + public void SingleOperandException(double op1, CalcOperatorType calcType) { var sut = new CalculatorRPN(); sut.AddNumber(op1); sut.AddOperator(new CalcOperator(calcType)); double x; var ex = Assert.Throws <TokenException>(() => x = sut.Value()); Assert.AreEqual("Not enough values to perform operation.", ex.Message); }
[TestCase(3, CalcOperatorType.Addition, 2, 1)] // 3 + 2 1 public void TooManyOperandException(double op1, CalcOperatorType calcType, double op2, double op3) { var sut = new CalculatorRPN(); sut.AddNumber(op1); sut.AddOperator(new CalcOperator(calcType)); sut.AddNumber(op2); sut.AddNumber(op3); double x; var ex = Assert.Throws <TokenException>(() => x = sut.Value()); Assert.AreEqual("Too many remaining operands.", ex.Message); }