#include "unity.h"
#include "Spiellogik.h"
#include <stdlib.h>

void setUp(void){
}

void tearDown(void){
	
}

void test_test1(void){

	int result = probe(2);
	
	TEST_ASSERT_EQUAL_INT(2, result);
}

//Tests für Funktion win

//Testet ob die Schlange lang genug ist
void test_win_SchlangegroesseAusreichend(void){
    int realU[N][N] = {0};
    realU[15][19] = (N*N)-1;
    int result = win(realU);

    TEST_ASSERT_EQUAL_INT(1, result);
}

//Test Schlange nicht lang genug
void test_win_SchlangeNichtAusreichend(void){
    int realU[N][N] = {0};
    realU[15][5] = 15;
    int result = win(realU);

    TEST_ASSERT_EQUAL_INT(0, result);
}
void test_feldFrei_Verhalten_bei_belegtem_Feld(void){
    int realU[N][N];
    realU[11][12] = 1;
    int result = feldFrei( realU, 11,12);

    TEST_ASSERT_EQUAL_INT(0 , result);
}

void test_feldFrei_Verhalten_bei_freiem_Feld(void){
    int realU[N][N];
    realU[11][12] = 0;
    int result = feldFrei(realU, 11, 12);
    
    TEST_ASSERT_EQUAL_INT(1, result);
}
//Tests für die Methode lose

//Test der Methode lose mit einer Bewegung nach oben auf
//ein freies Feld
void test_lose_up_freiesFeld(void){
    int realU[20][20] = { 0 };
    realU[10][12] = 4;
    int result = lose(realU, 'u');
    
    TEST_ASSERT_EQUAL_INT(0, result);
}
//Test der Methode lose mit einer Bewegung nach oben auf
//ein bereits belegtes Feld
void test_lose_up_belegtesFeld(void){
    int realU[20][20] = { 0 };
    realU[10][12] = 4;
    realU[9][12] = 3;
    int result = lose(realU, 'u');

    TEST_ASSERT_EQUAL_INT(1, result);
}

//Test der Methode lose mit einer Bewegung nach oben ausserhalb
//der Spielfeld Begrenzungen
void test_lose_up_Obererrand(void){
    int realU[20][20] = { 0 };
    realU[0][12] = 4;
    int result = lose(realU, 'u');

    TEST_ASSERT_EQUAL_INT(1, result);
}

//Test der Methode lose mit einer Bewegung nach unten auf
//ein freies Feld
void test_lose_down_freiesFeld(void){
    int realU[20][20] = { 0 };
    realU[10][12] = 4;
    int result = lose(realU, 'd');

    TEST_ASSERT_EQUAL_INT(0, result);
}

//Test der Methode lose mit einer Bewegung nach unten auf
//ein belegtes Feld
void test_lose_down_belegtesFeld(void){
    int realU[20][20] = { 0 };
    realU[10][12] = 4;
    realU[11][12] = 3;
    int result = lose(realU, 'd');

    TEST_ASSERT_EQUAL_INT(1, result);
}

//Test der Methode lose mit einer Bewegung nach links auf
//ein freies Feld
void test_lose_left_freiesFeld(void){
    int realU[20][20] = { 0 };
    realU[5][12] = 4;
    int result = lose(realU, 'l');

    TEST_ASSERT_EQUAL_INT(0, result);
}

//Test der Methode lose mit einer Bewegung nach links auf
//ein belegtes Feld
void test_lose_left_belegtesFeld(void){
    int realU[20][20] = { 0 };
    realU[5][12] = 4;
    realU[5][11] = 3;
    int result = lose(realU, 'l');

    TEST_ASSERT_EQUAL_INT(1, result);
}

//Test der Methode lose mit einer Bewegung nach links über
//den linken Spielfeldrand
void test_lose_left_linkerRand(void){
    int realU[20][20] = { 0 };
    realU[5][0] = 4;
    int result = lose(realU, 'l');

    TEST_ASSERT_EQUAL_INT(1, result);
}

//Test der Methode lose mit einer Bewegung nach rechts auf
//ein freies Feld
void test_lose_right_freiesFeld(void){
    int realU[20][20] = { 0 };
    realU[5][12] = 4;
    int result = lose(realU, 'r');

    TEST_ASSERT_EQUAL_INT(0, result);
}

//Test der Methode lose mit einer Bewegung nach rechts auf
//ein belegtes Feld
void test_lose_right_belegtesFeld(void){
    int realU[20][20] = { 0 };
    realU[5][12] = 4;
    realU[5][13] = 3;
    int result = lose(realU, 'r');

    TEST_ASSERT_EQUAL_INT(1, result);
}

//Test der Methode lose mit einer Bewegung nach links über
//den rechten Spielfeldrand
void test_lose_right_rechterRand(void){
    int realU[20][20] = { 0 };
    realU[5][N] = 4;
    int result = lose(realU, 'l');

    TEST_ASSERT_EQUAL_INT(1, result);
}