From 9594210f02572681ed581c5197ace4c207db0917 Mon Sep 17 00:00:00 2001 From: JSDurand Date: Mon, 8 Nov 2021 16:37:57 +0800 Subject: initial commit Now the rough framework is established and the grammar class is sort of ready. It remains to write a general input reading mechanism. --- src/test/check_grammar.c | 35 ++++++++ src/test/check_list.c | 217 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 252 insertions(+) create mode 100644 src/test/check_grammar.c create mode 100644 src/test/check_list.c (limited to 'src/test') diff --git a/src/test/check_grammar.c b/src/test/check_grammar.c new file mode 100644 index 0000000..1fe27dd --- /dev/null +++ b/src/test/check_grammar.c @@ -0,0 +1,35 @@ +#include +#include +#include "../grammar.h" + +int main(U_ATTR int argc, U_ATTR char **argv) +{ + /* check new_tnt and print it */ + TNT *tnt = new_tnt(1, 12); + + printf("Print a TNT value of type NT: "); + print_tnt(tnt); + printf("\n"); + + free(tnt); + + /* check new_tnt_string */ + + List *tnt_string = new_tnt_string("tntnt", 5, + (T) 1, (NT) 2, (T) 3, (NT) 4, (T) 15); + + if (!tnt_string) { + eprintf("error!\n"); + return 1; + } + + /* check new_rule, print_rule, and destroy_rule. */ + + Rule *rule = new_rule(1, tnt_string); + + print_rule(rule); + + destroy_rule(rule); + + return 0; +} diff --git a/src/test/check_list.c b/src/test/check_list.c new file mode 100644 index 0000000..8677cd3 --- /dev/null +++ b/src/test/check_list.c @@ -0,0 +1,217 @@ +#include +#include +#include "../list.h" + +void +print_int(void *p) +{ + printf("%d\n", *((int *)p)); +} + +int +main(U_ATTR int argc, U_ATTR char **argv) +{ + List *ls = new_list(); + + if (!ls) { + eprintf("%s:%d, failed to create a new list\n", + __FILE__, __LINE__); + exit(1); + } + + unsigned char result = 0; + + int x[] = { 1, 2, 3, 4, 1 }; + + for (size_t i = 0; i < sizeof(x) / sizeof(*x); i++) { + if (add_to_list(ls, x+i)) { + eprintf("failed to add %ld-th element to LS\n", + i); + exit(1); + } + } + + print_list(ls, print_int); + + NUM expected_ls_len = sizeof(x) / sizeof(*x); + + if (list_length(ls) != expected_ls_len) { + eprintf("The length of the list is wrong!\n"); + exit(1); + } + + eprintf("The length is correct!\n"); + + NUM array_len = 0; + int *array = list_to_array(ls, sizeof(*array), &array_len); + + if (!array) { + eprintf("%s:%d, failed to convert the list to an array\n", + __FILE__, __LINE__); + exit(1); + } + + if (array_len != expected_ls_len) { + eprintf("The length of the array is wrong!\n"); + exit(1); + } + + eprintf("The length of the array is correct!\n"); + + for (NUM i = 0; i < expected_ls_len; i++) { + if (*(array+i) != *(x+i)) { + eprintf("The %lu-th element of array = %d, x = %d\n", + i, *(array+i), *(x+i)); + exit(1); + } + } + + eprintf("Every element of the array is as expected!\n"); + + for (NUM i = 0; i < expected_ls_len; i++) { + int *pointer = pop_from_list(ls); + + if (!pointer) { + eprintf("%s:%d, i = %ld, Popping returns NULL\n", + __FILE__, __LINE__, i); + exit(1); + } + + if (*pointer != *(x+expected_ls_len-i-1)) { + eprintf("i = %ld, *pointer = %d, and x = %d\n", + i, *pointer, *(x+expected_ls_len-i-1)); + exit(1); + } + } + + eprintf("pop_from_list works as expected.\n"); + + print_list(ls, print_int); + + expected_ls_len = 5; + + for (NUM i = 0; i < expected_ls_len; i++) { + int *pointer = malloc(sizeof *pointer * 1); + + if (!pointer) { + eprintf("%s:%d, i = %ld, failed to malloc\n", + __FILE__, __LINE__, i); + exit(1); + } + + *pointer = expected_ls_len-1-i; + if (add_to_list(ls, pointer)) { + eprintf("%s:%d, i = %ld, failed to add element\n", + __FILE__, __LINE__, i); + exit(1); + } + } + + print_list(ls, print_int); + + destroy_list(ls, 1); + + eprintf("Successfully destroyed the list and freed every element\n"); + + free(array); + + ls = new_list(); + + if (!ls) { + eprintf("%s:%d, failed to create a new list\n", + __FILE__, __LINE__); + exit(1); + } + + if (list_assure_size(ls, 513)) { + eprintf("%s:%d, failed to assure size\n", + __FILE__, __LINE__); + exit(1); + } + + if (list_set_length(ls, 513)) { + eprintf("%s:%d, failed to set length\n", + __FILE__, __LINE__); + exit(1); + } + + print_list(ls, print_int); + + destroy_list(ls, 2); + + eprintf("Successfully destroyed the list\n"); + + if (!(ls = new_list())) { + eprintf("%s:%d, failed to create a new list\n", + __FILE__, __LINE__); + exit(1); + } + + List *ls2 = new_list(); + + if (!ls2) { + eprintf("%s:%d, failed to create a new list\n", + __FILE__, __LINE__); + exit(1); + } + + for (NUM i = 0; i < 5; i++) { + int *pointer = malloc(sizeof *pointer * 1); + + if (!pointer) { + eprintf("%s:%d, failed to malloc\n", + __FILE__, __LINE__); + exit(1); + } + + *pointer = 4-i; + + if (add_to_list(ls2, pointer)) { + eprintf("%s:%d, i = %ld, failed to add to list\n", + __FILE__, __LINE__, i); + exit(1); + } + } + + print_list(ls2, print_int); + + result = copy_list(ls, ls2, copy_num); + + if (result) { + eprintf("%s:%d, failed to copy list\n", + __FILE__, __LINE__); + exit(1); + } + + destroy_list(ls2, 1); + destroy_list(ls, 1); + + eprintf("Successfully destroyed lists!\n"); + + /* test a list with pointers in an array */ + + if (!(ls = new_list())) { + eprintf("%s:%d, failed to create a new list\n", + __FILE__, __LINE__); + exit(1); + } + + NUM arr[10]; + + for (NUM i = 0; i < 10; i++) { + arr[i] = i*i-i+1; + if (add_to_list(ls, arr+i)) { + eprintf("%s:%d, i = %ld, failed to add element\n", + __FILE__, __LINE__, i); + exit(1); + } + } + + print_list(ls, print_int); + + destroy_list(ls, 0); + + printf("Every test is successful!\n"); + + return 0; +} -- cgit v1.2.3-18-g5258