Mercurial > molko
changeset 124:7b84764741b6
core: allows loading maps from memory, closes #2489
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 05 Oct 2020 16:24:37 +0200 |
parents | 2cbea8172926 |
children | d59efa737fcc |
files | libcore/core/map.c libcore/core/map.h tests/CMakeLists.txt tests/test-map.c |
diffstat | 4 files changed, 112 insertions(+), 68 deletions(-) [+] |
line wrap: on
line diff
--- a/libcore/core/map.c Mon Oct 05 20:01:00 2020 +0200 +++ b/libcore/core/map.c Mon Oct 05 16:24:37 2020 +0200 @@ -26,6 +26,7 @@ #include "image.h" #include "map.h" #include "painter.h" +#include "rbuf.h" #include "sprite.h" #include "sys.h" #include "texture.h" @@ -131,19 +132,17 @@ } bool -map_data_open(struct map_data *data, const char *path) +map_data_open_fp(struct map_data *data, FILE *fp) { assert(data); - assert(path); - memset(data, 0, sizeof (*data)); - - FILE *fp = fopen(path, "r"); - char line[BUFSIZ]; + char line[1024]; if (!fp) return false; + memset(data, 0, sizeof (*data)); + while (fgets(line, sizeof (line), fp)) { /* Remove \n if any */ line[strcspn(line, "\n")] = '\0'; @@ -164,6 +163,24 @@ return true; } +bool +map_data_open(struct map_data *data, const char *path) +{ + assert(data); + assert(path); + + return map_data_open_fp(data, fopen(path, "r")); +} + +bool +map_data_openmem(struct map_data *data, const void *buf, size_t bufsz) +{ + assert(data); + assert(buf); + + return map_data_open_fp(data, fmemopen((void *)buf, bufsz, "r")); +} + void map_data_finish(struct map_data *data) {
--- a/libcore/core/map.h Mon Oct 05 20:01:00 2020 +0200 +++ b/libcore/core/map.h Mon Oct 05 16:24:37 2020 +0200 @@ -78,7 +78,7 @@ }; /** - * Open a map defintion + * Open a map defintion. * * \pre data != NULL * \pre path != NULL @@ -90,6 +90,18 @@ map_data_open(struct map_data *data, const char *path); /** + * Open map data definition from memory. + * + *\pre data != NULL + *\pre buf != NULL + *\param data the map definition to fill + *\param buf the source buffer + *\param bufsz the source buffer size + */ +bool +map_data_openmem(struct map_data *data, const void *buf, size_t bufsz); + +/** * Dispose the map definition data. * * \pre data != NULL
--- a/tests/CMakeLists.txt Mon Oct 05 20:01:00 2020 +0200 +++ b/tests/CMakeLists.txt Mon Oct 05 16:24:37 2020 +0200 @@ -21,10 +21,17 @@ molko_define_test(TARGET color SOURCES test-color.c) molko_define_test(TARGET error SOURCES test-error.c) molko_define_test(TARGET inventory SOURCES test-inventory.c) -# -# Maps will be revamped. -# molko_define_test(TARGET map SOURCES test-map.c ASSETS ${tests_SOURCE_DIR}/) -# +molko_define_test( + TARGET map + SOURCES test-map.c + ASSETS + ${tests_SOURCE_DIR}/assets/maps/error-height.map + ${tests_SOURCE_DIR}/assets/maps/error-tileheight.map + ${tests_SOURCE_DIR}/assets/maps/error-tilewidth.map + ${tests_SOURCE_DIR}/assets/maps/error-title.map + ${tests_SOURCE_DIR}/assets/maps/error-width.map + ${tests_SOURCE_DIR}/assets/maps/sample-map.map +) molko_define_test(TARGET rbuf SOURCES test-rbuf.c) molko_define_test(TARGET save SOURCES test-save.c) molko_define_test(TARGET script SOURCES test-script.c)
--- a/tests/test-map.c Mon Oct 05 20:01:00 2020 +0200 +++ b/tests/test-map.c Mon Oct 05 16:24:37 2020 +0200 @@ -16,93 +16,101 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#define GREATEST_USE_ABBREVS 0 #include <greatest.h> -#include <error.h> -#include <map.h> -#include <panic.h> -#include <sys.h> -#include <window.h> +#include <core/error.h> +#include <core/map.h> +#include <core/panic.h> +#include <core/sys.h> +#include <core/window.h> -TEST -sample(void) +#include <assets/maps/sample-map.h> +#include <assets/maps/error-title.h> +#include <assets/maps/error-width.h> +#include <assets/maps/error-height.h> +#include <assets/maps/error-tilewidth.h> +#include <assets/maps/error-tileheight.h> + +GREATEST_TEST +test_sample(void) { struct map_data map; - ASSERT(map_data_open(&map, sys_datapath("maps/sample-map.map"))); - ASSERT_STR_EQ("This is a test map", map.title); - ASSERT_EQ(2, map.w); - ASSERT_EQ(2, map.h); - ASSERT_EQ(32, map.tile_w); - ASSERT_EQ(16, map.tile_h); - ASSERT_EQ(0, map.layers[0].tiles[0]); - ASSERT_EQ(1, map.layers[0].tiles[1]); - ASSERT_EQ(2, map.layers[0].tiles[2]); - ASSERT_EQ(3, map.layers[0].tiles[3]); - ASSERT_EQ(4, map.layers[1].tiles[0]); - ASSERT_EQ(5, map.layers[1].tiles[1]); - ASSERT_EQ(6, map.layers[1].tiles[2]); - ASSERT_EQ(7, map.layers[1].tiles[3]); - PASS(); + GREATEST_ASSERT(map_data_openmem(&map, sample_map, sizeof (sample_map))); + GREATEST_ASSERT_STR_EQ("This is a test map", map.title); + GREATEST_ASSERT_EQ(2, map.w); + GREATEST_ASSERT_EQ(2, map.h); + GREATEST_ASSERT_EQ(32, map.tile_w); + GREATEST_ASSERT_EQ(16, map.tile_h); + GREATEST_ASSERT_EQ(0, map.layers[0].tiles[0]); + GREATEST_ASSERT_EQ(1, map.layers[0].tiles[1]); + GREATEST_ASSERT_EQ(2, map.layers[0].tiles[2]); + GREATEST_ASSERT_EQ(3, map.layers[0].tiles[3]); + GREATEST_ASSERT_EQ(4, map.layers[1].tiles[0]); + GREATEST_ASSERT_EQ(5, map.layers[1].tiles[1]); + GREATEST_ASSERT_EQ(6, map.layers[1].tiles[2]); + GREATEST_ASSERT_EQ(7, map.layers[1].tiles[3]); + GREATEST_PASS(); } -TEST -error_title(void) -{ - struct map_data map; - - ASSERT(!map_data_open(&map, sys_datapath("maps/error-title.map"))); - PASS(); -} - -TEST -error_width(void) +GREATEST_TEST +test_error_title(void) { struct map_data map; - ASSERT(!map_data_open(&map, sys_datapath("maps/error-width.map"))); - PASS(); + GREATEST_ASSERT(!map_data_openmem(&map, error_title, sizeof (error_title))); + GREATEST_PASS(); } -TEST -error_height(void) +GREATEST_TEST +test_error_width(void) { struct map_data map; - ASSERT(!map_data_open(&map, sys_datapath("maps/error-height.map"))); - PASS(); + GREATEST_ASSERT(!map_data_openmem(&map, error_width, sizeof (error_width))); + GREATEST_PASS(); } -TEST -error_tilewidth(void) +GREATEST_TEST +test_error_height(void) { struct map_data map; - ASSERT(!map_data_open(&map, sys_datapath("maps/error-tilewidth.map"))); - PASS(); + GREATEST_ASSERT(!map_data_openmem(&map, error_height, sizeof (error_height))); + GREATEST_PASS(); } -TEST -error_tileheight(void) +GREATEST_TEST +test_error_tilewidth(void) { struct map_data map; - ASSERT(!map_data_open(&map, sys_datapath("maps/error-tileheight.map"))); - PASS(); + GREATEST_ASSERT(!map_data_openmem(&map, error_tilewidth, sizeof (error_tilewidth))); + GREATEST_PASS(); +} + +GREATEST_TEST +test_error_tileheight(void) +{ + struct map_data map; + + GREATEST_ASSERT(!map_data_openmem(&map, error_tileheight, sizeof (error_tileheight))); + GREATEST_PASS(); } -SUITE(basics) +GREATEST_SUITE(basics) { - RUN_TEST(sample); + GREATEST_RUN_TEST(test_sample); } -SUITE(errors) +GREATEST_SUITE(errors) { - RUN_TEST(error_title); - RUN_TEST(error_width); - RUN_TEST(error_height); - RUN_TEST(error_tilewidth); - RUN_TEST(error_tileheight); + GREATEST_RUN_TEST(test_error_title); + GREATEST_RUN_TEST(test_error_width); + GREATEST_RUN_TEST(test_error_height); + GREATEST_RUN_TEST(test_error_tilewidth); + GREATEST_RUN_TEST(test_error_tileheight); } GREATEST_MAIN_DEFS(); @@ -111,8 +119,8 @@ main(int argc, char **argv) { GREATEST_MAIN_BEGIN(); - RUN_SUITE(basics); - RUN_SUITE(errors); + GREATEST_RUN_SUITE(basics); + GREATEST_RUN_SUITE(errors); GREATEST_MAIN_END(); return 0;