From d3fddd7d28f314a6738f2a0ba4d9f58024b01984 Mon Sep 17 00:00:00 2001 From: Oxore Date: Thu, 12 Jul 2018 11:51:00 +0300 Subject: Introduce testing with munit, refactor Split unicode routines from text. Testing: add munit submodule, move translation units with main functions to separate folder, make corresponding changes in Makefile. Make simple test for unicode handling routine. Remove _vimrc_local. test.c: optimize includes. Add test run to .travis.yml. --- src/engine.c | 1 + src/main.c | 115 ---------------------------------------------------- src/target/test.c | 57 ++++++++++++++++++++++++++ src/target/tetris.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/text.c | 53 +----------------------- src/unicode.c | 52 ++++++++++++++++++++++++ 6 files changed, 226 insertions(+), 167 deletions(-) delete mode 100644 src/main.c create mode 100644 src/target/test.c create mode 100644 src/target/tetris.c create mode 100644 src/unicode.c (limited to 'src') diff --git a/src/engine.c b/src/engine.c index d9cfe98..482c6df 100644 --- a/src/engine.c +++ b/src/engine.c @@ -11,6 +11,7 @@ #include "vector.h" #include "text.h" #include "field.h" +#include "unicode.h" #include "painter.h" #include "engine.h" diff --git a/src/main.c b/src/main.c deleted file mode 100644 index bf9014a..0000000 --- a/src/main.c +++ /dev/null @@ -1,115 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include "common.h" -#include "idlist.h" -#include "vector.h" -#include "text.h" -#include "field.h" -#include "painter.h" -#include "engine.h" -#include "tet_conf.h" - -sfRenderWindow *window; -struct idlist *texts; - -struct field fld, nxt; -struct game game = { - .started = 0, - .paused = 0, - .scoreCurrent = 0, - .level = 1, - .moveLatency = L00LATENCY, - .lines = 0 -}; - -static void handleWindowEvents() { - sfEvent event; - while (sfRenderWindow_pollEvent(window, &event)) - if (event.type == sfEvtClosed) - sfRenderWindow_close(window); -} - -static void register_text(void *obj) -{ - struct text *text = obj; - text->id = painter_register_text(text); -} - -int main() -{ - srand(time(NULL)); - game.gameTick = sfClock_create(); - game.putTick = sfClock_create(); - game.mTick = sfClock_create(); - game.repPushDown = sfClock_create(); - game.repKeyLeft = sfClock_create(); - game.repKeyRight = sfClock_create(); - painter_load_font("dat/arial.ttf"); - - sfVideoMode mode = (sfVideoMode){450, 570, 32}; - window = sfRenderWindow_create(mode, windowName_conf, sfResize | sfClose, NULL); - if (!window) - exit(EXIT_FAILURE); - sfRenderWindow_setFramerateLimit(window, 60); - painter_set_window(window); - - fld.pos = FLD_POS; - fld.size = (struct vector2ui){.x = FLD_SIZE_X, .y = FLD_SIZE_Y}; - fld.bound = (struct vector2ui){.x = FLD_BOUND_X, .y = FLD_BOUND_Y}; - fld.shape_cnt = 2; - field_init(&fld); - fld.shape[0].attr |= SHP_ATTR_GHOST; - - nxt.pos = NXT_POS; - nxt.size = NXT_SIZE; - nxt.bound = NXT_SIZE; - nxt.shape_cnt = 3; - nxt.attr |= FLD_ATTR_HIDE_EMPTY_CELLS | FLD_ATTR_INVISIBLE; - field_init(&nxt); - nxt.shape[0].y = 4; - nxt.shape[1].y = 1; - nxt.shape[2].y = -2; - - fld.id = painter_register_field(&fld); - nxt.id = painter_register_field(&nxt); - field_fill_random(&fld); - painter_update_field(fld.id, &fld); - painter_update_field(nxt.id, &nxt); - - texts = load_texts("dat/texts.yaml"); - - list_foreach(texts, register_text); - - transition_init(); - while (sfRenderWindow_isOpen(window)) { - handleWindowEvents(); - main_loop(); - } - - list_foreach(texts, text_destroy); - list_destroy(texts); - - painter_destroy_drawables(); - field_deinit(&fld); - field_deinit(&nxt); - - if (window) { - sfRenderWindow_destroy(window); - window = 0; - } - painter_destroy_font(); - sfClock_destroy(game.gameTick); - sfClock_destroy(game.putTick); - sfClock_destroy(game.mTick); - sfClock_destroy(game.repPushDown); - sfClock_destroy(game.repKeyLeft); - sfClock_destroy(game.repKeyRight); - return EXIT_SUCCESS; -} diff --git a/src/target/test.c b/src/target/test.c new file mode 100644 index 0000000..60439a5 --- /dev/null +++ b/src/target/test.c @@ -0,0 +1,57 @@ +#include "munit.h" + +#include "unicode.h" + +struct u_pair { + char *utf8; + wchar_t *utf32; +}; + +struct u_pair *text_fixture; + +static void *test_text_setup(const MunitParameter params[], void *user_data) { + (void) params; + (void) user_data; + + return text_fixture; +} + +static MunitResult test_text(const MunitParameter params[], void *fixture) { + (void) params; + struct u_pair *f = fixture; + + munit_assert_ulong(utf8_strlen(f[0].utf8), ==, strlen(f[0].utf8)); + + return MUNIT_OK; +} + +static MunitTest test_suite_tests[] = { + { + "/example/parameters", + test_text, + test_text_setup, + NULL, + MUNIT_TEST_OPTION_NONE, + NULL + }, + {NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL} +}; + +static const MunitSuite test_suite = { + "unit", + test_suite_tests, + NULL, + 1, + MUNIT_SUITE_OPTION_NONE +}; + +int main(int argc, char **argv) { + text_fixture = (struct u_pair []){ + { + .utf8 = "Single byte ascii symbols string", + .utf32 = L"Single byte ascii symbols string" + } + }; + + return munit_suite_main(&test_suite, NULL, argc, argv); +} diff --git a/src/target/tetris.c b/src/target/tetris.c new file mode 100644 index 0000000..2419c8d --- /dev/null +++ b/src/target/tetris.c @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "idlist.h" +#include "vector.h" +#include "text.h" +#include "field.h" +#include "painter.h" +#include "engine.h" +#include "tet_conf.h" + +sfRenderWindow *window; +struct idlist *texts; + +struct field fld, nxt; +struct game game = { + .started = 0, + .paused = 0, + .scoreCurrent = 0, + .level = 1, + .moveLatency = L00LATENCY, + .lines = 0 +}; + +static void handleWindowEvents() { + sfEvent event; + while (sfRenderWindow_pollEvent(window, &event)) + if (event.type == sfEvtClosed) + sfRenderWindow_close(window); +} + +static void register_text(void *obj) +{ + struct text *text = obj; + text->id = painter_register_text(text); +} + +int main() +{ + srand(time(NULL)); + game.gameTick = sfClock_create(); + game.putTick = sfClock_create(); + game.mTick = sfClock_create(); + game.repPushDown = sfClock_create(); + game.repKeyLeft = sfClock_create(); + game.repKeyRight = sfClock_create(); + painter_load_font("dat/arial.ttf"); + + sfVideoMode mode = (sfVideoMode){450, 570, 32}; + window = sfRenderWindow_create(mode, windowName_conf, sfResize | sfClose, NULL); + if (!window) + exit(EXIT_FAILURE); + sfRenderWindow_setFramerateLimit(window, 60); + painter_set_window(window); + + fld.pos = FLD_POS; + fld.size = (struct vector2ui){.x = FLD_SIZE_X, .y = FLD_SIZE_Y}; + fld.bound = (struct vector2ui){.x = FLD_BOUND_X, .y = FLD_BOUND_Y}; + fld.shape_cnt = 2; + field_init(&fld); + fld.shape[0].attr |= SHP_ATTR_GHOST; + + nxt.pos = NXT_POS; + nxt.size = NXT_SIZE; + nxt.bound = NXT_SIZE; + nxt.shape_cnt = 3; + nxt.attr |= FLD_ATTR_HIDE_EMPTY_CELLS | FLD_ATTR_INVISIBLE; + field_init(&nxt); + nxt.shape[0].y = 4; + nxt.shape[1].y = 1; + nxt.shape[2].y = -2; + + fld.id = painter_register_field(&fld); + nxt.id = painter_register_field(&nxt); + field_fill_random(&fld); + painter_update_field(fld.id, &fld); + painter_update_field(nxt.id, &nxt); + + texts = load_texts("dat/texts.yaml"); + + list_foreach(texts, register_text); + + transition_init(); + while (sfRenderWindow_isOpen(window)) { + handleWindowEvents(); + main_loop(); + } + + list_foreach(texts, text_destroy); + list_destroy(texts); + + painter_destroy_drawables(); + field_deinit(&fld); + field_deinit(&nxt); + + if (window) { + sfRenderWindow_destroy(window); + window = 0; + } + painter_destroy_font(); + sfClock_destroy(game.gameTick); + sfClock_destroy(game.putTick); + sfClock_destroy(game.mTick); + sfClock_destroy(game.repPushDown); + sfClock_destroy(game.repKeyLeft); + sfClock_destroy(game.repKeyRight); + return EXIT_SUCCESS; +} diff --git a/src/text.c b/src/text.c index 46304ae..8c110d7 100644 --- a/src/text.c +++ b/src/text.c @@ -1,63 +1,12 @@ #include #include #include -#include -#include -#include #include -#include "common.h" #include "idlist.h" #include "vector.h" #include "text.h" - -static inline unsigned int utf8_char_len(unsigned char c) -{ - if (c > 0x00 && c < 0xC0) - return 1; - else if (c >= 0xC2 && c < 0xE0) - return 2; - else if (c >= 0xE0 && c < 0xF0) - return 3; - else if (c >= 0xF0 && c < 0xF5) - return 4; - else - return 0; -} - -unsigned long utf8_strlen(void *string) -{ - unsigned long len = 0, keep = 0; - for (unsigned char *c = string; *c; (keep ? --keep : ++len), ++c) - if (!keep) - keep = (keep = utf8_char_len(*c)) ? keep - 1 : keep; - return len; -} - -void utf8to32_strcpy(wchar_t *dest, char *src) -{ - wchar_t *dc = dest; - char *c = src; - unsigned long len = 0; - while (*c) { - int clen = utf8_char_len(*c); - if (clen == 1) { - dc[len] = c[0] & 0x7f; - } else if (clen == 2) { - dc[len] = ((c[0] & 0x1f) << 6) | ((c[1] & 0x3f) << 0); - } else if (clen == 3) { - dc[len] = ((c[0] & 0x0f) << 12) | ((c[1] & 0x3f) << 6) | ((c[2] & 0x3f) << 0); - } else if (clen == 4) { - dc[len] = ((c[0] & 0x07) << 18) | ((c[1] & 0x3f) << 12) | ((c[2] & 0x3f) << 6) | ((c[3] & 0x3f) << 0); - } else { - dc[len] = 0; - return; - } - c += clen; - ++len; - } - dc[len] = 0; -} +#include "unicode.h" static FILE *openFile(char *filename) { diff --git a/src/unicode.c b/src/unicode.c new file mode 100644 index 0000000..dea541a --- /dev/null +++ b/src/unicode.c @@ -0,0 +1,52 @@ +#include +#include + +#include "unicode.h" + +static inline unsigned int utf8_char_len(unsigned char c) +{ + if (c > 0x00 && c < 0xC0) + return 1; + else if (c >= 0xC2 && c < 0xE0) + return 2; + else if (c >= 0xE0 && c < 0xF0) + return 3; + else if (c >= 0xF0 && c < 0xF5) + return 4; + else + return 0; +} + +unsigned long utf8_strlen(void *string) +{ + unsigned long len = 0, keep = 0; + for (unsigned char *c = string; *c; (keep ? --keep : ++len), ++c) + if (!keep) + keep = (keep = utf8_char_len(*c)) ? keep - 1 : keep; + return len; +} + +void utf8to32_strcpy(wchar_t *dest, char *src) +{ + wchar_t *dc = dest; + char *c = src; + unsigned long len = 0; + while (*c) { + int clen = utf8_char_len(*c); + if (clen == 1) { + dc[len] = c[0] & 0x7f; + } else if (clen == 2) { + dc[len] = ((c[0] & 0x1f) << 6) | ((c[1] & 0x3f) << 0); + } else if (clen == 3) { + dc[len] = ((c[0] & 0x0f) << 12) | ((c[1] & 0x3f) << 6) | ((c[2] & 0x3f) << 0); + } else if (clen == 4) { + dc[len] = ((c[0] & 0x07) << 18) | ((c[1] & 0x3f) << 12) | ((c[2] & 0x3f) << 6) | ((c[3] & 0x3f) << 0); + } else { + dc[len] = 0; + return; + } + c += clen; + ++len; + } + dc[len] = 0; +} -- cgit v1.2.3