
class BankTests {

    public static void main(String[] args) {
        new BankTests().run();
    }

    void run() {
        try {
            header("Testar klassen Account");
            testAccount();
            header("Testar klassen Bank");
            testBank();
        } catch (Exception e) {
            System.out.println("Testerna avbröts...: " + e.toString());
        }
    }

    void header(String text) {
        System.out.println();
        System.out.println("==== " + text + " ====");
        System.out.println();
    }

    void test(boolean condition, String message) {
        System.out.println((condition ? " OK" : "FEL") + ": " + message);
        if (!condition) {
            throw new RuntimeException("Fel i test");
        }
    }

    boolean equals(double x, double y) {
        return Math.abs(x - y) < 0.001;
    }

    void testAccount() {
        Account acc1 = new Account(1010);
        Account acc2 = new Account(1020);
        test(acc1.getAccountNumber() == 1010, "Kontonummer");
        test(acc2.getAccountNumber() == 1020, "Kontonummer");
        test(equals(acc1.getBalance(), 0), "Startsaldo");
        test(equals(acc2.getBalance(), 0), "Startsaldo");
        test(equals(acc1.deposit(-100), 0), "Felaktig insättning");
        test(equals(acc1.getBalance(), 0), "Saldo efter otillåten insättning");
        test(equals(acc1.deposit(100), 100), "Insättning på tomt konto");
        test(equals(acc1.getBalance(), 100), "Insättning och saldo på tomt konto");
        test(equals(acc1.deposit(50), 50), "Vanlig insättning");
        test(equals(acc1.getBalance(), 150), "Vanlig insättning och saldo");
        test(equals(acc2.getBalance(), 0), "Saldo på tomt konto efter insättning på annat konto");
        test(equals(acc1.withdraw(100), 100), "Vanligt uttag");
        test(equals(acc1.getBalance(), 50), "Vanligt uttag och saldo");
        test(equals(acc1.withdraw(200), 50), "Övertrassering");
        test(equals(acc1.getBalance(), 0), "Saldo efter övertrassering");
        test(equals(acc1.deposit(50), 50), "Vanlig insättning efter övertrassering");
        test(equals(acc1.getBalance(), 50), "Saldo efter övertrassering");
    }

    void testBank() {
        Bank bank1 = new Bank();
        Bank bank2 = new Bank();
        test(!bank1.hasAccount(1010), "Hittar inte konto som inte finns");
        test(bank1.createAccount(1010), "Kan skapa konto med nytt kontonummer");
        test(bank1.createAccount(1020), "Kan skapa konto med nytt kontonummer");
        test(!bank1.createAccount(1010), "Kan inte skapa konto med gammalt kontonummer");
        test(!bank1.createAccount(1020), "Kan inte skapa konto med gammalt kontonummer");

        test(!bank2.hasAccount(1010), "Hittar inte konto som inte finns (ny bank)");
        test(bank2.createAccount(1010), "Kan skapa konto med nytt kontonummer (ny bank)");
        test(bank2.createAccount(1020), "Kan skapa konto med nytt kontonummer (ny bank)");
        test(!bank2.createAccount(1010), "Kan inte skapa konto med gammalt kontonummer (ny bank)");
        test(!bank2.createAccount(1020), "Kan inte skapa konto med gammalt kontonummer (ny bank)");

        test(equals(bank1.deposit(1010, -100), 0), "Felaktig insättning på tomt konto");
        test(equals(bank1.getBalance(1010), 0), "Saldo efter felaktig insättning på tomt konto");

        test(equals(bank1.deposit(1010, 100), 100), "Korrekt insättning på tomt konto");
        test(equals(bank1.getBalance(1010), 100), "Saldo efter insättning på tomt konto");

        test(equals(bank1.deposit(1010, 350), 350), "Korrekt insättning på konto med pengar");
        test(equals(bank1.getBalance(1010), 450), "Saldo efter insättning på konto med pengar");

        test(equals(bank1.deposit(1010, -100), 0), "Felaktig insättning på konto med pengar");
        test(equals(bank1.getBalance(1010), 450), "Saldo efter felaktig insättning på konto med pengar");

        test(equals(bank1.withdraw(1010, 350), 350), "Korrekt uttag på konto med pengar");
        test(equals(bank1.getBalance(1010), 100), "Saldo efter uttag på konto med pengar");

        test(bank1.withdraw(1050, 100) < 0, "Inget uttag från konto som inte finns");
    }
}
