From 7349b885c3dbb73f8ea47a1e15b263ce04a7f294 Mon Sep 17 00:00:00 2001 From: Sabrina <sabrinalap98@gmail.com> Date: Fri, 4 Apr 2025 22:42:06 +0200 Subject: [PATCH] Modify unit Tests --- UnitTests/Makefile | 13 +++++++---- UnitTests/unitTests.c | 52 +++++++++++++++--------------------------- UnitTests/unit_tests | Bin 0 -> 21904 bytes 3 files changed, 28 insertions(+), 37 deletions(-) create mode 100755 UnitTests/unit_tests diff --git a/UnitTests/Makefile b/UnitTests/Makefile index 69f006e..8087f36 100644 --- a/UnitTests/Makefile +++ b/UnitTests/Makefile @@ -1,6 +1,11 @@ -unitTests: unitTests.o - gcc unitTests.o -o unit_tests +SRC = unitTests.c \ + ../src/board.c \ + ../src/winnerCheck.c \ + ../src/smartAI.c -unitTests.o : unitTests.c - gcc -Wall -Wextra -c unitTests.c \ No newline at end of file +unit_tests: $(SRC:.c=.o) + gcc $(SRC:.c=.o) -o unit_tests + +unittests.o: unitTests.c + gcc -Wall -Wextra -c unitTests -o unittests \ No newline at end of file diff --git a/UnitTests/unitTests.c b/UnitTests/unitTests.c index 0dac56e..0b8994b 100644 --- a/UnitTests/unitTests.c +++ b/UnitTests/unitTests.c @@ -5,12 +5,12 @@ void TestCreateBoard() { struct board board = create_board(7,6); - assert(board.col != 0 && "Fail of board creation"); - assert(board.line != 0 && "Fail of board creation"); - assert(board.last_pos_x != -1 && "Fail of board creation"); - assert(board.last_pos_y != -1 && "Fail of board creation"); - assert(board.last_symbole != Vide && "Fail of board creation"); - printf("Sucess of board creation\n"); + assert(board.col != 0 && "Fail to board creation"); + assert(board.line != 0 && "Fail to board creation"); + assert(board.last_pos_x == -1 && "Fail to board creation"); + assert(board.last_pos_y == -1 && "Fail to board creation"); + assert(board.last_symbole == Vide && "Fail to board creation"); + printf("Sucess to board creation\n"); } void TestInitBoard() { @@ -18,28 +18,29 @@ void TestInitBoard() { init_board(&board); for(int i = 0; i < 6; i++){ for(int j = 0; j < 7; j++){ - assert(board.data[i][j] != Vide && "Fail of init case"); + assert(board.data[i][j] == Vide && "Fail to init case"); } } - printf("Success of init board\n"); + printf("Success to init board\n"); } void TestCurrentLine() { struct board board = create_board(7,6); init_board(&board); int no_col1 = 2; - int no_col2 = 7; + int no_col2 = 6; board.data[5][no_col1] = Croix; board.data[4][no_col1] = Cercle; - assert(current_line(board, no_col1) == 3 && "Fail of get line to column"); - assert(current_line(board, no_col2) == 5 && "Fail of get line to column"); - printf("Success of get lines to column %d and %d\n", no_col1,no_col2); + assert(current_line(board, no_col1) == 3 && "Fail to get line to column"); + assert(current_line(board, no_col2) == 5 && "Fail to get line to column"); + printf("Success to get lines to column %d and %d\n", no_col1,no_col2); } void TestFullBoard() { struct board board = create_board(7,6); init_board(&board); + assert(is_full_board(board) == false && "Fail to check if the board is full"); for(int i = 0; i < 6; i++){ for(int j = 0; j < 7; j++){ board.data[i][j] = Croix; @@ -49,20 +50,6 @@ void TestFullBoard() { printf("Success to check if the board is full\n"); } -void TestCheckRowof4() { - struct board board = create_board(7,6); - init_board(&board); - board.data[5][0] = Croix; - board.data[5][1] = Croix; - board.data[5][2] = Croix; - board.data[5][3] = Croix; - board.data[4][0] = Cercle; - board.data[4][1] = Cercle; - board.data[4][2] = Cercle; - assert(row_of_four(&board) == false && "Fail to check a row of 4\n"); - printf("Success to check a row of 4\n"); -} - void TestCheckColof4() { struct board board = create_board(7,6); init_board(&board); @@ -73,7 +60,7 @@ void TestCheckColof4() { board.data[5][0] = Cercle; board.data[4][0] = Cercle; board.data[3][0] = Cercle; - assert(col_of_four(&board) == false && "Fail to check a col of 4\n"); + assert(col_of_four(&board) == true && "Fail to check a col of 4\n"); printf("Success to check a col of 4\n"); } @@ -91,7 +78,7 @@ void TestCheckDiagRLof4() { board.data[5][3] = Cercle; board.data[4][3] = Cercle; board.data[3][3] = Cercle; - assert(diag_of_four_right_left(&board) == false && "Fail to check a diag RL of 4\n"); + assert(diag_of_four_right_left(&board) == true && "Fail to check a diag RL of 4\n"); printf("Success to check a diag RL of 4\n"); } @@ -108,7 +95,7 @@ void TestCheckDiagLRof4() { board.data[3][1] = Cercle; board.data[4][2] = Cercle; board.data[5][3] = Cercle; - assert(diag_of_four_left_right(&board) == false && "Fail to check a diag LR of 4\n"); + assert(diag_of_four_left_right(&board) == true && "Fail to check a diag LR of 4\n"); printf("Success to check a dia LR of 4\n"); } @@ -122,7 +109,7 @@ void TestSimulateWin() { board.data[5][1] = Cercle; board.data[5][2] = Cercle; board.data[5][4] = Cercle; - assert(simulate_for_win(&board) == -1 && "Fail to win on the next round\n"); + assert(simulate_for_win(&board) != -1 && "Fail to win on the next round\n"); printf("Success to win on the next round\n"); } @@ -135,16 +122,15 @@ void TestSimulateBlock() { board.data[3][0] = Croix; board.data[5][1] = Cercle; board.data[5][4] = Cercle; - assert(simulate_for_block_player(&board) == -1 && "Fail to block the player\n"); + assert(simulate_for_block_player(&board) != -1 && "Fail to block the player\n"); printf("Success to block the player\n"); } int main(){ TestCreateBoard(); TestInitBoard(); - TestFullBoard(); TestCurrentLine(); - TestCheckRowof4(); + TestFullBoard(); TestCheckColof4(); TestCheckDiagLRof4(); TestCheckDiagRLof4(); diff --git a/UnitTests/unit_tests b/UnitTests/unit_tests new file mode 100755 index 0000000000000000000000000000000000000000..dc34154bdc69eb95c020d1dde49bf94d15a0eec1 GIT binary patch literal 21904 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 literal 0 HcmV?d00001 -- GitLab