public void TestCalculateYears0()
        {
            var data = new StockData
            {
                Price      = 200,
                Percentage = 3,
                Quantity   = 17,
                Years      = 0
            };
            var result = StockCalculator.Calculate(data);

            Assert.AreEqual(1, result.Count);
        }
        public void TestCalculatePercentage0()
        {
            var data = new StockData
            {
                Price      = 0,
                Percentage = 3,
                Quantity   = 17,
                Years      = 7
            };
            var result = StockCalculator.Calculate(data);

            Assert.AreEqual(data.Years + 1, result.Count);
            foreach (var value in result)
            {
                Assert.AreEqual(result[0], value);
            }
        }
        public void TestCalculatePriceOrQuantity0()
        {
            var data = new StockData
            {
                Price      = 0,
                Percentage = 3,
                Quantity   = 17,
                Years      = 7
            };
            var result = StockCalculator.Calculate(data);

            CheckValues(data, result);
            data.Price    = 200;
            data.Quantity = 0;
            result        = StockCalculator.Calculate(data);
            CheckValues(data, result);
        }
        public void TestCalculateByRegularWay()
        {
            var data = new StockData
            {
                Price      = 200,
                Percentage = 3,
                Quantity   = 17,
                Years      = 6
            };

            var result = StockCalculator.Calculate(data);

            Assert.AreEqual(data.Years + 1, result.Count);
            Assert.AreEqual(data.Price * data.Quantity, result[0]);
            for (int i = 1; i < result.Count; i++)
            {
                Assert.AreEqual(result[i - 1] + result[i - 1] * (decimal)data.Percentage / 100, result[i]);
            }
        }
        //TODO: there are missed tests for double convertion to decimal
        public void TestCalculateByPriceMaxValue()
        {
            var data = new StockData
            {
                Price      = decimal.MaxValue,
                Percentage = 3,
                Quantity   = 17,
                Years      = 6
            };

            try
            {
                StockCalculator.Calculate(data);
                Assert.Fail("An exception with OverflowException type is ecpexted.");
            }
            catch (Exception e)
            {
                Assert.IsInstanceOfType(e, typeof(OverflowException));
            }
        }
        public HttpResponseMessage Calculate(StockDetails details)
        {
            if (!ModelState.IsValid)
            {
                return(Request.CreateErrorResponse(System.Net.HttpStatusCode.BadRequest, ModelState));
            }
            //custom validation for price
            if (details.Price < 0)
            {
                ModelState.AddModelError("Price", string.Format("The value {0} is not valid for the field Price", details.Price));
                return(Request.CreateErrorResponse(System.Net.HttpStatusCode.BadRequest,
                                                   ModelState));
            }
            //Need to encode string before save in repository
            details.Name = HttpUtility.HtmlEncode(details.Name);

            var result     = StockCalculator.Calculate(new StockData(details));
            var repository = new StockHttpApplicationRepository(HttpContext.Current.Application);

            repository.Add(new StockCalculationResult(details, result));
            return(Request.CreateResponse(System.Net.HttpStatusCode.OK, result));
        }