#ifdef TEST
#include "unity.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "Springer.h"
#include "Schachbrett.h"
#include "Spieler.h"

void test_istzugerlaubt_Springer_LegalMove(void) {
    char **Brett = Schachbrett_erstellen();

    // Viele Test um legale Züge zu prüfen
    TEST_ASSERT_TRUE(istzugerlaubt_Springer(Brett, 1, 0, 0, 2, PLAYER_WHITE));
    TEST_ASSERT_TRUE(istzugerlaubt_Springer(Brett, 1, 0, 2, 2, PLAYER_WHITE));
    TEST_ASSERT_TRUE(istzugerlaubt_Springer(Brett, 4, 3, 3, 5, PLAYER_WHITE));
    TEST_ASSERT_TRUE(istzugerlaubt_Springer(Brett, 4, 3, 2, 2, PLAYER_WHITE));
    TEST_ASSERT_TRUE(istzugerlaubt_Springer(Brett, 4, 3, 6, 2, PLAYER_BLACK));
    TEST_ASSERT_TRUE(istzugerlaubt_Springer(Brett, 6, 7, 5, 5, PLAYER_BLACK));
    TEST_ASSERT_TRUE(istzugerlaubt_Springer(Brett, 6, 7, 7, 5, PLAYER_BLACK));
    TEST_ASSERT_TRUE(istzugerlaubt_Springer(Brett, 4, 3, 5, 5, PLAYER_BLACK));

    Schachbrettspeicher_freigeben(Brett);
}
void test_istzugerlaubt_Springer_IllegalMove(void) {
    char **Brett = Schachbrett_erstellen();

    // Landet auf eigener Figur
    TEST_ASSERT_FALSE(istzugerlaubt_Springer(Brett, 6, 7, 4, 6, PLAYER_BLACK));
    TEST_ASSERT_FALSE(istzugerlaubt_Springer(Brett, 1, 7, 3, 6, PLAYER_BLACK));
    TEST_ASSERT_FALSE(istzugerlaubt_Springer(Brett, 6, 0, 4, 1, PLAYER_WHITE));
    TEST_ASSERT_FALSE(istzugerlaubt_Springer(Brett, 1, 0, 3, 1, PLAYER_WHITE));

    // versucht sich geradeaus zu bewegen
    TEST_ASSERT_FALSE(istzugerlaubt_Springer(Brett, 1, 0, 1, 3, PLAYER_WHITE));

    // Versucht Diagonal zu bewegen
    TEST_ASSERT_FALSE(istzugerlaubt_Springer(Brett, 7, 0, 6, 1, PLAYER_WHITE));

    // Vom Brett springen
    TEST_ASSERT_FALSE(istzugerlaubt_Springer(Brett, 7, 0, 8, 2, PLAYER_WHITE));

    Schachbrettspeicher_freigeben(Brett);
}
void test_bewegeSpringer(void) {
    char **Brett = Schachbrett_erstellen();
    bool Ergebnis;

    // Scenario 1: Legaler Zug, weißer Springer von b1 zu c3
    Ergebnis = bewegeSpringer(Brett, 1, 0, 2, 2, PLAYER_WHITE);
    TEST_ASSERT_TRUE(Ergebnis);
    TEST_ASSERT_EQUAL_CHAR('N', Brett[2][2]);
    TEST_ASSERT_EQUAL_CHAR(' ', Brett[0][1]);

    Schachbrettspeicher_freigeben(Brett);
    Brett = Schachbrett_erstellen();

    // Scenario 2: Illegaler Zug , vom Brett
    Ergebnis = bewegeSpringer(Brett, 7, 6, 8, 8, PLAYER_WHITE);
    TEST_ASSERT_FALSE(Ergebnis);

    // Scenario 3: Legaler Zug, schwarzer Springer von g8 zu f6
    Ergebnis = bewegeSpringer(Brett, 6, 7, 5, 5, PLAYER_BLACK);
    TEST_ASSERT_TRUE(Ergebnis);
    TEST_ASSERT_EQUAL_CHAR('n', Brett[5][5]);
    TEST_ASSERT_EQUAL_CHAR(' ', Brett[7][6]);

    Schachbrettspeicher_freigeben(Brett);
    Brett = Schachbrett_erstellen();

  // Scenario 4: Illegaler Zug, schwarzer Springer bewegt sich auf andere schwarze Figur
    Brett[5][5] = 'n'; // ein anderer Springer als Hindernis
    Ergebnis = bewegeSpringer(Brett, 6, 7, 5, 5, PLAYER_BLACK);
    TEST_ASSERT_FALSE(Ergebnis);

    // Scenario 5: Legaler Zug zum einnehmen feindlicher Figur
    Brett[5][5] = 'P'; // Weißer Bauer auf F6
    Ergebnis = bewegeSpringer(Brett, 6, 7, 5, 5, PLAYER_BLACK);
    TEST_ASSERT_TRUE(Ergebnis);
    TEST_ASSERT_EQUAL_CHAR('n', Brett[5][5]);

    Schachbrettspeicher_freigeben(Brett);
}
#endif // TEST