import org.junit.jupiter.api.Test;
// import static org.junit.Assert.assertNull;
import static org.junit.jupiter.api.Assertions.*;

import java.io.*;

public class Test_Passwort_Check {
 @Test
    public void testPasswortZuKurz() {
        assertFalse(Passwort_Check.checkLaenge("Hello Wolrd"));
        assertFalse(Passwort_Check.checkLaenge("qwertzuiopasdfghjkl"));
        assertFalse(Passwort_Check.checkLaenge("1234567890qwertzuio"));

    }
     @Test
    public void testPasswortKleinBuchstaben() {
        assertFalse(Passwort_Check.checkKleinBuchstaben("HELLO!WorLD!ICHLIEBEJAVA"));
        assertFalse(Passwort_Check.checkKleinBuchstaben("QWERTZUoPlYXCVBNMLKJHGFDS"));
        assertFalse(Passwort_Check.checkKleinBuchstaben("1234567890QWERTZUIOP"));

    }
    @Test
    public void testPasswortGrossBuchstaben(){
        assertFalse(Passwort_Check.checkKleinBuchstaben("HelloWorldichliebejava"));
    }
}
public class Passwort_CheckTest {

    @Test
    public void testCheckLaenge() {
        assertFalse(Passwort_Check.checkLaenge("KurzesPasswort123!")); // < 20
        assertTrue(Passwort_Check.checkLaenge("LangesPasswortMit123!@#")); // >= 20
    }

    @Test
    public void testCheckKleinBuchstaben() {
        assertFalse(Passwort_Check.checkKleinBuchstaben("ABCDEF123!@#")); // keine Kleinbuchstaben
        assertFalse(Passwort_Check.checkKleinBuchstaben("aB123")); // nur 1 Kleinbuchstabe
        assertTrue(Passwort_Check.checkKleinBuchstaben("abcDEF123!@#")); // 3 Kleinbuchstaben
    }

    @Test
    public void testCheckGrossBuchstaben() {
        assertFalse(Passwort_Check.checkGrossBuchstaben("abcdef123!@#")); // keine Großbuchstaben
        assertFalse(Passwort_Check.checkGrossBuchstaben("aB123")); // nur 1 Großbuchstabe
        assertTrue(Passwort_Check.checkGrossBuchstaben("ABCdef123!@#")); // 3 Großbuchstaben
    }

    @Test
    public void testCheckZiffer() {
        assertFalse(Passwort_Check.checkZiffer("abcdefABC!@#")); // keine Ziffern
        assertFalse(Passwort_Check.checkZiffer("aB1")); // nur 1 Ziffer
        assertTrue(Passwort_Check.checkZiffer("abcABC123!@#")); // 3 Ziffern
    }

    @Test
    public void testCheckSonderZeichen() {
        assertFalse(Passwort_Check.checkSonderZeichen("abcABC123")); // keine Sonderzeichen
        assertFalse(Passwort_Check.checkSonderZeichen("abcABC123!@")); // nur 2 Sonderzeichen
        assertTrue(Passwort_Check.checkSonderZeichen("abcABC123!@#")); // 3 Sonderzeichen
    }
}



public class Passwort_CheckIntegrationTest {

    @Test
    public void testMainMitUnsicheremUndSicheremPasswort() {
        // Simulierte Benutzereingaben (1. Versuch unsicher, 2. Versuch sicher)
        String simulatedInput = String.join("\n",
                "kurz123", // zu kurz
                "PasswortMit2BUCHSTABEN", // kein Sonderzeichen, keine Ziffern
                "AbcAbcAbc123!@#", // zu kurz
                "abcABC123!@#abcABC123!@#", // gültiges Passwort
                ""
        );

        // Eingabe simulieren
        ByteArrayInputStream in = new ByteArrayInputStream(simulatedInput.getBytes());
        System.setIn(in);

        // Ausgabe abfangen
        ByteArrayOutputStream outContent = new ByteArrayOutputStream();
        PrintStream originalOut = System.out;
        System.setOut(new PrintStream(outContent));

        // Main-Methode ausführen
        Passwort_Check.main(new String[]{});

        // Wiederherstellen der Originalstreams
        System.setOut(originalOut);
        System.setIn(System.in);

        String output = outContent.toString();

        // Wichtige Ausgaben überprüfen
        assertTrue(output.contains("Passwort ist zu kurz!"));
        assertTrue(output.contains("Es fehlen Ziffern!") || output.contains("Es fehlen Sonderzeichen!"));
        assertTrue(output.contains("Passwort ist sicher."));
        assertTrue(output.contains("...und Tschüss"));
    }
}

