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 BankAccountTransferConsistencyTest {

    @Test
    void transferConservation() throws Exception {

        BankAccount a = new BankAccount(1, 100_000);
        BankAccount b = new BankAccount(2, 100_000);

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

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

            executor.submit(() -> {
                for (int j = 0; j < 1000; j++) {
                    a.transfer(b, 1);
                }
                latch.countDown();
            });

            executor.submit(() -> {
                for (int j = 0; j < 1000; j++) {
                    b.transfer(a, 1);
                }
                latch.countDown();
            });
        }

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

        long total = a.getBalance() + b.getBalance();

        assertEquals(200_000, total);
    }
}