1 /* See LICENSE file for copyright and license details. */
7 #include "../grapheme.h"
11 uint_least32_t cp; /* input codepoint */
12 char *exp_arr; /* expected UTF-8 byte sequence */
13 size_t exp_len; /* expected length of UTF-8 sequence */
16 /* invalid codepoint (UTF-16 surrogate half) */
17 .cp = UINT32_C(0xD800),
18 .exp_arr = (char *)(unsigned char[]){ 0xEF, 0xBF, 0xBD },
22 /* invalid codepoint (UTF-16-unrepresentable) */
23 .cp = UINT32_C(0x110000),
24 .exp_arr = (char *)(unsigned char[]){ 0xEF, 0xBF, 0xBD },
28 /* codepoint encoded to a 1-byte sequence */
30 .exp_arr = (char *)(unsigned char[]){ 0x01 },
34 /* codepoint encoded to a 2-byte sequence */
36 .exp_arr = (char *)(unsigned char[]){ 0xC3, 0xBF },
40 /* codepoint encoded to a 3-byte sequence */
42 .exp_arr = (char *)(unsigned char[]){ 0xE0, 0xBF, 0xBF },
46 /* codepoint encoded to a 4-byte sequence */
47 .cp = UINT32_C(0xFFFFF),
48 .exp_arr = (char *)(unsigned char[]){ 0xF3, 0xBF, 0xBF, 0xBF },
54 main(int argc, char *argv[])
60 /* UTF-8 encoder test */
61 for (i = 0, failed = 0; i < LEN(enc_test); i++) {
65 len = grapheme_encode_utf8(enc_test[i].cp, arr, LEN(arr));
67 if (len != enc_test[i].exp_len ||
68 memcmp(arr, enc_test[i].exp_arr, len)) {
69 fprintf(stderr, "%s, Failed test %zu: "
70 "Expected (", argv[0], i);
71 for (j = 0; j < enc_test[i].exp_len; j++) {
72 fprintf(stderr, "0x%x",
73 enc_test[i].exp_arr[j]);
74 if (j + 1 < enc_test[i].exp_len) {
78 fprintf(stderr, "), but got (");
79 for (j = 0; j < len; j++) {
80 fprintf(stderr, "0x%x", arr[j]);
85 fprintf(stderr, ").\n");
89 printf("%s: %zu/%zu unit tests passed.\n", argv[0],
90 LEN(enc_test) - failed, LEN(enc_test));
92 return (failed > 0) ? 1 : 0;