| #include "../../unity/unity.h" |
| #include <stdio.h> |
| #include <string.h> |
| #include <stdlib.h> |
| #include <stdbool.h> |
|
|
| |
| |
| |
| static FILE* make_stream_from(const char* remainder) |
| { |
| FILE* f = tmpfile(); |
| TEST_ASSERT_NOT_NULL(f); |
| if (remainder && *remainder) |
| { |
| size_t n = fwrite(remainder, 1, strlen(remainder), f); |
| TEST_ASSERT_EQUAL_UINT(strlen(remainder), n); |
| } |
| rewind(f); |
| return f; |
| } |
|
|
| |
| static char* copy_word_text(WORD *w) |
| { |
| char *s = (char*)malloc((size_t)w->length + 1); |
| TEST_ASSERT_NOT_NULL(s); |
| memcpy(s, w->text, (size_t)w->length); |
| s[w->length] = '\0'; |
| return s; |
| } |
|
|
| |
| void setUp(void) |
| { |
| |
| wptr = parabuf; |
| word_limit = word; |
|
|
| |
| tabs = false; |
| uniform = false; |
|
|
| |
| prefix = ""; |
| prefix_full_length = 0; |
| prefix_length = 0; |
| prefix_lead_space = 0; |
|
|
| |
| in_column = 0; |
| } |
|
|
| void tearDown(void) |
| { |
| |
| } |
|
|
| |
| static void test_get_line_basic_two_words(void) |
| { |
| |
| FILE *f = make_stream_from("ello world\n Next"); |
| int c = 'H'; |
|
|
| int ret = get_line(f, c); |
|
|
| |
| TEST_ASSERT_EQUAL_INT(2, (int)(word_limit - word)); |
|
|
| { |
| WORD *w0 = &word[0]; |
| char *s0 = copy_word_text(w0); |
| TEST_ASSERT_EQUAL_STRING("Hello", s0); |
| TEST_ASSERT_EQUAL_INT(5, w0->length); |
| TEST_ASSERT_FALSE(w0->period); |
| TEST_ASSERT_FALSE(w0->punct); |
| TEST_ASSERT_FALSE(w0->final); |
| TEST_ASSERT_FALSE(w0->paren); |
| TEST_ASSERT_EQUAL_INT(1, w0->space); |
| free(s0); |
| } |
| { |
| WORD *w1 = &word[1]; |
| char *s1 = copy_word_text(w1); |
| TEST_ASSERT_EQUAL_STRING("world", s1); |
| TEST_ASSERT_EQUAL_INT(5, w1->length); |
| TEST_ASSERT_FALSE(w1->period); |
| TEST_ASSERT_FALSE(w1->punct); |
| TEST_ASSERT_FALSE(w1->final); |
| TEST_ASSERT_FALSE(w1->paren); |
| |
| TEST_ASSERT_EQUAL_INT(1, w1->space); |
| free(s1); |
| } |
|
|
| |
| TEST_ASSERT_EQUAL_INT('N', ret); |
| TEST_ASSERT_EQUAL_INT(2, in_column); |
|
|
| fclose(f); |
| } |
|
|
| |
| static void test_get_line_sentence_end_with_closer(void) |
| { |
| |
| FILE *f = make_stream_from("ello.) Next\nX"); |
| int c = 'H'; |
|
|
| int ret = get_line(f, c); |
|
|
| TEST_ASSERT_EQUAL_INT(2, (int)(word_limit - word)); |
|
|
| { |
| WORD *w0 = &word[0]; |
| char *s0 = copy_word_text(w0); |
| TEST_ASSERT_EQUAL_STRING("Hello.)", s0); |
| TEST_ASSERT_EQUAL_INT(7, w0->length); |
| |
| TEST_ASSERT_TRUE(w0->punct); |
| TEST_ASSERT_TRUE(w0->period); |
| |
| TEST_ASSERT_TRUE(w0->final); |
| TEST_ASSERT_EQUAL_INT(2, w0->space); |
| TEST_ASSERT_FALSE(w0->paren); |
| free(s0); |
| } |
| { |
| WORD *w1 = &word[1]; |
| char *s1 = copy_word_text(w1); |
| TEST_ASSERT_EQUAL_STRING("Next", s1); |
| TEST_ASSERT_EQUAL_INT(4, w1->length); |
| TEST_ASSERT_FALSE(w1->period); |
| TEST_ASSERT_FALSE(w1->final); |
| TEST_ASSERT_EQUAL_INT(1, w1->space); |
| free(s1); |
| } |
|
|
| |
| TEST_ASSERT_EQUAL_INT('X', ret); |
| TEST_ASSERT_EQUAL_INT(0, in_column); |
|
|
| fclose(f); |
| } |
|
|
| |
| static void test_get_line_tab_expansion_and_tabs_flag(void) |
| { |
| |
| FILE *f = make_stream_from("bc\tdef\nZ"); |
| int c = 'a'; |
|
|
| int ret = get_line(f, c); |
|
|
| TEST_ASSERT_EQUAL_INT(2, (int)(word_limit - word)); |
|
|
| { |
| WORD *w0 = &word[0]; |
| char *s0 = copy_word_text(w0); |
| TEST_ASSERT_EQUAL_STRING("abc", s0); |
| TEST_ASSERT_EQUAL_INT(3, w0->length); |
| |
| TEST_ASSERT_EQUAL_INT(5, w0->space); |
| TEST_ASSERT_TRUE(tabs); |
| free(s0); |
| } |
| { |
| WORD *w1 = &word[1]; |
| char *s1 = copy_word_text(w1); |
| TEST_ASSERT_EQUAL_STRING("def", s1); |
| TEST_ASSERT_EQUAL_INT(3, w1->length); |
| TEST_ASSERT_EQUAL_INT(1, w1->space); |
| free(s1); |
| } |
|
|
| TEST_ASSERT_EQUAL_INT('Z', ret); |
| TEST_ASSERT_EQUAL_INT(0, in_column); |
|
|
| fclose(f); |
| } |
|
|
| |
| static void test_get_line_uniform_spacing_normalizes_interword_space(void) |
| { |
| |
| const char *remainder = " b\nX"; |
| int c = 'a'; |
|
|
| |
| { |
| FILE *f = make_stream_from(remainder); |
| uniform = false; |
| wptr = parabuf; |
| word_limit = word; |
| in_column = 0; |
|
|
| int ret = get_line(f, c); |
| TEST_ASSERT_EQUAL_INT(2, (int)(word_limit - word)); |
| TEST_ASSERT_EQUAL_INT(3, word[0].space); |
| TEST_ASSERT_EQUAL_INT('X', ret); |
| fclose(f); |
| } |
|
|
| |
| { |
| FILE *f = make_stream_from(remainder); |
| uniform = true; |
| wptr = parabuf; |
| word_limit = word; |
| in_column = 0; |
|
|
| int ret = get_line(f, c); |
| TEST_ASSERT_EQUAL_INT(2, (int)(word_limit - word)); |
| TEST_ASSERT_EQUAL_INT(1, word[0].space); |
| TEST_ASSERT_EQUAL_INT('X', ret); |
| fclose(f); |
| } |
| } |
|
|
| |
| static void test_get_line_paren_and_punct_flags(void) |
| { |
| |
| FILE *f = make_stream_from("test) ok\nY"); |
| int c = '('; |
|
|
| int ret = get_line(f, c); |
|
|
| TEST_ASSERT_EQUAL_INT(2, (int)(word_limit - word)); |
|
|
| { |
| WORD *w0 = &word[0]; |
| char *s0 = copy_word_text(w0); |
| TEST_ASSERT_EQUAL_STRING("(test)", s0); |
| TEST_ASSERT_TRUE(w0->paren); |
| TEST_ASSERT_TRUE(w0->punct); |
| TEST_ASSERT_FALSE(w0->period); |
| TEST_ASSERT_FALSE(w0->final); |
| TEST_ASSERT_EQUAL_INT(1, w0->space); |
| free(s0); |
| } |
| { |
| WORD *w1 = &word[1]; |
| char *s1 = copy_word_text(w1); |
| TEST_ASSERT_EQUAL_STRING("ok", s1); |
| TEST_ASSERT_FALSE(w1->paren); |
| TEST_ASSERT_FALSE(w1->period); |
| TEST_ASSERT_FALSE(w1->final); |
| TEST_ASSERT_EQUAL_INT(1, w1->space); |
| free(s1); |
| } |
|
|
| TEST_ASSERT_EQUAL_INT('Y', ret); |
| TEST_ASSERT_EQUAL_INT(0, in_column); |
|
|
| fclose(f); |
| } |
|
|
| |
| static void test_get_line_eof_terminated_line(void) |
| { |
| |
| FILE *f = make_stream_from("ast"); |
| int c = 'l'; |
|
|
| int ret = get_line(f, c); |
|
|
| TEST_ASSERT_EQUAL_INT(1, (int)(word_limit - word)); |
|
|
| { |
| WORD *w0 = &word[0]; |
| char *s0 = copy_word_text(w0); |
| TEST_ASSERT_EQUAL_STRING("last", s0); |
| TEST_ASSERT_TRUE(w0->final); |
| TEST_ASSERT_EQUAL_INT(2, w0->space); |
| free(s0); |
| } |
|
|
| TEST_ASSERT_EQUAL_INT(EOF, ret); |
| |
| TEST_ASSERT_EQUAL_INT(0, in_column); |
|
|
| fclose(f); |
| } |
|
|
| int main(void) |
| { |
| UNITY_BEGIN(); |
| RUN_TEST(test_get_line_basic_two_words); |
| RUN_TEST(test_get_line_sentence_end_with_closer); |
| RUN_TEST(test_get_line_tab_expansion_and_tabs_flag); |
| RUN_TEST(test_get_line_uniform_spacing_normalizes_interword_space); |
| RUN_TEST(test_get_line_paren_and_punct_flags); |
| RUN_TEST(test_get_line_eof_terminated_line); |
| return UNITY_END(); |
| } |