예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="paidAmount"></param>
        /// <param name="productAmount"></param>
        /// <returns></returns>
        private string CalculateChange(string paidAmount, string productAmount)
        {
            // Limpa mensagem de erro
            this.UxTxtOutput.Text = string.Empty;

            // Monta o request
            ChangeRequest changeRequest = new ChangeRequest();

            changeRequest.PaidAmount    = int.Parse(paidAmount);
            changeRequest.ProductAmount = int.Parse(productAmount);

            // Chama o calculo do troco
            ChangeManager changeManager = new ChangeManager();

            // Assina o evento de conclusão de processador.
            changeManager.OnProcessorDone += changeManager_OnProcessorDone;

            ChangeResponse changeResponse = changeManager.CalculateChange(changeRequest);

            // Verifica se o calculo foi feito corretamente
            if (changeResponse.Success == true)
            {
                // Instancia montador de string
                StringBuilder stringBuilder = new StringBuilder();

                stringBuilder.AppendFormat("Moedas:");

                foreach (ChangeData changeInCoin in changeResponse.ChangeDataCollection)
                {
                    stringBuilder.AppendFormat("\r\n{0} {1}(s) de {2} centavo(s)", changeInCoin.Quantity, changeInCoin.Name, changeInCoin.AmountInCents);
                }

                // Devolve a mensagem de erro para a interface
                this.UxTxtOutput.AppendText(stringBuilder.ToString());

                // Retorna troco
                return(changeResponse.ChangeAmount.ToString());
            }
            else
            {
                // Instancia montador de string
                StringBuilder stringBuilder = new StringBuilder();

                stringBuilder.AppendFormat("Deu ruim!");

                // Varre a coleção de erros
                foreach (ErrorReport errorReport in changeResponse.ErrorReport)
                {
                    stringBuilder.AppendFormat("\r\nErro no campo {0}: {1}", errorReport.Field, errorReport.Message);
                }

                // Devolve a mensagem de erro para a interface
                this.UxTxtOutput.AppendText(stringBuilder.ToString());

                // Retorna troco vazio
                return(string.Empty);
            }
        }
        public void CalculateChange_NegativeProductAmount()
        {
            ChangeManager changeManager = new ChangeManager();

            IocFactory.Register <IConfigurationUtility, ConfigurationUtilityMock>();

            ChangeRequest changeRequest = new ChangeRequest();

            changeRequest.PaidAmount    = 100;
            changeRequest.ProductAmount = -100;
            ChangeResponse changeResponse = changeManager.CalculateChange(changeRequest);

            Assert.IsNotNull(changeResponse);
            Assert.IsNotNull(changeResponse.ErrorReport);
            Assert.AreEqual(changeResponse.ErrorReport.Count(), 1);
            Assert.AreEqual(changeResponse.ErrorReport[0].Field, "ChangeRequest.ProductAmount");
            Assert.AreEqual(changeResponse.ChangeAmount, 0);
        }
        public void CalculateChange_WithValidValue()
        {
            ChangeManager changeManager = new ChangeManager();

            ChangeRequest changeRequest = new ChangeRequest();

            changeRequest.PaidAmount    = 73891;
            changeRequest.ProductAmount = 100;
            ChangeResponse changeResponse = changeManager.CalculateChange(changeRequest);

            Assert.IsNotNull(changeResponse);
            Assert.IsNotNull(changeResponse.ChangeDataCollection);
            Assert.AreEqual(7, changeResponse.ChangeDataCollection.SingleOrDefault(o => o.AmountInCents == 10000).Quantity);
            Assert.AreEqual(1, changeResponse.ChangeDataCollection.SingleOrDefault(o => o.AmountInCents == 2000).Quantity);
            Assert.AreEqual(1, changeResponse.ChangeDataCollection.SingleOrDefault(o => o.AmountInCents == 1000).Quantity);
            Assert.AreEqual(1, changeResponse.ChangeDataCollection.SingleOrDefault(o => o.AmountInCents == 500).Quantity);
            Assert.AreEqual(1, changeResponse.ChangeDataCollection.SingleOrDefault(o => o.AmountInCents == 200).Quantity);

            Assert.AreEqual(1, changeResponse.ChangeDataCollection.SingleOrDefault(o => o.AmountInCents == 90).Quantity);

            Assert.AreEqual(1, changeResponse.ChangeDataCollection.SingleOrDefault(o => o.AmountInCents == 1).Quantity);
        }