|
|
#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(); |
|
|
} |