Updated Branches:
  refs/heads/cfc-tests 64602a2a9 -> 7c4d3f5e0

Rework CFC tests

- CFCTestBatch struct
- Store list of all tests centrally
- Correct exit code of test scripts
- Rename and const some vars


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/7c4d3f5e
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/7c4d3f5e
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/7c4d3f5e

Branch: refs/heads/cfc-tests
Commit: 7c4d3f5e032b7bb8f2b497f7c32c0095e5f340b5
Parents: 64602a2
Author: Nick Wellnhofer <[email protected]>
Authored: Tue Jan 29 03:29:05 2013 +0100
Committer: Nick Wellnhofer <[email protected]>
Committed: Tue Jan 29 20:01:55 2013 +0100

----------------------------------------------------------------------
 clownfish/compiler/perl/lib/Clownfish/CFC.xs     |   42 +---
 clownfish/compiler/perl/t/core/001-util.t        |    6 +-
 clownfish/compiler/perl/t/core/050-docucomment.t |    6 +-
 clownfish/compiler/perl/t/core/051-symbol.t      |    6 +-
 clownfish/compiler/perl/t/core/052-version.t     |    6 +-
 clownfish/compiler/perl/t/core/100-type.t        |    6 +-
 clownfish/compiler/perl/t/core/200-function.t    |    6 +-
 clownfish/compiler/perl/t/core/201-method.t      |    6 +-
 clownfish/compiler/perl/t/core/300-variable.t    |    6 +-
 clownfish/compiler/perl/t/core/301-param_list.t  |    6 +-
 clownfish/compiler/perl/t/core/400-file_spec.t   |    6 +-
 clownfish/compiler/perl/t/core/401-class.t       |    6 +-
 clownfish/compiler/src/CFCTest.c                 |  218 +++++++++--------
 clownfish/compiler/src/CFCTest.h                 |   57 ++---
 clownfish/compiler/src/CFCTestClass.c            |   15 +-
 clownfish/compiler/src/CFCTestDocuComment.c      |   10 +-
 clownfish/compiler/src/CFCTestFileSpec.c         |   15 +-
 clownfish/compiler/src/CFCTestFunction.c         |   10 +-
 clownfish/compiler/src/CFCTestMethod.c           |   13 +-
 clownfish/compiler/src/CFCTestParamList.c        |   15 +-
 clownfish/compiler/src/CFCTestSymbol.c           |   10 +-
 clownfish/compiler/src/CFCTestType.c             |   13 +-
 clownfish/compiler/src/CFCTestUtil.c             |   14 +-
 clownfish/compiler/src/CFCTestVariable.c         |   15 +-
 clownfish/compiler/src/CFCTestVersion.c          |   10 +-
 25 files changed, 268 insertions(+), 255 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/perl/lib/Clownfish/CFC.xs
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/lib/Clownfish/CFC.xs 
b/clownfish/compiler/perl/lib/Clownfish/CFC.xs
index fc306f2..13ee4d4 100644
--- a/clownfish/compiler/perl/lib/Clownfish/CFC.xs
+++ b/clownfish/compiler/perl/lib/Clownfish/CFC.xs
@@ -2401,45 +2401,11 @@ CODE:
     CFCBase_decref((CFCBase*)self);
 OUTPUT: RETVAL
 
-void
+int
 run_batch(self, klass)
     CFCTest *self;
     const char *klass;
-PPCODE:
-    if (strcmp(klass, "Clownfish::CFC::Model::Class") == 0) {
-        CFCTestClass_run(self);
-    }
-    else if (strcmp(klass, "Clownfish::CFC::Model::DocuComment") == 0) {
-        CFCTestDocuComment_run(self);
-    }
-    else if (strcmp(klass, "Clownfish::CFC::Model::FileSpec") == 0) {
-        CFCTestFileSpec_run(self);
-    }
-    else if (strcmp(klass, "Clownfish::CFC::Model::Function") == 0) {
-        CFCTestFunction_run(self);
-    }
-    else if (strcmp(klass, "Clownfish::CFC::Model::Method") == 0) {
-        CFCTestMethod_run(self);
-    }
-    else if (strcmp(klass, "Clownfish::CFC::Model::ParamList") == 0) {
-        CFCTestParamList_run(self);
-    }
-    else if (strcmp(klass, "Clownfish::CFC::Model::Symbol") == 0) {
-        CFCTestSymbol_run(self);
-    }
-    else if (strcmp(klass, "Clownfish::CFC::Model::Type") == 0) {
-        CFCTestType_run(self);
-    }
-    else if (strcmp(klass, "Clownfish::CFC::Model::Variable") == 0) {
-        CFCTestVariable_run(self);
-    }
-    else if (strcmp(klass, "Clownfish::CFC::Model::Version") == 0) {
-        CFCTestVersion_run(self);
-    }
-    else if (strcmp(klass, "Clownfish::CFC::Util") == 0) {
-        CFCTestUtil_run(self);
-    }
-    else {
-        croak("No tests found for class '%s'", klass);
-    }
+CODE:
+    RETVAL = CFCTest_run_batch(self, klass);
+OUTPUT: RETVAL
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/perl/t/core/001-util.t
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/t/core/001-util.t 
b/clownfish/compiler/perl/t/core/001-util.t
index 1508f25..b3ad862 100644
--- a/clownfish/compiler/perl/t/core/001-util.t
+++ b/clownfish/compiler/perl/t/core/001-util.t
@@ -18,6 +18,8 @@ use warnings;
 
 use Clownfish::CFC::Test;
 
-my $test = Clownfish::CFC::Test->new;
-$test->run_batch('Clownfish::CFC::Util');
+my $test   = Clownfish::CFC::Test->new;
+my $passed = $test->run_batch('Clownfish::CFC::Util');
+
+exit($passed ? 0 : 1);
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/perl/t/core/050-docucomment.t
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/t/core/050-docucomment.t 
b/clownfish/compiler/perl/t/core/050-docucomment.t
index 5054cd3..09ad252 100644
--- a/clownfish/compiler/perl/t/core/050-docucomment.t
+++ b/clownfish/compiler/perl/t/core/050-docucomment.t
@@ -18,6 +18,8 @@ use warnings;
 
 use Clownfish::CFC::Test;
 
-my $test = Clownfish::CFC::Test->new;
-$test->run_batch('Clownfish::CFC::Model::DocuComment');
+my $test   = Clownfish::CFC::Test->new;
+my $passed = $test->run_batch('Clownfish::CFC::Model::DocuComment');
+
+exit($passed ? 0 : 1);
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/perl/t/core/051-symbol.t
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/t/core/051-symbol.t 
b/clownfish/compiler/perl/t/core/051-symbol.t
index b3a7307..4209292 100644
--- a/clownfish/compiler/perl/t/core/051-symbol.t
+++ b/clownfish/compiler/perl/t/core/051-symbol.t
@@ -18,6 +18,8 @@ use warnings;
 
 use Clownfish::CFC::Test;
 
-my $test = Clownfish::CFC::Test->new;
-$test->run_batch('Clownfish::CFC::Model::Symbol');
+my $test   = Clownfish::CFC::Test->new;
+my $passed = $test->run_batch('Clownfish::CFC::Model::Symbol');
+
+exit($passed ? 0 : 1);
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/perl/t/core/052-version.t
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/t/core/052-version.t 
b/clownfish/compiler/perl/t/core/052-version.t
index ef220bb..d5c2f63 100644
--- a/clownfish/compiler/perl/t/core/052-version.t
+++ b/clownfish/compiler/perl/t/core/052-version.t
@@ -18,6 +18,8 @@ use warnings;
 
 use Clownfish::CFC::Test;
 
-my $test = Clownfish::CFC::Test->new;
-$test->run_batch('Clownfish::CFC::Model::Version');
+my $test   = Clownfish::CFC::Test->new;
+my $passed = $test->run_batch('Clownfish::CFC::Model::Version');
+
+exit($passed ? 0 : 1);
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/perl/t/core/100-type.t
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/t/core/100-type.t 
b/clownfish/compiler/perl/t/core/100-type.t
index 3a7cdc5..f5a0e24 100644
--- a/clownfish/compiler/perl/t/core/100-type.t
+++ b/clownfish/compiler/perl/t/core/100-type.t
@@ -18,6 +18,8 @@ use warnings;
 
 use Clownfish::CFC::Test;
 
-my $test = Clownfish::CFC::Test->new;
-$test->run_batch('Clownfish::CFC::Model::Type');
+my $test   = Clownfish::CFC::Test->new;
+my $passed = $test->run_batch('Clownfish::CFC::Model::Type');
+
+exit($passed ? 0 : 1);
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/perl/t/core/200-function.t
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/t/core/200-function.t 
b/clownfish/compiler/perl/t/core/200-function.t
index e22af70..d70d2b8 100644
--- a/clownfish/compiler/perl/t/core/200-function.t
+++ b/clownfish/compiler/perl/t/core/200-function.t
@@ -18,6 +18,8 @@ use warnings;
 
 use Clownfish::CFC::Test;
 
-my $test = Clownfish::CFC::Test->new;
-$test->run_batch('Clownfish::CFC::Model::Function');
+my $test   = Clownfish::CFC::Test->new;
+my $passed = $test->run_batch('Clownfish::CFC::Model::Function');
+
+exit($passed ? 0 : 1);
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/perl/t/core/201-method.t
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/t/core/201-method.t 
b/clownfish/compiler/perl/t/core/201-method.t
index c926593..0f24c25 100644
--- a/clownfish/compiler/perl/t/core/201-method.t
+++ b/clownfish/compiler/perl/t/core/201-method.t
@@ -18,6 +18,8 @@ use warnings;
 
 use Clownfish::CFC::Test;
 
-my $test = Clownfish::CFC::Test->new;
-$test->run_batch('Clownfish::CFC::Model::Method');
+my $test   = Clownfish::CFC::Test->new;
+my $passed = $test->run_batch('Clownfish::CFC::Model::Method');
+
+exit($passed ? 0 : 1);
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/perl/t/core/300-variable.t
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/t/core/300-variable.t 
b/clownfish/compiler/perl/t/core/300-variable.t
index 9e0e1ed..c89f830 100644
--- a/clownfish/compiler/perl/t/core/300-variable.t
+++ b/clownfish/compiler/perl/t/core/300-variable.t
@@ -18,6 +18,8 @@ use warnings;
 
 use Clownfish::CFC::Test;
 
-my $test = Clownfish::CFC::Test->new;
-$test->run_batch('Clownfish::CFC::Model::Variable');
+my $test   = Clownfish::CFC::Test->new;
+my $passed = $test->run_batch('Clownfish::CFC::Model::Variable');
+
+exit($passed ? 0 : 1);
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/perl/t/core/301-param_list.t
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/t/core/301-param_list.t 
b/clownfish/compiler/perl/t/core/301-param_list.t
index 66abb5e..23cdeb6 100644
--- a/clownfish/compiler/perl/t/core/301-param_list.t
+++ b/clownfish/compiler/perl/t/core/301-param_list.t
@@ -18,6 +18,8 @@ use warnings;
 
 use Clownfish::CFC::Test;
 
-my $test = Clownfish::CFC::Test->new;
-$test->run_batch('Clownfish::CFC::Model::ParamList');
+my $test   = Clownfish::CFC::Test->new;
+my $passed = $test->run_batch('Clownfish::CFC::Model::ParamList');
+
+exit($passed ? 0 : 1);
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/perl/t/core/400-file_spec.t
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/t/core/400-file_spec.t 
b/clownfish/compiler/perl/t/core/400-file_spec.t
index 46e34c4..c3d25b4 100644
--- a/clownfish/compiler/perl/t/core/400-file_spec.t
+++ b/clownfish/compiler/perl/t/core/400-file_spec.t
@@ -18,6 +18,8 @@ use warnings;
 
 use Clownfish::CFC::Test;
 
-my $test = Clownfish::CFC::Test->new;
-$test->run_batch('Clownfish::CFC::Model::FileSpec');
+my $test   = Clownfish::CFC::Test->new;
+my $passed = $test->run_batch('Clownfish::CFC::Model::FileSpec');
+
+exit($passed ? 0 : 1);
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/perl/t/core/401-class.t
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/t/core/401-class.t 
b/clownfish/compiler/perl/t/core/401-class.t
index f78e107..6e3b1b2 100644
--- a/clownfish/compiler/perl/t/core/401-class.t
+++ b/clownfish/compiler/perl/t/core/401-class.t
@@ -18,6 +18,8 @@ use warnings;
 
 use Clownfish::CFC::Test;
 
-my $test = Clownfish::CFC::Test->new;
-$test->run_batch('Clownfish::CFC::Model::Class');
+my $test   = Clownfish::CFC::Test->new;
+my $passed = $test->run_batch('Clownfish::CFC::Model::Class');
+
+exit($passed ? 0 : 1);
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/src/CFCTest.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCTest.c b/clownfish/compiler/src/CFCTest.c
index 352cdd1..e4f6e4c 100644
--- a/clownfish/compiler/src/CFCTest.c
+++ b/clownfish/compiler/src/CFCTest.c
@@ -25,42 +25,34 @@
 #include "CFCParser.h"
 #include "CFCUtil.h"
 
-struct CFCTestFormatter {
-    void (*start_batch)(const char *name, int num_planned);
+typedef struct CFCTestFormatter {
+    void (*batch_prologue)(const CFCTestBatch *batch);
     void (*vtest_result)(int pass, int test_num, const char *fmt,
                          va_list args);
     void (*test_comment)(const char *fmt, ...);
     void (*batch_comment)(const char *fmt, ...);
-    void (*summary)(CFCTest *test);
-};
-typedef struct CFCTestFormatter CFCTestFormatter;
+    void (*summary)(const CFCTest *test);
+} CFCTestFormatter;
 
 struct CFCTest {
     CFCBase base;
-    CFCTestFormatter *formatter;
+    const CFCTestFormatter *formatter;
     int num_tests;
     int num_tests_failed;
     int num_batches;
     int num_batches_failed;
-    int batch_num_tests;
-    int batch_num_failed;
-    int batch_num_planned;
+    int num_tests_in_batch;
+    int num_failed_in_batch;
 };
 
-const static CFCMeta CFCTEST_META = {
-    "Clownfish::CFC::Test",
-    sizeof(CFCTest),
-    (CFCBase_destroy_t)CFCTest_destroy
-};
+static int
+S_do_run_batch(CFCTest *self, const CFCTestBatch *batch);
 
 static void
 S_vtest_true(CFCTest *self, int cond, const char *fmt, va_list args);
 
 static void
-S_finish_batch(CFCTest *self);
-
-static void
-S_format_cfish_start_batch(const char *name, int num_planned);
+S_format_cfish_batch_prologue(const CFCTestBatch *batch);
 
 static void
 S_format_cfish_vtest_result(int pass, int test_num, const char *fmt,
@@ -73,22 +65,14 @@ static void
 S_format_cfish_batch_comment(const char *fmt, ...);
 
 static void
-S_format_cfish_summary(CFCTest *test);
-
-static CFCTestFormatter S_formatter_cfish = {
-    S_format_cfish_start_batch,
-    S_format_cfish_vtest_result,
-    S_format_cfish_test_comment,
-    S_format_cfish_batch_comment,
-    S_format_cfish_summary
-};
+S_format_cfish_summary(const CFCTest *test);
 
 static void
-S_format_tap_start_batch(const char *name, int num_planned);
+S_format_tap_batch_prologue(const CFCTestBatch *batch);
 
 static void
 S_format_tap_vtest_result(int pass, int test_num, const char *fmt,
-                         va_list args);
+                          va_list args);
 
 static void
 S_format_tap_test_comment(const char *fmt, ...);
@@ -97,16 +81,45 @@ static void
 S_format_tap_batch_comment(const char *fmt, ...);
 
 static void
-S_format_tap_summary(CFCTest *test);
+S_format_tap_summary(const CFCTest *test);
+
+static const CFCMeta CFCTEST_META = {
+    "Clownfish::CFC::Test",
+    sizeof(CFCTest),
+    (CFCBase_destroy_t)CFCTest_destroy
+};
 
-static CFCTestFormatter S_formatter_tap = {
-    S_format_tap_start_batch,
+static const CFCTestFormatter S_formatter_cfish = {
+    S_format_cfish_batch_prologue,
+    S_format_cfish_vtest_result,
+    S_format_cfish_test_comment,
+    S_format_cfish_batch_comment,
+    S_format_cfish_summary
+};
+
+static const CFCTestFormatter S_formatter_tap = {
+    S_format_tap_batch_prologue,
     S_format_tap_vtest_result,
     S_format_tap_test_comment,
     S_format_tap_batch_comment,
     S_format_tap_summary
 };
 
+static const CFCTestBatch *const S_batches[] = {
+    &CFCTEST_BATCH_UTIL,
+    &CFCTEST_BATCH_DOCU_COMMENT,
+    &CFCTEST_BATCH_SYMBOL,
+    &CFCTEST_BATCH_VERSION,
+    &CFCTEST_BATCH_TYPE,
+    &CFCTEST_BATCH_FUNCTION,
+    &CFCTEST_BATCH_METHOD,
+    &CFCTEST_BATCH_VARIABLE,
+    &CFCTEST_BATCH_PARAM_LIST,
+    &CFCTEST_BATCH_FILE_SPEC,
+    &CFCTEST_BATCH_CLASS,
+    NULL
+};
+
 CFCTest*
 CFCTest_new(const char *formatter_name) {
     CFCTest *self = (CFCTest*)CFCBase_allocate(&CFCTEST_META);
@@ -125,13 +138,12 @@ CFCTest_init(CFCTest *self, const char *formatter_name) {
         CFCUtil_die("Unknown formatter name '%s'", formatter_name);
     }
 
-    self->num_tests          = 0;
-    self->num_tests_failed   = 0;
-    self->num_batches        = 0;
-    self->num_batches_failed = 0;
-    self->batch_num_planned  = 0;
-    self->batch_num_tests    = 0;
-    self->batch_num_failed   = 0;
+    self->num_tests           = 0;
+    self->num_tests_failed    = 0;
+    self->num_batches         = 0;
+    self->num_batches_failed  = 0;
+    self->num_tests_in_batch  = 0;
+    self->num_failed_in_batch = 0;
 
     return self;
 }
@@ -141,13 +153,59 @@ CFCTest_destroy(CFCTest *self) {
     CFCBase_destroy((CFCBase*)self);
 }
 
-void
-CFCTest_start_batch(CFCTest *self, const char *name, int num_planned) {
-    S_finish_batch(self);
+int
+CFCTest_run_all(CFCTest *self) {
+    int failed = 0;
 
-    self->formatter->start_batch(name, num_planned);
+    for (int i = 0; S_batches[i]; ++i) {
+        if (!S_do_run_batch(self, S_batches[i])) { failed = 1; }
+    }
 
-    self->batch_num_planned = num_planned;
+    return !failed;
+}
+
+int
+CFCTest_run_batch(CFCTest *self, const char *name) {
+    for (int i = 0; S_batches[i]; ++i) {
+        const CFCTestBatch *batch = S_batches[i];
+        if (strcmp(batch->name, name) == 0) {
+            return S_do_run_batch(self, batch);
+        }
+    }
+
+    CFCUtil_die("Test batch '%s' not found", name);
+    return 0;
+}
+
+static int
+S_do_run_batch(CFCTest *self, const CFCTestBatch *batch) {
+    self->formatter->batch_prologue(batch);
+
+    batch->run(self);
+
+    int failed = 0;
+    void (*comment)(const char *fmt, ...) = self->formatter->batch_comment;
+
+    if (self->num_failed_in_batch > 0) {
+        failed = 1;
+        comment("%d/%d tests failed.\n", self->num_failed_in_batch,
+                self->num_tests_in_batch);
+    }
+    if (self->num_tests_in_batch != batch->num_planned) {
+        failed = 1;
+        comment("Bad plan: You planned %d tests but ran %d.\n",
+                batch->num_planned, self->num_tests_in_batch);
+    }
+
+    if (failed) {
+        self->num_batches_failed += 1;
+    }
+
+    self->num_batches += 1;
+    self->num_tests_in_batch  = 0;
+    self->num_failed_in_batch = 0;
+
+    return !failed;
 }
 
 void
@@ -192,14 +250,12 @@ CFCTest_test_int_equals(CFCTest *self, long result, long 
expected,
 
 void
 CFCTest_skip(CFCTest *self, int num) {
-    self->num_tests       += num;
-    self->batch_num_tests += num;
+    self->num_tests          += num;
+    self->num_tests_in_batch += num;
 }
 
 int
 CFCTest_finish(CFCTest *self) {
-    S_finish_batch(self);
-
     self->formatter->summary(self);
 
     return self->num_batches != 0 && self->num_batches_failed == 0;
@@ -207,60 +263,20 @@ CFCTest_finish(CFCTest *self) {
 
 static void
 S_vtest_true(CFCTest *self, int cond, const char *fmt, va_list args) {
-    self->num_tests       += 1;
-    self->batch_num_tests += 1;
+    self->num_tests          += 1;
+    self->num_tests_in_batch += 1;
 
     if (!cond) {
-        self->num_tests_failed += 1;
-        self->batch_num_failed += 1;
+        self->num_tests_failed    += 1;
+        self->num_failed_in_batch += 1;
     }
 
-    self->formatter->vtest_result(cond, self->batch_num_tests, fmt, args);
+    self->formatter->vtest_result(cond, self->num_tests_in_batch, fmt, args);
 }
 
 static void
-S_finish_batch(CFCTest *self) {
-    int batch_failed = 0;
-    void (*batch_comment)(const char *fmt, ...)
-        = self->formatter->batch_comment;
-
-    if (self->batch_num_planned == 0) {
-        if (self->batch_num_tests != 0) {
-            batch_failed = 1;
-            batch_comment("Bad plan: You ran %d tests without plan.\n",
-                          self->batch_num_tests);
-        }
-        else {
-            // No tests run
-            return;
-        }
-    }
-    else {
-        if (self->batch_num_failed > 0) {
-            batch_failed = 1;
-            batch_comment("%d/%d tests failed.\n", self->batch_num_failed,
-                   self->batch_num_tests);
-        }
-        if (self->batch_num_tests != self->batch_num_planned) {
-            batch_failed = 1;
-            batch_comment("Bad plan: You planned %d tests but ran %d.\n",
-                          self->batch_num_planned, self->batch_num_tests);
-        }
-    }
-
-    if (batch_failed) {
-        self->num_batches_failed += 1;
-    }
-
-    self->num_batches += 1;
-    self->batch_num_planned = 0;
-    self->batch_num_tests  = 0;
-    self->batch_num_failed = 0;
-}
-
-static void
-S_format_cfish_start_batch(const char *name, int num_planned) {
-    printf("Testing %s...\n", name);
+S_format_cfish_batch_prologue(const CFCTestBatch *batch) {
+    printf("Testing %s...\n", batch->name);
 }
 
 static void
@@ -294,24 +310,26 @@ S_format_cfish_batch_comment(const char *fmt, ...) {
 }
 
 static void
-S_format_cfish_summary(CFCTest *test) {
+S_format_cfish_summary(const CFCTest *test) {
     if (test->num_batches == 0) {
         printf("No tests planned or run.\n");
     }
     else if (test->num_batches_failed == 0) {
+        printf("%d batches passed. %d tests passed.\n",
+               test->num_batches, test->num_tests);
         printf("Result: PASS\n");
     }
     else {
-        printf("Result: FAIL\n");
         printf("%d/%d batches failed. %d/%d tests failed.\n",
                test->num_batches_failed, test->num_batches,
                test->num_tests_failed, test->num_tests);
+        printf("Result: FAIL\n");
     }
 }
 
 static void
-S_format_tap_start_batch(const char *name, int num_planned) {
-    printf("1..%d\n", num_planned);
+S_format_tap_batch_prologue(const CFCTestBatch *batch) {
+    printf("1..%d\n", batch->num_planned);
 }
 
 static void
@@ -344,7 +362,7 @@ S_format_tap_batch_comment(const char *fmt, ...) {
 }
 
 static void
-S_format_tap_summary(CFCTest *test) {
+S_format_tap_summary(const CFCTest *test) {
 }
 
 struct CFCParcel*

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/src/CFCTest.h
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCTest.h b/clownfish/compiler/src/CFCTest.h
index ecada06..8b87b3c 100644
--- a/clownfish/compiler/src/CFCTest.h
+++ b/clownfish/compiler/src/CFCTest.h
@@ -24,6 +24,13 @@
 #endif
 
 typedef struct CFCTest CFCTest;
+
+typedef struct CFCTestBatch {
+    const char *name;
+    int num_planned;
+    void (*run)(CFCTest *test);
+} CFCTestBatch;
+
 struct CFCClass;
 struct CFCFunction;
 struct CFCMethod;
@@ -42,8 +49,11 @@ CFCTest_init(CFCTest *self, const char *formatter_name);
 void
 CFCTest_destroy(CFCTest *self);
 
-void
-CFCTest_start_batch(CFCTest *self, const char *name, int num_planned);
+int
+CFCTest_run_all(CFCTest *self);
+
+int
+CFCTest_run_batch(CFCTest *self, const char *name);
 
 void
 CFCTest_test_true(CFCTest *self, int cond, const char *fmt, ...);
@@ -86,38 +96,17 @@ CFCTest_parse_method(CFCTest *test, struct CFCParser 
*parser, const char *src);
 struct CFCClass*
 CFCTest_parse_class(CFCTest *test, struct CFCParser *parser, const char *src);
 
-void
-CFCTestClass_run(CFCTest *test);
-
-void
-CFCTestDocuComment_run(CFCTest *test);
-
-void
-CFCTestFileSpec_run(CFCTest *test);
-
-void
-CFCTestFunction_run(CFCTest *test);
-
-void
-CFCTestMethod_run(CFCTest *test);
-
-void
-CFCTestParamList_run(CFCTest *test);
-
-void
-CFCTestSymbol_run(CFCTest *test);
-
-void
-CFCTestType_run(CFCTest *test);
-
-void
-CFCTestUtil_run(CFCTest *test);
-
-void
-CFCTestVariable_run(CFCTest *test);
-
-void
-CFCTestVersion_run(CFCTest *test);
+extern const CFCTestBatch CFCTEST_BATCH_CLASS;
+extern const CFCTestBatch CFCTEST_BATCH_DOCU_COMMENT;
+extern const CFCTestBatch CFCTEST_BATCH_FILE_SPEC;
+extern const CFCTestBatch CFCTEST_BATCH_FUNCTION;
+extern const CFCTestBatch CFCTEST_BATCH_METHOD;
+extern const CFCTestBatch CFCTEST_BATCH_PARAM_LIST;
+extern const CFCTestBatch CFCTEST_BATCH_SYMBOL;
+extern const CFCTestBatch CFCTEST_BATCH_TYPE;
+extern const CFCTestBatch CFCTEST_BATCH_UTIL;
+extern const CFCTestBatch CFCTEST_BATCH_VARIABLE;
+extern const CFCTestBatch CFCTEST_BATCH_VERSION;
 
 #endif /* H_TEST_CFC */
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/src/CFCTestClass.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCTestClass.c 
b/clownfish/compiler/src/CFCTestClass.c
index 50b4024..f2c4fac 100644
--- a/clownfish/compiler/src/CFCTestClass.c
+++ b/clownfish/compiler/src/CFCTestClass.c
@@ -32,20 +32,19 @@
 #include "CFCVariable.h"
 
 static void
-S_run_basic_tests(CFCTest *test);
+S_run_tests(CFCTest *test);
 
 static int
 S_has_symbol(CFCSymbol **symbols, const char *micro_sym);
 
-void
-CFCTestClass_run(CFCTest *test) {
-    CFCTest_start_batch(test, "class", 83);
-
-    S_run_basic_tests(test);
-}
+const CFCTestBatch CFCTEST_BATCH_CLASS = {
+    "Clownfish::CFC::Model::Class",
+    83,
+    S_run_tests
+};
 
 static void
-S_run_basic_tests(CFCTest *test) {
+S_run_tests(CFCTest *test) {
     CFCParser *parser = CFCParser_new();
 
     CFCParcel *neato = CFCParcel_new("Neato", NULL, NULL);

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/src/CFCTestDocuComment.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCTestDocuComment.c 
b/clownfish/compiler/src/CFCTestDocuComment.c
index c17f27d..a5121cd 100644
--- a/clownfish/compiler/src/CFCTestDocuComment.c
+++ b/clownfish/compiler/src/CFCTestDocuComment.c
@@ -24,11 +24,11 @@
 static void
 S_run_tests(CFCTest *test);
 
-void
-CFCTestDocuComment_run(CFCTest *test) {
-    CFCTest_start_batch(test, "docucomment", 15);
-    S_run_tests(test);
-}
+const CFCTestBatch CFCTEST_BATCH_DOCU_COMMENT = {
+    "Clownfish::CFC::Model::DocuComment",
+    15,
+    S_run_tests
+};
 
 static void
 S_run_tests(CFCTest *test) {

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/src/CFCTestFileSpec.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCTestFileSpec.c 
b/clownfish/compiler/src/CFCTestFileSpec.c
index 2cddfa8..7fdb2d8 100644
--- a/clownfish/compiler/src/CFCTestFileSpec.c
+++ b/clownfish/compiler/src/CFCTestFileSpec.c
@@ -20,17 +20,16 @@
 #include "CFCTest.h"
 
 static void
-S_run_basic_tests(CFCTest *test);
+S_run_tests(CFCTest *test);
 
-void
-CFCTestFileSpec_run(CFCTest *test) {
-    CFCTest_start_batch(test, "file_spec", 4);
-
-    S_run_basic_tests(test);
-}
+const CFCTestBatch CFCTEST_BATCH_FILE_SPEC = {
+    "Clownfish::CFC::Model::FileSpec",
+    4,
+    S_run_tests
+};
 
 static void
-S_run_basic_tests(CFCTest *test) {
+S_run_tests(CFCTest *test) {
     {
         CFCFileSpec *file_spec
             = CFCFileSpec_new("Clownfish/_include", "Stuff/Thing", 0);

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/src/CFCTestFunction.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCTestFunction.c 
b/clownfish/compiler/src/CFCTestFunction.c
index 8907254..4cd6967 100644
--- a/clownfish/compiler/src/CFCTestFunction.c
+++ b/clownfish/compiler/src/CFCTestFunction.c
@@ -26,11 +26,11 @@
 static void
 S_run_tests(CFCTest *test);
 
-void
-CFCTestFunction_run(CFCTest *test) {
-    CFCTest_start_batch(test, "function", 11);
-    S_run_tests(test);
-}
+const CFCTestBatch CFCTEST_BATCH_FUNCTION = {
+    "Clownfish::CFC::Model::Function",
+    11,
+    S_run_tests
+};
 
 static void
 S_run_tests(CFCTest *test) {

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/src/CFCTestMethod.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCTestMethod.c 
b/clownfish/compiler/src/CFCTestMethod.c
index 0144300..157f7e4 100644
--- a/clownfish/compiler/src/CFCTestMethod.c
+++ b/clownfish/compiler/src/CFCTestMethod.c
@@ -25,6 +25,9 @@
 #include "CFCType.h"
 
 static void
+S_run_tests(CFCTest *test);
+
+static void
 S_run_basic_tests(CFCTest *test);
 
 static void
@@ -36,10 +39,14 @@ S_run_overridden_tests(CFCTest *test);
 static void
 S_run_final_tests(CFCTest *test);
 
-void
-CFCTestMethod_run(CFCTest *test) {
-    CFCTest_start_batch(test, "method", 62);
+const CFCTestBatch CFCTEST_BATCH_METHOD = {
+    "Clownfish::CFC::Model::Method",
+    62,
+    S_run_tests
+};
 
+static void
+S_run_tests(CFCTest *test) {
     S_run_basic_tests(test);
     S_run_parser_tests(test);
     S_run_overridden_tests(test);

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/src/CFCTestParamList.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCTestParamList.c 
b/clownfish/compiler/src/CFCTestParamList.c
index 16f0a1e..dd43d5b 100644
--- a/clownfish/compiler/src/CFCTestParamList.c
+++ b/clownfish/compiler/src/CFCTestParamList.c
@@ -23,17 +23,16 @@
 #include "CFCVariable.h"
 
 static void
-S_run_basic_tests(CFCTest *test);
+S_run_tests(CFCTest *test);
 
-void
-CFCTestParamList_run(CFCTest *test) {
-    CFCTest_start_batch(test, "param_list", 16);
-
-    S_run_basic_tests(test);
-}
+const CFCTestBatch CFCTEST_BATCH_PARAM_LIST = {
+    "Clownfish::CFC::Model::ParamList",
+    16,
+    S_run_tests
+};
 
 static void
-S_run_basic_tests(CFCTest *test) {
+S_run_tests(CFCTest *test) {
     CFCParser *parser = CFCParser_new();
     CFCParcel *neato_parcel
         = CFCTest_parse_parcel(test, parser, "parcel Neato;");

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/src/CFCTestSymbol.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCTestSymbol.c 
b/clownfish/compiler/src/CFCTestSymbol.c
index 3321f6c..7dfe8d9 100644
--- a/clownfish/compiler/src/CFCTestSymbol.c
+++ b/clownfish/compiler/src/CFCTestSymbol.c
@@ -23,11 +23,11 @@
 static void
 S_run_tests(CFCTest *test);
 
-void
-CFCTestSymbol_run(CFCTest *test) {
-    CFCTest_start_batch(test, "symbol", 28);
-    S_run_tests(test);
-}
+const CFCTestBatch CFCTEST_BATCH_SYMBOL = {
+    "Clownfish::CFC::Model::Symbol",
+    28,
+    S_run_tests
+};
 
 static void
 S_run_tests(CFCTest *test) {

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/src/CFCTestType.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCTestType.c 
b/clownfish/compiler/src/CFCTestType.c
index 0d971d4..11e5102 100644
--- a/clownfish/compiler/src/CFCTestType.c
+++ b/clownfish/compiler/src/CFCTestType.c
@@ -23,6 +23,9 @@
 #include "CFCUtil.h"
 
 static void
+S_run_tests(CFCTest *test);
+
+static void
 S_run_basic_tests(CFCTest *test);
 
 static void
@@ -49,10 +52,14 @@ S_run_arbitrary_tests(CFCTest *test);
 static void
 S_run_composite_tests(CFCTest *test);
 
-void
-CFCTestType_run(CFCTest *test) {
-    CFCTest_start_batch(test, "type", 349);
+const CFCTestBatch CFCTEST_BATCH_TYPE = {
+    "Clownfish::CFC::Model::Type",
+    349,
+    S_run_tests
+};
 
+static void
+S_run_tests(CFCTest *test) {
     S_run_basic_tests(test);
     S_run_primitive_tests(test);
     S_run_integer_tests(test);

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/src/CFCTestUtil.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCTestUtil.c 
b/clownfish/compiler/src/CFCTestUtil.c
index 4918255..27fbeec 100644
--- a/clownfish/compiler/src/CFCTestUtil.c
+++ b/clownfish/compiler/src/CFCTestUtil.c
@@ -26,6 +26,9 @@
 #include "CFCTest.h"
 
 static void
+S_run_tests(CFCTest *test);
+
+static void
 S_run_string_tests(CFCTest *test);
 
 static void
@@ -37,9 +40,14 @@ S_get_file_mtime(const char *path);
 static void
 S_set_file_times(const char *path, time_t time);
 
-void
-CFCTestUtil_run(CFCTest *test) {
-    CFCTest_start_batch(test, "util", 15);
+const CFCTestBatch CFCTEST_BATCH_UTIL = {
+    "Clownfish::CFC::Util",
+    15,
+    S_run_tests
+};
+
+static void
+S_run_tests(CFCTest *test) {
     S_run_string_tests(test);
     S_run_file_tests(test);
 }

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/src/CFCTestVariable.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCTestVariable.c 
b/clownfish/compiler/src/CFCTestVariable.c
index f6673e0..d7093cf 100644
--- a/clownfish/compiler/src/CFCTestVariable.c
+++ b/clownfish/compiler/src/CFCTestVariable.c
@@ -24,17 +24,16 @@
 #include "CFCVariable.h"
 
 static void
-S_run_basic_tests(CFCTest *test);
+S_run_tests(CFCTest *test);
 
-void
-CFCTestVariable_run(CFCTest *test) {
-    CFCTest_start_batch(test, "variable", 27);
-
-    S_run_basic_tests(test);
-}
+const CFCTestBatch CFCTEST_BATCH_VARIABLE = {
+    "Clownfish::CFC::Model::Variable",
+    27,
+    S_run_tests
+};
 
 static void
-S_run_basic_tests(CFCTest *test) {
+S_run_tests(CFCTest *test) {
     CFCParser *parser = CFCParser_new();
     CFCParcel *neato_parcel
         = CFCTest_parse_parcel(test, parser, "parcel Neato;");

http://git-wip-us.apache.org/repos/asf/lucy/blob/7c4d3f5e/clownfish/compiler/src/CFCTestVersion.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCTestVersion.c 
b/clownfish/compiler/src/CFCTestVersion.c
index fcd89cb..693e01b 100644
--- a/clownfish/compiler/src/CFCTestVersion.c
+++ b/clownfish/compiler/src/CFCTestVersion.c
@@ -22,11 +22,11 @@
 static void
 S_run_tests(CFCTest *test);
 
-void
-CFCTestVersion_run(CFCTest *test) {
-    CFCTest_start_batch(test, "version", 11);
-    S_run_tests(test);
-}
+const CFCTestBatch CFCTEST_BATCH_VERSION = {
+    "Clownfish::CFC::Model::Version",
+    11,
+    S_run_tests
+};
 
 static void
 S_run_tests(CFCTest *test) {

Reply via email to