package inheritance;

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 SavingsAccount2Test {
	private SavingsAccount2 sub;
	private static double epsilon = 0.0005d;

	@BeforeEach
	public void setUp() {
		sub = new SavingsAccount2(1, 50.0);
	}

	@Test
	@DisplayName("Sjekk at innskudd fungerer som det skal")
	void testDeposit() {
		assertEquals(0.0, sub.getBalance(), epsilon, "Saldoen på kontoen ble feil");
		sub.deposit(10000.0);
		assertEquals(10000.0, sub.getBalance(), epsilon, "Saldoen på kontoen ble feil");
		assertThrows(IllegalArgumentException.class, () -> {
			sub.deposit(-10000.0);
		}, "Negativt innskudd burde utløst IllegalArugment-unntak!");
		assertEquals(10000.0, sub.getBalance(), epsilon, "Saldoen på kontoen ble feil");
	}

	@Test
	@DisplayName("Sjekk at uttak fungerer som det skal")
	void testWithdraw() {
		sub.deposit(20000.0);
		sub.withdraw(5000.0);
		assertEquals(15000.0, sub.getBalance(), epsilon, "Saldoen på kontoen ble feil");
		assertThrows(IllegalArgumentException.class, () -> {
			sub.withdraw(-10000.0);
		}, "Negativt uttak burde utløst IllegalArugment-unntak!");
		assertEquals(15000.0, sub.getBalance(), epsilon, "Saldoen på kontoen ble feil");
		assertThrows(IllegalStateException.class, () -> {
			sub.withdraw(20000.0);
		}, "Uttak på mer enn saldo burde utløst IllegalState-unntak");
		assertEquals(15000.0, sub.getBalance(), epsilon, "Saldoen på kontoen ble feil");
		sub.withdraw(10000.0);
		assertEquals(4950.0, sub.getBalance(), epsilon, "Saldoen på kontoen ble feil etter at gebyret var trukket fra");
		assertThrows(IllegalStateException.class, () -> {
			sub.withdraw(4930.0);
		}, "Uttak på mer enn saldo + gebyr burde utløst IllegalState-unntak");
		assertEquals(4950.0, sub.getBalance(), epsilon, "Saldoen på kontoen ble feil etter at gebyret var trukket fra");
	}

}