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;