public void ThrowException_WhenValidatorThrowsException(string input, ArgumentException argumentException)
        {
            A.CallTo(() => _inputValidator.Validate(A <decimal[]> .Ignored, A <bool> .Ignored, A <decimal?> .Ignored)).Throws(argumentException);

            var calculatorInput = new CalculatorInput(input, Operation.Add);
            var exception       = Should.Throw <ArgumentException>(() => _calculatorClient.Calculate(calculatorInput));

            exception.ShouldBe(argumentException);
        }
예제 #2
0
 public ActionResult GetInput(CalculatorInput input)
 {
     if (ModelState.IsValid)
     {
         var output = new CalculatorOutput(input);
         return(View("Results", output));
     }
     else
     {
         return(View(input));
     }
 }
        public void InterpretCustomDelimiters_ComboSingleMultiCharacterDelimitersProvided_TreatedLikeNoDelimitersProvided()
        {
            string userInput = @"//;[***][26]\n11***22***33";

            CalculatorInputHandler calculatorInputHandler = new CalculatorInputHandler();
            CalculatorInput        calculatorInput        = calculatorInputHandler.InterpretCalculatorInput(userInput);

            Assert.IsTrue(calculatorInputHandler.AcceptableDelimiters.Count == 2);
            Assert.IsTrue(!calculatorInputHandler.AcceptableDelimiters.Contains("***"));
            Assert.IsTrue(calculatorInput.Numbers.Count == 2);
            Assert.IsTrue(calculatorInput.Numbers[0] == 0);
            Assert.IsTrue(calculatorInput.Numbers[1] == 0);
        }
        public void InterpretCustomDelimiters_MoreThanSingleCharacterDelimiterProvided_ReturnSuccessful()
        {
            string userInput = @"//;;\n2;5";

            CalculatorInputHandler calculatorInputHandler = new CalculatorInputHandler();
            CalculatorInput        calculatorInput        = calculatorInputHandler.InterpretCalculatorInput(userInput);

            Assert.IsTrue(calculatorInputHandler.AcceptableDelimiters.Count == 2);
            Assert.IsTrue(!calculatorInputHandler.AcceptableDelimiters.Contains(";"));
            Assert.IsTrue(calculatorInput.Numbers.Count == 2);
            Assert.IsTrue(calculatorInput.Numbers[0] == 0);
            Assert.IsTrue(calculatorInput.Numbers[1] == 0);
        }
예제 #5
0
        public string Calculate(CalculatorInput alculatorInput)
        {
            var values = _parser.Parse(alculatorInput.Input, alculatorInput.AlternateDelimiter);

            var validNumbers = _validator.Validate(values, alculatorInput.AllowNegative, alculatorInput.MaxNumber);

            var response = _calculator.Run(
                _operatorProvider.GetByOperation(alculatorInput.Operation),
                validNumbers,
                _operatorProvider.GetSymbolByOperation(alculatorInput.Operation));

            return(response.ToString());
        }
        public void InterpretCalculatorInput_NumbersOver1000Excluded_ReturnSuccessful()
        {
            string userInput = @"2,1001,6";

            CalculatorInputHandler calculatorInputHandler = new CalculatorInputHandler();

            calculatorInputHandler.ReplaceAlternativeDelimiterWithArgumentDelimiter("|");
            CalculatorInput calculatorInput = calculatorInputHandler.InterpretCalculatorInput(userInput);

            Assert.IsTrue(calculatorInput.Numbers.Count == 2);
            Assert.IsTrue(calculatorInput.Numbers[0] == 2);
            Assert.IsTrue(calculatorInput.Numbers[1] == 6);
        }
        public void CallCalculatorWithValidNumber_WhenValidatorReturnsValidNumbers(string input)
        {
            var numbers = new decimal[] { 1, 0, 5 };

            A.CallTo(() => _inputValidator.Validate(A <decimal[]> .Ignored, false, A <decimal?> .Ignored)).Returns(numbers);

            var calculatorInput = new CalculatorInput(input, Operation.Add);

            _calculatorClient.Calculate(calculatorInput);

            A.CallTo(() => _calculator.Run(A <Func <decimal, decimal, decimal> > .Ignored, numbers,
                                           A <string> .Ignored))
            .MustHaveHappenedOnceExactly();
        }
        public void InterpretCustomDelimiters_SingleMultiCharacterDelimiterProvided_ReturnSuccessful()
        {
            string userInput = @"//[***]\n11***22***33";

            CalculatorInputHandler calculatorInputHandler = new CalculatorInputHandler();
            CalculatorInput        calculatorInput        = calculatorInputHandler.InterpretCalculatorInput(userInput);

            Assert.IsTrue(calculatorInputHandler.AcceptableDelimiters.Count == 3);
            Assert.IsTrue(calculatorInputHandler.AcceptableDelimiters.Contains("***"));
            Assert.IsTrue(calculatorInput.Numbers.Count == 3);
            Assert.IsTrue(calculatorInput.Numbers[0] == 11);
            Assert.IsTrue(calculatorInput.Numbers[1] == 22);
            Assert.IsTrue(calculatorInput.Numbers[2] == 33);
        }
        public void InterpretCalculatorInput_MultipleValidNumbersWithCommaAndArgumentDelimiters_ReturnSuccessful()
        {
            string userInput = @"1|2,3";

            CalculatorInputHandler calculatorInputHandler = new CalculatorInputHandler();

            calculatorInputHandler.ReplaceAlternativeDelimiterWithArgumentDelimiter("|");
            CalculatorInput calculatorInput = calculatorInputHandler.InterpretCalculatorInput(userInput);

            Assert.IsTrue(calculatorInput.Numbers.Count == 3);
            Assert.IsTrue(calculatorInput.Numbers[0] == 1);
            Assert.IsTrue(calculatorInput.Numbers[1] == 2);
            Assert.IsTrue(calculatorInput.Numbers[2] == 3);
        }
예제 #10
0
        public IActionResult Calculate(int calculatorId, [FromBody] CalculatorInput calculatorInput)
        {
            var calculator = this.calculatorService.GetById(calculatorId);

            var valueInputs = calculator.Module.Function.GetInputs();

            for (var i = 0; i < valueInputs.Length; i++)
            {
                var input = calculatorInput.Inputs.FirstOrDefault(j => j.Key.Replace("_", " ") == valueInputs[i].Info.Name);

                if (input.Key != null && input.Value != null)
                {
                    try
                    {
                        valueInputs[i].Value = TypeConverter.ToObject <double>(input.Value);
                    }
                    catch (Exception ex)
                    {
                        return(this.BadRequest(new CalculateResult($"Bad value for input \"{valueInputs[i].Info.Name}\": {ex.Message}")));
                    }

                    continue;
                }

                var arrayInput = calculatorInput.ArrayInputs.FirstOrDefault(j => j.Key.Replace("_", " ") == valueInputs[i].Info.Name);

                if (arrayInput.Key != null && arrayInput.Value != null)
                {
                    try
                    {
                        valueInputs[i].Value = TypeConverter.ToArray <double[]>(arrayInput.Value);
                    }
                    catch (Exception ex)
                    {
                        return(this.BadRequest(new CalculateResult($"Bad value for input \"{valueInputs[i].Info.Name}\": {ex.Message}")));
                    }
                }
            }

            try
            {
                var result = calculator.Module.Function.Calculate(valueInputs);

                return(Json(new CalculateResult(result)));
            }
            catch (Exception ex)
            {
                return(this.BadRequest(new CalculateResult($"An error occurred during calculation: {ex.Message}.")));
            }
        }
예제 #11
0
        /// <summary>
        /// Calculate the aggregation of numbers in a delimited string based on console arguments and input
        /// </summary>
        /// <param name="userInput">numbers and delimiters in a delimited format</param>
        /// <param name="args">applpication arguments</param>
        /// <returns>A result of the calculation based on the configuration</returns>
        public CalculatorResult Calculate(string userInput, string[] args)
        {
            CalculatorResult calculatorResult = new CalculatorResult();

            try
            {
                ProgramArguments programArguments = programArgumentsHandler.InterpretProgramArguments(args);
                if (programArguments.AlternateDelimiter.Length > 0)
                {
                    calculatorInputHandler.ReplaceAlternativeDelimiterWithArgumentDelimiter(programArguments.AlternateDelimiter);
                }
                if (programArguments.UpperBoundExists)
                {
                    calculatorInputHandler.UpperBound = programArguments.UpperBound;
                }
                CalculatorInput calculatorInput = calculatorInputHandler.InterpretCalculatorInput(userInput);
                if (!programArguments.AllowNegativeNumbers && calculatorInput.Numbers.Any(x => x < 0))
                {
                    throw new NegativeNumberException("Negative numbers are not allowed: " + string.Join(",", calculatorInput.Numbers.Where(x => x < 0)));
                }

                try
                {
                    calculatorResult = calculator.Calculate(calculatorInput.Numbers, Calculator.CreateCalculator(programArguments.CalculatorType));
                }
                catch (DivideByZeroException ex)
                {
                    calculatorResult.ErrorMessage = $"{ex.Message}";
                }
                catch (Exception ex)
                {
                    calculatorResult.ErrorMessage = $"Encountered an Error Attempting to Run Calculation: {ex.ToString()}";
                }
            }
            catch (MaxNumbersExceededException ex)
            {
                calculatorResult.ErrorMessage = $"{ex.Message}";
            }
            catch (NegativeNumberException ex)
            {
                calculatorResult.ErrorMessage = $"{ex.Message}";
            }
            catch (Exception ex)
            {
                calculatorResult.ErrorMessage = $"Encountered an Error Attempting to Intepret the Calculator Input: {ex.ToString()}";
            }

            return(calculatorResult);
        }
        public void InterpretCalculatorInput_ArgumentProvidedUpperBoundExcluded_ReturnSuccessful()
        {
            const int UPPER_BOUND = 2000;
            string    userInput   = @"2,1001,2001,6";

            CalculatorInputHandler calculatorInputHandler = new CalculatorInputHandler();

            calculatorInputHandler.UpperBound = UPPER_BOUND;
            CalculatorInput calculatorInput = calculatorInputHandler.InterpretCalculatorInput(userInput);

            Assert.IsTrue(calculatorInput.Numbers.Count == 3);
            Assert.IsTrue(calculatorInput.Numbers[0] == 2);
            Assert.IsTrue(calculatorInput.Numbers[1] == 1001);
            Assert.IsTrue(calculatorInput.Numbers[2] == 6);
        }
예제 #13
0
        public void TestFileRead()
        {
            //to run tests find where the spreadsheet is located on your system couldn't figure out relative paths
            string path = @"C:\Users\andel\GUI_Calculator\TestSpreadsheet.xlsx";

            Assert.IsTrue(File.Exists(path));
            List <CalculatorInput> calcInputs   = fileHandler.ReadFromExcel(path).ToList();
            CalculatorInput        correctInput = new CalculatorInput(
                new System.DateTime(2020, 1, 1),
                new System.DateTime(2020, 1, 2),
                "Days");

            Assert.AreEqual(calcInputs[0].firstDateTime, correctInput.firstDateTime);
            Assert.AreEqual(calcInputs[0].secondDateTime, correctInput.secondDateTime);
            Assert.AreEqual(calcInputs[0].units, correctInput.units);
        }
예제 #14
0
        /// <summary>
        /// Interprets a formatted delimited string with config data into an object for use by the calculator
        /// </summary>
        /// <param name="userInput">a formatted delimited string</param>
        /// <returns>An object representing the data in the userInput</returns>
        public CalculatorInput InterpretCalculatorInput(string userInput)
        {
            CalculatorInput calculatorInput = new CalculatorInput()
            {
            };

            //Interpret the possible delimiters in the input string
            userInput = InterpretCustomDelimiters(userInput);

            //Split the string by all of the acceptable delimiters
            List <string> splitUserInput = userInput.Split(AcceptableDelimiters.ToArray(), StringSplitOptions.None).ToList();

            //Replace invalid entries with 0
            calculatorInput.Numbers = splitUserInput.Select(x => int.TryParse(x, out int num) ? num : 0).Where(x => x <= UpperBound).ToList();

            return(calculatorInput);
        }
        public CalculatorResult Calculate(CalculatorInput input)
        {
            int result = 0;

            switch (input.Operation)
            {
            case "Add":
                result = Add(input.Number1, input.Number2);
                break;

            case "Subtract":
                result = Subtract(input.Number1, input.Number2);
                break;

            case "Multiply":
                result = Multiply(input.Number1, input.Number2);
                break;

            case "Divide":
                if (input.Number2 == 0)
                {
                    throw new FaultException <DivideOperationFailure>(new DivideOperationFailure()
                    {
                        Number1 = input.Number1,
                        Number2 = input.Number2,
                        Message = "Only a dumbo will try to divide by zero"
                    });
                }
                if (input.Number2 % 2 == 0)
                {
                    throw new FaultException <DivideByEvenNumberFailure>(new DivideByEvenNumberFailure()
                    {
                        Message = "This is juz for fun"
                    });
                }
                result = Divide(input.Number1, input.Number2);
                break;
            }
            return(new CalculatorResult()
            {
                Number1 = input.Number1,
                Number2 = input.Number2,
                Operation = input.Operation,
                Result = result
            });
        }
        void IAdvancedCalculatorProcessor.Calculate(CalculatorInput input)
        {
            int result = 0;

            switch (input.Operation)
            {
            case "Add":
                result = Add(input.Number1, input.Number2);
                break;

            case "Subtract":
                result = Subtract(input.Number1, input.Number2);
                break;

            case "Multiply":
                result = Multiply(input.Number1, input.Number2);
                break;

            case "Divide":
                if (input.Number2 == 0)
                {
                    throw new FaultException <DivideOperationFailure>(new DivideOperationFailure()
                    {
                        Number1 = input.Number1,
                        Number2 = input.Number2,
                        Message = "Only a dumbo will try to divide by zero"
                    });
                }
                result = Divide(input.Number1, input.Number2);
                break;
            }
            Console.WriteLine(new CalculatorResult()
            {
                Number1   = input.Number1,
                Number2   = input.Number2,
                Operation = input.Operation,
                Result    = result
            });
        }
예제 #17
0
 private void AC_Click(object sender, EventArgs e)
 {
     CalculatorInput.Clear();
 }
예제 #18
0
        //GET: /Home/GetInput
        public ActionResult GetInput()
        {
            var input = new CalculatorInput();

            return(View(input));
        }
예제 #19
0
 public void GivenTheCostOfMyMealIs(decimal mealCost)
 {
     TestInput        = new CalculatorInput();
     TestInput.Amount = mealCost;
 }
예제 #20
0
 private void substraction_Click(object sender, EventArgs e)
 {
     CalculatorInput.AppendText("-");
 }
예제 #21
0
 private void sum_Click(object sender, EventArgs e)
 {
     CalculatorInput.AppendText("+");
 }
예제 #22
0
 private void divition_Click(object sender, EventArgs e)
 {
     CalculatorInput.AppendText("/");
 }
예제 #23
0
 private void multiplication_Click(object sender, EventArgs e)
 {
     CalculatorInput.AppendText("x");
 }
예제 #24
0
 private void Decimal_Click(object sender, EventArgs e)
 {
     CalculatorInput.AppendText(",");
 }
예제 #25
0
 private void button0_Click(object sender, EventArgs e)
 {
     CalculatorInput.AppendText("0");
 }