[C] Refactoring for utf-8
This commit is contained in:
@@ -125,12 +125,55 @@ void test_bug_fixes(void)
|
||||
ft_destroy_table(table);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef FT_HAVE_UTF8
|
||||
SCENARIO("Issue 11 - https://github.com/seleznevae/libfort/issues/11 (utf-8 case)") {
|
||||
ft_table_t *table = ft_create_table();
|
||||
ft_set_border_style(table, FT_PLAIN_STYLE);
|
||||
|
||||
ft_set_cell_prop(table, 0, FT_ANY_COLUMN, FT_CPROP_ROW_TYPE, FT_ROW_HEADER);
|
||||
ft_u8write_ln(table, "1", "2");
|
||||
ft_u8write_ln(table, "3", "4");
|
||||
|
||||
const char *table_str = ft_to_u8string(table);
|
||||
assert_true(table_str != NULL);
|
||||
const char *table_str_etalon =
|
||||
"-------\n"
|
||||
" 1 2 \n"
|
||||
"-------\n"
|
||||
" 3 4 \n";
|
||||
assert_str_equal(table_str, table_str_etalon);
|
||||
ft_destroy_table(table);
|
||||
}
|
||||
#endif /* FT_HAVE_UTF8 */
|
||||
}
|
||||
|
||||
void test_table_basic(void)
|
||||
{
|
||||
ft_table_t *table = NULL;
|
||||
|
||||
WHEN("Empty table") {
|
||||
table = ft_create_table();
|
||||
assert_true(table != NULL);
|
||||
|
||||
const char *table_str = ft_to_string(table);
|
||||
assert_true(table_str != NULL);
|
||||
const char *table_str_etalon = "";
|
||||
assert_str_equal(table_str, table_str_etalon);
|
||||
#ifdef FT_HAVE_WCHAR
|
||||
const wchar_t *table_wstr = ft_to_wstring(table);
|
||||
assert_true(table_wstr != NULL);
|
||||
const wchar_t *table_wstr_etalon = L"";
|
||||
assert_wcs_equal(table_wstr, table_wstr_etalon);
|
||||
#endif
|
||||
#ifdef FT_HAVE_UTF8
|
||||
table_str = ft_to_u8string(table);
|
||||
assert_true(table_str != NULL);
|
||||
assert_str_equal(table_str, table_str_etalon);
|
||||
#endif /* FT_HAVE_UTF8 */
|
||||
ft_destroy_table(table);
|
||||
}
|
||||
|
||||
WHEN("All columns are equal and not empty") {
|
||||
table = ft_create_table();
|
||||
assert_true(table != NULL);
|
||||
@@ -193,6 +236,39 @@ void test_table_basic(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef FT_HAVE_UTF8
|
||||
WHEN("All columns are equal and not empty (utf8 strings)") {
|
||||
table = ft_create_table();
|
||||
assert_true(table != NULL);
|
||||
assert_true(set_test_props_for_table(table) == FT_SUCCESS);
|
||||
|
||||
ft_set_cell_prop(table, 0, FT_ANY_COLUMN, FT_CPROP_ROW_TYPE, FT_ROW_HEADER);
|
||||
assert_true(ft_u8write_ln(table, "3", "c", "234", "3.140000") == FT_SUCCESS);
|
||||
assert_true(ft_u8write_ln(table, "3", "c", "234", "3.140000") == FT_SUCCESS);
|
||||
assert_true(ft_u8write_ln(table, "3", "c", "234", "3.140000") == FT_SUCCESS);
|
||||
|
||||
const char *table_str = ft_to_u8string(table);
|
||||
assert_true(table_str != NULL);
|
||||
|
||||
const char *table_str_etalon =
|
||||
"+---+---+-----+----------+\n"
|
||||
"| | | | |\n"
|
||||
"| 3 | c | 234 | 3.140000 |\n"
|
||||
"| | | | |\n"
|
||||
"+---+---+-----+----------+\n"
|
||||
"| | | | |\n"
|
||||
"| 3 | c | 234 | 3.140000 |\n"
|
||||
"| | | | |\n"
|
||||
"+---+---+-----+----------+\n"
|
||||
"| | | | |\n"
|
||||
"| 3 | c | 234 | 3.140000 |\n"
|
||||
"| | | | |\n"
|
||||
"+---+---+-----+----------+\n";
|
||||
assert_str_equal(table_str, table_str_etalon);
|
||||
ft_destroy_table(table);
|
||||
}
|
||||
#endif /* FT_HAVE_UTF8 */
|
||||
|
||||
WHEN("All columns are not equal and not empty") {
|
||||
table = ft_create_table();
|
||||
assert_true(table != NULL);
|
||||
@@ -255,6 +331,38 @@ void test_table_basic(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef FT_HAVE_UTF8
|
||||
WHEN("All columns are not equal and not empty") {
|
||||
table = ft_create_table();
|
||||
assert_true(table != NULL);
|
||||
assert_true(set_test_props_for_table(table) == FT_SUCCESS);
|
||||
|
||||
ft_set_cell_prop(table, 0, FT_ANY_COLUMN, FT_CPROP_ROW_TYPE, FT_ROW_HEADER);
|
||||
assert_true(ft_u8write_ln(table, "3", "c", "234", "3.140000") == FT_SUCCESS);
|
||||
assert_true(ft_u8write_ln(table, "c", "234", "3.140000", "3") == FT_SUCCESS);
|
||||
assert_true(ft_u8write_ln(table, "234", "3.140000", "3", "c") == FT_SUCCESS);
|
||||
|
||||
const char *table_str = ft_to_u8string(table);
|
||||
assert_true(table_str != NULL);
|
||||
const char *table_str_etalon =
|
||||
"+-----+----------+----------+----------+\n"
|
||||
"| | | | |\n"
|
||||
"| 3 | c | 234 | 3.140000 |\n"
|
||||
"| | | | |\n"
|
||||
"+-----+----------+----------+----------+\n"
|
||||
"| | | | |\n"
|
||||
"| c | 234 | 3.140000 | 3 |\n"
|
||||
"| | | | |\n"
|
||||
"+-----+----------+----------+----------+\n"
|
||||
"| | | | |\n"
|
||||
"| 234 | 3.140000 | 3 | c |\n"
|
||||
"| | | | |\n"
|
||||
"+-----+----------+----------+----------+\n";
|
||||
assert_str_equal(table_str, table_str_etalon);
|
||||
ft_destroy_table(table);
|
||||
}
|
||||
#endif /* FT_HAVE_UTF8 */
|
||||
|
||||
WHEN("All columns are not equal and some cells are empty") {
|
||||
table = ft_create_table();
|
||||
assert_true(table != NULL);
|
||||
@@ -317,6 +425,38 @@ void test_table_basic(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef FT_HAVE_UTF8
|
||||
WHEN("All columns are not equal and some cells are empty (utf-8 strings)") {
|
||||
table = ft_create_table();
|
||||
assert_true(table != NULL);
|
||||
assert_true(set_test_props_for_table(table) == FT_SUCCESS);
|
||||
|
||||
ft_set_cell_prop(table, 0, FT_ANY_COLUMN, FT_CPROP_ROW_TYPE, FT_ROW_HEADER);
|
||||
assert_true(ft_u8write_ln(table, "", "", "234", "3.140000") == FT_SUCCESS);
|
||||
assert_true(ft_u8write_ln(table, "c", "234", "3.140000", "") == FT_SUCCESS);
|
||||
assert_true(ft_u8write_ln(table, "234", "3.140000", "", "") == FT_SUCCESS);
|
||||
|
||||
const char *table_str = ft_to_u8string(table);
|
||||
assert_true(table_str != NULL);
|
||||
const char *table_str_etalon =
|
||||
"+-----+----------+----------+----------+\n"
|
||||
"| | | | |\n"
|
||||
"| | | 234 | 3.140000 |\n"
|
||||
"| | | | |\n"
|
||||
"+-----+----------+----------+----------+\n"
|
||||
"| | | | |\n"
|
||||
"| c | 234 | 3.140000 | |\n"
|
||||
"| | | | |\n"
|
||||
"+-----+----------+----------+----------+\n"
|
||||
"| | | | |\n"
|
||||
"| 234 | 3.140000 | | |\n"
|
||||
"| | | | |\n"
|
||||
"+-----+----------+----------+----------+\n";
|
||||
assert_str_equal(table_str, table_str_etalon);
|
||||
ft_destroy_table(table);
|
||||
}
|
||||
#endif /* FT_HAVE_UTF8 */
|
||||
|
||||
WHEN("All cells are empty") {
|
||||
table = ft_create_table();
|
||||
assert_true(table != NULL);
|
||||
@@ -378,6 +518,40 @@ void test_table_basic(void)
|
||||
ft_destroy_table(table);
|
||||
}
|
||||
#endif
|
||||
|
||||
WHEN("Multiline conten") {
|
||||
table = ft_create_table();
|
||||
assert_true(table != NULL);
|
||||
assert_true(set_test_props_for_table(table) == FT_SUCCESS);
|
||||
|
||||
ft_set_cell_prop(table, 0, FT_ANY_COLUMN, FT_CPROP_ROW_TYPE, FT_ROW_HEADER);
|
||||
assert_true(ft_write_ln(table, "3", "c", "234\n2", "3.140000") == FT_SUCCESS);
|
||||
assert_true(ft_write_ln(table, "3", "c", "234", "3.140000\n123") == FT_SUCCESS);
|
||||
assert_true(ft_write_ln(table, "3", "c", "234", "x") == FT_SUCCESS);
|
||||
|
||||
ft_set_cell_prop(table, FT_ANY_ROW, 3, FT_CPROP_TEXT_ALIGN, FT_ALIGNED_RIGHT);
|
||||
|
||||
const char *table_str = ft_to_string(table);
|
||||
assert_true(table_str != NULL);
|
||||
const char *table_str_etalon =
|
||||
"+---+---+-----+----------+\n"
|
||||
"| | | | |\n"
|
||||
"| 3 | c | 234 | 3.140000 |\n"
|
||||
"| | | 2 | |\n"
|
||||
"| | | | |\n"
|
||||
"+---+---+-----+----------+\n"
|
||||
"| | | | |\n"
|
||||
"| 3 | c | 234 | 3.140000 |\n"
|
||||
"| | | | 123 |\n" /* todo: Fix strange alignment for multiline cells */
|
||||
"| | | | |\n"
|
||||
"+---+---+-----+----------+\n"
|
||||
"| | | | |\n"
|
||||
"| 3 | c | 234 | x |\n"
|
||||
"| | | | |\n"
|
||||
"+---+---+-----+----------+\n";
|
||||
assert_str_equal(table_str, table_str_etalon);
|
||||
ft_destroy_table(table);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -419,6 +593,138 @@ void test_wcs_table_boundaries(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef FT_HAVE_UTF8
|
||||
void test_utf8_table(void)
|
||||
{
|
||||
ft_table_t *table = NULL;
|
||||
|
||||
#define TEST_UTF8_SIMPLE(content) \
|
||||
{ \
|
||||
table = ft_create_table(); \
|
||||
assert_true(table != NULL); \
|
||||
assert(ft_set_border_style(table, FT_EMPTY_STYLE) == 0); \
|
||||
assert_true(ft_u8write_ln(table, content) == FT_SUCCESS); \
|
||||
const char *table_str = ft_to_u8string(table); \
|
||||
assert_true(table_str != NULL); \
|
||||
char table_str_etalon[1024] = {'\0'}; \
|
||||
snprintf(table_str_etalon, 1024," %s \n", content); \
|
||||
assert_str_equal(table_str, table_str_etalon); \
|
||||
ft_destroy_table(table); \
|
||||
}
|
||||
TEST_UTF8_SIMPLE("");
|
||||
TEST_UTF8_SIMPLE("1");
|
||||
TEST_UTF8_SIMPLE("foo");
|
||||
TEST_UTF8_SIMPLE("1234567890");
|
||||
TEST_UTF8_SIMPLE("Xylophmsik");
|
||||
TEST_UTF8_SIMPLE("ψημένηζειθ");
|
||||
TEST_UTF8_SIMPLE("D’ḟuascail");
|
||||
TEST_UTF8_SIMPLE("Pójdźżełąć");
|
||||
TEST_UTF8_SIMPLE("«braçõeshá");
|
||||
TEST_UTF8_SIMPLE("французких");
|
||||
TEST_UTF8_SIMPLE("Benjamínúñ");
|
||||
TEST_UTF8_SIMPLE("görmüştüçğ");
|
||||
TEST_UTF8_SIMPLE("視野無限廣窗外有藍天");
|
||||
TEST_UTF8_SIMPLE("いろはにほへとちりぬ");
|
||||
TEST_UTF8_SIMPLE("𠜎𠜱𠝹𠱓𠱸𠲖𠳏𠳕𠴕𠵼");
|
||||
#undef TEST_UTF8_SIMPLE
|
||||
|
||||
#define TEST_UTF8_SIMPLE_STYLE(content) \
|
||||
{ \
|
||||
table = ft_create_table(); \
|
||||
assert_true(table != NULL); \
|
||||
assert(ft_set_border_style(table, FT_EMPTY_STYLE) == 0); \
|
||||
assert_true(ft_u8write_ln(table, content) == FT_SUCCESS); \
|
||||
assert(ft_set_cell_prop(table, 0, 0, FT_CPROP_CONT_FG_COLOR, FT_COLOR_YELLOW) == FT_SUCCESS); \
|
||||
assert(ft_set_cell_prop(table, 0, 0, FT_CPROP_CELL_BG_COLOR, FT_COLOR_RED) == FT_SUCCESS); \
|
||||
assert(ft_set_cell_prop(table, 0, 0, FT_CPROP_CONT_TEXT_STYLE, FT_TSTYLE_UNDERLINED) == FT_SUCCESS); \
|
||||
const char *table_str = ft_to_u8string(table); \
|
||||
assert_true(table_str != NULL); \
|
||||
char table_str_etalon[1024] = {'\0'}; \
|
||||
snprintf(table_str_etalon, 1024, \
|
||||
"\033[41m \033[4m\033[33m%s\033[0m\033[41m \033[0m\n", content); \
|
||||
assert_str_equal(table_str, table_str_etalon); \
|
||||
ft_destroy_table(table); \
|
||||
}
|
||||
TEST_UTF8_SIMPLE_STYLE("1234567890");
|
||||
TEST_UTF8_SIMPLE_STYLE("Xylophmsik");
|
||||
TEST_UTF8_SIMPLE_STYLE("ψημένηζειθ");
|
||||
TEST_UTF8_SIMPLE_STYLE("D’ḟuascail");
|
||||
TEST_UTF8_SIMPLE_STYLE("Pójdźżełąć");
|
||||
TEST_UTF8_SIMPLE_STYLE("«braçõeshá");
|
||||
TEST_UTF8_SIMPLE_STYLE("французких");
|
||||
TEST_UTF8_SIMPLE_STYLE("Benjamínúñ");
|
||||
TEST_UTF8_SIMPLE_STYLE("görmüştüçğ");
|
||||
TEST_UTF8_SIMPLE_STYLE("視野無限廣窗外有藍天");
|
||||
TEST_UTF8_SIMPLE_STYLE("いろはにほへとちりぬ");
|
||||
TEST_UTF8_SIMPLE_STYLE("𠜎𠜱𠝹𠱓𠱸𠲖𠳏𠳕𠴕𠵼");
|
||||
#undef TEST_UTF8_SIMPLE_STYLE
|
||||
|
||||
#define TEST_UTF8_BORDER(content) \
|
||||
{ \
|
||||
table = ft_create_table(); \
|
||||
assert_true(table != NULL); \
|
||||
assert(ft_set_border_style(table, FT_BASIC_STYLE) == 0); \
|
||||
assert_true(ft_u8write_ln(table, content) == FT_SUCCESS); \
|
||||
const char *table_str = ft_to_u8string(table); \
|
||||
assert_true(table_str != NULL); \
|
||||
char table_str_etalon[1024] = {'\0'}; \
|
||||
snprintf(table_str_etalon, 1024, \
|
||||
"+------------+\n" \
|
||||
"| %s |\n" \
|
||||
"+------------+\n", content); \
|
||||
assert_str_equal(table_str, table_str_etalon); \
|
||||
ft_destroy_table(table); \
|
||||
}
|
||||
|
||||
TEST_UTF8_BORDER("1234567890");
|
||||
TEST_UTF8_BORDER("Xylophmsik");
|
||||
TEST_UTF8_BORDER("ψημένηζειθ");
|
||||
TEST_UTF8_BORDER("D’ḟuascail");
|
||||
TEST_UTF8_BORDER("Pójdźżełąć");
|
||||
TEST_UTF8_BORDER("«braçõeshá");
|
||||
TEST_UTF8_BORDER("французких");
|
||||
TEST_UTF8_BORDER("Benjamínúñ");
|
||||
TEST_UTF8_BORDER("görmüştüçğ");
|
||||
TEST_UTF8_BORDER("視野無限廣窗外有藍天");
|
||||
TEST_UTF8_BORDER("いろはにほへとちりぬ");
|
||||
TEST_UTF8_BORDER("𠜎𠜱𠝹𠱓𠱸𠲖𠳏𠳕𠴕𠵼");
|
||||
#undef TEST_UTF8_BORDER
|
||||
|
||||
#define TEST_UTF8_STYLE(content) \
|
||||
{ \
|
||||
table = ft_create_table(); \
|
||||
assert_true(table != NULL); \
|
||||
assert(ft_set_border_style(table, FT_BASIC_STYLE) == 0); \
|
||||
assert_true(ft_u8write_ln(table, content) == FT_SUCCESS); \
|
||||
assert(ft_set_cell_prop(table, 0, 0, FT_CPROP_CONT_FG_COLOR, FT_COLOR_YELLOW) == FT_SUCCESS); \
|
||||
assert(ft_set_cell_prop(table, 0, 0, FT_CPROP_CELL_BG_COLOR, FT_COLOR_RED) == FT_SUCCESS); \
|
||||
assert(ft_set_cell_prop(table, 0, 0, FT_CPROP_CONT_TEXT_STYLE, FT_TSTYLE_UNDERLINED) == FT_SUCCESS); \
|
||||
const char *table_str = ft_to_u8string(table); \
|
||||
assert_true(table_str != NULL); \
|
||||
char table_str_etalon[1024] = {'\0'}; \
|
||||
snprintf(table_str_etalon, 1024, \
|
||||
"+------------+\n" \
|
||||
"|\033[41m \033[4m\033[33m%s\033[0m\033[41m \033[0m|\n" \
|
||||
"+------------+\n", content); \
|
||||
assert_str_equal(table_str, table_str_etalon); \
|
||||
ft_destroy_table(table); \
|
||||
}
|
||||
TEST_UTF8_STYLE("1234567890");
|
||||
TEST_UTF8_STYLE("Xylophmsik");
|
||||
TEST_UTF8_STYLE("ψημένηζειθ");
|
||||
TEST_UTF8_STYLE("D’ḟuascail");
|
||||
TEST_UTF8_STYLE("Pójdźżełąć");
|
||||
TEST_UTF8_STYLE("«braçõeshá");
|
||||
TEST_UTF8_STYLE("французких");
|
||||
TEST_UTF8_STYLE("Benjamínúñ");
|
||||
TEST_UTF8_STYLE("görmüştüçğ");
|
||||
TEST_UTF8_STYLE("視野無限廣窗外有藍天");
|
||||
TEST_UTF8_STYLE("いろはにほへとちりぬ");
|
||||
TEST_UTF8_STYLE("𠜎𠜱𠝹𠱓𠱸𠲖𠳏𠳕𠴕𠵼");
|
||||
#undef TEST_UTF8_STYLE
|
||||
|
||||
}
|
||||
#endif /* FT_HAVE_UTF8 */
|
||||
|
||||
void test_table_write(void)
|
||||
{
|
||||
|
@@ -22,6 +22,9 @@ void test_table_cell_properties(void);
|
||||
void test_table_text_styles(void);
|
||||
void test_table_tbl_properties(void);
|
||||
void test_memory_errors(void);
|
||||
#ifdef FT_HAVE_UTF8
|
||||
void test_utf8_table(void);
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef FORT_WB_TESTING_ENABLED
|
||||
@@ -41,6 +44,9 @@ struct test_case bb_test_suite [] = {
|
||||
{"test_table_basic", test_table_basic},
|
||||
#ifdef FT_HAVE_WCHAR
|
||||
{"test_wcs_table_boundaries", test_wcs_table_boundaries},
|
||||
#endif
|
||||
#ifdef FT_HAVE_UTF8
|
||||
{"test_utf8_table", test_utf8_table},
|
||||
#endif
|
||||
{"test_table_write", test_table_write},
|
||||
{"test_table_changing_cell", test_table_changing_cell},
|
||||
|
@@ -2,39 +2,53 @@
|
||||
#include "string_buffer.h"
|
||||
#include "wcwidth.h"
|
||||
#include <wchar.h>
|
||||
|
||||
#if defined(FT_HAVE_UTF8)
|
||||
#include "utf8.h"
|
||||
#endif
|
||||
|
||||
size_t strchr_count(const char *str, char ch);
|
||||
size_t wstrchr_count(const wchar_t *str, wchar_t ch);
|
||||
#if defined(FT_HAVE_UTF8)
|
||||
size_t utf8chr_count(const void *str, utf8_int32_t ch);
|
||||
#endif
|
||||
|
||||
|
||||
const char *str_n_substring_beg(const char *str, char ch_separator, size_t n);
|
||||
const wchar_t *wstr_n_substring_beg(const wchar_t *str, wchar_t ch_separator, size_t n);
|
||||
#ifdef FT_HAVE_UTF8
|
||||
const void *utf8_n_substring_beg(const void *str, utf8_int32_t ch_separator, size_t n);
|
||||
#endif
|
||||
|
||||
fort_status_t str_n_substring(const char *str, char ch_separator, size_t n, const char **begin, const char **end);
|
||||
void wstr_n_substring(const wchar_t *str, wchar_t ch_separator, size_t n, const wchar_t **begin, const wchar_t **end);
|
||||
#ifdef FT_HAVE_UTF8
|
||||
void utf8_n_substring(const void *str, utf8_int32_t ch_separator, size_t n, const void **begin, const void **end);
|
||||
#endif
|
||||
|
||||
|
||||
//size_t buffer_text_width(string_buffer_t *buffer);
|
||||
|
||||
|
||||
void test_strchr_count(void);
|
||||
void test_str_n_substring(void);
|
||||
void test_buffer_text_width(void);
|
||||
void test_buffer_text_height(void);
|
||||
void test_buffer_text_visible_width(void);
|
||||
void test_buffer_text_visible_height(void);
|
||||
#if defined(FT_HAVE_WCHAR)
|
||||
void test_wchar_basics(void);
|
||||
#endif
|
||||
void test_print_n_strings(void);
|
||||
|
||||
|
||||
|
||||
void test_string_buffer(void)
|
||||
{
|
||||
test_strchr_count();
|
||||
test_str_n_substring();
|
||||
test_buffer_text_width();
|
||||
test_buffer_text_height();
|
||||
test_buffer_text_visible_width();
|
||||
test_buffer_text_visible_height();
|
||||
#if defined(FT_HAVE_WCHAR)
|
||||
test_wchar_basics();
|
||||
#endif
|
||||
test_print_n_strings();
|
||||
}
|
||||
|
||||
|
||||
@@ -70,8 +84,60 @@ void test_strchr_count(void)
|
||||
assert_true(wstrchr_count(L"\n123123\n123123\n\n\n123", L'\n') == 5);
|
||||
|
||||
assert_true(wstrchr_count(L"1\xffffy23123\xffffy123123\xffffy\xffffy\xffffy123", L'\xffff') == 5);
|
||||
|
||||
|
||||
#ifdef FT_HAVE_UTF8
|
||||
assert_true(utf8chr_count(NULL, '\n') == 0);
|
||||
assert_true(utf8chr_count("", '\n') == 0);
|
||||
assert_true(utf8chr_count("asbd", '\n') == 0);
|
||||
|
||||
assert_true(utf8chr_count("Chinese L視野無限廣,窗外有藍天", '\n') == 0);
|
||||
assert_true(utf8chr_count("Hindi ऋषियों को सताने वाले दुष्ट राक्षसों के राजा रावण का सर्वनाश करने वाले विष्णुवतार भगवान श्रीराम, अयोध्या के महाराज दशरथ के बड़े सपुत्र थे।", '\n') == 0);
|
||||
assert_true(utf8chr_count("Portuguese Luís argüia à Júlia que «brações, fé, chá, óxido, pôr, zângão» eram palavras do português.", '\n') == 0);
|
||||
assert_true(utf8chr_count("Russian В чащах юга жил бы цитрус? Да, но фальшивый экземпляръ!", '\n') == 0);
|
||||
assert_true(utf8chr_count("Spanish La niña, viéndose atrapada en el áspero baúl índigo y sintiendo asfixia, lloró de vergüenza; mientras que la frustrada madre llamaba a su hija diciendo: ¿Dónde estás Waleska?", '\n') == 0);
|
||||
|
||||
assert_true(utf8chr_count("asbd\n", '\n') == 1);
|
||||
assert_true(utf8chr_count("\nasbd", '\n') == 1);
|
||||
assert_true(utf8chr_count("a\nsbd", '\n') == 1);
|
||||
assert_true(utf8chr_count("Chinese L視野無限\n廣,窗外有藍天", '\n') == 1);
|
||||
assert_true(utf8chr_count("Hindi ऋषियों को सताने वा\nले दुष्ट राक्षसों के राजा रावण का सर्वनाश करने वाले विष्णुवतार भगवान श्रीराम, अयोध्या के महाराज दशरथ के बड़े सपुत्र थे।", '\n') == 1);
|
||||
assert_true(utf8chr_count("Portuguese Luís argüi\na à Júlia que «brações, fé, chá, óxido, pôr, zângão» eram palavras do português.", '\n') == 1);
|
||||
assert_true(utf8chr_count("Russian В чащах \nюга жил бы цитрус? Да, но фальшивый экземпляръ!", '\n') == 1);
|
||||
assert_true(utf8chr_count("Spanish La niña, vié\nndose atrapada en el áspero baúl índigo y sintiendo asfixia, lloró de vergüenza; mientras que la frustrada madre llamaba a su hija diciendo: ¿Dónde estás Waleska?", '\n') == 1);
|
||||
|
||||
assert_true(utf8chr_count("\n12\n123", '\n') == 2);
|
||||
assert_true(utf8chr_count("\n12\n123\n", '\n') == 3);
|
||||
assert_true(utf8chr_count("\n\n\n", '\n') == 3);
|
||||
assert_true(utf8chr_count("\n123123\n123123\n\n\n123", '\n') == 5);
|
||||
assert_true(utf8chr_count("Chinese L視野無限\n廣,窗外有\n藍天", '\n') == 2);
|
||||
assert_true(utf8chr_count("Hindi ऋषियों को सताने वा\nले दुष्ट राक्षसों के राजा\n रावण का सर्वना\nश करने वाले विष्णुवतार भगवान श्रीराम, अयोध्या के महाराज दशरथ के बड़े सपुत्र थे।", '\n') == 3);
|
||||
assert_true(utf8chr_count("Portuguese Luís argüi\na à Júlia que «brações, fé, chá, óxido, \npôr, zângão» eram pal\navras do portu\nguês.", '\n') == 4);
|
||||
assert_true(utf8chr_count("Russian В чащах \nюга жил бы ц\nитрус? Да, но фальшивый экземпляръ!", '\n') == 2);
|
||||
assert_true(utf8chr_count("Spanish La niña, vié\nndose atrapada en el \n\n\náspero baúl índigo y \nsintiendo asfixia, lloró de vergüenza; mientras que la frustrada madre llamaba a su hija diciendo: ¿Dónde estás Waleska?", '\n') == 5);
|
||||
|
||||
assert_true(utf8chr_count("1a23123a123123aaa123", 'a') == 5);
|
||||
#endif
|
||||
}
|
||||
|
||||
void assert_str_equal_strong(const char *str1, const char *str2,
|
||||
const char *file,
|
||||
int line,
|
||||
const char *function)
|
||||
{
|
||||
if (!str1 && !str2)
|
||||
return;
|
||||
|
||||
if ((str1 && !str2) || (!str1 && str2)) {
|
||||
fprintf(stderr, "%s:%d(%s):Abort! Not equals strings:\n", file, line, function);
|
||||
exit(EXIT_FAILURE);
|
||||
} else if (strcmp(str1, str2) != 0) {
|
||||
fprintf(stderr, "%s:%d(%s):Abort! Not equals strings:\n", file, line, function);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
#define ASSERT_STR_EQUAL_STRONG(str1, str2) assert_str_equal_strong(str1, str2, __FILE__,__LINE__, __func__)
|
||||
|
||||
void test_str_n_substring(void)
|
||||
{
|
||||
@@ -86,6 +152,13 @@ void test_str_n_substring(void)
|
||||
assert_true(wstr_n_substring_beg(empty_wstr, L'\n', 1) == NULL);
|
||||
assert_true(wstr_n_substring_beg(empty_wstr, L'\n', 2) == NULL);
|
||||
#endif
|
||||
#ifdef FT_HAVE_UTF8
|
||||
const char *utf8_empty_str = "";
|
||||
assert_true(utf8_n_substring_beg(utf8_empty_str, '\n', 0) == utf8_empty_str);
|
||||
assert_true(utf8_n_substring_beg(utf8_empty_str, '\n', 1) == NULL);
|
||||
assert_true(utf8_n_substring_beg(utf8_empty_str, '\n', 2) == NULL);
|
||||
#endif
|
||||
|
||||
|
||||
const char *str = "123\n5678\n9";
|
||||
assert_true(str_n_substring_beg(NULL, '\n', 0) == NULL);
|
||||
@@ -106,6 +179,16 @@ void test_str_n_substring(void)
|
||||
assert_true(wstr_n_substring_beg(wstr, L'\n', 2) == wstr + 9);
|
||||
assert_true(wstr_n_substring_beg(wstr, L'\n', 3) == NULL);
|
||||
#endif
|
||||
#ifdef FT_HAVE_UTF8
|
||||
const char *utf8_str = "123\n5678\n9";
|
||||
ASSERT_STR_EQUAL_STRONG(utf8_n_substring_beg(NULL, '\n', 0), NULL);
|
||||
ASSERT_STR_EQUAL_STRONG(utf8_n_substring_beg(utf8_str, '\n', 0), utf8_str);
|
||||
ASSERT_STR_EQUAL_STRONG(utf8_n_substring_beg(utf8_str, '1', 0), utf8_str);
|
||||
|
||||
ASSERT_STR_EQUAL_STRONG(utf8_n_substring_beg(utf8_str, '\n', 1), "5678\n9");
|
||||
ASSERT_STR_EQUAL_STRONG(utf8_n_substring_beg(utf8_str, '\n', 2), "9");
|
||||
ASSERT_STR_EQUAL_STRONG(utf8_n_substring_beg(utf8_str, '\n', 3), NULL);
|
||||
#endif
|
||||
|
||||
const char *str2 = "\n123\n56\n\n9\n";
|
||||
assert_true(str_n_substring_beg(str2, '\n', 0) == str2);
|
||||
@@ -126,6 +209,16 @@ void test_str_n_substring(void)
|
||||
assert_true(wstr_n_substring_beg(wstr2, L'\xff0f', 5) == wstr2 + 11);
|
||||
assert_true(wstr_n_substring_beg(wstr2, L'\xff0f', 6) == NULL);
|
||||
#endif
|
||||
#ifdef FT_HAVE_UTF8
|
||||
const char *utf8_str2 = "\n123\n56\n\n9\n";
|
||||
ASSERT_STR_EQUAL_STRONG(utf8_n_substring_beg(utf8_str2, '\n', 0), utf8_str2);
|
||||
ASSERT_STR_EQUAL_STRONG(utf8_n_substring_beg(utf8_str2, '\n', 1), "123\n56\n\n9\n");
|
||||
ASSERT_STR_EQUAL_STRONG(utf8_n_substring_beg(utf8_str2, '\n', 2), "56\n\n9\n");
|
||||
ASSERT_STR_EQUAL_STRONG(utf8_n_substring_beg(utf8_str2, '\n', 3), "\n9\n");
|
||||
ASSERT_STR_EQUAL_STRONG(utf8_n_substring_beg(utf8_str2, '\n', 4), "9\n");
|
||||
ASSERT_STR_EQUAL_STRONG(utf8_n_substring_beg(utf8_str2, '\n', 5), "");
|
||||
ASSERT_STR_EQUAL_STRONG(utf8_n_substring_beg(utf8_str2, '\n', 6), NULL);
|
||||
#endif
|
||||
|
||||
const char *beg = NULL;
|
||||
const char *end = NULL;
|
||||
@@ -146,6 +239,16 @@ void test_str_n_substring(void)
|
||||
wstr_n_substring(empty_wstr, L'\n', 2, &wbeg, &wend);
|
||||
assert_true(wbeg == NULL && wend == NULL);
|
||||
#endif
|
||||
#ifdef FT_HAVE_UTF8
|
||||
const void *utf8_beg = NULL;
|
||||
const void *utf8_end = NULL;
|
||||
utf8_n_substring(utf8_empty_str, '\n', 0, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == utf8_empty_str && utf8_end == utf8_empty_str + strlen(utf8_empty_str));
|
||||
utf8_n_substring(utf8_empty_str, '\n', 1, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == NULL && utf8_end == NULL);
|
||||
utf8_n_substring(utf8_empty_str, '\n', 2, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == NULL && utf8_end == NULL);
|
||||
#endif
|
||||
|
||||
|
||||
str_n_substring(NULL, '\n', 0, &beg, &end);
|
||||
@@ -163,6 +266,14 @@ void test_str_n_substring(void)
|
||||
wstr_n_substring(wstr, L'2', 0, &wbeg, &wend);
|
||||
assert_true(wbeg == wstr && wend == wstr + 1);
|
||||
#endif
|
||||
#ifdef FT_HAVE_UTF8
|
||||
utf8_n_substring(NULL, '\n', 0, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == NULL && utf8_end == NULL);
|
||||
utf8_n_substring(utf8_str, '\n', 0, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == utf8_str && utf8_end == utf8_str + 3);
|
||||
utf8_n_substring(utf8_str, '2', 0, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == utf8_str && utf8_end == utf8_str + 1);
|
||||
#endif
|
||||
|
||||
str_n_substring(str, '\n', 1, &beg, &end);
|
||||
assert_true(beg == str + 4 && end == str + 8);
|
||||
@@ -179,6 +290,14 @@ void test_str_n_substring(void)
|
||||
wstr_n_substring(wstr, L'\n', 3, &wbeg, &wend);
|
||||
assert_true(wbeg == NULL && wend == NULL);
|
||||
#endif
|
||||
#ifdef FT_HAVE_UTF8
|
||||
utf8_n_substring(utf8_str, '\n', 1, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == utf8_str + 4 && utf8_end == utf8_str + 8);
|
||||
utf8_n_substring(utf8_str, '\n', 2, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == utf8_str + 9 && utf8_end == utf8_str + strlen(utf8_str));
|
||||
utf8_n_substring(utf8_str, '\n', 3, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == NULL && end == NULL);
|
||||
#endif
|
||||
|
||||
str_n_substring(str2, '\n', 0, &beg, &end);
|
||||
assert_true(beg == str2 && end == str2);
|
||||
@@ -211,113 +330,226 @@ void test_str_n_substring(void)
|
||||
wstr_n_substring(wstr2, L'\xff0f', 6, &wbeg, &wend);
|
||||
assert_true(wbeg == NULL && wend == NULL);
|
||||
#endif
|
||||
#if defined(FT_HAVE_WCHAR)
|
||||
utf8_n_substring(utf8_str2, '\n', 0, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == utf8_str2 && utf8_end == utf8_str2);
|
||||
utf8_n_substring(utf8_str2, '\n', 1, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == utf8_str2 + 1 && utf8_end == utf8_str2 + 4);
|
||||
utf8_n_substring(utf8_str2, '\n', 2, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == utf8_str2 + 5 && utf8_end == utf8_str2 + 7);
|
||||
utf8_n_substring(utf8_str2, '\n', 3, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == utf8_str2 + 8 && utf8_end == utf8_str2 + 8);
|
||||
utf8_n_substring(utf8_str2, '\n', 4, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == utf8_str2 + 9 && utf8_end == utf8_str2 + 10);
|
||||
utf8_n_substring(utf8_str2, '\n', 5, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == utf8_str2 + 11 && utf8_end == utf8_str2 + 11);
|
||||
utf8_n_substring(utf8_str2, '\n', 6, &utf8_beg, &utf8_end);
|
||||
assert_true(utf8_beg == NULL && utf8_end == NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
void test_buffer_text_width(void)
|
||||
void test_buffer_text_visible_width(void)
|
||||
{
|
||||
string_buffer_t *buffer = create_string_buffer(200, CharBuf);
|
||||
buffer->type = CharBuf;
|
||||
string_buffer_t *buffer = create_string_buffer(200, CHAR_BUF);
|
||||
buffer->type = CHAR_BUF;
|
||||
char *old_value = buffer->str.cstr;
|
||||
|
||||
buffer->str.cstr = (char *)"";
|
||||
assert_true(buffer_text_width(buffer) == 0);
|
||||
assert_true(buffer_text_visible_width(buffer) == 0);
|
||||
|
||||
buffer->str.cstr = (char *)"\n\n\n\n";
|
||||
assert_true(buffer_text_width(buffer) == 0);
|
||||
assert_true(buffer_text_visible_width(buffer) == 0);
|
||||
|
||||
buffer->str.cstr = (char *)"12345";
|
||||
assert_true(buffer_text_width(buffer) == 5);
|
||||
assert_true(buffer_text_visible_width(buffer) == 5);
|
||||
|
||||
buffer->str.cstr = (char *)"12345\n1234567";
|
||||
assert_true(buffer_text_width(buffer) == 7);
|
||||
assert_true(buffer_text_visible_width(buffer) == 7);
|
||||
|
||||
buffer->str.cstr = (char *)"12345\n1234567\n";
|
||||
assert_true(buffer_text_width(buffer) == 7);
|
||||
assert_true(buffer_text_visible_width(buffer) == 7);
|
||||
|
||||
buffer->str.cstr = (char *)"12345\n1234567\n123";
|
||||
assert_true(buffer_text_width(buffer) == 7);
|
||||
assert_true(buffer_text_visible_width(buffer) == 7);
|
||||
|
||||
#if defined(FT_HAVE_WCHAR)
|
||||
buffer->type = WCharBuf;
|
||||
buffer->type = W_CHAR_BUF;
|
||||
|
||||
buffer->str.wstr = (wchar_t *)L"";
|
||||
assert_true(buffer_text_width(buffer) == 0);
|
||||
assert_true(buffer_text_visible_width(buffer) == 0);
|
||||
|
||||
buffer->str.wstr = (wchar_t *)L"\n\n\n\n";
|
||||
assert_true(buffer_text_width(buffer) == 0);
|
||||
assert_true(buffer_text_visible_width(buffer) == 0);
|
||||
|
||||
buffer->str.wstr = (wchar_t *)L"12345";
|
||||
assert_true(buffer_text_width(buffer) == 5);
|
||||
assert_true(buffer_text_visible_width(buffer) == 5);
|
||||
|
||||
buffer->str.wstr = (wchar_t *)L"12345\n1234567";
|
||||
assert_true(buffer_text_width(buffer) == 7);
|
||||
assert_true(buffer_text_visible_width(buffer) == 7);
|
||||
|
||||
buffer->str.wstr = (wchar_t *)L"12345\n1234567\n";
|
||||
assert_true(buffer_text_width(buffer) == 7);
|
||||
assert_true(buffer_text_visible_width(buffer) == 7);
|
||||
|
||||
buffer->str.wstr = (wchar_t *)L"12345\n1234567\n123";
|
||||
assert_true(buffer_text_width(buffer) == 7);
|
||||
assert_true(buffer_text_visible_width(buffer) == 7);
|
||||
#endif
|
||||
|
||||
buffer->type = CharBuf;
|
||||
#if defined(FT_HAVE_UTF8)
|
||||
buffer->type = UTF8_BUF;
|
||||
|
||||
buffer->str.u8str = (void *)"";
|
||||
assert_true(buffer_text_visible_width(buffer) == 0);
|
||||
|
||||
buffer->str.u8str = (void *)"\n\n\n\n";
|
||||
assert_true(buffer_text_visible_width(buffer) == 0);
|
||||
|
||||
buffer->str.u8str = (void *)"12345";
|
||||
assert_true(buffer_text_visible_width(buffer) == 5);
|
||||
|
||||
buffer->str.u8str = (void *)"12345\n1234567";
|
||||
assert_true(buffer_text_visible_width(buffer) == 7);
|
||||
|
||||
buffer->str.u8str = (void *)"12345\n1234567\n";
|
||||
assert_true(buffer_text_visible_width(buffer) == 7);
|
||||
|
||||
buffer->str.u8str = (void *)"12345\n1234567\n123";
|
||||
assert_true(buffer_text_visible_width(buffer) == 7);
|
||||
|
||||
|
||||
/* panagrams from http://clagnut.com/blog/2380/ */
|
||||
/* 10 20 30 40 50 60 70 80 90 100 110 */
|
||||
buffer->str.u8str = (void *)"Numbers 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
|
||||
assert_true(buffer_text_visible_width(buffer) == 110);
|
||||
buffer->str.u8str = (void *)"Chinese 視野無限廣, 窗外有藍天";
|
||||
assert_true(buffer_text_visible_width(buffer) == 22);
|
||||
buffer->str.u8str = (void *)"German Falsches Üben von Xylophonmusik quält jeden größeren Zwerg";
|
||||
assert_true(buffer_text_visible_width(buffer) == 68);
|
||||
buffer->str.u8str = (void *)"Greek Ταχίστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός Takhístè";
|
||||
assert_true(buffer_text_visible_width(buffer) == 80);
|
||||
buffer->str.u8str = (void *)"Irish D’ḟuascail Íosa Úrṁac na hÓiġe Beannaiṫe pór Éaḃa agus Áḋaiṁ";
|
||||
assert_true(buffer_text_visible_width(buffer) == 70);
|
||||
buffer->str.u8str = (void *)"Japanese いろはにほへと ちりぬるを わかよたれそ つねならむ うゐ";
|
||||
assert_true(buffer_text_visible_width(buffer) == 39);
|
||||
buffer->str.u8str = (void *)"Polish Pójdźże, kiń tę chmurność w głąb flaszy";
|
||||
assert_true(buffer_text_visible_width(buffer) == 49);
|
||||
buffer->str.u8str = (void *)"Portuguese Luís argüia à Júlia que «brações, fé, chá, óxido, pôr, zângão» eram palavras do português";
|
||||
assert_true(buffer_text_visible_width(buffer) == 100);
|
||||
buffer->str.u8str = (void *)"Russian Съешь же ещё этих мягких французских булок, да выпей чаю";
|
||||
assert_true(buffer_text_visible_width(buffer) == 66);
|
||||
buffer->str.u8str = (void *)"Spanish Benjamín pidió una bebida de kiwi y fresa; Noé, sin vergüenza, la más exquisita champaña del menú";
|
||||
assert_true(buffer_text_visible_width(buffer) == 107);
|
||||
buffer->str.u8str = (void *)"Turkish Vakfın çoğu bu huysuz genci plajda görmüştü";
|
||||
assert_true(buffer_text_visible_width(buffer) == 53);
|
||||
|
||||
/* 10 20 30 40 50 60 70 80 90 100 110 */
|
||||
buffer->str.u8str = (void *)"Numbers 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
|
||||
assert_true(buffer_text_visible_width(buffer) == 110);
|
||||
buffer->str.u8str = (void *)"Chinese 視野無限廣,\n 窗外有藍天";
|
||||
assert_true(buffer_text_visible_width(buffer) == 16);
|
||||
buffer->str.u8str = (void *)"German Falsches Üben von Xy\nlophonmusik quält \njeden größeren Zwerg";
|
||||
assert_true(buffer_text_visible_width(buffer) == 30);
|
||||
buffer->str.u8str = (void *)"Greek Ταχίστη αλώπηξ βαφής\n ψημένη γη, δρασκελίζει\n υπέρ νωθρού \nκυνός Takhístè";
|
||||
assert_true(buffer_text_visible_width(buffer) == 30);
|
||||
buffer->str.u8str = (void *)"Irish D’ḟuascail Íosa Úrṁa\nc na hÓiġe Beannaiṫe\n pór Éaḃa agus Áḋaiṁ";
|
||||
assert_true(buffer_text_visible_width(buffer) == 30);
|
||||
buffer->str.u8str = (void *)"Japanese いろはにほへと ちり\nぬるを わかよたれそ つねならむ うゐ";
|
||||
assert_true(buffer_text_visible_width(buffer) == 20);
|
||||
buffer->str.u8str = (void *)"Polish Pójdźże, kiń tę chmu\nrność w głąb flaszy";
|
||||
assert_true(buffer_text_visible_width(buffer) == 30);
|
||||
buffer->str.u8str = (void *)"Portuguese Luís argüia à Júlia\n que «brações, fé, chá,\n óxido, pôr, \nzângão» eram palavras\n do português";
|
||||
assert_true(buffer_text_visible_width(buffer) == 30);
|
||||
buffer->str.u8str = (void *)"Russian Съешь же ещё этих мя\nгких французских булок,\n да выпей чаю";
|
||||
assert_true(buffer_text_visible_width(buffer) == 30);
|
||||
buffer->str.u8str = (void *)"Spanish Benjamín pidió una b\nebida de kiwi y fresa;\n Noé, sin vergüenza,\n la más exquisita\n champaña del menú";
|
||||
assert_true(buffer_text_visible_width(buffer) == 30);
|
||||
buffer->str.u8str = (void *)"Turkish Vakfın çoğu bu huysu\nz genci plajda gö\nrmüştü";
|
||||
assert_true(buffer_text_visible_width(buffer) == 30);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
buffer->type = CHAR_BUF;
|
||||
buffer->str.cstr = old_value;
|
||||
destroy_string_buffer(buffer);
|
||||
}
|
||||
|
||||
|
||||
void test_buffer_text_height(void)
|
||||
void test_buffer_text_visible_height(void)
|
||||
{
|
||||
string_buffer_t *buffer = create_string_buffer(200, CharBuf);
|
||||
buffer->type = CharBuf;
|
||||
string_buffer_t *buffer = create_string_buffer(200, CHAR_BUF);
|
||||
buffer->type = CHAR_BUF;
|
||||
char *old_value = buffer->str.cstr;
|
||||
|
||||
buffer->str.cstr = (char *)"";
|
||||
assert_true(buffer_text_height(buffer) == 0);
|
||||
assert_true(buffer_text_visible_height(buffer) == 0);
|
||||
|
||||
buffer->str.cstr = (char *)"\n";
|
||||
assert_true(buffer_text_height(buffer) == 2);
|
||||
assert_true(buffer_text_visible_height(buffer) == 2);
|
||||
|
||||
buffer->str.cstr = (char *)"\n\n";
|
||||
assert_true(buffer_text_height(buffer) == 3);
|
||||
assert_true(buffer_text_visible_height(buffer) == 3);
|
||||
|
||||
buffer->str.cstr = (char *)"\n\n\n\n";
|
||||
assert_true(buffer_text_height(buffer) == 5);
|
||||
assert_true(buffer_text_visible_height(buffer) == 5);
|
||||
|
||||
buffer->str.cstr = (char *)"12345";
|
||||
assert_true(buffer_text_height(buffer) == 1);
|
||||
assert_true(buffer_text_visible_height(buffer) == 1);
|
||||
|
||||
buffer->str.cstr = (char *)"\n12345";
|
||||
assert_true(buffer_text_height(buffer) == 2);
|
||||
assert_true(buffer_text_visible_height(buffer) == 2);
|
||||
|
||||
buffer->str.cstr = (char *)"\n12345\n\n2";
|
||||
assert_true(buffer_text_height(buffer) == 4);
|
||||
assert_true(buffer_text_visible_height(buffer) == 4);
|
||||
|
||||
#if defined(FT_HAVE_WCHAR)
|
||||
buffer->type = WCharBuf;
|
||||
buffer->type = W_CHAR_BUF;
|
||||
buffer->str.wstr = (wchar_t *)L"";
|
||||
assert_true(buffer_text_height(buffer) == 0);
|
||||
assert_true(buffer_text_visible_height(buffer) == 0);
|
||||
|
||||
buffer->str.wstr = (wchar_t *)L"\n";
|
||||
assert_true(buffer_text_height(buffer) == 2);
|
||||
assert_true(buffer_text_visible_height(buffer) == 2);
|
||||
|
||||
buffer->str.wstr = (wchar_t *)L"\n\n";
|
||||
assert_true(buffer_text_height(buffer) == 3);
|
||||
assert_true(buffer_text_visible_height(buffer) == 3);
|
||||
|
||||
buffer->str.wstr = (wchar_t *)L"\n\n\n\n";
|
||||
assert_true(buffer_text_height(buffer) == 5);
|
||||
assert_true(buffer_text_visible_height(buffer) == 5);
|
||||
|
||||
buffer->str.wstr = (wchar_t *)L"\xff0fy2345\xff0f";
|
||||
assert_true(buffer_text_height(buffer) == 1);
|
||||
assert_true(buffer_text_visible_height(buffer) == 1);
|
||||
|
||||
buffer->str.wstr = (wchar_t *)L"\n12345";
|
||||
assert_true(buffer_text_height(buffer) == 2);
|
||||
assert_true(buffer_text_visible_height(buffer) == 2);
|
||||
|
||||
buffer->str.wstr = (wchar_t *)L"\n12345\n\n2";
|
||||
assert_true(buffer_text_height(buffer) == 4);
|
||||
assert_true(buffer_text_visible_height(buffer) == 4);
|
||||
#endif
|
||||
#if defined(FT_HAVE_UTF8)
|
||||
buffer->type = UTF8_BUF;
|
||||
buffer->str.u8str = (void *)"";
|
||||
assert_true(buffer_text_visible_height(buffer) == 0);
|
||||
|
||||
buffer->str.u8str = (void *)"\n";
|
||||
assert_true(buffer_text_visible_height(buffer) == 2);
|
||||
|
||||
buffer->str.u8str = (void *)"\n\n";
|
||||
assert_true(buffer_text_visible_height(buffer) == 3);
|
||||
|
||||
buffer->str.u8str = (void *)"\n\n\n\n";
|
||||
assert_true(buffer_text_visible_height(buffer) == 5);
|
||||
|
||||
buffer->str.u8str = (void *)"12345";
|
||||
assert_true(buffer_text_visible_height(buffer) == 1);
|
||||
|
||||
buffer->str.u8str = (void *)"\n12345";
|
||||
assert_true(buffer_text_visible_height(buffer) == 2);
|
||||
|
||||
buffer->str.u8str = (void *)"\n12345\n\n2";
|
||||
assert_true(buffer_text_visible_height(buffer) == 4);
|
||||
#endif
|
||||
|
||||
|
||||
buffer->type = CharBuf;
|
||||
buffer->type = CHAR_BUF;
|
||||
buffer->str.cstr = old_value;
|
||||
destroy_string_buffer(buffer);
|
||||
}
|
||||
@@ -367,3 +599,59 @@ void test_wchar_basics(void)
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static void test_print_n_strings_(const char *str, size_t n)
|
||||
{
|
||||
int sz = n * strlen(str);
|
||||
{
|
||||
string_buffer_t *buffer = create_string_buffer(200, CHAR_BUF);
|
||||
conv_context_t cntx;
|
||||
cntx.buf = (char *)buffer_get_data(buffer);
|
||||
cntx.buf_origin = (char *)buffer_get_data(buffer);
|
||||
cntx.raw_avail = 200;
|
||||
cntx.b_type = CHAR_BUF;
|
||||
assert_true(print_n_strings(&cntx, n, str) == sz);
|
||||
assert_true(cntx.buf - cntx.buf_origin == sz);
|
||||
destroy_string_buffer(buffer);
|
||||
}
|
||||
|
||||
{
|
||||
string_buffer_t *buffer = create_string_buffer(200, W_CHAR_BUF);
|
||||
conv_context_t cntx;
|
||||
cntx.buf = (char *)buffer_get_data(buffer);
|
||||
cntx.buf_origin = (char *)buffer_get_data(buffer);
|
||||
cntx.raw_avail = 200;
|
||||
cntx.b_type = W_CHAR_BUF;
|
||||
assert_true(print_n_strings(&cntx, n, str) == /*sizeof(wchar_t) **/ sz);
|
||||
assert_true(cntx.buf - cntx.buf_origin == sizeof(wchar_t) * sz);
|
||||
destroy_string_buffer(buffer);
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
string_buffer_t *buffer = create_string_buffer(200, UTF8_BUF);
|
||||
conv_context_t cntx;
|
||||
cntx.buf = (char *)buffer_get_data(buffer);
|
||||
cntx.buf_origin = (char *)buffer_get_data(buffer);
|
||||
cntx.raw_avail = 200;
|
||||
cntx.b_type = UTF8_BUF;
|
||||
assert_true(print_n_strings(&cntx, n, str) == sz);
|
||||
assert_true(cntx.buf - cntx.buf_origin == sz);
|
||||
destroy_string_buffer(buffer);
|
||||
}
|
||||
}
|
||||
void test_print_n_strings(void)
|
||||
{
|
||||
test_print_n_strings_("", 0);
|
||||
test_print_n_strings_("", 1);
|
||||
test_print_n_strings_("", 2);
|
||||
|
||||
test_print_n_strings_(" ", 0);
|
||||
test_print_n_strings_(" ", 1);
|
||||
test_print_n_strings_(" ", 2);
|
||||
|
||||
test_print_n_strings_("foo", 0);
|
||||
test_print_n_strings_("foo", 1);
|
||||
test_print_n_strings_("foo", 2);
|
||||
}
|
||||
|
Reference in New Issue
Block a user