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

import org.junit.jupiter.api.Test;

class BankAccountTest {

    @Test
    void withdrawWithEnoughBalance() throws InsufficientFundsException {
        BankAccount account = new BankAccount("C-01");
        account.deposit(500);
        account.withdraw(200);
        assertEquals(300, account.balance());
    }

    @Test
    void withdrawTooMuchKeepsDataAndBalance() {
        BankAccount account = new BankAccount("C-01");
        account.deposit(500);
        InsufficientFundsException e =
                assertThrows(InsufficientFundsException.class, () -> account.withdraw(800));
        assertEquals(500, e.balance());
        assertEquals(800, e.requested());
        assertEquals(500, account.balance());   // el saldo no cambió
    }

    @Test
    void rejectsNonPositiveDeposit() {
        BankAccount account = new BankAccount("C-01");
        IllegalArgumentException e =
                assertThrows(IllegalArgumentException.class, () -> account.deposit(0));
        assertEquals("monto no positivo: 0", e.getMessage());
    }

    @Test
    void rejectsNullId() {
        assertThrows(NullPointerException.class, () -> new BankAccount(null));
    }
}
