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); }
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)}"); } }
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."); }
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)); } }