/**
    Diese Klasse macht einen einfachen Blackboxtest von CheckingAccount.
    Jeder Konstruktor und jede Operation wird durch mindestens einen
    Aufruf getestet.
    Bei Fallunterscheidungen wird jeder Fall einmal getestet.
    Auserdem werden die Werte in den Grenzbereichen geprueft.

    @author info2
    @version 1.1
*/
public class CheckingAccountOpsTest
{ /**
      Die Operation main fuehrt die Blackboxtestfaelle aus.
  */
    public static void main (String[] args)
    {   //Test des Konstruktors CheckingAccount(double initialbalance)
        System.out.println("Test des Konstruktors CheckingAccount(amount):"+
                   " Erzeugung eines CheckingAcc-Objekts mit Kontostand 2000 für girokonto");
        System.out.println("Erwartetes Ergebnis: balance = 2000.0, transactionCount = 0");
        CheckingAccount girokonto = new CheckingAccount(2000);
        System.out.println("Zustand von girokonto: "+girokonto.toString());

        //Test des Konstruktors CheckingAccount()
        System.out.println("Test des Konstruktors CheckingAccount():"+
                   " Erzeugung eines CheckingAcc-Objekts  für girokonto1");
        System.out.println("Erwartetes Ergebnis: balance = 0.0, transactionCount = 0");
        CheckingAccount girokonto1 = new CheckingAccount();
        System.out.println("Zustand von girokonto1: "+girokonto1.toString());

        //Test von transferTo
        System.out.println("Zustand von girokonto: "+girokonto.toString());
        System.out.println("Erwartetes Ergebnis: " +
                   "girokonto: balance = 1500.0, transactionCount = 1" +  '\n' +
                   "girokonto1: balance = 500.0, transactionCount = 1");
        girokonto.transferTo(girokonto1, 500); //dyn. Bindung!
        System.out.println("Zustand von girokonto1: "+girokonto1.toString());
        System.out.println("Zustand von girokonto: "+girokonto.toString());

        //Test von withdraw
        System.out.println("Aufruf von girokonto.withdraw(500)");
        System.out.println("Erwartetes Ergebnis: balance = 1000.0, transactionCount = 2");
        girokonto.withdraw(500);
        System.out.println("Zustand von girokonto: "+girokonto.toString());

        //Test von deposit
        System.out.println("Aufruf von girokonto.deposit(200)");
        System.out.println("Erwartetes Ergebnis: balance = 1200.0, transactionCount = 3");
        girokonto.deposit(200);              //dyn. Bindung!
        System.out.println("Zustand von girokonto: "+girokonto.toString());

        //Test von deductFees
        System.out.println("Test von deductFees "+
                   " mit Kosten, ohne Kosten und an der Grenze");

        //deductFees Testfall: transactionCount > FREE_TRANSACTIONS
        System.out.println("2 Aufrufe von girokonto.withdraw(500)");
        girokonto.withdraw(500);              //dyn. Bindung!
        girokonto.withdraw(500);              //dyn. Bindung!
        System.out.println("Zustand von girokonto: "+girokonto.toString());
        System.out.println("Aufruf von girokonto.deductFees()nach insgesamt 5 Transaktionen");
        System.out.println("Erwartetes Ergebnis: balance = 198.5, transactionCount = 0");
        girokonto.deductFees();
        System.out.println("Zustand von girokonto: "+girokonto.toString());

        //deductFees Testfall: transactionCount < FREE_TRANSACTIONS
        System.out.println("Aufruf von girokonto.deductFees()nach insgesamt 0 Transaktionen");
        System.out.println("Erwartetes Ergebnis: balance = 198.5, transactionCount = 0");
        girokonto.deductFees();
        System.out.println("Zustand von girokonto: "+girokonto.toString());

        //deductFees Grenztestfall: transactionCount = FREE_TRANSACTIONS
        System.out.println("2 Aufrufe von girokonto.deposit(500)");
        girokonto.deposit(500);              //dyn. Bindung!
        girokonto.deposit(500);              //dyn. Bindung!
        System.out.println("Zustand von girokonto: "+girokonto.toString());
        System.out.println("Aufruf von girokonto.deductFees()nach insgesamt 2 Transaktionen");
        System.out.println("Erwartetes Ergebnis: balance =1198.5, transactionCount = 0");
        girokonto.deductFees();
        System.out.println("Zustand von girokonto: "+girokonto.toString());

        //deductFees Grenztestfall: transactionCount = FREE_TRANSACTIONS+1
        System.out.println("3 Aufrufe von girokonto.deposit(500)");
        girokonto.deposit(500);              //dyn. Bindung!
        girokonto.deposit(500);              //dyn. Bindung!
        girokonto.deposit(500);              //dyn. Bindung!
        System.out.println("Zustand von girokonto: "+girokonto.toString());
        System.out.println("Aufruf von girokonto.deductFees()nach insgesamt 3 Transaktionen");
        System.out.println("Erwartetes Ergebnis: balance =2698.0, transactionCount = 0");
        girokonto.deductFees();
        System.out.println("Zustand von girokonto: "+girokonto.toString());

        //Test von toString; eigentlich ueberfluessig, da in den vorherigen Tests enthalten
        System.out.println("Aufruf von girokonto.toString(): "+ '\n' +
                   "Erwartetes Ergebnis: CheckingAccount[balance =2698.0, transactionCount = 0]");
        System.out.println(girokonto.toString());

     }
}

