1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
#include "unit-test.h"
#include "utf8.h"
#include "strbuf.h"
/*
* Test utf8_strnwidth with various Chinese strings
* Chinese characters typically have a width of 2 columns when displayed
*/
void test_utf8_width__strnwidth_chinese(void)
{
const char *str;
/* Test basic ASCII - each character should have width 1 */
cl_assert_equal_i(5, utf8_strnwidth("Hello", 5, 0));
/* skip_ansi = 1 */
cl_assert_equal_i(5, utf8_strnwidth("Hello", 5, 1));
/* Test simple Chinese characters - each should have width 2 */
/* "你好" is 6 bytes (3 bytes per char in UTF-8), 4 display columns */
cl_assert_equal_i(4, utf8_strnwidth("你好", 6, 0));
/* Test mixed ASCII and Chinese - ASCII = 1 column, Chinese = 2 columns */
/* "h"(1) + "i"(1) + "你"(2) + "好"(2) = 6 */
cl_assert_equal_i(6, utf8_strnwidth("Hi你好", 8, 0));
/* Test longer Chinese string */
/* 5 Chinese chars = 10 display columns */
cl_assert_equal_i(10, utf8_strnwidth("你好世界!", 15, 0));
/* Test individual Chinese character width */
cl_assert_equal_i(2, utf8_strnwidth("中", 3, 0));
/* Test empty string */
cl_assert_equal_i(0, utf8_strnwidth("", 0, 0));
/* Test length limiting */
str = "你好世界";
/* Only first char "你"(2 columns) within 3 bytes */
cl_assert_equal_i(2, utf8_strnwidth(str, 3, 0));
/* First two chars "你好"(4 columns) in 6 bytes */
cl_assert_equal_i(4, utf8_strnwidth(str, 6, 0));
}
/*
* Tests for utf8_strwidth (simpler version without length limit)
*/
void test_utf8_width__strwidth_chinese(void)
{
/* Test basic ASCII */
cl_assert_equal_i(5, utf8_strwidth("Hello"));
/* Test Chinese characters */
/* 2 Chinese chars = 4 display columns */
cl_assert_equal_i(4, utf8_strwidth("你好"));
/* Test longer Chinese string */
/* 5 Chinese chars = 10 display columns */
cl_assert_equal_i(10, utf8_strwidth("你好世界!"));
/* Test mixed ASCII and Chinese */
/* 5 ASCII (5 cols) + 2 Chinese (4 cols) = 9 */
cl_assert_equal_i(9, utf8_strwidth("Hello世界"));
/* 2 ASCII (2 cols) + 2 Chinese (4 cols) + 1 ASCII (1 col) = 7 */
cl_assert_equal_i(7, utf8_strwidth("Hi世界!"));
}
/*
* Additional tests with other East Asian characters
*/
void test_utf8_width__strnwidth_japanese_korean(void)
{
/* Japanese characters (should also be 2 columns each) */
/* 5 Japanese chars x 2 cols each = 10 display columns */
cl_assert_equal_i(10, utf8_strnwidth("こんにちは", 15, 0));
/* Korean characters (should also be 2 columns each) */
/* 5 Korean chars x 2 cols each = 10 display columns */
cl_assert_equal_i(10, utf8_strnwidth("안녕하세요", 15, 0));
}
/*
* Test utf8_strnwidth with CJK strings and ANSI sequences
*/
void test_utf8_width__strnwidth_cjk_with_ansi(void)
{
/* Test CJK with ANSI sequences */
const char *ansi_test = "\033[1m你好\033[0m";
int width = utf8_strnwidth(ansi_test, strlen(ansi_test), 1);
/* Should skip ANSI sequences and count "你好" as 4 columns */
cl_assert_equal_i(4, width);
/* Test mixed ASCII, CJK, and ANSI */
ansi_test = "Hello\033[32m世界\033[0m!";
width = utf8_strnwidth(ansi_test, strlen(ansi_test), 1);
/* "Hello"(5) + "世界"(4) + "!"(1) = 10 */
cl_assert_equal_i(10, width);
}
/*
* Test the strbuf_utf8_align function with CJK characters
*/
void test_utf8_width__strbuf_utf8_align(void)
{
struct strbuf buf = STRBUF_INIT;
/* Test left alignment with CJK */
strbuf_utf8_align(&buf, ALIGN_LEFT, 10, "你好");
/* Since "你好" is 4 display columns, we need 6 more spaces to reach 10 */
cl_assert_equal_s("你好 ", buf.buf);
strbuf_reset(&buf);
/* Test right alignment with CJK */
strbuf_utf8_align(&buf, ALIGN_RIGHT, 8, "世界");
/* "世界" is 4 display columns, so we need 4 leading spaces */
cl_assert_equal_s(" 世界", buf.buf);
strbuf_reset(&buf);
/* Test center alignment with CJK */
strbuf_utf8_align(&buf, ALIGN_MIDDLE, 10, "中");
/* "中" is 2 display columns, so (10-2)/2 = 4 spaces on left, 4 on right */
cl_assert_equal_s(" 中 ", buf.buf);
strbuf_reset(&buf);
strbuf_utf8_align(&buf, ALIGN_MIDDLE, 5, "中");
/* "中" is 2 display columns, so (5-2)/2 = 1 spaces on left, 2 on right */
cl_assert_equal_s(" 中 ", buf.buf);
strbuf_reset(&buf);
/* Test alignment that is smaller than string width */
strbuf_utf8_align(&buf, ALIGN_LEFT, 2, "你好");
/* Since "你好" is 4 display columns, it should not be truncated */
cl_assert_equal_s("你好", buf.buf);
strbuf_release(&buf);
}
|