summaryrefslogtreecommitdiffstats
path: root/tests/test_flat.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_flat.c')
-rw-r--r--tests/test_flat.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/tests/test_flat.c b/tests/test_flat.c
new file mode 100644
index 0000000..2710ce5
--- /dev/null
+++ b/tests/test_flat.c
@@ -0,0 +1,132 @@
+// Tests for flat.h - directory traversal utilities
+#define FLAT_IMPLEMENTATION
+#include "../include/flat.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#define ASSERT(cond, msg) \
+ do { \
+ if (!(cond)) { \
+ fprintf(stderr, "FAIL: %s (test_flat.c:%d)\n", msg, __LINE__); \
+ failures++; \
+ } \
+ } while (0)
+
+static int failures = 0;
+
+void test_path() {
+ char *p = flat_path(3, "a", "b", "c");
+ ASSERT(p != NULL, "path returns non-NULL");
+ ASSERT(strcmp(p, "a/b/c") == 0, "path a/b/c");
+ free(p);
+
+ p = flat_path(2, "home", "user");
+ ASSERT(strcmp(p, "home/user") == 0, "path home/user");
+ free(p);
+
+ p = flat_path(1, "single");
+ ASSERT(strcmp(p, "single") == 0, "path single component");
+ free(p);
+}
+
+void test_path_zero() {
+ char *p = flat_path(0, NULL);
+ ASSERT(p == NULL, "zero components returns NULL");
+}
+
+void test_entry_count() {
+ ASSERT(mkdir("/tmp/test_flat_dir", 0777) == 0 || errno == EEXIST, "mkdir test_flat_dir");
+
+ FILE *f1 = fopen("/tmp/test_flat_dir/file1.txt", "w");
+ ASSERT(f1 != NULL, "fopen file1.txt");
+ if (!f1) { rmdir("/tmp/test_flat_dir"); return; }
+ fclose(f1);
+ FILE *f2 = fopen("/tmp/test_flat_dir/file2.txt", "w");
+ ASSERT(f2 != NULL, "fopen file2.txt");
+ if (!f2) { unlink("/tmp/test_flat_dir/file1.txt"); rmdir("/tmp/test_flat_dir"); return; }
+ fclose(f2);
+
+ int64_t count = flat_directory_entry_count("/tmp/test_flat_dir");
+ ASSERT(count >= 2, "entry count >= 2");
+
+ unlink("/tmp/test_flat_dir/file1.txt");
+ unlink("/tmp/test_flat_dir/file2.txt");
+ rmdir("/tmp/test_flat_dir");
+}
+
+void test_entries() {
+ ASSERT(mkdir("/tmp/test_flat_dir2", 0777) == 0 || errno == EEXIST, "mkdir test_flat_dir2");
+
+ FILE *f1 = fopen("/tmp/test_flat_dir2/alpha.txt", "w");
+ ASSERT(f1 != NULL, "fopen alpha.txt");
+ if (!f1) { rmdir("/tmp/test_flat_dir2"); return; }
+ fclose(f1);
+ FILE *f2 = fopen("/tmp/test_flat_dir2/beta.txt", "w");
+ ASSERT(f2 != NULL, "fopen beta.txt");
+ if (!f2) { unlink("/tmp/test_flat_dir2/alpha.txt"); rmdir("/tmp/test_flat_dir2"); return; }
+ fclose(f2);
+
+ char **entries = flat_directory_entries("/tmp/test_flat_dir2");
+ ASSERT(entries != NULL, "entries returns non-NULL");
+ if (!entries) {
+ unlink("/tmp/test_flat_dir2/alpha.txt");
+ unlink("/tmp/test_flat_dir2/beta.txt");
+ rmdir("/tmp/test_flat_dir2");
+ return;
+ }
+
+ int found_alpha = 0, found_beta = 0;
+ for (int64_t i = 0; entries[i]; i++) {
+ if (strcmp(entries[i], "alpha.txt") == 0) found_alpha = 1;
+ if (strcmp(entries[i], "beta.txt") == 0) found_beta = 1;
+ }
+
+ ASSERT(found_alpha, "found alpha.txt");
+ ASSERT(found_beta, "found beta.txt");
+
+ flat_free_entries(entries);
+
+ unlink("/tmp/test_flat_dir2/alpha.txt");
+ unlink("/tmp/test_flat_dir2/beta.txt");
+ rmdir("/tmp/test_flat_dir2");
+}
+
+void test_entries_invalid() {
+ char **entries = flat_directory_entries("/nonexistent/path");
+ ASSERT(entries == NULL, "invalid path returns NULL");
+}
+
+void test_free_entries_null() {
+ flat_free_entries(NULL);
+}
+
+void test_entry_count_invalid() {
+ int64_t count = flat_directory_entry_count("/nonexistent/path");
+ ASSERT(count == 0, "invalid path returns 0 count");
+}
+
+void test_path_with_empty() {
+ char *p = flat_path(3, "a", "", "c");
+ ASSERT(p != NULL, "path with empty returns non-NULL");
+ ASSERT(strcmp(p, "a//c") == 0, "path a//c with empty");
+ free(p);
+}
+
+int main() {
+ test_path();
+ test_path_zero();
+ test_entry_count();
+ test_entries();
+ test_entries_invalid();
+ test_free_entries_null();
+ test_entry_count_invalid();
+ test_path_with_empty();
+
+ printf("test_flat: %d failures\n", failures);
+ return failures;
+}