]> pd.if.org Git - ctap/blobdiff - prove.c
reverse test parameters, add prove
[ctap] / prove.c
diff --git a/prove.c b/prove.c
index a0931c4c71e88484bcfc8826d7f214549536c8b2..afb5a73e2c5a16742562a00e1697f413c2582d07 100644 (file)
--- a/prove.c
+++ b/prove.c
@@ -2,6 +2,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
+#include <errno.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <regex.h>
@@ -72,6 +73,9 @@ int runone(struct testrun *run) {
                close(1); /* close stdout */
                dup(pipefd[1]); /* set stdout to the write end of the pipe */
                execlp(run->name, run->name, NULL);
+               /* only gets here if exec failed */
+               printf("Bail Out! exec %s failed: %s\n", run->name, strerror(errno));
+               exit(EXIT_FAILURE);
        }
 
        close(pipefd[1]);
@@ -120,6 +124,15 @@ int runone(struct testrun *run) {
                        int skip = 0;
                        int pass = 0;
 
+                       run->ran++;
+
+                       if (run->interactive) {
+                               backup(written);
+                               written = printf("%d/%d", run->ran, run->plan);
+                               fflush(stdout);
+                       }
+
+
                        /* if the "not" match fails, the test passed */
                        pass = match[1].rm_so == -1;
 
@@ -133,26 +146,26 @@ int runone(struct testrun *run) {
                        }
 
                        /* check for diagnostics */
-                       if (test != run->ran+1) {
+                       if (test != run->ran) {
                                fprintf(stderr, "expected test %d, got %d\n", run->ran+1, test);
                        }
 
-                       run->ran++;
-
-                       if (pass || todo) {
+                       /* pass, todo, or skip are all pass */
+                       if (pass || todo || skip) {
                                run->pass++;
+                       } else {
+                               run->fail++;
                        }
 
-                       if (todo) {
-                               if (pass) {
-                                       run->todo_pass++;
-                               }
+                       if (todo && pass) {
+                               run->todo_pass++;
                        }
+
                        if (skip) {
                                run->skip++;
                        }
 
-                       if (!pass) {
+                       if (!pass && !todo) {
                                struct result *r;
                                r = malloc(sizeof *r);
 
@@ -168,11 +181,6 @@ int runone(struct testrun *run) {
                                /* push test number onto fail list */
                        }
 
-                       if (run->interactive) {
-                               backup(written);
-                               written = printf("%d/%d", run->ran, run->plan);
-                               fflush(stdout);
-                       }
                }
                else if (rmatch(&diagnostic, line, match)) {
 
@@ -280,7 +288,6 @@ int main(int ac, char *av[]) {
        for (i=optind; i<ac; i++) {
                run = clear;
                run.name = av[i];
-               run.plan = -1;
                run.interactive = interactive;
 
                if (progress) {
@@ -298,20 +305,31 @@ int main(int ac, char *av[]) {
                total.ran += run.ran;
                total.pass += run.pass;
                total.fail += run.fail;
+               total.skip += run.skip;
 
                if (progress) {
-                       if (run.fail > 0 ) printf("not ");
-                       printf("ok\n");
+                       if (run.bailout) {
+                               printf("Bail out!\n");
+                       } else {
+                               if (run.fail > 0 ) printf("not ");
+                               printf("ok\n");
+                       }
                }
 
                runs[i-optind] = run;
        }
 
        if (summary) {
-               printf("ran: %d/%d, pass: %d, fail: %d, %.2f%% ok\n",
+               printf("ran: %d/%d, pass: %d, fail: %d, skip: %d",
                                total.ran, total.plan, total.pass, total.fail,
-                               100.0*(double)total.pass/(double)total.plan
+                               total.skip
                      );
+               if (total.plan > 0) {
+                       printf(", %.2f%% ok",
+                               100.0*(double)total.pass/(double)total.plan
+                             );
+               }
+               printf("\n");
 
        }