#ifdef TEST
#include "unity.h"
#include "Schachbrett.h"
#include "Moving.h"
#include "Spieler.h"
#include "Turm.h"
#include "Bauer.h"
#include "Koenig.h"
#include "Springer.h"
#include "Dame.h"
#include "Laeufer.h"
#include <stdlib.h>

void setUp(void) {
}

void tearDown(void) {
}

void test_Bauern_bewegen(void) {
    char** brett = Schachbrett_erstellen();
    int startX = 0;
    int startY = 1;
    int endX = 0;
    int endY = 2;
    Player player = PLAYER_WHITE;
    

    TEST_ASSERT_NOT_NULL(brett);

    machezug( brett, startX, startY, endX, endY, player);

    print_Schachfeld(brett);

    TEST_ASSERT_EQUAL('P', brett[2][0]);
    TEST_ASSERT_EQUAL(' ', brett[1][0]);
    

    for (int i = 0; i < 8; i++) {
        free(brett[i]);
    }
    free(brett);
}

void test_istzugerlaubt_Koenig_Verknuepfung(void) {
     char **Brett = Schachbrett_erstellen();
    Player player = PLAYER_WHITE;
    //Vorbereitung für Test
    Brett[1][4] = ' '; 
    Brett[2][4] = 'p'; 

    // Test bewegung
    TEST_ASSERT_TRUE(istzugerlaubt(Brett, 4, 0, 4, 1, player)); // e1 zu e2
    TEST_ASSERT_TRUE(istzugerlaubt(Brett, 4, 1, 4, 2, player)); // e2 zu e3 (Einnehmen von Figur)

    Schachbrettspeicher_freigeben(Brett);
    Brett = Schachbrett_erstellen();
    player = PLAYER_BLACK;
    //Vorbereitung für Test
    Brett[6][4] = ' ';
    Brett[5][4] = 'P';

    // Test bewegung
    TEST_ASSERT_TRUE(istzugerlaubt(Brett, 4, 7, 4, 6, player)); // e8 zu e7
    TEST_ASSERT_TRUE(istzugerlaubt(Brett, 4, 6, 4, 5, player)); // e7 zu e6 (Einnehmen von Figur)

    Schachbrettspeicher_freigeben(Brett);
}

void test_Bauer_Y_Verknuepfung_Bewegung(void) {

    char** brett = Schachbrett_erstellen();
    int startX = 1;
    int startY = 1;
    int endX = 1;
    int endY = 2;
    Player player = PLAYER_WHITE;
    

    TEST_ASSERT_NOT_NULL(brett);
    

    TEST_ASSERT_TRUE(istzugerlaubt( brett, startX, startY, endX, endY, player));

    
    for (int i = 0; i < 8; i++) {
        free(brett[i]);
    }
    free(brett);
}

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

    // Viele Test um legale Züge zu prüfen
    TEST_ASSERT_TRUE(istzugerlaubt(Brett, 1, 0, 0, 2, PLAYER_WHITE));

    TEST_ASSERT_TRUE(istzugerlaubt(Brett, 4, 3, 6, 2, PLAYER_BLACK));


    Schachbrettspeicher_freigeben(Brett);
}

void test_istzugerlaubt(void){
    char** brett = Schachbrett_erstellen();
    int startX = 1;
    int startY = 1;
    int endX = 1;
    int endY = 1;
    Player player = PLAYER_WHITE;
    
    //istzugerlaubt(brett,startX,startY,endX,endY,player);

    TEST_ASSERT_FALSE(istzugerlaubt(brett,startX,startY,endX,endY,player));
    for (int i = 0; i < 8; i++) {
        free(brett[i]);
    }
    free(brett);



}

void test_istzugerlaubt_Turm(void){

    char** brett = Schachbrett_erstellen();
    int startX = 0;
    int startY = 4;
    int endX = 0;
    int endY = 2;
    Player player = PLAYER_WHITE;
    

    TEST_ASSERT_NOT_NULL(brett);

    brett[4][0] = 'r';
    print_Schachfeld(brett);
    

    TEST_ASSERT_TRUE(istzugerlaubt(brett, startX, startY, endX, endY, player));

    
    for (int i = 0; i < 8; i++) {
        free(brett[i]);
    }
    free(brett);
}

#endif // TEST