예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #5
0
        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());
        }
예제 #6
0
        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);
            }
        }