diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c index 59292482..7b5c33d0 100644 --- a/src/ui/inputwin.c +++ b/src/ui/inputwin.c @@ -256,67 +256,12 @@ _handle_edit(int key_type, const wint_t ch) { int col = getcurx(inp_win); int utf8_len = g_utf8_strlen(line, -1); + int wcols = getmaxx(stdscr); // CTRL-LEFT - if (line_utf8_pos > 0 && _is_ctrl_left(key_type, ch)) { - gchar *curr_ch = g_utf8_offset_to_pointer(line, line_utf8_pos); - gunichar curr_uni = g_utf8_get_char(curr_ch); - line_utf8_pos--; - col--; - if (g_unichar_iswide(curr_uni)) { - col--; - } - - curr_ch = g_utf8_find_prev_char(line, curr_ch); - - gchar *prev_ch; - gunichar prev_uni; - while (curr_ch != NULL) { - curr_uni = g_utf8_get_char(curr_ch); - if (g_unichar_isspace(curr_uni)) { - curr_ch = g_utf8_find_prev_char(line, curr_ch); - line_utf8_pos--; - col--; - } else { - prev_ch = g_utf8_find_prev_char(line, curr_ch); - if (prev_ch == NULL) { - curr_ch = NULL; - break; - } else { - prev_uni = g_utf8_get_char(prev_ch); - line_utf8_pos--; - col--; - if (g_unichar_iswide(prev_uni)) { - col--; - } - if (g_unichar_isspace(prev_uni)) { - break; - } else { - curr_ch = prev_ch; - } - } - } - } - - if (curr_ch == NULL) { - col = 0; - wmove(inp_win, 0, col); - } else { - col++; - line_utf8_pos++; - wmove(inp_win, 0, col); - } - - // if gone off screen to left, jump left (half a screen worth) - int wcols = getmaxx(stdscr); - if (col <= pad_start) { - pad_start = pad_start - (wcols / 2); - if (pad_start < 0) { - pad_start = 0; - } - - _inp_win_update_virtual(); - } + if (_is_ctrl_left(key_type, ch)) { + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, wcols); + wmove(inp_win, 0, col); return 1; // CTRL-RIGHT @@ -353,7 +298,6 @@ _handle_edit(int key_type, const wint_t ch) wmove(inp_win, 0, col); // if gone off screen to right, jump right (half a screen worth) - int wcols = getmaxx(stdscr); if (col > pad_start + wcols) { pad_start = pad_start + (wcols / 2); _inp_win_update_virtual(); @@ -464,7 +408,7 @@ _handle_edit(int key_type, const wint_t ch) line_utf8_pos--; // current position off screen to left - if (col - 1 < pad_start) { + if (col < pad_start) { pad_start--; _inp_win_update_virtual(); } @@ -490,7 +434,7 @@ _handle_edit(int key_type, const wint_t ch) // current position off screen to right int wcols = getmaxx(stdscr); - if ((col + 1 - pad_start) >= wcols) { + if ((col - pad_start) >= wcols) { pad_start++; _inp_win_update_virtual(); } diff --git a/src/ui/keyhandlers.c b/src/ui/keyhandlers.c index 513997ef..d7c3c616 100644 --- a/src/ui/keyhandlers.c +++ b/src/ui/keyhandlers.c @@ -48,7 +48,6 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int // handle insert if not at end of input if (*line_utf8_pos < utf8_len) { - // create new line char bytes[MB_CUR_MAX]; size_t utf8_ch_len = wcrtomb(bytes, ch, NULL); bytes[utf8_ch_len] = '\0'; @@ -62,35 +61,29 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int g_free(end); g_string_free(new_line_str, FALSE); - // replace old line strncpy(line, new_line, INP_WIN_MAX); free(new_line); - // set utf8 position - (*line_utf8_pos)++; - - // set col position - (*col)++; gunichar uni = g_utf8_get_char(bytes); - if (g_unichar_iswide(uni)) { - (*col)++; + if (*col == (*pad_start + wcols)) { + (*pad_start)++; + if (g_unichar_iswide(uni)) { + (*pad_start)++; + } } - // set pad_start - int display_len = utf8_display_len(line); - (*pad_start) = 0; - if (display_len > wcols-2) { - (*pad_start) = display_len - wcols + 1; + (*line_utf8_pos)++; + + (*col)++; + if (g_unichar_iswide(uni)) { + (*col)++; } // otherwise just append } else { char bytes[MB_CUR_MAX+1]; size_t utf8_ch_len = wcrtomb(bytes, ch, NULL); - - // wcrtomb can return (size_t) -1 if (utf8_ch_len < MB_CUR_MAX) { - // update old line int i; int bytes_len = strlen(line); @@ -99,10 +92,8 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int } line[bytes_len] = '\0'; - // set utf8 position (*line_utf8_pos)++; - // set col position (*col)++; bytes[utf8_ch_len] = '\0'; gunichar uni = g_utf8_get_char(bytes); @@ -110,9 +101,7 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int (*col)++; } - // set pad_start - // if gone over screen size follow input - if (*col - *pad_start > wcols-2) { + if (*col - *pad_start > wcols-1) { (*pad_start)++; if (g_unichar_iswide(uni)) { (*pad_start)++; @@ -120,4 +109,63 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int } } } -} \ No newline at end of file +} + +void +key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int wcols) +{ + if (*line_utf8_pos == 0) { + return; + } + + gchar *curr_ch = g_utf8_offset_to_pointer(line, *line_utf8_pos); + gunichar curr_uni = g_utf8_get_char(curr_ch); + (*line_utf8_pos)--; + (*col)--; + if (g_unichar_iswide(curr_uni)) { + (*col)--; + } + + curr_ch = g_utf8_find_prev_char(line, curr_ch); + + gchar *prev_ch; + gunichar prev_uni; + while (curr_ch != NULL) { + curr_uni = g_utf8_get_char(curr_ch); + if (g_unichar_isspace(curr_uni)) { + curr_ch = g_utf8_find_prev_char(line, curr_ch); + (*line_utf8_pos)--; + (*col)--; + } else { + prev_ch = g_utf8_find_prev_char(line, curr_ch); + if (prev_ch == NULL) { + curr_ch = NULL; + break; + } else { + prev_uni = g_utf8_get_char(prev_ch); + (*line_utf8_pos)--; + (*col)--; + if (g_unichar_iswide(prev_uni)) { + (*col)--; + } + if (g_unichar_isspace(prev_uni)) { + break; + } else { + curr_ch = prev_ch; + } + } + } + } + + if (curr_ch == NULL) { + (*col) = 0; + (*line_utf8_pos) = 0; + } else { + (*col)++; + (*line_utf8_pos)++; + } + + if (*col < *pad_start) { + *pad_start = *col; + } +} diff --git a/src/ui/keyhandlers.h b/src/ui/keyhandlers.h index cb1b14d8..d8153356 100644 --- a/src/ui/keyhandlers.h +++ b/src/ui/keyhandlers.h @@ -39,4 +39,6 @@ void key_printable(char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const wint_t ch, const int wcols); +void key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int wcols); + #endif diff --git a/tests/test_keyhandlers.c b/tests/test_keyhandlers.c index 2e29ec6d..32582c2e 100644 --- a/tests/test_keyhandlers.c +++ b/tests/test_keyhandlers.c @@ -63,7 +63,7 @@ void append_wide_to_empty(void **state) void append_non_wide_to_non_wide(void **state) { setlocale(LC_ALL, ""); - strncpy(line, "a", 1); + g_utf8_strncpy(line, "a", 1); line[1] = '\0'; int line_utf8_pos = 1; int col = utf8_pos_to_col(line, line_utf8_pos); @@ -80,7 +80,7 @@ void append_non_wide_to_non_wide(void **state) void append_wide_to_non_wide(void **state) { setlocale(LC_ALL, ""); - strncpy(line, "a", 1); + g_utf8_strncpy(line, "a", 1); line[1] = '\0'; int line_utf8_pos = 1; int col = utf8_pos_to_col(line, line_utf8_pos); @@ -128,7 +128,7 @@ void append_wide_to_wide(void **state) assert_int_equal(pad_start, 0); } -void append_no_wide_when_overrun(void **state) +void append_non_wide_when_overrun(void **state) { setlocale(LC_ALL, ""); g_utf8_strncpy(line, "0123456789四1234567", 18); @@ -232,4 +232,450 @@ void insert_wide_to_wide(void **state) assert_int_equal(line_utf8_pos, 3); assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); assert_int_equal(pad_start, 0); +} + +void insert_single_non_wide_when_pad_scrolled(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "AAAAAAAAAAAAAAA", 15); + line[strlen(line)] = '\0'; + int line_utf8_pos = 2; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 2; + + key_printable(line, &line_utf8_pos, &col, &pad_start, 'B', 12); + + assert_string_equal("AABAAAAAAAAAAAAA", line); + assert_int_equal(line_utf8_pos, 3); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 2); +} + +void insert_many_non_wide_when_pad_scrolled(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "AAAAAAAAAAAAAAA", 15); + line[strlen(line)] = '\0'; + int line_utf8_pos = 2; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 2; + + key_printable(line, &line_utf8_pos, &col, &pad_start, 'B', 12); + key_printable(line, &line_utf8_pos, &col, &pad_start, 'C', 12); + key_printable(line, &line_utf8_pos, &col, &pad_start, 'D', 12); + + assert_string_equal("AABCDAAAAAAAAAAAAA", line); + assert_int_equal(line_utf8_pos, 5); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 2); +} + +void insert_single_wide_when_pad_scrolled(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "AAAAAAAAAAAAAAA", 15); + line[strlen(line)] = '\0'; + int line_utf8_pos = 2; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 2; + + key_printable(line, &line_utf8_pos, &col, &pad_start, 0x4E09, 12); + + assert_string_equal("AA三AAAAAAAAAAAAA", line); + assert_int_equal(line_utf8_pos, 3); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 2); +} + +void insert_many_wide_when_pad_scrolled(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "AAAAAAAAAAAAAAA", 15); + line[strlen(line)] = '\0'; + int line_utf8_pos = 2; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 2; + + key_printable(line, &line_utf8_pos, &col, &pad_start, 0x304C, 12); + key_printable(line, &line_utf8_pos, &col, &pad_start, 0x304C, 12); + key_printable(line, &line_utf8_pos, &col, &pad_start, 0x4E09, 12); + + assert_string_equal("AAがが三AAAAAAAAAAAAA", line); + assert_int_equal(line_utf8_pos, 5); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 2); +} + +void insert_single_non_wide_last_column(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcdefghijklmno", 15); + line[strlen(line)] = '\0'; + int line_utf8_pos = 7; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 2; + + key_printable(line, &line_utf8_pos, &col, &pad_start, '1', 5); + + assert_string_equal("abcdefg1hijklmno", line); + assert_int_equal(line_utf8_pos, 8); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 3); +} + +void insert_many_non_wide_last_column(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcdefghijklmno", 15); + line[strlen(line)] = '\0'; + int line_utf8_pos = 7; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 2; + + key_printable(line, &line_utf8_pos, &col, &pad_start, '1', 5); + key_printable(line, &line_utf8_pos, &col, &pad_start, '2', 5); + + assert_string_equal("abcdefg12hijklmno", line); + assert_int_equal(line_utf8_pos, 9); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 4); +} + +void insert_single_wide_last_column(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcdefghijklmno", 15); + line[strlen(line)] = '\0'; + int line_utf8_pos = 7; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 2; + + key_printable(line, &line_utf8_pos, &col, &pad_start, 0x4E09, 5); + + assert_string_equal("abcdefg三hijklmno", line); + assert_int_equal(line_utf8_pos, 8); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 4); +} + +void insert_many_wide_last_column(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcdefghijklmno", 15); + line[strlen(line)] = '\0'; + int line_utf8_pos = 7; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 2; + + key_printable(line, &line_utf8_pos, &col, &pad_start, 0x4E09, 5); + key_printable(line, &line_utf8_pos, &col, &pad_start, 0x304C, 5); + + assert_string_equal("abcdefg三がhijklmno", line); + assert_int_equal(line_utf8_pos, 9); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 6); +} + +void ctrl_left_when_at_start(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcd efghij klmn opqr", 21); + line[strlen(line)] = '\0'; + int line_utf8_pos = 0; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 0); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_when_in_first_word(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcd efghij klmn opqr", 21); + line[strlen(line)] = '\0'; + int line_utf8_pos = 2; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 0); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_when_in_first_space(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcd efghij klmn opqr", 21); + line[strlen(line)] = '\0'; + int line_utf8_pos = 4; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 0); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_when_at_start_of_second_word(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcd efghij klmn opqr", 21); + line[strlen(line)] = '\0'; + int line_utf8_pos = 5; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 0); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_when_in_second_word(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcd efghij klmn opqr", 21); + line[strlen(line)] = '\0'; + int line_utf8_pos = 8; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 5); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_when_at_end_of_second_word(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcd efghij klmn opqr", 21); + line[strlen(line)] = '\0'; + int line_utf8_pos = 10; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 5); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_when_in_second_space(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcd efghij klmn opqr", 21); + line[strlen(line)] = '\0'; + int line_utf8_pos = 11; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 5); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_when_at_start_of_third_word(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcd efghij klmn opqr", 21); + line[strlen(line)] = '\0'; + int line_utf8_pos = 12; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 5); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_when_in_third_word(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcd efghij klmn opqr", 21); + line[strlen(line)] = '\0'; + int line_utf8_pos = 14; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 12); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_when_at_end_of_third_word(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcd efghij klmn opqr", 21); + line[strlen(line)] = '\0'; + int line_utf8_pos = 15; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 12); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_when_in_third_space(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcd efghij klmn opqr", 21); + line[strlen(line)] = '\0'; + int line_utf8_pos = 16; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 12); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_when_at_end(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "abcd efghij klmn opqr", 21); + line[strlen(line)] = '\0'; + int line_utf8_pos = 20; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 17); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_when_in_only_whitespace(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, " ", 7); + line[strlen(line)] = '\0'; + int line_utf8_pos = 5; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 0); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_when_start_whitespace_start_of_word(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, " hello", 9); + line[strlen(line)] = '\0'; + int line_utf8_pos = 4; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 0); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_when_start_whitespace_middle_of_word(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, " hello", 9); + line[strlen(line)] = '\0'; + int line_utf8_pos = 7; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 4); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_in_whitespace_between_words(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "hey hello", 12); + line[strlen(line)] = '\0'; + int line_utf8_pos = 5; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 0); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_in_whitespace_between_words_start_of_word(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "hey hello", 12); + line[strlen(line)] = '\0'; + int line_utf8_pos = 7; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 0); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_in_whitespace_between_words_middle_of_word(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "hey hello", 12); + line[strlen(line)] = '\0'; + int line_utf8_pos = 9; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 0; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 7); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 0); +} + +void ctrl_left_when_word_overrun_to_left(void **state) +{ + setlocale(LC_ALL, ""); + g_utf8_strncpy(line, "someword anotherword", 20); + line[strlen(line)] = '\0'; + int line_utf8_pos = 18; + int col = utf8_pos_to_col(line, line_utf8_pos); + int pad_start = 14; + + key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, 80); + + assert_int_equal(line_utf8_pos, 9); + assert_int_equal(col, utf8_pos_to_col(line, line_utf8_pos)); + assert_int_equal(pad_start, 9); } \ No newline at end of file diff --git a/tests/test_keyhandlers.h b/tests/test_keyhandlers.h index f70ee81e..4db5f340 100644 --- a/tests/test_keyhandlers.h +++ b/tests/test_keyhandlers.h @@ -1,16 +1,40 @@ void append_non_wide_to_empty(void **state); void append_wide_to_empty(void **state); - void append_non_wide_to_non_wide(void **state); void append_wide_to_non_wide(void **state); - void append_non_wide_to_wide(void **state); void append_wide_to_wide(void **state); - -void append_no_wide_when_overrun(void **state); +void append_non_wide_when_overrun(void **state); void append_wide_when_overrun(void **state); - void insert_non_wide_to_non_wide(void **state); void insert_wide_to_non_wide(void **state); void insert_non_wide_to_wide(void **state); -void insert_wide_to_wide(void **state); \ No newline at end of file +void insert_wide_to_wide(void **state); +void insert_single_non_wide_when_pad_scrolled(void **state); +void insert_many_non_wide_when_pad_scrolled(void **state); +void insert_single_wide_when_pad_scrolled(void **state); +void insert_many_wide_when_pad_scrolled(void **state); +void insert_single_non_wide_last_column(void **state); +void insert_many_non_wide_last_column(void **state); +void insert_single_wide_last_column(void **state); +void insert_many_wide_last_column(void **state); + +void ctrl_left_when_at_start(void **state); +void ctrl_left_when_in_first_word(void **state); +void ctrl_left_when_in_first_space(void **state); +void ctrl_left_when_at_start_of_second_word(void **state); +void ctrl_left_when_in_second_word(void **state); +void ctrl_left_when_at_end_of_second_word(void **state); +void ctrl_left_when_in_second_space(void **state); +void ctrl_left_when_at_start_of_third_word(void **state); +void ctrl_left_when_in_third_word(void **state); +void ctrl_left_when_at_end_of_third_word(void **state); +void ctrl_left_when_in_third_space(void **state); +void ctrl_left_when_at_end(void **state); +void ctrl_left_when_in_only_whitespace(void **state); +void ctrl_left_when_start_whitespace_start_of_word(void **state); +void ctrl_left_when_start_whitespace_middle_of_word(void **state); +void ctrl_left_in_whitespace_between_words(void **state); +void ctrl_left_in_whitespace_between_words_start_of_word(void **state); +void ctrl_left_in_whitespace_between_words_middle_of_word(void **state); +void ctrl_left_when_word_overrun_to_left(void **state); \ No newline at end of file diff --git a/tests/testsuite.c b/tests/testsuite.c index 3a60317e..1a5e0f7e 100644 --- a/tests/testsuite.c +++ b/tests/testsuite.c @@ -630,12 +630,39 @@ int main(int argc, char* argv[]) { unit_test(append_wide_to_non_wide), unit_test(append_non_wide_to_wide), unit_test(append_wide_to_wide), - unit_test(append_no_wide_when_overrun), + unit_test(append_non_wide_when_overrun), unit_test(append_wide_when_overrun), unit_test(insert_non_wide_to_non_wide), unit_test(insert_wide_to_non_wide), unit_test(insert_non_wide_to_wide), unit_test(insert_wide_to_wide), + unit_test(insert_single_non_wide_when_pad_scrolled), + unit_test(insert_many_non_wide_when_pad_scrolled), + unit_test(insert_single_wide_when_pad_scrolled), + unit_test(insert_many_wide_when_pad_scrolled), + unit_test(insert_single_non_wide_last_column), + unit_test(insert_many_non_wide_last_column), + unit_test(insert_single_wide_last_column), + unit_test(insert_many_wide_last_column), + unit_test(ctrl_left_when_at_start), + unit_test(ctrl_left_when_in_first_word), + unit_test(ctrl_left_when_in_first_space), + unit_test(ctrl_left_when_at_start_of_second_word), + unit_test(ctrl_left_when_in_second_word), + unit_test(ctrl_left_when_at_end_of_second_word), + unit_test(ctrl_left_when_in_second_space), + unit_test(ctrl_left_when_at_start_of_third_word), + unit_test(ctrl_left_when_in_third_word), + unit_test(ctrl_left_when_at_end_of_third_word), + unit_test(ctrl_left_when_in_third_space), + unit_test(ctrl_left_when_at_end), + unit_test(ctrl_left_when_in_only_whitespace), + unit_test(ctrl_left_when_start_whitespace_start_of_word), + unit_test(ctrl_left_when_start_whitespace_middle_of_word), + unit_test(ctrl_left_in_whitespace_between_words), + unit_test(ctrl_left_in_whitespace_between_words_start_of_word), + unit_test(ctrl_left_in_whitespace_between_words_middle_of_word), + unit_test(ctrl_left_when_word_overrun_to_left), }; return run_tests(all_tests);