util.c - libgrapheme - unicode string library
 (HTM) git clone git://git.suckless.org/libgrapheme
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       util.c (3049B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #include <stdbool.h>
            3 #include <stddef.h>
            4 #include <stdint.h>
            5 #include <stdio.h>
            6 #include <string.h>
            7 
            8 #include "../gen/types.h"
            9 #include "../grapheme.h"
           10 #include "util.h"
           11 
           12 int
           13 run_break_tests(size_t (*next_break)(const uint_least32_t *, size_t),
           14                 const struct break_test *test, size_t testlen,
           15                 const char *argv0)
           16 {
           17         size_t i, j, off, res, failed;
           18 
           19         /* character break test */
           20         for (i = 0, failed = 0; i < testlen; i++) {
           21                 for (j = 0, off = 0; off < test[i].cplen; off += res) {
           22                         res = next_break(test[i].cp + off, test[i].cplen - off);
           23 
           24                         /* check if our resulting offset matches */
           25                         if (j == test[i].lenlen || res != test[i].len[j++]) {
           26                                 fprintf(stderr,
           27                                         "%s: Failed conformance test %zu "
           28                                         "\"%s\".\n",
           29                                         argv0, i, test[i].descr);
           30                                 fprintf(stderr,
           31                                         "J=%zu: EXPECTED len %zu, got %zu\n",
           32                                         j - 1, test[i].len[j - 1], res);
           33                                 failed++;
           34                                 break;
           35                         }
           36                 }
           37         }
           38         printf("%s: %zu/%zu conformance tests passed.\n", argv0,
           39                testlen - failed, testlen);
           40 
           41         return (failed > 0) ? 1 : 0;
           42 }
           43 
           44 int
           45 run_unit_tests(int (*unit_test_callback)(const void *, size_t, const char *,
           46                                          const char *),
           47                const void *test, size_t testlen, const char *name,
           48                const char *argv0)
           49 {
           50         size_t i, failed;
           51 
           52         for (i = 0, failed = 0; i < testlen; i++) {
           53                 failed +=
           54                         (unit_test_callback(test, i, name, argv0) == 0) ? 0 : 1;
           55         }
           56 
           57         printf("%s: %s: %zu/%zu unit tests passed.\n", argv0, name,
           58                testlen - failed, testlen);
           59 
           60         return (failed > 0) ? 1 : 0;
           61 }
           62 
           63 int
           64 unit_test_callback_next_break(const struct unit_test_next_break *t, size_t off,
           65                               size_t (*next_break)(const uint_least32_t *,
           66                                                    size_t),
           67                               const char *name, const char *argv0)
           68 {
           69         const struct unit_test_next_break *test = t + off;
           70 
           71         size_t ret = next_break(test->input.src, test->input.srclen);
           72 
           73         if (ret != test->output.ret) {
           74                 goto err;
           75         }
           76 
           77         return 0;
           78 err:
           79         fprintf(stderr,
           80                 "%s: %s: Failed unit test %zu \"%s\" "
           81                 "(returned %zu instead of %zu).\n",
           82                 argv0, name, off, test->description, ret, test->output.ret);
           83         return 1;
           84 }
           85 
           86 int
           87 unit_test_callback_next_break_utf8(const struct unit_test_next_break_utf8 *t,
           88                                    size_t off,
           89                                    size_t (*next_break_utf8)(const char *,
           90                                                              size_t),
           91                                    const char *name, const char *argv0)
           92 {
           93         const struct unit_test_next_break_utf8 *test = t + off;
           94 
           95         size_t ret = next_break_utf8(test->input.src, test->input.srclen);
           96 
           97         if (ret != test->output.ret) {
           98                 goto err;
           99         }
          100 
          101         return 0;
          102 err:
          103         fprintf(stderr,
          104                 "%s: %s: Failed unit test %zu \"%s\" "
          105                 "(returned %zu instead of %zu).\n",
          106                 argv0, name, off, test->description, ret, test->output.ret);
          107         return 1;
          108 }