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