aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt5
-rw-r--r--fuzzpuzz.c65
2 files changed, 70 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9e8d96f..5e7992c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -275,4 +275,9 @@ cliprogram(penrose-vector-test penrose.c COMPILE_DEFINITIONS TEST_VECTORS)
cliprogram(sort-test sort.c COMPILE_DEFINITIONS SORT_TEST)
cliprogram(tree234-test tree234.c COMPILE_DEFINITIONS TEST)
+write_generated_games_header()
+cliprogram(fuzzpuzz fuzzpuzz.c list.c ${puzzle_sources}
+ COMPILE_DEFINITIONS COMBINED)
+target_include_directories(fuzzpuzz PRIVATE ${generated_include_dir})
+
build_extras()
diff --git a/fuzzpuzz.c b/fuzzpuzz.c
new file mode 100644
index 0000000..4ee523f
--- /dev/null
+++ b/fuzzpuzz.c
@@ -0,0 +1,65 @@
+/*
+ * fuzzpuzz.c: Fuzzing frontend to all puzzles.
+ */
+
+/*
+ * The idea here is that this front-end supports all back-ends and can
+ * feed them save files. This tests the deserialiser, the code for
+ * loading game descriptions, and the processing of move strings,
+ * without all the tedium of actually rendering anything.
+ */
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "puzzles.h"
+
+static bool savefile_read(void *wctx, void *buf, int len)
+{
+ FILE *fp = (FILE *)wctx;
+ int ret;
+
+ ret = fread(buf, 1, len, fp);
+ return (ret == len);
+}
+
+int main(int argc, char **argv)
+{
+ const char *err;
+ char *gamename;
+ int i;
+ const game * ourgame = NULL;
+ midend *me;
+
+ if (argc != 1) {
+ fprintf(stderr, "usage: %s\n", argv[0]);
+ exit(1);
+ }
+
+ err = identify_game(&gamename, savefile_read, stdin);
+ if (err != NULL) {
+ fprintf(stderr, "%s\n", err);
+ exit(1);
+ }
+
+ for (i = 0; i < gamecount; i++)
+ if (strcmp(gamename, gamelist[i]->name) == 0)
+ ourgame = gamelist[i];
+ if (ourgame == NULL) {
+ fprintf(stderr, "Game '%s' not recognised\n", gamename);
+ exit(1);
+ }
+
+ me = midend_new(NULL, ourgame, NULL, NULL);
+
+ rewind(stdin);
+ err = midend_deserialise(me, savefile_read, stdin);
+ if (err != NULL) {
+ fprintf(stderr, "%s\n", err);
+ exit(1);
+ }
+ midend_free(me);
+ return 0;
+}