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

public class Test_Passwort_Check {

    @Test
    public void testCheckLaenge() {
        // Länge ist zu kurz
        assertFalse(Passwort_Check.checkLaenge("KurzesPasswort123!"));
        assertFalse(Passwort_Check.checkLaenge("Hello Wolrd"));
        assertFalse(Passwort_Check.checkLaenge("qwertzuiopasdfghjkl"));
        assertFalse(Passwort_Check.checkLaenge("1234567890qwertzuio"));
        // richtige Länge
        assertTrue(Passwort_Check.checkLaenge("LangesPasswortMit123!@#"));
    }

    @Test
    public void testCheckKleinBuchstaben() {
        // zu wenig Kleinbuchstaben
        assertFalse(Passwort_Check.checkKleinBuchstaben("ABCDEF123!@#")); // keine Kleinbuchstaben
        assertFalse(Passwort_Check.checkKleinBuchstaben("aB123")); // nur 1 Kleinbuchstaben
        assertFalse(Passwort_Check.checkKleinBuchstaben("HELLO!WorLD!ICHLIEBEJAVA")); // nur 2 Kleinbuchstaben

        // genügend Kleinbuchstaben
        assertTrue(Passwort_Check.checkKleinBuchstaben("abc DEF 123!@#"));

    }

    @Test
    public void testCheckGrossBuchstaben() {
        // zu wenig Großbuchstaben
        assertFalse(Passwort_Check.checkGrossBuchstaben("abcdef123!@#")); // keine Grossbuchstaben
        assertFalse(Passwort_Check.checkGrossBuchstaben("aB123")); // nur 1 Grossbuchstaben
        assertFalse(Passwort_Check.checkGrossBuchstaben("aAB123")); // nur 2 Grossbuchstaben
        // mind. 3 Großbuchstaben
        assertTrue(Passwort_Check.checkGrossBuchstaben("ABCdef123!@#"));
        assertTrue(Passwort_Check.checkKleinBuchstaben("HelloWorldichliebejava"));
    }

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

    @Test
    public void testCheckSonderZeichen() {
        // zu wenig Sonderzeichen
        assertFalse(Passwort_Check.checkSonderZeichen("abcABC123")); // keine Sonderzeichen
        assertFalse(Passwort_Check.checkSonderZeichen("abcABC123!")); // nur 1 Sonderzeichen
        assertFalse(Passwort_Check.checkSonderZeichen("abcABC123!@")); // nur 2 Sonderzeichen
        // mind. 3 Sonderzeichen
        assertTrue(Passwort_Check.checkSonderZeichen("abcABC123!@#")); // 3 Sonderzeichen
        // Überprüfung der speziellen Sonderzeichen
        assertTrue(Passwort_Check.checkSonderZeichen("a b c d")); // Leerzeichen als Sonderzeichen

        // Prüfe einzeln alle ASCII-Sonderzeichen (33–47, 58–64, 91–96, 123–126)
        String asciiSonderzeichen = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
        for (int i = 0; i < asciiSonderzeichen.length(); i++) {
            String c = "" + asciiSonderzeichen.charAt(i);
            assertFalse(Passwort_Check.checkSonderZeichen("abcABC123" + c + c)); // nur 2 Sonderzeichen
            assertTrue(Passwort_Check.checkSonderZeichen("abcABC123" + c + c + c)); // 3 identische Sonderzeichen
        }

        String steuerzeichen = "";
        for (int i = 0; i <= 31; i++) {
            steuerzeichen += (char) i;
        }
        steuerzeichen += (char) 127;
        for (int i = 0; i < steuerzeichen.length(); i++) {
            String c = "" + steuerzeichen.charAt(i);
            System.out.println(c);
            assertFalse(Passwort_Check.checkSonderZeichen("abcABC123" + c + c)); // nur 2 Sonderzeichen
            assertFalse(Passwort_Check.checkSonderZeichen("abcABC123" + c + c + c)); // 3 identische Sonderzeichen
        }
        assertFalse(Passwort_Check.checkSonderZeichen("\t\t\t")); // Tab als Sonderzeichen
        assertFalse(Passwort_Check.checkSonderZeichen("\r\r\r")); // Carriage Return als Sonderzeichen
        assertFalse(Passwort_Check.checkSonderZeichen("\n\n\n")); // Line Feed als Sonderzeichen
    }
}
