diff --git a/meson.build b/meson.build index 97f8eae..5ec1c1f 100644 --- a/meson.build +++ b/meson.build @@ -91,8 +91,7 @@ add_project_arguments( language: 'c' ) -tofi_sources = files( - 'src/main.c', +common_sources = files( 'src/color.c', 'src/compgen.c', 'src/config.c', @@ -175,9 +174,11 @@ foreach proto : wl_proto_xml command: [wayland_scanner, 'private-code', '@INPUT@', '@OUTPUT@']) endforeach +subdir('test') + executable( 'tofi', - tofi_sources, wl_proto_src, wl_proto_headers, + files('src/main.c'), common_sources, wl_proto_src, wl_proto_headers, dependencies: [librt, libm, freetype, harfbuzz, cairo, pangocairo, wayland_client, xkbcommon, glib, gio_unix], install: true ) diff --git a/test/meson.build b/test/meson.build new file mode 100644 index 0000000..49f6870 --- /dev/null +++ b/test/meson.build @@ -0,0 +1,15 @@ +tests = [ + 'utf8' +] + +foreach test_file : tests + t = executable( + test_file, + files(test_file + '.c', 'tap.c'), common_sources, wl_proto_src, wl_proto_headers, + include_directories: ['../src'], + dependencies: [librt, libm, freetype, harfbuzz, cairo, pangocairo, wayland_client, xkbcommon, glib, gio_unix], + install: false + ) + + test(test_file, t, protocol: 'tap') +endforeach diff --git a/test/tap.c b/test/tap.c new file mode 100644 index 0000000..47f7063 --- /dev/null +++ b/test/tap.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include + +static size_t test = 0; +static char *todo = NULL; + +void tap_version(size_t version) +{ + printf("TAP version %zu\n", version); +} + +void tap_plan() +{ + printf("1..%zu\n", test); +} + +void tap_ok(const char *message, ...) +{ + va_list args; + va_start(args, message); + printf("ok %zu - ", ++test); + vprintf(message, args); + if (todo != NULL) { + printf(" # TODO %s", todo); + free(todo); + todo = NULL; + } + printf("\n"); + va_end(args); +} + +void tap_not_ok(const char *message, ...) +{ + va_list args; + va_start(args, message); + printf("not ok %zu - ", ++test); + vprintf(message, args); + if (todo != NULL) { + printf(" # TODO %s", todo); + free(todo); + todo = NULL; + } + printf("\n"); + va_end(args); +} + +void tap_todo(const char *message) +{ + todo = strdup(message); +} + diff --git a/test/tap.h b/test/tap.h new file mode 100644 index 0000000..fc0df61 --- /dev/null +++ b/test/tap.h @@ -0,0 +1,15 @@ +#ifndef TAP_H +#define TAP_H + +#include + +#define tap_is(a, b, message) ((a) == (b) ? tap_ok((message)) : tap_not_ok((message))) +#define tap_isnt(a, b, message) ((a) != (b) ? tap_ok((message)) : tap_not_ok((message))) + +void tap_version(size_t version); +void tap_plan(void); +void tap_ok(const char *message, ...); +void tap_not_ok(const char *message, ...); +void tap_todo(const char *message); + +#endif /* TAP_H */ diff --git a/test/utf8.c b/test/utf8.c new file mode 100644 index 0000000..494e75b --- /dev/null +++ b/test/utf8.c @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include +#include "fuzzy_match.h" +#include "tap.h" +#include "utf8.h" + +void is_simple_match(const char *pattern, const char *str, const char *message) +{ + int32_t res = fuzzy_match_simple_words(pattern, str); + tap_isnt(res, INT32_MIN, message); +} + +void isnt_simple_match(const char *pattern, const char *str, const char *message) +{ + int32_t res = fuzzy_match_simple_words(pattern, str); + tap_is(res, INT32_MIN, message); +} + +void is_fuzzy_match(const char *pattern, const char *str, const char *message) +{ + int32_t res = fuzzy_match_words(pattern, str); + tap_isnt(res, INT32_MIN, message); +} + +void isnt_fuzzy_match(const char *pattern, const char *str, const char *message) +{ + int32_t res = fuzzy_match_words(pattern, str); + tap_is(res, INT32_MIN, message); +} + +void is_match(const char *pattern, const char *str, const char *message) +{ + is_simple_match(pattern, str, message); + is_fuzzy_match(pattern, str, message); +} + +void isnt_match(const char *pattern, const char *str, const char *message) +{ + isnt_simple_match(pattern, str, message); + isnt_fuzzy_match(pattern, str, message); +} + +int main(int argc, char *argv[]) +{ + setlocale(LC_ALL, ""); + + tap_version(14); + + /* Case insensitivity. */ + is_match("o", "O", "Single Latin character, different case"); + is_match("д", "Д", "Single Cyrillic character, different case"); + is_match("ξ", "Ξ", "Single Greek character, different case"); + is_match("o", "ọ", "Single character with decomposed diacritic"); + + /* Combining diacritics. */ + isnt_match("o", "ọ", "Single character with composed diacritic"); + isnt_simple_match("ạ", "aọ", "Decomposed diacritics, character mismatch"); + tap_todo("Needs composed character comparison"); + isnt_fuzzy_match("ạ", "aọ", "Decomposed diacritics, character mismatch"); + + tap_plan(); + + return EXIT_SUCCESS; +}