package oving7.abstractaccount;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

public class DebitAccountTest {

	private static final double epsilon = 0.0005;

	private DebitAccount sub;

	@BeforeEach
	public void setUp() {
		sub = new DebitAccount();
	}

	@Test
	@DisplayName("Check that deposits work as expected")
	public void testDeposit() {
		assertEquals(0.0, sub.getBalance(), epsilon, "The account balance was incorrect");

		sub.deposit(10_000.0);
		assertEquals(10_000.0, sub.getBalance(), epsilon, "The account balance was incorrect");

		assertThrows(IllegalArgumentException.class, () -> {
			sub.deposit(-10_000.0);
		}, "Negative deposit should have triggered an IllegalArgumentException!");

		assertEquals(10_000.0, sub.getBalance(), epsilon, "The account balance was incorrect");
	}

	@Test
	@DisplayName("Check that withdrawals work as expected")
	public void testWithdraw() {
		sub.deposit(20_000.0);
		sub.withdraw(5000.0);
		assertEquals(15_000.0, sub.getBalance(), epsilon, "The account balance was incorrect");

		assertThrows(IllegalArgumentException.class, () -> {
			sub.withdraw(-10_000.0);
		}, "Negative withdrawal should have triggered an IllegalArgumentException!");

		assertEquals(15_000.0, sub.getBalance(), epsilon, "The account balance was incorrect");

		assertThrows(IllegalArgumentException.class, () -> {
			sub.withdraw(20_000.0);
		}, "Withdrawal exceeding the balance should have triggered an IllegalArgumentException");
	}
}
