| #include "../../unity/unity.h" |
|
|
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <unistd.h> |
| #include <fcntl.h> |
| #include <errno.h> |
|
|
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| static char *make_tempfile_with_content(const char *content) |
| { |
| char tmpl[] = "/tmp/od_read_char_test_XXXXXX"; |
| int fd = mkstemp(tmpl); |
| TEST_ASSERT_TRUE_MESSAGE(fd >= 0, "mkstemp failed"); |
|
|
| if (content && content[0] != '\0') { |
| size_t len = strlen(content); |
| ssize_t wr = write(fd, content, len); |
| TEST_ASSERT_EQUAL_INT_MESSAGE((int)len, (int)wr, "write failed"); |
| } |
| close(fd); |
|
|
| char *path = (char *)malloc(strlen(tmpl) + 1); |
| TEST_ASSERT_NOT_NULL(path); |
| strcpy(path, tmpl); |
| return path; |
| } |
|
|
| |
| static void close_stream_if_open(void) |
| { |
| if (in_stream != NULL) { |
| |
| (void)check_and_close(0); |
| } |
| } |
|
|
| void setUp(void) { |
| |
| close_stream_if_open(); |
| |
| |
| static const char *empty_list[] = { NULL }; |
| file_list = empty_list; |
| } |
|
|
| void tearDown(void) { |
| |
| close_stream_if_open(); |
| } |
|
|
| |
| void test_read_char_single_byte(void) |
| { |
| char *p = make_tempfile_with_content("Z"); |
|
|
| const char *flist[] = { p, NULL }; |
| file_list = flist; |
|
|
| |
| TEST_ASSERT_TRUE(open_next_file()); |
|
|
| int ch = 0; |
| TEST_ASSERT_TRUE(read_char(&ch)); |
| TEST_ASSERT_EQUAL_INT('Z', ch); |
|
|
| |
| close_stream_if_open(); |
| unlink(p); |
| free(p); |
| } |
|
|
| |
| void test_read_char_three_bytes(void) |
| { |
| char *p = make_tempfile_with_content("ABC"); |
|
|
| const char *flist[] = { p, NULL }; |
| file_list = flist; |
|
|
| TEST_ASSERT_TRUE(open_next_file()); |
|
|
| int ch = 0; |
| TEST_ASSERT_TRUE(read_char(&ch)); |
| TEST_ASSERT_EQUAL_INT('A', ch); |
| TEST_ASSERT_TRUE(read_char(&ch)); |
| TEST_ASSERT_EQUAL_INT('B', ch); |
| TEST_ASSERT_TRUE(read_char(&ch)); |
| TEST_ASSERT_EQUAL_INT('C', ch); |
|
|
| |
|
|
| close_stream_if_open(); |
| unlink(p); |
| free(p); |
| } |
|
|
| |
| void test_read_char_eof_no_next_file(void) |
| { |
| char *p = make_tempfile_with_content(""); |
|
|
| const char *flist[] = { p, NULL }; |
| file_list = flist; |
|
|
| TEST_ASSERT_TRUE(open_next_file()); |
|
|
| int ch = 123; |
| TEST_ASSERT_TRUE(read_char(&ch)); |
| TEST_ASSERT_EQUAL_INT(EOF, ch); |
|
|
| |
| ch = 456; |
| TEST_ASSERT_TRUE(read_char(&ch)); |
| TEST_ASSERT_EQUAL_INT(EOF, ch); |
|
|
| close_stream_if_open(); |
| unlink(p); |
| free(p); |
| } |
|
|
| |
| void test_read_char_transition_to_next_file(void) |
| { |
| char *p1 = make_tempfile_with_content("A"); |
| char *p2 = make_tempfile_with_content("B"); |
|
|
| const char *flist[] = { p1, p2, NULL }; |
| file_list = flist; |
|
|
| TEST_ASSERT_TRUE(open_next_file()); |
|
|
| int ch = 0; |
| |
| TEST_ASSERT_TRUE(read_char(&ch)); |
| TEST_ASSERT_EQUAL_INT('A', ch); |
|
|
| |
| ch = 0; |
| TEST_ASSERT_TRUE(read_char(&ch)); |
| TEST_ASSERT_EQUAL_INT('B', ch); |
|
|
| |
| ch = 0; |
| TEST_ASSERT_TRUE(read_char(&ch)); |
| TEST_ASSERT_EQUAL_INT(EOF, ch); |
|
|
| close_stream_if_open(); |
| unlink(p1); |
| unlink(p2); |
| free(p1); |
| free(p2); |
| } |
|
|
| |
| void test_read_char_with_null_stream(void) |
| { |
| |
| close_stream_if_open(); |
| static const char *empty_list[] = { NULL }; |
| file_list = empty_list; |
|
|
| int ch = 0; |
| TEST_ASSERT_TRUE(read_char(&ch)); |
| TEST_ASSERT_EQUAL_INT(EOF, ch); |
| } |
|
|
| int main(void) |
| { |
| UNITY_BEGIN(); |
| RUN_TEST(test_read_char_single_byte); |
| RUN_TEST(test_read_char_three_bytes); |
| RUN_TEST(test_read_char_eof_no_next_file); |
| RUN_TEST(test_read_char_transition_to_next_file); |
| RUN_TEST(test_read_char_with_null_stream); |
| return UNITY_END(); |
| } |