public void PrimaryDispenserCanWithdrawWithEmptyMoneyStack() { var moneyStacks = new List <EnglishMoneyStack>(); moneyStacks.Add(new EnglishMoneyStack() { BaseValue = 2000, Quantity = 0 }); moneyStacks.Add(new EnglishMoneyStack() { BaseValue = 1000, Quantity = 10 }); EnglishAtmVault vault = new EnglishAtmVault(moneyStacks); var cashDispenser = new PrimaryCashDispenser(vault); var atmTerminal = new AtmTerminal(cashDispenser); var withdrawalAmount = 100m; atmTerminal.Withdraw(withdrawalAmount); var atmBalance = atmTerminal.Balance; var expected = 0m; Assert.AreEqual(expected, atmBalance); }
public void SecondaryDispenserReturnsCorrectVaultBalanceAfterWithdrawal() { // £3 in the vault var moneyStacks = new List <EnglishMoneyStack>(); moneyStacks.Add(new EnglishMoneyStack() { BaseValue = 1, Quantity = 100 }); moneyStacks.Add(new EnglishMoneyStack() { BaseValue = 2, Quantity = 100 }); EnglishAtmVault vault = new EnglishAtmVault(moneyStacks); var cashDispenser = new SecondaryCashDispenser(vault); var atmTerminal = new AtmTerminal(cashDispenser); // £1.20 taken from the vault var withdrawalAmount = 1.2m; var payload = atmTerminal.Withdraw(withdrawalAmount); var atmBalance = atmTerminal.Balance; var expected = 1.8m; Assert.AreEqual(expected, atmBalance); }
public void SecondaryDispenserReturnsMostly20PoundNotes() { EnglishAtmVault vault = new EnglishAtmVault(atmVault); var cashDispenser = new SecondaryCashDispenser(vault); var atmTerminal = new AtmTerminal(cashDispenser); // £120.00 withdrawn var withdrawalAmount = 120; IEnumerable <MoneyStack> result = atmTerminal.Withdraw(withdrawalAmount); int count = result.First(x => x.BaseValue == 2000).Quantity; Assert.AreEqual(6, count); }
public void PrimaryDispenserReturnsLeastPiecesOfMoney() { EnglishAtmVault vault = new EnglishAtmVault(atmVault); var cashDispenser = new PrimaryCashDispenser(vault); var atmTerminal = new AtmTerminal(cashDispenser); decimal withdrawalAmount = 120m; var result = atmTerminal.Withdraw(withdrawalAmount); var fiftyPoundCount = result.First(x => x.BaseValue == 5000).Quantity; var twentyPoundCount = result.First(x => x.BaseValue == 2000).Quantity; Assert.AreEqual(2, fiftyPoundCount); Assert.AreEqual(1, twentyPoundCount); }
public void PrimaryDispenserCanWithdrawMoreThanOnce() { EnglishAtmVault vault = new EnglishAtmVault(atmVault); var cashDispenser = new PrimaryCashDispenser(vault); var atmTerminal = new AtmTerminal(cashDispenser); var withdrawalAmount1 = 100m; atmTerminal.Withdraw(withdrawalAmount1); var atmBalance1 = atmTerminal.Balance; var expected1 = 4438m; Assert.AreEqual(expected1, atmBalance1); var withdrawalAmount2 = 123m; atmTerminal.Withdraw(withdrawalAmount2); var atmBalance2 = atmTerminal.Balance; var expected2 = 4315m; Assert.AreEqual(expected2, atmBalance2); }
public void SecondaryDispenserDoesntOverdraw() { // £3 in the vault var moneyStacks = new List <EnglishMoneyStack>(); moneyStacks.Add(new EnglishMoneyStack() { BaseValue = 1, Quantity = 100 }); moneyStacks.Add(new EnglishMoneyStack() { BaseValue = 2, Quantity = 100 }); var vault = new EnglishAtmVault(moneyStacks); var cashDispenser = new SecondaryCashDispenser(vault); var atmTerminal = new AtmTerminal(cashDispenser); // £1.20 taken from the vault var withdrawalAmount = 3.2m; atmTerminal.Withdraw(withdrawalAmount); }
public void SecondaryDispenserReturnsCorrectVaultBalanceBeforeWithdrawal() { // £3 in the vault var moneyStacks = new List <EnglishMoneyStack>(); moneyStacks.Add(new EnglishMoneyStack() { BaseValue = 1, Quantity = 100 }); moneyStacks.Add(new EnglishMoneyStack() { BaseValue = 2, Quantity = 100 }); EnglishAtmVault vault = new EnglishAtmVault(moneyStacks); var cashDispenser = new SecondaryCashDispenser(vault); var atmTerminal = new AtmTerminal(cashDispenser); var result = atmTerminal.Balance; var expected = 3m; Assert.AreEqual(expected, result); }
private static void Main(string[] args) { string line = null; var atmMoneyStacks = new List <EnglishMoneyStack>(); // £ atmMoneyStacks.Add(new EnglishMoneyStack() { BaseValue = 100, Quantity = 100 }); atmMoneyStacks.Add(new EnglishMoneyStack() { BaseValue = 100, Quantity = 100 }); atmMoneyStacks.Add(new EnglishMoneyStack() { BaseValue = 500, Quantity = 50 }); atmMoneyStacks.Add(new EnglishMoneyStack() { BaseValue = 1000, Quantity = 50 }); atmMoneyStacks.Add(new EnglishMoneyStack() { BaseValue = 2000, Quantity = 50 }); atmMoneyStacks.Add(new EnglishMoneyStack() { BaseValue = 5000, Quantity = 50 }); // p atmMoneyStacks.Add(new EnglishMoneyStack() { BaseValue = 1, Quantity = 100 }); atmMoneyStacks.Add(new EnglishMoneyStack() { BaseValue = 2, Quantity = 100 }); atmMoneyStacks.Add(new EnglishMoneyStack() { BaseValue = 5, Quantity = 100 }); atmMoneyStacks.Add(new EnglishMoneyStack() { BaseValue = 10, Quantity = 100 }); atmMoneyStacks.Add(new EnglishMoneyStack() { BaseValue = 20, Quantity = 100 }); atmMoneyStacks.Add(new EnglishMoneyStack() { BaseValue = 50, Quantity = 100 }); var moneyVault = new EnglishAtmVault(atmMoneyStacks); CashDispenser cashDispenser; string algorithm = ConfigurationManager.AppSettings["DispensingAlgorithm"]; // choose which algorithm to use based on a setting in the app.config if (algorithm == "1") { cashDispenser = new PrimaryCashDispenser(moneyVault); } else { cashDispenser = new SecondaryCashDispenser(moneyVault); } var atmTerminal = new AtmTerminal(cashDispenser); System.Console.WriteLine($"ATM balance is {atmTerminal.Balance.ToString("C")}"); System.Console.WriteLine("Enter an amount to withdraw"); while ((line = System.Console.ReadLine()) != "exit") { decimal valueToWithdraw; if (string.IsNullOrEmpty(line) || !decimal.TryParse(line, out valueToWithdraw)) { System.Console.WriteLine("Enter another amount to withdraw or type 'exit' to close the program"); continue; } decimal withdrawalAmount = decimal.Parse(line); var moneyStackText = new StringBuilder(); try { var result = atmTerminal.Withdraw(withdrawalAmount); foreach (var MoneyStack in result) { decimal poundFormat = (decimal)MoneyStack.BaseValue / 100; bool isPound = MoneyStack.BaseValue % 100 == 0; moneyStackText.Append(isPound ? $"{MoneyStack.CurrencySymbol}{poundFormat}" : $"{MoneyStack.BaseValue}{MoneyStack.FractionalUnit}"); moneyStackText.Append($"x{MoneyStack.Quantity},"); } } catch (Exception e) { moneyStackText = new StringBuilder(); moneyStackText.Append(e.Message); } System.Console.BackgroundColor = ConsoleColor.Blue; System.Console.ForegroundColor = ConsoleColor.White; System.Console.WriteLine(moneyStackText.ToString().TrimEnd(',')); System.Console.ResetColor(); System.Console.WriteLine($"ATM balance is {atmTerminal.Balance.ToString("C")}"); System.Console.WriteLine("Enter another amount to withdraw or type 'exit' to close the program"); } }