package banking;

import dev.banking.model.BankAccount;
import org.junit.jupiter.api.Test;

import java.util.concurrent.*;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class BankAccountDepositWithdrawRaceTest {

    @Test
    void concurrentDepositWithdraw() throws Exception {

        BankAccount account = new BankAccount(1, 1_000_000);

        ExecutorService executor = Executors.newFixedThreadPool(100);
        CountDownLatch latch = new CountDownLatch(100);

        for (int i = 0; i < 50; i++) {

            executor.submit(() -> {
                for (int j = 0; j < 10_000; j++) {
                    account.deposit(1);
                }
                latch.countDown();
            });

            executor.submit(() -> {
                for (int j = 0; j < 10_000; j++) {
                    account.withdraw(1);
                }
                latch.countDown();
            });
        }

        latch.await();
        executor.shutdown();

        assertEquals(1_000_000, account.getBalance());
    }
}