#include "ptlisp-test.h" static Pointer STANDARD_INPUT_STREAM; START_TEST(peek_char_test) { Stream stream = STREAM(STANDARD_INPUT_STREAM); ck_assert_uint_eq(peek_char(NIL, stream), 'h'); ck_assert_uint_eq(peek_char(character('o'), stream), 'o'); fseek(stream, 6, SEEK_SET); ck_assert_uint_eq(peek_char(T, stream), 'w'); rewind(stream); ck_assert_uint_eq(peek_char(character('z'), stream), 0); } END_TEST START_TEST(peek_char_fn_test) { ck_assert_uint_eq(CHAR(peek_char_fn(LIST(NIL, STANDARD_INPUT_STREAM), NIL)), 'h'); ck_assert_uint_eq(CHAR(peek_char_fn(NIL, NIL)), 'h'); } END_TEST START_TEST(read_char_fn_test) { ck_assert_uint_eq(CHAR(read_char_fn(LIST(STANDARD_INPUT_STREAM), NIL)), 'h'); ck_assert_uint_eq(CHAR(read_char_fn(NIL, NIL)), 'e'); ck_assert_uint_eq(CHAR(peek_char_fn(LIST(NIL, STANDARD_INPUT_STREAM), NIL)), 'l'); } END_TEST START_TEST(read_fn_test) { FILE* s; char hello[] = "hello"; s = fmemopen(hello, sizeof(hello), "r"); ck_assert_str_eq(SYMBOL(read_fn(LIST(stream(s)), NIL)).data, hello); fclose(s); char funny[] = "69.420"; s = fmemopen(funny, sizeof(funny), "r"); ck_assert_double_eq(NUMBER(read_fn(LIST(stream(s)), NIL)), 69.420); fclose(s); char list[] = "(1 2 3)"; s = fmemopen(list, sizeof(list), "r"); Pointer result = read_fn(LIST(stream(s)), NIL); ck_assert_double_eq(NUMBER(CAR(result)), 1); ck_assert_double_eq(NUMBER(CAR(CDR(result))), 2); ck_assert_double_eq(NUMBER(CAR(CDR(CDR(result)))), 3); fclose(s); } END_TEST START_TEST(read_char_macro_fn_test) { FILE* s; char a[] = "a"; s = fmemopen(a, sizeof(a), "r"); ck_assert_uint_eq(CHAR(read_char_macro(LIST(stream(s)), NIL)), 'a'); fclose(s); char ab[] = "ab"; s = fmemopen(ab, sizeof(ab), "r"); ck_assert_uint_eq(read_char_macro(LIST(stream(s)), NIL), UNDEFINED); fclose(s); unsigned char smile[] = "😄"; s = fmemopen(smile, sizeof(smile), "r"); Pointer result = read_char_macro(LIST(stream(s)), NIL); ck_assert_int_eq(CHAR(result) & 0xFF, smile[0]); ck_assert_int_eq((CHAR(result) >> 8) & 0xFF, smile[1]); ck_assert_int_eq((CHAR(result) >> 16) & 0xFF, smile[2]); ck_assert_int_eq((CHAR(result) >> 24) & 0xFF, smile[3]); fclose(s); char smile2[] = "😄😄"; s = fmemopen(smile2, sizeof(smile2), "r"); ck_assert_uint_eq(read_char_macro(LIST(stream(s)), NIL), UNDEFINED); fclose(s); char space[] = "space"; s = fmemopen(space, sizeof(space), "r"); ck_assert_uint_eq(CHAR(read_char_macro(LIST(stream(s)), NIL)), ' '); fclose(s); char tab[] = "tab"; s = fmemopen(tab, sizeof(tab), "r"); ck_assert_uint_eq(CHAR(read_char_macro(LIST(stream(s)), NIL)), '\t'); fclose(s); char newline[] = "newline"; s = fmemopen(newline, sizeof(newline), "r"); ck_assert_uint_eq(CHAR(read_char_macro(LIST(stream(s)), NIL)), '\n'); fclose(s); char space2[] = "space2"; s = fmemopen(space2, sizeof(space2), "r"); ck_assert_uint_eq(read_char_macro(LIST(stream(s)), NIL), UNDEFINED); fclose(s); } END_TEST START_TEST(read_list_macro_fn_test) { char list[] = "1 2 3)"; FILE* s = fmemopen(list, sizeof(list), "r"); Pointer result = read_list_macro(LIST(stream(s)), NIL); ck_assert_double_eq(NUMBER(CAR(result)), 1); ck_assert_double_eq(NUMBER(CAR(CDR(result))), 2); ck_assert_double_eq(NUMBER(CAR(CDR(CDR(result)))), 3); fclose(s); } END_TEST START_TEST(read_right_paren_macro_fn_test) { ck_assert_uint_eq(read_right_paren_macro(NIL, NIL), NIL); } END_TEST static char buffer[] = "hello, world"; static void setup(void) { memory_init(16); symbol_init(); reader_init(); environment_init(); STANDARD_INPUT_STREAM = stream(fmemopen(buffer, sizeof(buffer), "r")); environment_set(NIL, STANDARD_INPUT, STANDARD_INPUT_STREAM); } static void teardown(void) { fclose(STREAM(STANDARD_INPUT_STREAM)); memory_free(); } Suite* make_reader_test_suite(void) { Suite *s1 = suite_create("Reader"); TCase *tc1_1 = tcase_create("Reader"); suite_add_tcase(s1, tc1_1); tcase_add_checked_fixture(tc1_1, setup, teardown); tcase_add_test(tc1_1, peek_char_test); tcase_add_test(tc1_1, peek_char_fn_test); tcase_add_test(tc1_1, read_char_fn_test); tcase_add_test(tc1_1, read_fn_test); tcase_add_test(tc1_1, read_char_macro_fn_test); tcase_add_test(tc1_1, read_list_macro_fn_test); tcase_add_test(tc1_1, read_right_paren_macro_fn_test); return s1; }