Exemplo n.º 1
0
        public async Task CanWithDrawAndTopupFromMultiplePlacesSameTime()
        {
            var cashCard   = new CashCard(GetMockValidator(), MOCK_CARDNUMBER);
            var prebalance = cashCard.Balance;
            await cashCard.TopupBalance(MOCK_PIN, 2300M);

            Assert.AreEqual(cashCard.Balance, decimal.Add(prebalance, 2300M));

            List <Task> tasksArray = new List <Task>();

            int totalCounter = 100;

            for (int index = 1; index <= totalCounter; index++)
            {
                if (index % 5 == 0)
                {
                    tasksArray.Add(Task.Factory.StartNew(async() => { await cashCard.Withdraw(MOCK_PIN, 500M); }));
                }
                else
                {
                    tasksArray.Add(Task.Factory.StartNew(async() => { await cashCard.TopupBalance(MOCK_PIN, 200M); }));
                }
            }

            var task = Task.Factory.ContinueWhenAll(tasksArray.ToArray(),
                                                    innerTasks =>
            {
                foreach (var innerTask in innerTasks)
                {
                    Assert.That(innerTask.IsFaulted, Is.False);
                }
                Assert.AreEqual(cashCard.Balance, 6000M);
            });
        }
 public async Task CanTopupArbitraryAmount()
 {
     var cashCard = new CashCard(GetMockValidator(),MOCK_CARDNUMBER);
     var prebalance = cashCard.Balance;
     var result = await cashCard.TopupBalance(MOCK_PIN, 200M);
     Assert.That(result, Is.True);
     Assert.AreEqual(decimal.Add(prebalance, 200M), cashCard.Balance);
 }
Exemplo n.º 3
0
        public async Task TopUpFailOnMaxDecimalAmount()
        {
            var cashCard   = new CashCard(GetMockValidator(), MOCK_CARDNUMBER);
            var prebalance = cashCard.Balance;
            var result     = await cashCard.TopupBalance(MOCK_PIN, decimal.MaxValue);

            Assert.That(result, Is.False);
            Assert.AreEqual(prebalance, cashCard.Balance);
        }
 public async Task TopupFailOnFailedPinVerification()
 {
     int invalidPin = MOCK_PIN + 900; 
     var cashCard = new CashCard(GetMockValidator(), MOCK_CARDNUMBER);
     var prebalance = cashCard.Balance;
     var result = await cashCard.TopupBalance(invalidPin, 200M);
     Assert.That(result, Is.False);
     Assert.AreEqual(prebalance, cashCard.Balance);
 }
Exemplo n.º 5
0
        public void CanTopupFromMultiplePlacesSameTime()
        {
            var cashCard   = new CashCard(GetMockValidator(), MOCK_CARDNUMBER);
            var prebalance = cashCard.Balance;

            Task task1 = Task.Factory.StartNew(async() => { await cashCard.TopupBalance(MOCK_PIN, 500M); });
            Task task2 = Task.Factory.StartNew(async() => { await cashCard.TopupBalance(MOCK_PIN, 800M); });
            Task task3 = Task.Factory.StartNew(async() => { await cashCard.TopupBalance(MOCK_PIN, 900M); });

            var task = Task.Factory.ContinueWhenAll(
                new[] { task1, task2, task3 },
                innerTasks =>
            {
                foreach (var innerTask in innerTasks)
                {
                    Assert.That(innerTask.IsFaulted, Is.False);
                }
                Assert.AreEqual(cashCard.Balance, decimal.Add(prebalance, 2300M));
            });
        }
 public async Task CanWithdrawAmountWhenSufficientBalance()
 {
     var cashCard = new CashCard(GetMockValidator(), MOCK_CARDNUMBER);
     var prebalance = cashCard.Balance;
     var result = await cashCard.TopupBalance(MOCK_PIN, 200M);
     Assert.That(result, Is.True);
     Assert.AreEqual(decimal.Add(prebalance, 200M), cashCard.Balance);
     prebalance = cashCard.Balance;
     result = await cashCard.Withdraw(MOCK_PIN, 100M);
     Assert.That(result, Is.True);
     Assert.AreEqual(decimal.Subtract(prebalance, 100M), cashCard.Balance);
 }
        public async Task WithdrawFailOnPinVerificationFailure()
        {
            var cashCard = new CashCard(GetMockValidator(), MOCK_CARDNUMBER);
            var prebalance = cashCard.Balance;
            var result = await cashCard.TopupBalance(MOCK_PIN, 200M);
            Assert.That(result, Is.True);
            Assert.AreEqual(decimal.Add(prebalance, 200M), cashCard.Balance);
            prebalance = cashCard.Balance;

            int invalidPin = MOCK_PIN + 900;
            result = await cashCard.Withdraw(invalidPin, 100M);
            Assert.That(result, Is.False);
            Assert.AreEqual(prebalance, cashCard.Balance);
        }
        public async Task CanWithDrawFromMultiplePlacesSameTime()
        {
            var cashCard = new CashCard(GetMockValidator(), MOCK_CARDNUMBER);
            var prebalance = cashCard.Balance;
            await cashCard.TopupBalance(MOCK_PIN, 900M);
            Assert.AreEqual(cashCard.Balance, decimal.Add(prebalance, 900M));

            
            Task innerTask1 = Task.Factory.StartNew(async () => { await cashCard.Withdraw(MOCK_PIN, 100M ); });
            Task innerTask2 = Task.Factory.StartNew(async () => { await cashCard.Withdraw(MOCK_PIN, 300M ); });
            Task innerTask3 = Task.Factory.StartNew(async () => { await cashCard.Withdraw(MOCK_PIN, 400M ); });

            var task = Task.Factory.ContinueWhenAll(
                new[] { innerTask1, innerTask2, innerTask3 },
                innerTasks =>
                {
                    foreach (var innerTask in innerTasks)
                        Assert.That(innerTask.IsFaulted, Is.False);
                    Assert.AreEqual(cashCard.Balance, decimal.Subtract(prebalance, 800M));
                });
        }