diff options
| author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2025-08-21 23:19:18 +0100 | 
|---|---|---|
| committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2025-08-21 23:21:15 +0100 | 
| commit | bbb405fca9f8a68c1c92c779bf3cae0216ed0aaf (patch) | |
| tree | 7e435ed63857c608da7fabea3de00679daf4bda8 | |
| parent | 49a3302fd67e1925b53935939f9a61f6d79b9978 (diff) | |
| download | alisp-bbb405fca9f8a68c1c92c779bf3cae0216ed0aaf.tar.gz alisp-bbb405fca9f8a68c1c92c779bf3cae0216ed0aaf.tar.bz2 alisp-bbb405fca9f8a68c1c92c779bf3cae0216ed0aaf.zip  | |
Refactor testing system, and add more tests
Couple macros to make printing nicer, use assertions instead to fail
if a test doesn't work.
| -rw-r--r-- | test.c | 144 | 
1 files changed, 99 insertions, 45 deletions
@@ -18,7 +18,33 @@  #include "./alisp.h" +#define TEST_PASSED() printf("[%s]: Pass\n", __func__) +#define TEST(NAME, COND)                                \ +  do                                                    \ +  {                                                     \ +    if (!(COND))                                        \ +    {                                                   \ +      printf("[%s]: `%s` failed!\n", __func__, (NAME)); \ +      assert(0);                                        \ +    }                                                   \ +  } while (0) +  // Sample data +const char *unique_words[] = { +    "bibendum",     "etiam",    "gravida",   "dui",       "cursus", +    "purus",        "diam",     "phasellus", "nam",       "fermentum", +    "leo",          "enim",     "ac",        "semper",    "non", +    "mauris",       "proin",    "tellus",    "vivamus",   "lobortis", +    "lacus",        "neque",    "in",        "nullam",    "felis", +    "orci",         "pede",     "tempus",    "nec",       "at", +    "tortor",       "massa",    "sed",       "magna",     "eget", +    "tempor",       "velit",    "imperdiet", "praesent",  "volutpat", +    "tristique",    "id",       "commodo",   "aliquet",   "quis", +    "pellentesque", "eleifend", "porta",     "nunc",      "euismod", +    "aliquam",      "a",        "erat",      "dignissim", "ut", +    "vitae",        "vel",      "donec", +}; +  char *words[] = {      "aliquam",      "erat",      "volutpat",  "nunc",      "eleifend",      "leo",          "vitae",     "magna",     "in",        "id", @@ -37,6 +63,15 @@ char *words[] = {      "euismod",      "tellus",    "id",        "erat",  }; +char words_text[] = +    "aliquam erat volutpat nunc eleifend leo vitae magna in id erat non orci " +    "commodo lobortis proin neque massa cursus ut gravida ut lobortis eget " +    "lacus sed diam praesent fermentum tempor tellus nullam tempus mauris ac " +    "felis vel velit tristique imperdiet donec at pede etiam vel neque nec dui " +    "dignissim bibendum vivamus id enim phasellus neque orci porta a aliquet " +    "quis semper a massa phasellus purus pellentesque tristique imperdiet " +    "tortor nam euismod tellus id erat"; +  char text[] =      "Pellentesque dapibus suscipit ligula.  Donec posuere augue in quam.  "      "Etiam vel tortor sodales tellus ultricies commodo.  Suspendisse potenti.  " @@ -55,23 +90,20 @@ void symtable_test(void)    sym_table_t table = {0};    sym_table_init(&table);    for (u64 i = 0; i < ARRSIZE(words); ++i) -  { -    char *ptr = sym_table_find(&table, SV(words[i], strlen(words[i]))); -    printf("[symtable_test]: %s => %p\n", words[i], ptr); -  } +    sym_table_find(&table, SV(words[i], strlen(words[i]))); -  printf( -      "[symtable_test]: |words|=%lu, |table|= %lu => Unique word ratio: %lf\n", -      ARRSIZE(words), table.count, table.count / (double)ARRSIZE(words)); +  TEST("|table|=|set(words)|", table.count == ARRSIZE(unique_words)); +  TEST("|table| < |words|", table.count < ARRSIZE(words)); + +  TEST_PASSED();    sym_table_cleanup(&table);  } -void make_int_test(void) +void int_test(void)  {    i64 ints[] = { -      1,       -1,      (1 << 10) - 1, (-1) * ((1 << 10) - 1), -      INT_MIN, INT_MAX, INT64_MAX,     INT64_MIN, +      1, -1, (1 << 10) - 1, (-1) * ((1 << 10) - 1), INT_MIN, INT_MAX,    };    for (u64 i = 0; i < ARRSIZE(ints); ++i) @@ -80,11 +112,13 @@ void make_int_test(void)      lisp_t *lisp = make_int(in);      i64 out      = as_int(lisp); -    printf("[make_int_test]: %#16lx => %#16lx => %#16lx\n", in, (u64)lisp, out); +    TEST("in == out", in == out);    } + +  TEST_PASSED();  } -void intern_test(void) +void sym_test(void)  {    sys_t system = {0};    sys_init(&system); @@ -93,29 +127,44 @@ void intern_test(void)      char *in     = words[i];      lisp_t *lisp = intern(&system, SV(in, strlen(in)));      char *out    = as_sym(lisp); -    printf("[intern test]: `%s` -> %p -> `%s`\n", in, lisp, out); +    TEST("unique pointers when interning a symbol", in != out); +    TEST("same size", strlen(in) == strlen(out)); +    TEST("same string", strncmp(in, out, strlen(in)) == 0);    } +  TEST_PASSED();    sys_cleanup(&system);  } -void make_vec_test(void) +void vec_test1(void)  {    sys_t system = {0};    sys_init(&system);    // Generating a vector word by word -  lisp_t *vec = make_vec(&system, 0); +  lisp_t *lvec = make_vec(&system, 0);    for (u64 i = 0; i < ARRSIZE(words); ++i)    {      char *word = words[i]; -    vec_append(as_vec(vec), word, strlen(word)); -    vec_append(as_vec(vec), " ", 1); +    vec_append(as_vec(lvec), word, strlen(word)); +    if (i != ARRSIZE(words) - 1) +      vec_append(as_vec(lvec), " ", 1);    } -  printf("[make_vec_test]: %lu/%lu, inlined?: %s, text=%.*s\n", -         as_vec(vec)->size, as_vec(vec)->capacity, -         as_vec(vec)->is_inlined ? "yes" : "no", (int)as_vec(vec)->size, -         (char *)vec_data(as_vec(vec))); +  vec_append(as_vec(lvec), "\0", 1); + +  vec_t *vec = as_vec(lvec); +  TEST("same size vector", vec->size == ARRSIZE(words_text)); +  TEST("same as actually concatenated string", +       strncmp(vec_data(vec), words_text, vec->size) == 0); + +  TEST_PASSED(); +  sys_cleanup(&system); +} + +void vec_test2(void) +{ +  sys_t system = {0}; +  sys_init(&system);    // Generating substrings    struct Test    { @@ -126,19 +175,21 @@ void make_vec_test(void)        {32, 64},        {0, ARRSIZE(text)},    }; +    for (u64 i = 0; i < ARRSIZE(tests); ++i)    { -    struct Test test = tests[i]; -    // Always initialise below what we expect -    lisp_t *lvec = make_vec(&system, test.size / 2); -    vec_t *vec   = as_vec(lvec); -    printf("[make_vec_test]: %p -> %p[%lu/%lu] -> ", lvec, vec, vec->size, -           vec->capacity); -    vec_append(vec, text + test.start, test.size); -    printf("[%lu/%lu] -> ", vec->size, vec->capacity); -    printf("`%.*s`\n", (int)vec->size, (char *)vec_data(vec)); +    struct Test test  = tests[i]; +    const sv_t substr = SV(text + test.start, test.size); +    const u64 size    = test.size / 2; + +    lisp_t *lvec = make_vec(&system, size); +    vec_append(as_vec(lvec), text + test.start, test.size); +    TEST("Vector grew", as_vec(lvec)->size > size); +    TEST("Vector's substring is equivalent to the actual substring", +         strncmp(vec_data(as_vec(lvec)), substr.data, substr.size) == 0);    } +  printf("[vec_test2]: Pass\n");    sys_cleanup(&system);  } @@ -147,8 +198,7 @@ void cons_test(void)    sys_t system = {0};    sys_init(&system); -  // Iterate through each "word" in words, make a large contiguous list which is -  // its reverse +  // Let's make a list of words using `cons`    lisp_t *lisp = NIL;    for (u64 i = 0; i < ARRSIZE(words); ++i)    { @@ -157,28 +207,32 @@ void cons_test(void)      lisp          = cons(&system, lword, lisp);    } -  // Then iterate through it -  printf("[cons_test]: "); +  // Make sure we've essentially reversed the `words` array +  u64 i = ARRSIZE(words);    for (lisp_t *iter = lisp; iter; iter = cdr(iter))    {      lisp_t *item = car(iter); -    printf("%s ", as_sym(item)); +    TEST("we've reversed the array", +         strncmp(words[i - 1], as_sym(item), strlen(words[i - 1])) == 0); +    i -= 1;    } -  printf("\n"); + +  TEST_PASSED();    sys_cleanup(&system);  } +typedef void (*test_fn)(void); + +const test_fn TESTS[] = { +    int_test, sym_test, vec_test1, vec_test2, cons_test, +}; +  int main(void)  { -  symtable_test(); -  printf("\n"); -  make_int_test(); -  printf("\n"); -  intern_test(); -  printf("\n"); -  make_vec_test(); -  printf("\n"); -  cons_test(); +  for (u64 i = 0; i < ARRSIZE(TESTS); ++i) +  { +    TESTS[i](); +  }    return 0;  }  | 
