diff options
| author | sumuel <samuel@yakubos.org> | 2026-08-17 20:44:55 +0000 |
|---|---|---|
| committer | sumuel <samuel@yakubos.org> | 2026-08-17 20:44:55 +0000 |
| commit | 76424950e373d3b04ac3dd13019151bfba3e8423 (patch) | |
| tree | 4c3cfdbda039e592b9186be3e28f8d7cfd439e8a /tests/strutil.c | |
Add the files
Diffstat (limited to 'tests/strutil.c')
| -rw-r--r-- | tests/strutil.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/tests/strutil.c b/tests/strutil.c new file mode 100644 index 0000000..3d065ee --- /dev/null +++ b/tests/strutil.c @@ -0,0 +1,108 @@ +#include "common/strutil.h" +#include "common/textModifier.h" + +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> + +static void verify(bool expression, const char* expressionStr, int lineNo) { + if (expression) { + return; + } + + fprintf(stderr, FASTFETCH_TEXT_MODIFIER_ERROR "[%d] %s\n" FASTFETCH_TEXT_MODIFIER_RESET, lineNo, expressionStr); + exit(1); +} + +#define VERIFY(expression) verify((expression), #expression, __LINE__) + +int main(void) { + #if FF_ENABLE_WCWIDTH + { + uint8_t width = 255; + uint8_t bytes = ffUtf8CharLenWidth("", 0, &width); + VERIFY(bytes == 0); + VERIFY(width == 0); + } + + { + uint8_t width = 0; + uint8_t bytes = ffUtf8CharLenWidth("A", 1, &width); + VERIFY(bytes == 1); + VERIFY(width == 1); + } + + { + const char* ch = "\xE6\x96\x87"; // 文 U+6587 + uint8_t width = 0; + uint8_t bytes = ffUtf8CharLenWidth(ch, 3, &width); + VERIFY(bytes == 3); + VERIFY(width == 2); + } + + { + const char* combining = "\xCC\x81"; // ◌́ U+0301 + uint8_t width = 0; + uint8_t bytes = ffUtf8CharLenWidth(combining, 2, &width); + VERIFY(bytes == 2); + VERIFY(width == 0); // Should be 1 since there's no base character + } + + { + uint8_t width = 0; + uint8_t bytes = ffUtf8CharLenWidth("\xE6\x96\x87", 1, &width); // truncated + VERIFY(bytes == 1); + VERIFY(width == 1); + } + + { + uint8_t width = 0; + uint8_t bytes = ffUtf8CharLenWidth("\xE6" + "A", + 2, + &width); // invalid continuation + VERIFY(bytes == 1); + VERIFY(width == 1); + } + + { + VERIFY(ffUtf8StrWidth("abc", 3) == 3); + } + + { + const char* mixed = "A" + "\xE6\x96\x87" // 文 U+6587 + "B"; + VERIFY(ffUtf8StrWidth(mixed, 5) == 4); + } + + { + const char* combining = "A\xCC\x81"; // Á + VERIFY(ffUtf8StrWidth(combining, 3) == 1); + } + + { + VERIFY(ffUtf8StrWidth("\xE6" + "A", + 2) == 2); + } + + { + VERIFY(ffUtf8StrWidth("", 0) == 0); + VERIFY(ffUtf8StrWidth("A\0B", 3) == 1); + } + + { + const char* emoji = "\xF0\x9F\x98\x80"; // U+1F600 😀 + uint8_t width = 0; + uint8_t bytes = ffUtf8CharLenWidth(emoji, 4, &width); + VERIFY(bytes == 4); + VERIFY(width == 2); + } + + puts("\033[32mAll tests passed!" FASTFETCH_TEXT_MODIFIER_RESET); + #else + puts("\033[33mTests skipped because wcwidth support is disabled." FASTFETCH_TEXT_MODIFIER_RESET); + #endif + return 0; +} |