Example #1
0
void test_train_car_occupies_track(test_train_context* test_ctx, const void* data) {
#pragma unused(data)

    sem_world* world = &(test_ctx->world);
    sem_train* train = test_ctx->train;

    sem_track track_E_W;
    sem_track_set(&track_E_W, SEM_EAST, SEM_WEST);

    sem_track track_W_S;
    sem_track_set(&track_W_S, SEM_WEST, SEM_SOUTH);

    sem_tile_set_track(sem_tile_at(world, 0, 0), &track_E_W);
    sem_tile_set_track(sem_tile_at(world, 1, 0), &track_W_S);

    train->state = MOVING;
    train->direction = SEM_EAST;

    sem_car car;
    sem_coordinate_set(&(car.position), 0, 0);
    car.track = &track_E_W;
    sem_train_add_car(train, &car);

    sem_train_move_outcome outcome;
    sem_train_move(train, &outcome);

    g_assert_true(train->head_car->track == &track_W_S);
}
Example #2
0
void test_parser_print_three_way_points() {
	char expected_description[32] = "points N-SE N-S N-SW";
	char actual_description[32];
	FILE* out = fmemopen(actual_description, 32*sizeof(char), "w");

	sem_tile tile;

	sem_track trackN_S;
	sem_track_set(&trackN_S, SEM_NORTH, SEM_SOUTH);
	sem_tile_set_points(&tile, &trackN_S);

	sem_track trackN_SE;
	sem_track_set(&trackN_SE, SEM_NORTH, SEM_SOUTH | SEM_EAST);
	tile.points[1] = &trackN_SE;	

	sem_track trackN_SW;
	sem_track_set(&trackN_SW, SEM_NORTH, SEM_SOUTH | SEM_WEST);
	tile.points[2] = &trackN_SW;	

	sem_tile_switch_points(&tile);
	sem_tile_print(out, &tile);

	fclose(out);

	g_assert_cmpstr(expected_description, ==, actual_description);
}
Example #3
0
void test_train_follows_secondary_track(test_train_context* test_ctx, const void* data) {
#pragma unused(data)
    sem_world* world = &(test_ctx->world);
    sem_train* train = test_ctx->train;

    sem_car car;
    sem_coordinate_set(&(car.position), 0, 0);
    sem_train_add_car(train, &car);
    train->direction = SEM_EAST;

    sem_track track_E_W;
    sem_track_set(&track_E_W, SEM_EAST, SEM_WEST);

    sem_track track_SE_W;
    sem_track_set(&track_SE_W, SEM_SOUTH | SEM_EAST, SEM_WEST);

    sem_track track_N_S_SE_W;
    sem_track_set(&track_N_S_SE_W, SEM_NORTH, SEM_SOUTH);
    track_N_S_SE_W.next = &track_SE_W;

    sem_tile_set_track(sem_tile_at(world, 0, 0), &track_E_W);
    sem_tile_set_track(sem_tile_at(world, 1, 0), &track_N_S_SE_W);

    sem_train_move_outcome outcome;
    g_assert_true(sem_train_move(train, &outcome) == SEM_OK);
    g_assert_true(train->direction == (SEM_SOUTH | SEM_EAST));
}
Example #4
0
void test_train_derails_when_need_points_switch(test_train_context* test_ctx, const void* data) {
#pragma unused(data)
    sem_train* train = test_ctx->train;
    sem_world* world = &(test_ctx->world);

    sem_tile_acceptance acceptance;
    sem_tile_acceptance_init(&acceptance);

    train->direction = SEM_EAST;

    sem_car car;
    sem_coordinate_set(&(car.position), 0, 0);

    sem_train_add_car(train, &car);

    sem_track trackNW_E;
    sem_track_set(&trackNW_E, SEM_NORTH | SEM_WEST, SEM_EAST);

    sem_track trackW_E;
    sem_track_set(&trackW_E, SEM_WEST, SEM_EAST);

    sem_tile* tile = sem_tile_at(world, 1, 0);
    sem_tile_set_points(tile, &trackNW_E);
    tile->points[1] = &trackW_E;

    sem_train_move_outcome outcome;
    sem_train_move(train, &outcome);

    g_assert_true(train->state == DERAILED);
}
Example #5
0
void test_train_moves_head_car(test_train_context* test_ctx, const void* data) {
#pragma unused(data)
    sem_world* world = &(test_ctx->world);
    sem_train* train = test_ctx->train;

    sem_car head_car;
    sem_coordinate_set(&(head_car.position), 1, 0);
    sem_train_add_car(train, &head_car);

    sem_car car2;
    sem_coordinate_set(&(car2.position), 0, 0);
    sem_train_add_car(train, &car2);

    train->direction = SEM_EAST;

    sem_track track_E_W;
    sem_track_set(&track_E_W, SEM_EAST, SEM_WEST);

    sem_tile_set_track(sem_tile_at(world, 0, 0), &track_E_W);
    sem_tile_set_track(sem_tile_at(world, 1, 0), &track_E_W);
    sem_tile_set_track(sem_tile_at(world, 2, 0), &track_E_W);

    sem_train_move_outcome outcome;
    sem_train_move(train, &outcome);

    g_assert_cmpuint(train->position->x, ==, 2);
    g_assert_cmpuint(train->position->y, ==, 0);
}
Example #6
0
void test_train_stops_at_buffer(test_train_context* test_ctx, const void* data) {
#pragma unused(data)

    sem_train* train = test_ctx->train;
    sem_world* world = &(test_ctx->world);

    sem_track trackE_W;
    sem_track_set(&trackE_W, SEM_EAST, SEM_WEST);
    sem_tile_set_track(sem_tile_at(world, 0, 0), &trackE_W);
    sem_tile_set_buffer(sem_tile_at(world, 1, 0), &trackE_W);

    sem_car car;
    sem_coordinate_set(&(car.position), 0, 0);
    car.track = &trackE_W;
    sem_train_add_car(train, &car);
    train->direction = SEM_EAST;
    train->state = MOVING;

    sem_train_move_outcome outcome;
    sem_train_move(train, &outcome);

    g_assert_true(train->state == STOPPED);
    g_assert_cmpuint(train->position->x, ==, 0);
    g_assert_cmpuint(train->position->y, ==, 0);
    g_assert_true(outcome.stopped_at_buffer == true);
}
Example #7
0
void test_train_crashes_by_occupying_same_tile(test_train_context* test_ctx, const void* data) {
#pragma unused(data)
    sem_train* train1 = test_ctx->train1;
    sem_train* train2 = test_ctx->train2;
    sem_world* world = &(test_ctx->world);

    sem_track trackW_E;
    sem_track_set(&trackW_E, SEM_WEST, SEM_EAST);

    sem_tile* tile = sem_tile_at(world, 1, 0);
    sem_tile_set_track(tile, &trackW_E);

    train1->state = MOVING;
    train1->direction = SEM_EAST;

    sem_car train1_car;
    sem_coordinate_set(&(train1_car.position), 0, 0);
    sem_train_add_car(train1, &train1_car);

    train2->state = STOPPED;

    sem_car train2_car1;
    sem_coordinate_set(&(train2_car1.position), 1, 0);
    sem_train_add_car(train2, &train2_car1);

    sem_car train2_car2;
    sem_coordinate_set(&(train2_car2.position), 2, 0);
    sem_train_add_car(train2, &train2_car2);

    sem_train_move_outcome outcome;
    sem_train_move(train1, &outcome); // move head of train1 into tail of train2

    g_assert_true(train1->state == CRASHED);
    g_assert_true(train2->state == CRASHED);
}
Example #8
0
void test_train_reverses(test_train_context* test_ctx, const void* data) {
#pragma unused(data)
    sem_train* train = test_ctx->train;
    sem_world* world = &(test_ctx->world);

    sem_tile* tile = sem_tile_at(world, 1, 1);
    sem_track trackS_NE;
    sem_track_set(&trackS_NE, SEM_SOUTH, SEM_NORTH | SEM_EAST);
    sem_tile_set_track(tile, &trackS_NE);

    sem_track trackSW_E;
    sem_track_set(&trackSW_E, SEM_SOUTH | SEM_WEST, SEM_EAST);
    sem_tile_set_track(sem_tile_at(world, 2, 0), &trackSW_E);

    sem_track trackW_E;
    sem_track_set(&trackW_E, SEM_WEST, SEM_EAST);
    sem_tile_set_track(sem_tile_at(world, 3, 0), &trackW_E);

    train->direction = SEM_EAST;

    sem_car car1;
    sem_coordinate_set(&(car1.position), 3, 0);
    car1.track = &trackSW_E;
    sem_train_add_car(train, &car1);

    sem_car car2;
    sem_coordinate_set(&(car2.position), 2, 0);
    car2.track = &trackSW_E;
    sem_train_add_car(train, &car2);

    sem_car car3;
    sem_coordinate_set(&(car3.position), 1, 1);
    car3.track = &trackS_NE;
    sem_train_add_car(train, &car3);

    sem_train_reverse(train);

    g_assert_true(train->head_car == &car3);
    g_assert_true(train->head_car->next == &car2);
    g_assert_true(train->head_car->next->next == &car1);
    g_assert_true(train->tail_car == &car1);

    g_assert_true(train->direction == SEM_SOUTH);
    g_assert_cmpuint(train->position->x, ==, 1);
    g_assert_cmpuint(train->position->y, ==, 1);
}
Example #9
0
void test_parser_print_n_s_e_w_track() {
	char expected_description[32] = "track N-S+E-W";
	char actual_description[32];
	FILE* out = fmemopen(actual_description, 32*sizeof(char), "w");

	sem_tile tile;

	sem_track trackN_S;
	sem_track_set(&trackN_S, SEM_NORTH, SEM_SOUTH);
	sem_tile_set_track(&tile, &trackN_S);

	sem_track trackE_W;
	sem_track_set(&trackE_W, SEM_EAST, SEM_WEST);
	trackN_S.next = &trackE_W;

	sem_tile_print(out, &tile);

	fclose(out);

	g_assert_cmpstr(expected_description, ==, actual_description);
}
Example #10
0
void test_portal_setup(test_portal_context* test_ctx, const void* data) {
	#pragma unused(data)

	test_ctx->game.world.max_x = 4;
	test_ctx->game.world.max_y = 4;
	sem_game_init_blank(&(test_ctx->game));

	test_ctx->track = malloc(sizeof(sem_track));
	sem_track_set(test_ctx->track, SEM_WEST, SEM_EAST);

	sem_tile_set_entry(sem_tile_at(&(test_ctx->game.world), 0, 0), test_ctx->track);
	sem_tile_set_track(sem_tile_at(&(test_ctx->game.world), 1, 0), test_ctx->track);
	sem_tile_set_track(sem_tile_at(&(test_ctx->game.world), 2, 0), test_ctx->track);
	sem_tile_set_exit(sem_tile_at(&(test_ctx->game.world), 3, 0), test_ctx->track);
	sem_tile_set_exit(sem_tile_at(&(test_ctx->game.world), 3, 2), test_ctx->track);
}
Example #11
0
void test_parser_print_ne_sw_track() {
	char expected_description[32] = "track NE-SW";
	char actual_description[32];
	FILE* out = fmemopen(actual_description, 32*sizeof(char), "w");

	sem_tile tile;
	sem_track track;
	sem_track_set(&track, SEM_NORTH | SEM_EAST, SEM_SOUTH | SEM_WEST);
	sem_tile_set_track(&tile, &track);

	sem_tile_print(out, &tile);

	fclose(out);

	g_assert_cmpstr(expected_description, ==, actual_description);
}
Example #12
0
void test_train_error_moves_onto_blank_tile(test_train_context* test_ctx, const void* data) {
#pragma unused(data)
    sem_world* world = &(test_ctx->world);
    sem_train* train = test_ctx->train;

    sem_car car;
    sem_coordinate_set(&(car.position), 0, 0);
    sem_train_add_car(train, &car);
    train->direction = SEM_EAST;

    sem_track track_E_W;
    sem_track_set(&track_E_W, SEM_EAST, SEM_WEST);

    sem_tile_set_track(sem_tile_at(world, 0, 0), &track_E_W);

    sem_train_move_outcome outcome;
    g_assert_cmpint(sem_train_move(train, &outcome), ==, SEM_ERROR);
}
Example #13
0
void test_parser_print_red_main_auto_signal() {
	char expected_description[128] = "signal N-S red main auto previously red 81cbbfd6-43c8-4143-a345-ee9e27dd0e8b";
	char actual_description[128];
	char id_str[37] = "81cbbfd6-43c8-4143-a345-ee9e27dd0e8b";
	FILE* out = fmemopen(actual_description, 128*sizeof(char), "w");

	sem_tile tile;
	sem_track track;
	sem_track_set(&track, SEM_NORTH, SEM_SOUTH);
	sem_signal signal;
	sem_signal_init(&signal, MAIN_AUTO, RED);
	uuid_parse(id_str, signal.id);
	sem_tile_set_signal(&tile, &track, &signal);

	sem_tile_print(out, &tile);

	fclose(out);

	g_assert_cmpstr(expected_description, ==, actual_description);
}
Example #14
0
void test_serialize_save_load_track_tile() {
	sem_world world;
	world.max_x = 1;
	world.max_y = 1;
	sem_world_init_blank(&world);

	sem_tile* tile = sem_tile_at(&world, 0, 0);
	sem_track track;
	sem_track_set(&track, SEM_WEST, SEM_EAST);
	sem_tile_set_track(tile, &track);

	FILE* file = save_and_load("build/test/track_tile", &world);

	tile = sem_tile_at(&world, 0, 0);
	g_assert_true(tile->class == TRACK);
	g_assert_true(tile->track->start == SEM_WEST);
	g_assert_true(tile->track->end == SEM_EAST);

	sem_world_destroy(&world);
	fclose(file);
}
Example #15
0
void test_train_moves_given_velocity(test_train_context* test_ctx, const void* data) {
#pragma unused(data)
    sem_world* world = &(test_ctx->world);
    sem_train* train = test_ctx->train;

    sem_car car;
    sem_coordinate_set(&(car.position), 0, 1);
    sem_train_add_car(train, &car);

    train->direction = SEM_NORTH | SEM_EAST;

    sem_track track_SW_NE;
    sem_track_set(&track_SW_NE, SEM_SOUTH | SEM_WEST, SEM_NORTH | SEM_EAST);

    sem_tile_set_track(sem_tile_at(world, 1, 0), &track_SW_NE);

    sem_train_move_outcome outcome;
    sem_train_move(train, &outcome);

    g_assert_cmpuint(train->position->x, ==, 1);
    g_assert_cmpuint(train->position->y, ==, 0);
}
Example #16
0
void test_serialize_save_load_train() {
	sem_world world;
	world.max_x = 3;
	world.max_y = 2;
	sem_world_init_blank(&world);

	sem_tile* tile = sem_tile_at(&world, 0, 1);
	sem_track trackW_E;
	sem_track_set(&trackW_E, SEM_WEST, SEM_EAST);
	sem_tile_set_track(tile, &trackW_E);

	tile = sem_tile_at(&world, 1, 1);
	sem_track trackN_S_W_E;
	sem_track_set(&trackN_S_W_E, SEM_NORTH, SEM_SOUTH);
	trackN_S_W_E.next = &trackW_E;
	sem_tile_set_track(tile, &trackN_S_W_E);

	sem_train* saved_train1 = malloc(sizeof(sem_train));
	sem_train* train1 = saved_train1;
	sem_train_init(train1);
	train1->direction = SEM_EAST;
	train1->name = strdup("IC-123");

	sem_car car1;
	sem_coordinate_set(&(car1.position), 1, 1);
	car1.track = &trackW_E;
	sem_train_add_car(train1, &car1);

	sem_car car2;
	sem_coordinate_set(&(car2.position), 0, 1);
	car2.track = &trackW_E;
	sem_train_add_car(train1, &car2);

	sem_world_add_train(&world, train1);

	sem_train* saved_train2 = malloc(sizeof(sem_train));
	sem_train* train2 = saved_train2;
	sem_train_init(train2);
	train2->direction = SEM_WEST;
	train2->state = DERAILED;
	sem_world_add_train(&world, train2);

	FILE* file = save_and_load("build/test/train", &world);

	g_assert_cmpuint(world.trains->tail_idx, ==, 2);

	train1 = world.trains->items[0];
	g_assert_true(train1->state == STOPPED);
	g_assert_true(train1->direction == SEM_EAST);
	g_assert_cmpuint(train1->cars, ==, 2);
	g_assert_cmpstr(train1->name, ==, "IC-123");

	sem_car* car = train1->head_car;
	g_assert_cmpuint(car->position.x, ==, 1);
	g_assert_cmpuint(car->position.y, ==, 1);

	sem_track* track = car->track;
	g_assert_true(track->start == SEM_WEST);
	g_assert_true(track->end == SEM_EAST);

	train2 = world.trains->items[1];
	g_assert_true(train2->state == DERAILED);
	g_assert_true(train2->direction == SEM_WEST);

	sem_world_destroy(&world);
	fclose(file);
}
Example #17
0
void test_serialize_load_remove_train_action() {
	sem_world world;
	world.max_x = 3;
	world.max_y = 1;
	sem_world_init_blank(&world);

	sem_tile* tile = sem_tile_at(&world, 0, 0);
	sem_track trackW_E;
	sem_track_set(&trackW_E, SEM_WEST, SEM_EAST);
	sem_tile_set_track(tile, &trackW_E);

	tile = sem_tile_at(&world, 2, 0);
	sem_track trackN_S;
	sem_track_set(&trackN_S, SEM_NORTH, SEM_SOUTH);
	sem_tile_set_track(tile, &trackN_S);

	sem_train* train1 = malloc(sizeof(sem_train));
	sem_train_init(train1);
	uuid_t train1_id;
	uuid_copy(train1->id, train1_id);
	train1->direction = SEM_NORTH;
	sem_car car1;
	sem_coordinate_set(&(car1.position), 2, 0);
	car1.track = &trackN_S;
	sem_train_add_car(train1, &car1);
	sem_world_add_train(&world, train1);

	sem_train* train2 = malloc(sizeof(sem_train));
	sem_train_init(train2);
	train2->state = DERAILED;
	train2->direction = SEM_EAST;
	sem_car car2;
	sem_coordinate_set(&(car2.position), 0, 0);
	car2.track = &trackW_E;
	sem_train_add_car(train2, &car2);
	sem_world_add_train(&world, train2);
	
	// TODO: should fetch a partially-initialised sem_action from
	// a factory method
	sem_action action;
	action.time = 5000;
	action.function = remove_train_action;
	action.write = sem_remove_train_action_write;
	action.context = train2;

	sem_heap_insert(world.actions, &action);

	FILE* file = save_and_load("build/test/remove_train_action", &world);

	sem_action* loaded_action = sem_heap_remove_earliest(world.actions);
	g_assert_false(loaded_action == NULL);
	g_assert_true(loaded_action->function(world.actions, loaded_action) == SEM_OK);

	g_assert_cmpuint(world.trains->tail_idx, ==, 1);

	sem_train* remaining_train = (sem_train*) world.trains->items[0];
	g_assert_true(uuid_compare(remaining_train->id, train1_id) == 0);

	sem_world_destroy(&world);
	fclose(file);
}