public void GetTokensDisplay_Test() { //Arrange //First setup counters of the bank. (C1:Deposit, C2:Withdraw, C3:Withdraw, C4:Other, C5:Other) //Arrange var expectedDashboard = new List <(string, string)> { ("C1", "D1"), ("C2", "W1"), ("C3", "W2"), ("C4", "O1"), ("C5", "O2") }; ITokenDistributor tokenDistributor = new UniformTokenDistributor(); IBank bank = new Bank(tokenDistributor); var counters = SetupBankCounters(10); int maxCounterNumber = bank.Counters.Count; for (int index = maxCounterNumber + 1; index <= counters.Count; index++) { bank.Counters.Add('C' + index.ToString(), counters[index - (maxCounterNumber + 1)]); } //Assign 2 deposit tokens to each of these counters. VendingMachine.TokenList.Clear(); int noOfDepositTokens = 2; var vendingMachine = VendingMachine.GetInstance(); vendingMachine.GenerateTokens('D', noOfDepositTokens); //Assign deposit tokens to the counters. //bank.AssignTokensToCounters(VendingMachine.TokenList.Keys.ToList()); //Assign 3 withdraw tokens to the counters. int noOfWithdrawTokens = 3; vendingMachine.GenerateTokens('W', noOfWithdrawTokens); //bank.AssignTokensToCounters(VendingMachine.TokenList.Keys.ToList()); //Assign 3 withdraw tokens to the counters. int noOfOtherTokens = 4; vendingMachine.GenerateTokens('O', noOfOtherTokens); //Segregate and assign tokens to the appropriate counters. bank.AssignTokensToCounters(VendingMachine.TokenList.Keys.ToList()); //Act var actualDashBoard = bank.GetTokensGetDisplay(); //Assert Assert.NotNull(bank); Assert.NotNull(bank.Counters); Assert.Equal(expectedDashboard, actualDashBoard); }
public void Constructor_Test() { //Arrange ITokenDistributor tokenDistributor = new UniformTokenDistributor(); IBank bank = new Bank(tokenDistributor); var counters = SetupBankCounters(10); //Act int maxCounterNumber = bank.Counters.Count; for (int index = maxCounterNumber + 1; index <= counters.Count; index++) { bank.Counters.Add('C' + index.ToString(), counters[index - (maxCounterNumber + 1)]); } //Assert Assert.NotNull(bank); Assert.IsAssignableFrom <IBank>(bank); }
public void Assign_Invalid_Token_To_Counter_Throws_Exception_Test() { ITokenDistributor tokenDistributor = new UniformTokenDistributor(); IBank bank = new Bank(tokenDistributor); //Create Non Monetory counters Counter nonMonetaryCounter1 = new NonMonetoryTxnCounter(TokenType.Other, 10); Counter nonMonetaryCounter2 = new NonMonetoryTxnCounter(TokenType.Other, 10); var counters = new List <Counter> { nonMonetaryCounter1, nonMonetaryCounter2 }; int maxCounterNumber = bank.Counters.Count; for (int index = maxCounterNumber + 1; index <= counters.Count; index++) { bank.Counters.Add('C' + index.ToString(), counters[index - (maxCounterNumber + 1)]); } //Assign 2 deposit tokens to each of these counters. VendingMachine.TokenList.Clear(); var vendingMachine = VendingMachine.GetInstance(); int noOfDepositTokens = 2; vendingMachine.GenerateTokens('D', noOfDepositTokens); var tokenType = VendingMachine.TokenList.Keys.ToList()[0].Type; //Act //Segregate and assign tokens to the appropriate counters. Action act = () => bank.AssignTokensToCounters(VendingMachine.TokenList.Keys.ToList()); //assert var exception = Assert.Throws <InvalidOperationException>(act); //The thrown exception can be used for even more detailed assertions. Assert.Equal($"No appropriate counter available to process {tokenType} tokens", exception.Message); }
public void Evenly_Distribute_OddnumberOfTokens_To_OddnumberOfCounters_Test() { //Arrange //create odd no. of tokens VendingMachine.TokenList.Clear(); ITokenDistributor tokenDistributor = new UniformTokenDistributor(); IBank bank = new Bank(tokenDistributor); //create odd no. of counters var counters = SetupWithdrawCounters(10); //Act int maxCounterNumber = bank.Counters.Count; for (int index = maxCounterNumber + 1; index <= counters.Count; index++) { bank.Counters.Add('C' + index.ToString(), counters[index - (maxCounterNumber + 1)]); } var vendingMachine = VendingMachine.GetInstance(); int noOfTokens = 9; vendingMachine.GenerateTokens('W', noOfTokens); //Act //Assign tokens to the counters. bank.AssignTokensToCounters(VendingMachine.TokenList.Keys.ToList()); //Assert //We expect C1 counter queue must have 5 tokens and C2 counter must have 4 tokens var c1Counter = bank.Counters["C1"]; Assert.Equal(3, c1Counter.CounterQueue.Count); var c2Counter = bank.Counters["C2"]; Assert.Equal(3, c2Counter.CounterQueue.Count); var c3Counter = bank.Counters["C3"]; Assert.Equal(3, c3Counter.CounterQueue.Count); }
public void Display_Bank_Counters_Test() { //Arrange var expectedCounterIdList = new List <string> { "C1", "C2", "C3", "C4", "C5" }; ITokenDistributor tokenDistributor = new UniformTokenDistributor(); IBank bank = new Bank(tokenDistributor); var counters = SetupBankCounters(10); int maxCounterNumber = bank.Counters.Count; //Act for (int index = maxCounterNumber + 1; index <= counters.Count; index++) { bank.Counters.Add('C' + index.ToString(), counters[index - (maxCounterNumber + 1)]); } //Assert Assert.NotNull(bank); Assert.IsAssignableFrom <IBank>(bank); Assert.Equal(expectedCounterIdList, bank.Counters.Keys.ToList()); }
static void Main(string[] args) { try { //Create Bank ITokenDistributor tokenDistributor = new UniformTokenDistributor(); IBank bank = new Bank(tokenDistributor); //Set up few counters Console.WriteLine("Setting up counters. Please wait..."); Thread.Sleep(200); var counters = SetupBankCounters(10); int maxCounterNumber = bank.Counters.Count; for (int index = maxCounterNumber + 1; index <= counters.Count; index++) { bank.Counters.Add('C' + index.ToString(), counters[index - (maxCounterNumber + 1)]); } //Generate tokens VendingMachine.TokenList.Clear(); int noOfDepositTokens = 2; var vendingMachine = VendingMachine.GetInstance(); vendingMachine.GenerateTokens('D', noOfDepositTokens); //Assign 3 withdraw tokens to the counters. int noOfWithdrawTokens = 3; vendingMachine.GenerateTokens('W', noOfWithdrawTokens); //Assign 3 withdraw tokens to the counters. int noOfOtherTokens = 4; vendingMachine.GenerateTokens('O', noOfOtherTokens); Console.WriteLine("Assigning tokens to the counters. Please wait..."); Thread.Sleep(300); //Segregate and assign tokens to the appropriate counters. bank.AssignTokensToCounters(VendingMachine.TokenList.Keys.ToList()); Console.WriteLine("Displaying the dashboard...Please wait"); Thread.Sleep(200); var actualDashBoard = bank.GetTokensGetDisplay(); //Display dashboard to bank employee Console.WriteLine("========================================"); Console.WriteLine("\tCOUNTER\t\tTOKEN"); Console.WriteLine("========================================"); foreach (var counter in actualDashBoard) { Console.WriteLine(string.Format("\t{0}" + "\t\t" + "{1}", counter.Item1, counter.Item2)); } Console.WriteLine("========================================"); Console.WriteLine("Processing the tokens at the counters.Please wait..."); //Display updated dashboard after processing few tokens //Get the C1 counter and process it's token var c1Counter = bank.Counters.Where(dCounter => dCounter.Key == "C1").Select(dCounter => dCounter.Value).SingleOrDefault(); c1Counter.ProcessTokens(); var c4Counter = bank.Counters.Where(dCounter => dCounter.Key == "C4").Select(dCounter => dCounter.Value).SingleOrDefault(); c4Counter.ProcessTokens(); Console.WriteLine("Displaying the latest dashboard of counters and their tokens. Please wait..."); var latestDashBoard = bank.GetTokensGetDisplay(); //Display dashboard to bank employee Console.WriteLine("========================================"); Console.WriteLine("\tCOUNTER\t\tTOKEN"); Console.WriteLine("========================================"); foreach (var counter in latestDashBoard) { Console.WriteLine(string.Format("\t{0}" + "\t\t" + "{1}", counter.Item1, counter.Item2)); } Console.WriteLine("========================================"); Console.ReadKey(); } catch (Exception ex) { Console.WriteLine(ex.Message); } }