record-manager-solved/tests/unit.c
trevon 8c08fb626f
Some checks are pending
grade / grade (push) Waiting to run
push (solved)
2026-08-26 01:12:23 +00:00

92 lines
3.2 KiB
C

/* Direct unit tests for the graded interface (buf, list, store). */
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "buf.h"
#include "list.h"
#include "store.h"
#define CHECK(cond) \
do { \
if (!(cond)) { \
fprintf(stderr, "FAIL %s:%d: %s\n", __FILE__, __LINE__, #cond); \
return 1; \
} \
} while (0)
static int test_buf(void) {
buf_t *b = buf_new();
CHECK(b != NULL);
CHECK(strcmp(buf_cstr(b), "") == 0);
CHECK(buf_append(b, "hello", 5) == 0);
CHECK(buf_append(b, " world", 6) == 0);
CHECK(buf_len(b) == 11);
CHECK(strcmp(buf_cstr(b), "hello world") == 0);
buf_reset(b);
CHECK(buf_len(b) == 0);
CHECK(strcmp(buf_cstr(b), "") == 0);
buf_free(b);
return 0;
}
static int test_list(void) {
list_t *l = list_new();
record_t *r;
CHECK(l != NULL);
CHECK(list_len(l) == 0);
CHECK(list_append(l, record_new("zed", "z@x", "1")) == 0);
CHECK(list_append(l, record_new("amy", "a@x", "2")) == 0);
CHECK(list_append(l, record_new("bob", "b@x", "3")) == 0);
CHECK(list_len(l) == 3);
r = list_find(l, "amy");
CHECK(r != NULL && strcmp(r->field1, "a@x") == 0);
CHECK(list_find(l, "nope") == NULL);
CHECK(list_remove(l, "amy") == STATUS_OK);
CHECK(list_len(l) == 2);
CHECK(list_find(l, "amy") == NULL);
CHECK(list_remove(l, "amy") == STATUS_ERR_NOTFOUND);
CHECK(list_remove(l, NULL) == STATUS_ERR_ARG);
list_sort(l);
CHECK(strcmp(list_get(l, 0)->name, "bob") == 0); /* after sort: bob, zed */
CHECK(strcmp(list_get(l, 1)->name, "zed") == 0);
list_free(l);
return 0;
}
static int test_store(void) {
list_t *l = list_new();
list_t *l2 = list_new();
int n;
CHECK(l != NULL && l2 != NULL);
CHECK(list_append(l, record_new("Ada Lovelace", "ada@x", "555-0100")) == 0);
CHECK(list_append(l, record_new("grace", "", "third field with spaces")) == 0);
CHECK(store_save(l, "/tmp/recman_unit_store.txt") == STATUS_OK);
n = store_load(&l2, "/tmp/recman_unit_store.txt");
CHECK(n == 2);
CHECK(list_len(l2) == 2);
CHECK(strcmp(list_get(l2, 0)->name, "Ada Lovelace") == 0);
CHECK(strcmp(list_get(l2, 0)->field2, "555-0100") == 0);
CHECK(strcmp(list_get(l2, 1)->field1, "") == 0);
CHECK(strcmp(list_get(l2, 1)->field2, "third field with spaces") == 0);
/* load appends into a non-empty list */
n = store_load(&l2, "/tmp/recman_unit_store.txt");
CHECK(n == 2 && list_len(l2) == 4);
/* missing file -> error, not crash */
CHECK(store_load(&l2, "/tmp/recman_unit_missing_xyz.txt") < 0);
list_free(l);
list_free(l2);
remove("/tmp/recman_unit_store.txt");
return 0;
}
int main(void) {
if (test_buf() != 0)
return 1;
if (test_list() != 0)
return 1;
if (test_store() != 0)
return 1;
puts("unit: all pass");
return 0;
}