/* test_lisp_api.c: Testing of constructors/destructors of Lisp expressions * Created: 2026-02-04 * Author: Aryadev Chavali * License: See end of file * Commentary: */ #include "./data.h" #include "./test.h" #include void int_test(void) { i64 ints[] = { 1, -1, (1 << 10) - 1, (-1) * ((1 << 10) - 1), INT_MIN, INT_MAX, }; for (u64 i = 0; i < ARRSIZE(ints); ++i) { i64 in = ints[i]; lisp_t *lisp = make_int(in); i64 out = as_int(lisp); TEST(in == out, "%ld == %ld", in, out); } TEST_PASSED(); } void symtable_test(void) { sym_table_t table = {0}; sym_table_init(&table); for (u64 i = 0; i < ARRSIZE(words); ++i) sym_table_find(&table, SV((char *)words[i], strlen(words[i]))); TEST(table.count == ARRSIZE(unique_words), "%lu == %lu", table.count, ARRSIZE(unique_words)); TEST(table.count < ARRSIZE(unique_words), "%lu < %lu", table.count, ARRSIZE(unique_words)); TEST_PASSED(); sym_table_cleanup(&table); } void sym_test(void) { sys_t system = {0}; sys_init(&system); for (u64 i = 0; i < ARRSIZE(words); ++i) { const char *in = words[i]; lisp_t *lisp = intern(&system, SV((char *)in, strlen(in))); char *out = as_sym(lisp); TEST(in != out, "%p != %p", in, out); TEST(strlen(in) == strlen(out), "%zu == %zu", strlen(in), strlen(out)); TEST(strncmp(in, out, strlen(in)) == 0, "%d", strncmp(in, out, strlen(in))); } TEST_PASSED(); sys_cleanup(&system); } void cons_test(void) { sys_t system = {0}; sys_init(&system); // Let's make a list of words using `cons` lisp_t *lisp = NIL; for (u64 i = 0; i < ARRSIZE(words); ++i) { const char *word = words[i]; lisp_t *lword = intern(&system, SV((char *)word, strlen(word))); lisp = cons(&system, lword, lisp); } // Make sure we've essentially reversed the `words` array u64 i = ARRSIZE(words); for (lisp_t *iter = lisp; iter; iter = cdr(iter), --i) { const char *expected = words[i - 1]; lisp_t *item = car(iter); char *got = as_sym(item); size_t size = MIN(strlen(expected), strlen(got)); TEST(strncmp(expected, got, size) == 0, "%s == %s", expected, got); } TEST_PASSED(); sys_cleanup(&system); } const test_fn TESTS_LISP_API[] = { MAKE_TEST_FN(int_test), MAKE_TEST_FN(sym_test), MAKE_TEST_FN(cons_test), }; const test_suite_t LISP_API_SUITE = { .name = "Lisp API Tests", .tests = TESTS_LISP_API, .size = ARRSIZE(TESTS_LISP_API), }; /* Copyright (C) 2026 Aryadev Chavali * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License Version 2 for * details. * You may distribute and modify this code under the terms of the GNU General * * Public License Version 2, which you should have received a copy of along with * this program. If not, please go to . */