#include "munit/munit.h" #include "game.h" #include 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); }