Files
2026-05-26 13:38:15 +02:00

371 lines
12 KiB
C

#include "munit/munit.h"
#include "game.h"
#include <stdlib.h>
static void clear_tiles(GameState_t *state) {
for (int y = 0; y < BOARD_HEIGHT; y++) {
for (int x = 0; x < BOARD_WIDTH; x++) {
state->board[y][x] = 0;
}
}
}
static void *test_setup(const MunitParameter params[], void *user_data) {
(void)params;
(void)user_data;
GameState_t *state = (GameState_t *)malloc(sizeof(GameState_t));
munit_assert_not_null(state);
reset_board(state);
clear_tiles(state);
return state;
}
static void test_tear_down(void *fixture) {
free(fixture);
}
static MunitResult test_merge_left_simple(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[0][0] = 2;
state->board[0][1] = 2;
munit_assert_true(move(state, LEFT));
munit_assert_int(state->board[0][0], ==, 4);
munit_assert_int(state->board[0][1], ==, 0);
munit_assert_uint(state->score, ==, 4);
munit_assert_uint(state->moves_made, ==, 1);
return MUNIT_OK;
}
static MunitResult test_merge_left_through_gap(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[0][0] = 2;
state->board[0][2] = 2;
munit_assert_true(move(state, LEFT));
munit_assert_int(state->board[0][0], ==, 4);
munit_assert_int(state->board[0][1], ==, 0);
munit_assert_int(state->board[0][2], ==, 0);
munit_assert_int(state->board[0][3], ==, 0);
return MUNIT_OK;
}
static MunitResult test_merge_left_double_pair(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[0][0] = 2;
state->board[0][1] = 2;
state->board[0][2] = 4;
state->board[0][3] = 4;
munit_assert_true(move(state, LEFT));
munit_assert_int(state->board[0][0], ==, 4);
munit_assert_int(state->board[0][1], ==, 8);
munit_assert_int(state->board[0][2], ==, 0);
munit_assert_int(state->board[0][3], ==, 0);
munit_assert_uint(state->score, ==, 12);
return MUNIT_OK;
}
static MunitResult test_merge_left_no_double_merge_single_move(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[0][0] = 2;
state->board[0][1] = 2;
state->board[0][2] = 2;
munit_assert_true(move(state, LEFT));
munit_assert_int(state->board[0][0], ==, 4);
munit_assert_int(state->board[0][1], ==, 2);
munit_assert_int(state->board[0][2], ==, 0);
munit_assert_int(state->board[0][3], ==, 0);
munit_assert_uint(state->score, ==, 4);
return MUNIT_OK;
}
static MunitResult test_move_left_no_merge_when_different_values(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[0][1] = 2;
state->board[0][2] = 4;
munit_assert_true(move(state, LEFT));
munit_assert_int(state->board[0][0], ==, 2);
munit_assert_int(state->board[0][1], ==, 4);
munit_assert_int(state->board[0][2], ==, 0);
munit_assert_int(state->board[0][3], ==, 0);
munit_assert_uint(state->score, ==, 0);
return MUNIT_OK;
}
static MunitResult test_move_returns_false_when_nothing_changes(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[0][0] = 2;
state->board[0][1] = 4;
state->board[0][2] = 8;
state->board[0][3] = 16;
munit_assert_false(move(state, LEFT));
munit_assert_uint(state->moves_made, ==, 0);
munit_assert_uint(state->score, ==, 0);
return MUNIT_OK;
}
static MunitResult test_merge_right_simple(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[1][2] = 2;
state->board[1][3] = 2;
munit_assert_true(move(state, RIGHT));
munit_assert_int(state->board[1][0], ==, 0);
munit_assert_int(state->board[1][1], ==, 0);
munit_assert_int(state->board[1][2], ==, 0);
munit_assert_int(state->board[1][3], ==, 4);
return MUNIT_OK;
}
static MunitResult test_merge_right_through_gap(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[1][1] = 2;
state->board[1][3] = 2;
munit_assert_true(move(state, RIGHT));
munit_assert_int(state->board[1][0], ==, 0);
munit_assert_int(state->board[1][1], ==, 0);
munit_assert_int(state->board[1][2], ==, 0);
munit_assert_int(state->board[1][3], ==, 4);
return MUNIT_OK;
}
static MunitResult test_merge_right_double_pair(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[1][0] = 2;
state->board[1][1] = 2;
state->board[1][2] = 4;
state->board[1][3] = 4;
munit_assert_true(move(state, RIGHT));
munit_assert_int(state->board[1][0], ==, 0);
munit_assert_int(state->board[1][1], ==, 0);
munit_assert_int(state->board[1][2], ==, 4);
munit_assert_int(state->board[1][3], ==, 8);
munit_assert_uint(state->score, ==, 12);
return MUNIT_OK;
}
static MunitResult test_merge_right_no_double_merge_single_move(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[1][1] = 2;
state->board[1][2] = 2;
state->board[1][3] = 2;
munit_assert_true(move(state, RIGHT));
munit_assert_int(state->board[1][0], ==, 0);
munit_assert_int(state->board[1][1], ==, 0);
munit_assert_int(state->board[1][2], ==, 2);
munit_assert_int(state->board[1][3], ==, 4);
munit_assert_uint(state->score, ==, 4);
return MUNIT_OK;
}
static MunitResult test_merge_up_simple(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[0][0] = 2;
state->board[1][0] = 2;
munit_assert_true(move(state, UP));
munit_assert_int(state->board[0][0], ==, 4);
munit_assert_int(state->board[1][0], ==, 0);
munit_assert_int(state->board[2][0], ==, 0);
munit_assert_int(state->board[3][0], ==, 0);
return MUNIT_OK;
}
static MunitResult test_merge_up_through_gap(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[0][1] = 2;
state->board[2][1] = 2;
munit_assert_true(move(state, UP));
munit_assert_int(state->board[0][1], ==, 4);
munit_assert_int(state->board[1][1], ==, 0);
munit_assert_int(state->board[2][1], ==, 0);
munit_assert_int(state->board[3][1], ==, 0);
return MUNIT_OK;
}
static MunitResult test_merge_up_double_pair(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[0][1] = 2;
state->board[1][1] = 2;
state->board[2][1] = 4;
state->board[3][1] = 4;
munit_assert_true(move(state, UP));
munit_assert_int(state->board[0][1], ==, 4);
munit_assert_int(state->board[1][1], ==, 8);
munit_assert_int(state->board[2][1], ==, 0);
munit_assert_int(state->board[3][1], ==, 0);
munit_assert_uint(state->score, ==, 12);
return MUNIT_OK;
}
static MunitResult test_merge_up_no_double_merge_single_move(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[0][1] = 2;
state->board[1][1] = 2;
state->board[2][1] = 2;
munit_assert_true(move(state, UP));
munit_assert_int(state->board[0][1], ==, 4);
munit_assert_int(state->board[1][1], ==, 2);
munit_assert_int(state->board[2][1], ==, 0);
munit_assert_int(state->board[3][1], ==, 0);
munit_assert_uint(state->score, ==, 4);
return MUNIT_OK;
}
static MunitResult test_merge_down_simple(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[1][2] = 2;
state->board[2][2] = 2;
munit_assert_true(move(state, DOWN));
munit_assert_int(state->board[0][2], ==, 0);
munit_assert_int(state->board[1][2], ==, 0);
munit_assert_int(state->board[2][2], ==, 0);
munit_assert_int(state->board[3][2], ==, 4);
return MUNIT_OK;
}
static MunitResult test_merge_down_through_gap(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[0][2] = 2;
state->board[2][2] = 2;
munit_assert_true(move(state, DOWN));
munit_assert_int(state->board[0][2], ==, 0);
munit_assert_int(state->board[1][2], ==, 0);
munit_assert_int(state->board[2][2], ==, 0);
munit_assert_int(state->board[3][2], ==, 4);
return MUNIT_OK;
}
static MunitResult test_merge_down_double_pair(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[0][2] = 2;
state->board[1][2] = 2;
state->board[2][2] = 4;
state->board[3][2] = 4;
munit_assert_true(move(state, DOWN));
munit_assert_int(state->board[0][2], ==, 0);
munit_assert_int(state->board[1][2], ==, 0);
munit_assert_int(state->board[2][2], ==, 4);
munit_assert_int(state->board[3][2], ==, 8);
munit_assert_uint(state->score, ==, 12);
return MUNIT_OK;
}
static MunitResult test_merge_down_no_double_merge_single_move(const MunitParameter params[], void *fixture) {
(void)params;
GameState_t *state = (GameState_t *)fixture;
state->board[1][2] = 2;
state->board[2][2] = 2;
state->board[3][2] = 2;
munit_assert_true(move(state, DOWN));
munit_assert_int(state->board[0][2], ==, 0);
munit_assert_int(state->board[1][2], ==, 0);
munit_assert_int(state->board[2][2], ==, 2);
munit_assert_int(state->board[3][2], ==, 4);
munit_assert_uint(state->score, ==, 4);
return MUNIT_OK;
}
static MunitTest tests[] = {
{(char *)"/merge/left/simple", test_merge_left_simple, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/left/through-gap", test_merge_left_through_gap, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/left/double-pair", test_merge_left_double_pair, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/left/no-double-merge", test_merge_left_no_double_merge_single_move, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/left/different-values-no-merge", test_move_left_no_merge_when_different_values, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/move/no-change", test_move_returns_false_when_nothing_changes, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/right/simple", test_merge_right_simple, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/right/through-gap", test_merge_right_through_gap, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/right/double-pair", test_merge_right_double_pair, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/right/no-double-merge", test_merge_right_no_double_merge_single_move, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/up/simple", test_merge_up_simple, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/up/through-gap", test_merge_up_through_gap, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/up/double-pair", test_merge_up_double_pair, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/up/no-double-merge", test_merge_up_no_double_merge_single_move, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/down/simple", test_merge_down_simple, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/down/through-gap", test_merge_down_through_gap, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/down/double-pair", test_merge_down_double_pair, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{(char *)"/merge/down/no-double-merge", test_merge_down_no_double_merge_single_move, test_setup, test_tear_down, MUNIT_TEST_OPTION_NONE, NULL},
{NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL}};
static const MunitSuite suite = {
(char *)"",
tests,
NULL,
1,
MUNIT_SUITE_OPTION_NONE,
};
int main(int argc, char *argv[MUNIT_ARRAY_PARAM(argc + 1)]) {
return munit_suite_main(&suite, NULL, argc, argv);
}