/*
 * Auftrag an ChatGPT:
 * 
 * Schreibe mir ein einfaches Testprogramm (keine Test-Unit!) 
 * für die Methoden der generischen Klasse MyArrayList.
 * 
 * Es sollen drei Listen angelegt werden:
 * 
 * private MyArrayList<String> wortliste;
 * private MyArrayList<Punkt>  punktliste;
 * private MyArrayList<Name>   namensliste;
 * 
 * Die Methoden sollen getestet werden, 
 * und natürlich auch die Fehlerbehandlung mit try-catch.
 * 
 * ===================================================================
 * Hier der von ChatGPT erzeugte Quelltext
 */

public class TestMyArrayList
{
    private MyArrayList<String> wortliste;
    private MyArrayList<Punkt>  punktliste;
    private MyArrayList<Name>   namensliste;

    public TestMyArrayList()
    {
        wortliste = new MyArrayList<String>(5);
        punktliste = new MyArrayList<Punkt>(5);
        namensliste = new MyArrayList<Name>(5);

        testeWortliste();
        testePunktliste();
        testeNamensliste();
        testeFehlerbehandlung();
    }

    private void testeWortliste()
    {
        System.out.println("========================================");
        System.out.println("Test der Wortliste");
        System.out.println("========================================");

        wortliste.add("Rot");
        wortliste.add("Gruen");
        wortliste.add("Blau");
        wortliste.add("Gelb");

        ausgabeListe(wortliste, "wortliste nach add(...)");

        wortliste.add(2, "Orange");
        ausgabeListe(wortliste, "wortliste nach add(2, \"Orange\")");

        System.out.println("get(3): " + wortliste.get(3));

        wortliste.set(1, "Schwarz");
        ausgabeListe(wortliste, "wortliste nach set(1, \"Schwarz\")");

        System.out.println("contains(\"Blau\"): " + wortliste.contains("Blau"));
        System.out.println("contains(\"Weiss\"): " + wortliste.contains("Weiss"));

        System.out.println("indexOf(\"Orange\"): " + wortliste.indexOf("Orange"));
        System.out.println("indexOf(\"Pink\"):   " + wortliste.indexOf("Pink"));

        wortliste.remove(2);
        ausgabeListe(wortliste, "wortliste nach remove(2)");

        System.out.println("isEmpty(): " + wortliste.isEmpty());
        System.out.println("size():    " + wortliste.size());
        System.out.println("capacity(): " + wortliste.capacity());

        wortliste.clear();
        ausgabeListe(wortliste, "wortliste nach clear()");
        System.out.println("isEmpty(): " + wortliste.isEmpty());
        System.out.println();
    }

    private void testePunktliste()
    {
        System.out.println("========================================");
        System.out.println("Test der Punktliste");
        System.out.println("========================================");

        Punkt p1 = new Punkt(10, 20);
        Punkt p2 = new Punkt(30, 40);
        Punkt p3 = new Punkt(50, 60);

        punktliste.add(p1);
        punktliste.add(p2);
        punktliste.add(p3);

        ausgabeListe(punktliste, "punktliste nach add(...)");

        punktliste.set(1, new Punkt(99, 88));
        ausgabeListe(punktliste, "punktliste nach set(1, new Punkt(99, 88))");

        System.out.println("get(0): " + punktliste.get(0));
        System.out.println("contains(new Punkt(50, 60)): "
                           + punktliste.contains(new Punkt(50, 60)));
        System.out.println("indexOf(new Punkt(10, 20)):  "
                           + punktliste.indexOf(new Punkt(10, 20)));

        punktliste.remove(0);
        ausgabeListe(punktliste, "punktliste nach remove(0)");
        System.out.println();
    }

    private void testeNamensliste()
    {
        System.out.println("========================================");
        System.out.println("Test der Namensliste");
        System.out.println("========================================");

        Name n1 = new Name("Anna", "Maibaum");
        Name n2 = new Name("Karl", "Meyer");
        Name n3 = new Name("Lena", "Schulz");

        namensliste.add(n1);
        namensliste.add(n2);
        namensliste.add(n3);

        ausgabeListe(namensliste, "namensliste nach add(...)");

        namensliste.add(1, new Name("Tim", "Becker"));
        ausgabeListe(namensliste, "namensliste nach add(1, new Name(...))");

        System.out.println("get(2): " + namensliste.get(2));

        namensliste.set(0, new Name("Eva", "Sommer"));
        ausgabeListe(namensliste, "namensliste nach set(0, new Name(...))");

        System.out.println("contains(new Name(\"Karl\", \"Meyer\")): "
                           + namensliste.contains(new Name("Karl", "Meyer")));
        System.out.println("indexOf(new Name(\"Lena\", \"Schulz\")): "
                           + namensliste.indexOf(new Name("Lena", "Schulz")));

        namensliste.remove(1);
        ausgabeListe(namensliste, "namensliste nach remove(1)");
        System.out.println();
    }

    private void testeFehlerbehandlung()
    {
        System.out.println("========================================");
        System.out.println("Test der Fehlerbehandlung");
        System.out.println("========================================");

        try
        {
            wortliste.get(0);
        }
        catch (IndexOutOfBoundsException e)
        {
            System.out.println("Fehler bei get(0) auf leerer wortliste:");
            System.out.println(e.getMessage());
        }

        try
        {
            wortliste.add(null);
        }
        catch (IllegalArgumentException e)
        {
            System.out.println("Fehler bei add(null):");
            System.out.println(e.getMessage());
        }

        try
        {
            punktliste.set(10, new Punkt(1, 2));
        }
        catch (IndexOutOfBoundsException e)
        {
            System.out.println("Fehler bei set(10, ...):");
            System.out.println(e.getMessage());
        }

        try
        {
            namensliste.remove(-1);
        }
        catch (IndexOutOfBoundsException e)
        {
            System.out.println("Fehler bei remove(-1):");
            System.out.println(e.getMessage());
        }

        try
        {
            namensliste.add(99, new Name("Max", "Mueller"));
        }
        catch (IndexOutOfBoundsException e)
        {
            System.out.println("Fehler bei add(99, ...):");
            System.out.println(e.getMessage());
        }

        try
        {
            punktliste.indexOf(null);
        }
        catch (IllegalArgumentException e)
        {
            System.out.println("Fehler bei indexOf(null):");
            System.out.println(e.getMessage());
        }

        System.out.println();
    }

    private <T> void ausgabeListe(MyArrayList<T> liste, String titel)
    {
        System.out.println("--- " + titel + " ---");
        System.out.println("size = " + liste.size()
                           + ", capacity = " + liste.capacity());

        for (int i = 0; i < liste.size(); i++)
            System.out.println("Index " + i + ": " + liste.get(i));

        if (liste.isEmpty())
            System.out.println("(Liste ist leer)");

        System.out.println();
    }

    public static void main(String[] args)
    {
        new TestMyArrayList();
    }
}