package bank;

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

import org.junit.jupiter.api.Test;

class MoneyTest {

    @Test
    void plusAddsCents() {
        Money total = Money.soles(1_050).plus(Money.soles(250));

        assertEquals(1_300, total.cents());
        assertEquals("PEN", total.currency());
    }

    @Test
    void plusDoesNotChangeTheOriginal() {
        Money price = Money.soles(1_050);

        price.plus(Money.soles(250));

        assertEquals(1_050, price.cents());
    }

    @Test
    void recordsWithSameComponentsAreEqual() {
        // equals lo genera el record: compara componentes, no referencias.
        assertEquals(new Money(1_300, "PEN"), Money.soles(1_300));
    }

    @Test
    void rejectsNegativeCents() {
        assertThrows(IllegalArgumentException.class, () -> new Money(-1, "PEN"));
    }

    @Test
    void rejectsInvalidCurrencyCode() {
        assertThrows(IllegalArgumentException.class, () -> new Money(100, "SOLES"));
    }

    @Test
    void rejectsMixedCurrencies() {
        Money soles = Money.soles(100);
        Money dollars = new Money(100, "USD");

        assertThrows(IllegalArgumentException.class, () -> soles.plus(dollars));
    }
}
