Beispiel #1
0
        public static bool IsInventoryInputValid(string userInput)
        {
            var commandKey = "I $";

            if (userInput.StartsWith(commandKey, StringComparison.InvariantCulture))
            {
                var userBills = userInput.Substring((commandKey.Length - 1));
                if (userBills.Contains("$$"))
                {
                    return(false);
                }
                else
                {
                    var billAmounts = userBills.Split(new char[] { ' ', '$' }, StringSplitOptions.RemoveEmptyEntries);
                    var isValid     = true;
                    foreach (var billAmount in billAmounts)
                    {
                        isValid = isValid && UnitedStatesTender.TryParse(billAmount, out UnitedStatesTender tender);
                    }

                    return(isValid);
                }
            }
            return(false);
        }
Beispiel #2
0
        public InventoryCommand(string input)
        {
            _tenders = new List <UnitedStatesTender>();
            var commandKey = "I $";

            if (input.StartsWith(commandKey, StringComparison.InvariantCulture))
            {
                var userBills   = input.Substring((commandKey.Length - 1));
                var billAmounts = userBills.Split(new char[] { ' ', '$' }, StringSplitOptions.RemoveEmptyEntries);
                var isValid     = true;
                foreach (var billAmount in billAmounts)
                {
                    UnitedStatesTender tender = null;
                    isValid = isValid && UnitedStatesTender.TryParse(billAmount, out tender);
                    if (tender != null)
                    {
                        _tenders.Add(tender);
                    }
                }

                if (isValid == false)
                {
                    throw new ApplicationException($"Please call IsInventoryInputValid before using this constructor. {nameof(input)} - {input}");
                }
            }
            else
            {
                throw new ApplicationException($"Please call IsInventoryInputValid before using this constructor. {nameof(input)} - {input}");
            }
        }
        protected void DisplayBalance(IReadOnlyCashTransaction balance)
        {
            Console.WriteLine("Machine Balance:");
            var ordered = UnitedStatesTender.GetAllDefinedTenders().OrderByDescending(tender => tender.Value);

            foreach (var bill in ordered)
            {
                Console.WriteLine($"${bill.Value} - {balance.BillCount(bill)}");
            }
        }
Beispiel #4
0
        public void GivenAnEmptyBillAmountWhenTryParseThenGetExpectedTender()
        {
            // Arrange
            var testAmount = string.Empty;

            // Act
            var actualResult = UnitedStatesTender.TryParse(testAmount, out UnitedStatesTender actualTender);

            // Assert
            Assert.False(actualResult, "Expected try parse to not work");
            Assert.True(actualTender == null, "Expected null.");
        }
Beispiel #5
0
        public void GivenAValidDollarAmountWithDollarSignWhenTryParseThenGetExpectedTender()
        {
            // Arrange
            var testAmount = "$50";

            // Act
            var actualResult = UnitedStatesTender.TryParse(testAmount, out UnitedStatesTender actualTender);

            // Assert
            Assert.True(actualResult, "Expected try parse to work");
            Assert.Equal <int>(UnitedStatesTender.FiftyDollar.Value, actualTender.Value);
        }
        public IWithdrawalResult Withdraw(int amount, IAtmInventory inventory)
        {
            var withdrawTransaction           = CashTransaction.Start();
            var descendingUnitedStatesTenders = UnitedStatesTender.GetAllDefinedTenders().OrderByDescending(tender => tender.Value);

            var transactionAmount = amount;

            foreach (var tender in descendingUnitedStatesTenders)
            {
                var numberOfBills = transactionAmount / tender.Value;
                if (numberOfBills > 0)
                {
                    withdrawTransaction.Add(tender, numberOfBills);
                    transactionAmount = transactionAmount - tender.GetValue(numberOfBills);
                }
                if (transactionAmount == 0)
                {
                    break;
                }
                if (transactionAmount < 0)
                {
                    throw new ApplicationException($"transaction amount has gone below zero!");
                }
            }

            // Does inventory support transaction
            var isPossible = inventory.Withdraw(withdrawTransaction);

            if (isPossible)
            {
                return(WithdrawalResult.CreateSuccessResult(withdrawTransaction));
            }
            else
            {
                return(WithdrawalResult.CreateFailureResult("insufficient funds", withdrawTransaction));
            }
        }