test + doxygen for wstat()
[disorder] / lib / test.c
index 3b1eca3..5aa9f57 100644 (file)
@@ -31,6 +31,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#include <signal.h>
 
 #include "utf8.h"
 #include "mem.h"
 #include "wstat.h"
 #include "signame.h"
 #include "cache.h"
+#include "filepart.h"
+#include "hash.h"
+#include "selection.h"
+#include "syscalls.h"
 
 static int tests, errors;
 static int fail_first;
@@ -104,15 +109,31 @@ static const char *format_utf32(const uint32_t *s) {
   if(w == 0) {                                                 \
     fprintf(stderr, "%s:%d: %s returned 0\n",                  \
             __FILE__, __LINE__, #GOT);                         \
-    count_error();                                                     \
+    count_error();                                              \
   } else if(strcmp(w, g)) {                                    \
     fprintf(stderr, "%s:%d: %s returned:\n%s\nexpected:\n%s\n",        \
            __FILE__, __LINE__, #GOT, format(g), format(w));    \
-    count_error();                                                     \
+    count_error();                                              \
   }                                                            \
   ++tests;                                                     \
  } while(0)
 
+#define check_string_prefix(GOT, WANT) do {                             \
+  const char *g = GOT;                                                  \
+  const char *w = WANT;                                                 \
+                                                                        \
+  if(w == 0) {                                                          \
+    fprintf(stderr, "%s:%d: %s returned 0\n",                           \
+            __FILE__, __LINE__, #GOT);                                  \
+    count_error();                                                     \
+  } else if(strncmp(w, g, strlen(w))) {                                 \
+    fprintf(stderr, "%s:%d: %s returned:\n%s\nexpected:\n%s...\n",     \
+           __FILE__, __LINE__, #GOT, format(g), format(w));            \
+    count_error();                                                     \
+  }                                                                     \
+  ++tests;                                                              \
+ } while(0)
+
 static uint32_t *ucs4parse(const char *s) {
   struct dynstr_ucs4 d;
   char *e;
@@ -717,6 +738,82 @@ static void test_cache(void) {
   insist(cache_get(&t2, "2") == 0); 
 }
 
+static void test_filepart(void) {
+  fprintf(stderr, "test_filepart\n");
+  check_string(d_dirname("/"), "/");
+  check_string(d_dirname("/spong"), "/");
+  check_string(d_dirname("/foo/bar"), "/foo");
+  check_string(d_dirname("./bar"), ".");
+  check_string(d_dirname("."), ".");
+  check_string(d_dirname(".."), ".");
+  check_string(d_dirname("../blat"), "..");
+  check_string(d_dirname("wibble"), ".");
+  check_string(extension("foo.c"), ".c");
+  check_string(extension(".c"), ".c");
+  check_string(extension("."), ".");
+  check_string(extension("foo"), "");
+  check_string(extension("./foo"), "");
+  check_string(extension("./foo.c"), ".c");
+}
+
+static void test_selection(void) {
+  hash *h;
+  fprintf(stderr, "test_selection\n");
+  insist((h = selection_new()) != 0);
+  selection_set(h, "one", 1);
+  selection_set(h, "two", 1);
+  selection_set(h, "three", 0);
+  selection_set(h, "four", 1);
+  insist(selection_selected(h, "one") == 1);
+  insist(selection_selected(h, "two") == 1);
+  insist(selection_selected(h, "three") == 0);
+  insist(selection_selected(h, "four") == 1);
+  insist(selection_selected(h, "five") == 0);
+  insist(hash_count(h) == 3);
+  selection_flip(h, "one"); 
+  selection_flip(h, "three"); 
+  insist(selection_selected(h, "one") == 0);
+  insist(selection_selected(h, "three") == 1);
+  insist(hash_count(h) == 3);
+  selection_live(h, "one");
+  selection_live(h, "two");
+  selection_live(h, "three");
+  selection_cleanup(h);
+  insist(selection_selected(h, "one") == 0);
+  insist(selection_selected(h, "two") == 1);
+  insist(selection_selected(h, "three") == 1);
+  insist(selection_selected(h, "four") == 0);
+  insist(selection_selected(h, "five") == 0);
+  insist(hash_count(h) == 2);
+  selection_empty(h);
+  insist(selection_selected(h, "one") == 0);
+  insist(selection_selected(h, "two") == 0);
+  insist(selection_selected(h, "three") == 0);
+  insist(selection_selected(h, "four") == 0);
+  insist(selection_selected(h, "five") == 0);
+  insist(hash_count(h) == 0);
+}
+
+static void test_wstat(void) {
+  pid_t pid;
+  int w;
+  
+  fprintf(stderr, "test_wstat\n");
+  if(!(pid = xfork())) {
+    _exit(1);
+  }
+  while(waitpid(pid, &w, 0) < 0 && errno == EINTR)
+    ;
+  check_string(wstat(w), "exited with status 1");
+  if(!(pid = xfork())) {
+    kill(getpid(), SIGTERM);
+    _exit(-1);
+  }
+  while(waitpid(pid, &w, 0) < 0 && errno == EINTR)
+    ;
+  check_string_prefix(wstat(w), "terminated by signal 15");
+}
+
 int main(void) {
   fail_first = !!getenv("FAIL_FIRST");
   insist('\n' == 0x0A);
@@ -736,6 +833,8 @@ int main(void) {
   /* client.c */
   /* configuration.c */
   /* event.c */
+  /* filepart.c */
+  test_filepart();
   /* fprintf.c */
   /* heap.c */
   test_heap();
@@ -765,10 +864,13 @@ int main(void) {
   test_casefold();
   test_words();
   /* wstat.c */
+  test_wstat();
   /* signame.c */
   test_signame();
   /* cache.c */
   test_cache();
+  /* selection.c */
+  test_selection();
   fprintf(stderr,  "%d errors out of %d tests\n", errors, tests);
   return !!errors;
 }