You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2014/04/27 01:11:34 UTC

[lucy-commits] [04/54] [abbrv] Remove bundled Clownfish.

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/Test/Util/TestNumberUtils.c
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/Test/Util/TestNumberUtils.c b/clownfish/runtime/core/Clownfish/Test/Util/TestNumberUtils.c
deleted file mode 100644
index 5840c34..0000000
--- a/clownfish/runtime/core/Clownfish/Test/Util/TestNumberUtils.c
+++ /dev/null
@@ -1,377 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdlib.h>
-#include <time.h>
-
-#define CFISH_USE_SHORT_NAMES
-#define TESTCFISH_USE_SHORT_NAMES
-
-#include "charmony.h"
-
-#include "Clownfish/Test/Util/TestNumberUtils.h"
-
-#include "Clownfish/Err.h"
-#include "Clownfish/Test.h"
-#include "Clownfish/TestHarness/TestBatchRunner.h"
-#include "Clownfish/TestHarness/TestUtils.h"
-#include "Clownfish/Util/Memory.h"
-#include "Clownfish/Util/NumberUtils.h"
-#include "Clownfish/VTable.h"
-
-TestNumberUtils*
-TestNumUtil_new() {
-    return (TestNumberUtils*)VTable_Make_Obj(TESTNUMBERUTILS);
-}
-
-static void
-test_u1(TestBatchRunner *runner) {
-    size_t    count   = 64;
-    uint64_t *ints    = TestUtils_random_u64s(NULL, count, 0, 2);
-    size_t    amount  = count / 8;
-    uint8_t  *bits    = (uint8_t*)CALLOCATE(amount, sizeof(uint8_t));
-
-    for (size_t i = 0; i < count; i++) {
-        if (ints[i]) { NumUtil_u1set(bits, i); }
-    }
-    for (size_t i = 0; i < count; i++) {
-        TEST_INT_EQ(runner, NumUtil_u1get(bits, i), (long)ints[i],
-                    "u1 set/get");
-    }
-
-    for (size_t i = 0; i < count; i++) {
-        NumUtil_u1flip(bits, i);
-    }
-    for (size_t i = 0; i < count; i++) {
-        TEST_INT_EQ(runner, NumUtil_u1get(bits, i), !ints[i], "u1 flip");
-    }
-
-    FREEMEM(bits);
-    FREEMEM(ints);
-}
-
-static void
-test_u2(TestBatchRunner *runner) {
-    size_t    count = 32;
-    uint64_t *ints = TestUtils_random_u64s(NULL, count, 0, 4);
-    uint8_t  *bits = (uint8_t*)CALLOCATE((count / 4), sizeof(uint8_t));
-
-    for (size_t i = 0; i < count; i++) {
-        NumUtil_u2set(bits, i, (uint8_t)ints[i]);
-    }
-    for (size_t i = 0; i < count; i++) {
-        TEST_INT_EQ(runner, NumUtil_u2get(bits, i), (long)ints[i], "u2");
-    }
-
-    FREEMEM(bits);
-    FREEMEM(ints);
-}
-
-static void
-test_u4(TestBatchRunner *runner) {
-    size_t    count = 128;
-    uint64_t *ints  = TestUtils_random_u64s(NULL, count, 0, 16);
-    uint8_t  *bits  = (uint8_t*)CALLOCATE((count / 2), sizeof(uint8_t));
-
-    for (size_t i = 0; i < count; i++) {
-        NumUtil_u4set(bits, i, (uint8_t)ints[i]);
-    }
-    for (size_t i = 0; i < count; i++) {
-        TEST_INT_EQ(runner, NumUtil_u4get(bits, i), (long)ints[i], "u4");
-    }
-
-    FREEMEM(bits);
-    FREEMEM(ints);
-}
-
-static void
-test_c32(TestBatchRunner *runner) {
-    uint64_t  mins[]   = { 0,   0x4000 - 100, (uint32_t)INT32_MAX - 100, UINT32_MAX - 10 };
-    uint64_t  limits[] = { 500, 0x4000 + 100, (uint32_t)INT32_MAX + 100, UINT32_MAX      };
-    uint32_t  set_num;
-    uint32_t  num_sets  = sizeof(mins) / sizeof(uint64_t);
-    size_t    count     = 64;
-    uint64_t *ints      = NULL;
-    size_t    amount    = count * C32_MAX_BYTES;
-    char     *encoded   = (char*)CALLOCATE(amount, sizeof(char));
-    char     *target    = encoded;
-    char     *limit     = target + amount;
-
-    for (set_num = 0; set_num < num_sets; set_num++) {
-        char *skip;
-        ints = TestUtils_random_u64s(ints, count,
-                                     mins[set_num], limits[set_num]);
-        target = encoded;
-        for (size_t i = 0; i < count; i++) {
-            NumUtil_encode_c32((uint32_t)ints[i], &target);
-        }
-        target = encoded;
-        skip   = encoded;
-        for (size_t i = 0; i < count; i++) {
-            TEST_INT_EQ(runner, NumUtil_decode_c32(&target), (long)ints[i],
-                        "c32 %lu", (long)ints[i]);
-            NumUtil_skip_cint(&skip);
-            if (target > limit) { THROW(ERR, "overrun"); }
-        }
-        TEST_TRUE(runner, skip == target, "skip %lu == %lu",
-                  (unsigned long)skip, (unsigned long)target);
-
-        target = encoded;
-        for (size_t i = 0; i < count; i++) {
-            NumUtil_encode_padded_c32((uint32_t)ints[i], &target);
-        }
-        TEST_TRUE(runner, target == limit,
-                  "padded c32 uses 5 bytes (%lu == %lu)", (unsigned long)target,
-                  (unsigned long)limit);
-        target = encoded;
-        skip   = encoded;
-        for (size_t i = 0; i < count; i++) {
-            TEST_INT_EQ(runner, NumUtil_decode_c32(&target), (long)ints[i],
-                        "padded c32 %lu", (long)ints[i]);
-            NumUtil_skip_cint(&skip);
-            if (target > limit) { THROW(ERR, "overrun"); }
-        }
-        TEST_TRUE(runner, skip == target, "skip padded %lu == %lu",
-                  (unsigned long)skip, (unsigned long)target);
-    }
-
-    target = encoded;
-    NumUtil_encode_c32(UINT32_MAX, &target);
-    target = encoded;
-    TEST_INT_EQ(runner, NumUtil_decode_c32(&target), UINT32_MAX, "c32 UINT32_MAX");
-
-    FREEMEM(encoded);
-    FREEMEM(ints);
-}
-
-static void
-test_c64(TestBatchRunner *runner) {
-    uint64_t  mins[]    = { 0,   0x4000 - 100, (uint64_t)UINT32_MAX - 100,  UINT64_MAX - 10 };
-    uint64_t  limits[]  = { 500, 0x4000 + 100, (uint64_t)UINT32_MAX + 1000, UINT64_MAX      };
-    uint32_t  set_num;
-    uint32_t  num_sets  = sizeof(mins) / sizeof(uint64_t);
-    size_t    count     = 64;
-    uint64_t *ints      = NULL;
-    size_t    amount    = count * C64_MAX_BYTES;
-    char     *encoded   = (char*)CALLOCATE(amount, sizeof(char));
-    char     *target    = encoded;
-    char     *limit     = target + amount;
-
-    for (set_num = 0; set_num < num_sets; set_num++) {
-        char *skip;
-        ints = TestUtils_random_u64s(ints, count,
-                                     mins[set_num], limits[set_num]);
-        target = encoded;
-        for (size_t i = 0; i < count; i++) {
-            NumUtil_encode_c64(ints[i], &target);
-        }
-        target = encoded;
-        skip   = encoded;
-        for (size_t i = 0; i < count; i++) {
-            uint64_t got = NumUtil_decode_c64(&target);
-            TEST_TRUE(runner, got == ints[i],
-                      "c64 %" PRIu64 " == %" PRIu64, got, ints[i]);
-            if (target > limit) { THROW(ERR, "overrun"); }
-            NumUtil_skip_cint(&skip);
-        }
-        TEST_TRUE(runner, skip == target, "skip %lu == %lu",
-                  (unsigned long)skip, (unsigned long)target);
-    }
-
-    target = encoded;
-    NumUtil_encode_c64(UINT64_MAX, &target);
-    target = encoded;
-
-    uint64_t got = NumUtil_decode_c64(&target);
-    TEST_TRUE(runner, got == UINT64_MAX, "c64 UINT64_MAX");
-
-    FREEMEM(encoded);
-    FREEMEM(ints);
-}
-
-static void
-test_bigend_u16(TestBatchRunner *runner) {
-    size_t    count     = 32;
-    uint64_t *ints      = TestUtils_random_u64s(NULL, count, 0, UINT16_MAX + 1);
-    size_t    amount    = (count + 1) * sizeof(uint16_t);
-    char     *allocated = (char*)CALLOCATE(amount, sizeof(char));
-    char     *encoded   = allocated + 1; // Intentionally misaligned.
-    char     *target    = encoded;
-
-    for (size_t i = 0; i < count; i++) {
-        NumUtil_encode_bigend_u16((uint16_t)ints[i], &target);
-        target += sizeof(uint16_t);
-    }
-    target = encoded;
-    for (size_t i = 0; i < count; i++) {
-        uint16_t got = NumUtil_decode_bigend_u16(target);
-        TEST_INT_EQ(runner, got, (long)ints[i], "bigend u16");
-        target += sizeof(uint16_t);
-    }
-
-    target = encoded;
-    NumUtil_encode_bigend_u16(1, &target);
-    TEST_INT_EQ(runner, encoded[0], 0, "Truly big-endian u16");
-    TEST_INT_EQ(runner, encoded[1], 1, "Truly big-endian u16");
-
-    FREEMEM(allocated);
-    FREEMEM(ints);
-}
-
-static void
-test_bigend_u32(TestBatchRunner *runner) {
-    size_t    count     = 32;
-    uint64_t *ints      = TestUtils_random_u64s(NULL, count, 0, UINT64_C(1) + UINT32_MAX);
-    size_t    amount    = (count + 1) * sizeof(uint32_t);
-    char     *allocated = (char*)CALLOCATE(amount, sizeof(char));
-    char     *encoded   = allocated + 1; // Intentionally misaligned.
-    char     *target    = encoded;
-
-    for (size_t i = 0; i < count; i++) {
-        NumUtil_encode_bigend_u32((uint32_t)ints[i], &target);
-        target += sizeof(uint32_t);
-    }
-    target = encoded;
-    for (size_t i = 0; i < count; i++) {
-        uint32_t got = NumUtil_decode_bigend_u32(target);
-        TEST_INT_EQ(runner, got, (long)ints[i], "bigend u32");
-        target += sizeof(uint32_t);
-    }
-
-    target = encoded;
-    NumUtil_encode_bigend_u32(1, &target);
-    TEST_INT_EQ(runner, encoded[0], 0, "Truly big-endian u32");
-    TEST_INT_EQ(runner, encoded[3], 1, "Truly big-endian u32");
-
-    FREEMEM(allocated);
-    FREEMEM(ints);
-}
-
-static void
-test_bigend_u64(TestBatchRunner *runner) {
-    size_t    count     = 32;
-    uint64_t *ints      = TestUtils_random_u64s(NULL, count, 0, UINT64_MAX);
-    size_t    amount    = (count + 1) * sizeof(uint64_t);
-    char     *allocated = (char*)CALLOCATE(amount, sizeof(char));
-    char     *encoded   = allocated + 1; // Intentionally misaligned.
-    char     *target    = encoded;
-
-    for (size_t i = 0; i < count; i++) {
-        NumUtil_encode_bigend_u64(ints[i], &target);
-        target += sizeof(uint64_t);
-    }
-    target = encoded;
-    for (size_t i = 0; i < count; i++) {
-        uint64_t got = NumUtil_decode_bigend_u64(target);
-        TEST_TRUE(runner, got == ints[i], "bigend u64");
-        target += sizeof(uint64_t);
-    }
-
-    target = encoded;
-    NumUtil_encode_bigend_u64(1, &target);
-    TEST_INT_EQ(runner, encoded[0], 0, "Truly big-endian");
-    TEST_INT_EQ(runner, encoded[7], 1, "Truly big-endian");
-
-    FREEMEM(allocated);
-    FREEMEM(ints);
-}
-
-static void
-test_bigend_f32(TestBatchRunner *runner) {
-    float    source[]  = { -1.3f, 0.0f, 100.2f };
-    size_t   count     = 3;
-    size_t   amount    = (count + 1) * sizeof(float);
-    uint8_t *allocated = (uint8_t*)CALLOCATE(amount, sizeof(uint8_t));
-    uint8_t *encoded   = allocated + 1; // Intentionally misaligned.
-    uint8_t *target    = encoded;
-
-    for (size_t i = 0; i < count; i++) {
-        NumUtil_encode_bigend_f32(source[i], &target);
-        target += sizeof(float);
-    }
-    target = encoded;
-    for (size_t i = 0; i < count; i++) {
-        float got = NumUtil_decode_bigend_f32(target);
-        TEST_TRUE(runner, got == source[i], "bigend f32");
-        target += sizeof(float);
-    }
-
-    target = encoded;
-    NumUtil_encode_bigend_f32(-2.0f, &target);
-    TEST_INT_EQ(runner, (encoded[0] & 0x80), 0x80,
-                "Truly big-endian (IEEE 754 sign bit set for negative number)");
-    TEST_INT_EQ(runner, encoded[0], 0xC0,
-                "IEEE 754 representation of -2.0f, byte 0");
-    for (size_t i = 1; i < sizeof(float); i++) {
-        TEST_INT_EQ(runner, encoded[i], 0,
-                    "IEEE 754 representation of -2.0f, byte %d", (int)i);
-    }
-
-    FREEMEM(allocated);
-}
-
-static void
-test_bigend_f64(TestBatchRunner *runner) {
-    double   source[]  = { -1.3, 0.0, 100.2 };
-    size_t   count     = 3;
-    size_t   amount    = (count + 1) * sizeof(double);
-    uint8_t *allocated = (uint8_t*)CALLOCATE(amount, sizeof(uint8_t));
-    uint8_t *encoded   = allocated + 1; // Intentionally misaligned.
-    uint8_t *target    = encoded;
-
-    for (size_t i = 0; i < count; i++) {
-        NumUtil_encode_bigend_f64(source[i], &target);
-        target += sizeof(double);
-    }
-    target = encoded;
-    for (size_t i = 0; i < count; i++) {
-        double got = NumUtil_decode_bigend_f64(target);
-        TEST_TRUE(runner, got == source[i], "bigend f64");
-        target += sizeof(double);
-    }
-
-    target = encoded;
-    NumUtil_encode_bigend_f64(-2.0, &target);
-    TEST_INT_EQ(runner, (encoded[0] & 0x80), 0x80,
-                "Truly big-endian (IEEE 754 sign bit set for negative number)");
-    TEST_INT_EQ(runner, encoded[0], 0xC0,
-                "IEEE 754 representation of -2.0, byte 0");
-    for (size_t i = 1; i < sizeof(double); i++) {
-        TEST_INT_EQ(runner, encoded[i], 0,
-                    "IEEE 754 representation of -2.0, byte %d", (int)i);
-    }
-
-    FREEMEM(allocated);
-}
-
-void
-TestNumUtil_Run_IMP(TestNumberUtils *self, TestBatchRunner *runner) {
-    TestBatchRunner_Plan(runner, (TestBatch*)self, 1196);
-    srand((unsigned int)time((time_t*)NULL));
-    test_u1(runner);
-    test_u2(runner);
-    test_u4(runner);
-    test_c32(runner);
-    test_c64(runner);
-    test_bigend_u16(runner);
-    test_bigend_u32(runner);
-    test_bigend_u64(runner);
-    test_bigend_f32(runner);
-    test_bigend_f64(runner);
-}
-
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/Test/Util/TestNumberUtils.cfh
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/Test/Util/TestNumberUtils.cfh b/clownfish/runtime/core/Clownfish/Test/Util/TestNumberUtils.cfh
deleted file mode 100644
index cd9e165..0000000
--- a/clownfish/runtime/core/Clownfish/Test/Util/TestNumberUtils.cfh
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel TestClownfish;
-
-class Clownfish::Test::Util::TestNumberUtils cnick TestNumUtil
-    inherits Clownfish::TestHarness::TestBatch {
-
-    inert incremented TestNumberUtils*
-    new();
-
-    void
-    Run(TestNumberUtils *self, TestBatchRunner *runner);
-}
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/Test/Util/TestStringHelper.c
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/Test/Util/TestStringHelper.c b/clownfish/runtime/core/Clownfish/Test/Util/TestStringHelper.c
deleted file mode 100644
index 339de02..0000000
--- a/clownfish/runtime/core/Clownfish/Test/Util/TestStringHelper.c
+++ /dev/null
@@ -1,300 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <string.h>
-
-#define CFISH_USE_SHORT_NAMES
-#define TESTCFISH_USE_SHORT_NAMES
-
-#include "Clownfish/Test/Util/TestStringHelper.h"
-
-#include "Clownfish/String.h"
-#include "Clownfish/Err.h"
-#include "Clownfish/Test.h"
-#include "Clownfish/TestHarness/TestBatchRunner.h"
-#include "Clownfish/Util/StringHelper.h"
-#include "Clownfish/VTable.h"
-
-/* This alternative implementation of utf8_valid() is (presumably) slower, but
- * it implements the standard in a more linear, easy-to-grok way.
- */
-#define TRAIL_OK(n) (n >= 0x80 && n <= 0xBF)
-TestStringHelper*
-TestStrHelp_new() {
-    return (TestStringHelper*)VTable_Make_Obj(TESTSTRINGHELPER);
-}
-
-static bool
-S_utf8_valid_alt(const char *maybe_utf8, size_t size) {
-    const uint8_t *string = (const uint8_t*)maybe_utf8;
-    const uint8_t *const end = string + size;
-    while (string < end) {
-        int count = StrHelp_UTF8_COUNT[*string];
-        bool valid = false;
-        if (count == 1) {
-            if (string[0] <= 0x7F) {
-                valid = true;
-            }
-        }
-        else if (count == 2) {
-            if (string[0] >= 0xC2 && string[0] <= 0xDF) {
-                if (TRAIL_OK(string[1])) {
-                    valid = true;
-                }
-            }
-        }
-        else if (count == 3) {
-            if (string[0] == 0xE0) {
-                if (string[1] >= 0xA0 && string[1] <= 0xBF
-                    && TRAIL_OK(string[2])
-                   ) {
-                    valid = true;
-                }
-            }
-            else if (string[0] >= 0xE1 && string[0] <= 0xEC) {
-                if (TRAIL_OK(string[1])
-                    && TRAIL_OK(string[2])
-                   ) {
-                    valid = true;
-                }
-            }
-            else if (string[0] == 0xED) {
-                if (string[1] >= 0x80 && string[1] <= 0x9F
-                    && TRAIL_OK(string[2])
-                   ) {
-                    valid = true;
-                }
-            }
-            else if (string[0] >= 0xEE && string[0] <= 0xEF) {
-                if (TRAIL_OK(string[1])
-                    && TRAIL_OK(string[2])
-                   ) {
-                    valid = true;
-                }
-            }
-        }
-        else if (count == 4) {
-            if (string[0] == 0xF0) {
-                if (string[1] >= 0x90 && string[1] <= 0xBF
-                    && TRAIL_OK(string[2])
-                    && TRAIL_OK(string[3])
-                   ) {
-                    valid = true;
-                }
-            }
-            else if (string[0] >= 0xF1 && string[0] <= 0xF3) {
-                if (TRAIL_OK(string[1])
-                    && TRAIL_OK(string[2])
-                    && TRAIL_OK(string[3])
-                   ) {
-                    valid = true;
-                }
-            }
-            else if (string[0] == 0xF4) {
-                if (string[1] >= 0x80 && string[1] <= 0x8F
-                    && TRAIL_OK(string[2])
-                    && TRAIL_OK(string[3])
-                   ) {
-                    valid = true;
-                }
-            }
-        }
-
-        if (!valid) {
-            return false;
-        }
-        string += count;
-    }
-
-    if (string != end) {
-        return false;
-    }
-
-    return true;
-}
-
-static void
-test_overlap(TestBatchRunner *runner) {
-    int32_t result;
-    result = StrHelp_overlap("", "", 0, 0);
-    TEST_INT_EQ(runner, result, 0, "two empty strings");
-    result = StrHelp_overlap("", "foo", 0, 3);
-    TEST_INT_EQ(runner, result, 0, "first string is empty");
-    result = StrHelp_overlap("foo", "", 3, 0);
-    TEST_INT_EQ(runner, result, 0, "second string is empty");
-    result = StrHelp_overlap("foo", "foo", 3, 3);
-    TEST_INT_EQ(runner, result, 3, "equal strings");
-    result = StrHelp_overlap("foo bar", "foo", 7, 3);
-    TEST_INT_EQ(runner, result, 3, "first string is longer");
-    result = StrHelp_overlap("foo", "foo bar", 3, 7);
-    TEST_INT_EQ(runner, result, 3, "second string is longer");
-}
-
-
-static void
-test_to_base36(TestBatchRunner *runner) {
-    char buffer[StrHelp_MAX_BASE36_BYTES];
-    StrHelp_to_base36(UINT64_MAX, buffer);
-    TEST_STR_EQ(runner, "3w5e11264sgsf", buffer, "base36 UINT64_MAX");
-    StrHelp_to_base36(1, buffer);
-    TEST_STR_EQ(runner, "1", buffer, "base36 1");
-    TEST_INT_EQ(runner, buffer[1], 0, "base36 NULL termination");
-}
-
-static void
-test_utf8_round_trip(TestBatchRunner *runner) {
-    int32_t code_point;
-    for (code_point = 0; code_point <= 0x10FFFF; code_point++) {
-        char buffer[4];
-        uint32_t size = StrHelp_encode_utf8_char(code_point, buffer);
-        char *start = buffer;
-        char *end   = start + size;
-
-        // Verify length returned by encode_utf8_char().
-        if (size != StrHelp_UTF8_COUNT[(unsigned char)buffer[0]]) {
-            break;
-        }
-        // Verify that utf8_valid() agrees with alternate implementation.
-        if (!!StrHelp_utf8_valid(start, size)
-            != !!S_utf8_valid_alt(start, size)
-           ) {
-            break;
-        }
-
-        // Verify back_utf8_char().
-        if (StrHelp_back_utf8_char(end, start) != start) {
-            break;
-        }
-
-        // Verify round trip of encode/decode.
-        if (StrHelp_decode_utf8_char(buffer) != code_point) {
-            break;
-        }
-    }
-    if (code_point == 0x110000) {
-        PASS(runner, "Successfully round tripped 0 - 0x10FFFF");
-    }
-    else {
-        FAIL(runner, "Failed round trip at 0x%.1X", (unsigned)code_point);
-    }
-}
-
-static void
-S_test_validity(TestBatchRunner *runner, const char *content, size_t size,
-                bool expected, const char *description) {
-    bool sane = StrHelp_utf8_valid(content, size);
-    bool double_check = S_utf8_valid_alt(content, size);
-    if (sane != double_check) {
-        FAIL(runner, "Disagreement: %s", description);
-    }
-    else {
-        TEST_TRUE(runner, sane == expected, "%s", description);
-    }
-}
-
-static void
-test_utf8_valid(TestBatchRunner *runner) {
-    // Musical symbol G clef:
-    // Code point: U+1D11E
-    // UTF-16:     0xD834 0xDD1E
-    // UTF-8       0xF0 0x9D 0x84 0x9E
-    S_test_validity(runner, "\xF0\x9D\x84\x9E", 4, true,
-                    "Musical symbol G clef");
-    S_test_validity(runner, "\xED\xA0\xB4\xED\xB4\x9E", 6, false,
-                    "G clef as UTF-8 encoded UTF-16 surrogates");
-    S_test_validity(runner, ".\xED\xA0\xB4.", 5, false,
-                    "Isolated high surrogate");
-    S_test_validity(runner, ".\xED\xB4\x9E.", 5, false,
-                    "Isolated low surrogate");
-
-    // Shortest form.
-    S_test_validity(runner, ".\xC1\x9C.", 4, false,
-                    "Non-shortest form ASCII backslash");
-    S_test_validity(runner, ".\xC0\xAF.", 4, false,
-                    "Non-shortest form ASCII slash");
-    S_test_validity(runner, ".\xC0\x80.", 4, false,
-                    "Non-shortest form ASCII NUL character");
-
-    // Range.
-    S_test_validity(runner, "\xF8\x88\x80\x80\x80", 5, false, "5-byte UTF-8");
-
-    // Bad continuations.
-    S_test_validity(runner, "\xE2\x98\xBA\xE2\x98\xBA", 6, true,
-                    "SmileySmiley");
-    S_test_validity(runner, "\xE2\xBA\xE2\x98\xBA", 5, false,
-                    "missing first continuation byte");
-    S_test_validity(runner, "\xE2\x98\xE2\x98\xBA", 5, false,
-                    "missing second continuation byte");
-    S_test_validity(runner, "\xE2\xE2\x98\xBA", 4, false,
-                    "missing both continuation bytes");
-    S_test_validity(runner, "\xBA\xE2\x98\xBA\xE2\xBA", 5, false,
-                    "missing first continuation byte (end)");
-    S_test_validity(runner, "\xE2\x98\xBA\xE2\x98", 5, false,
-                    "missing second continuation byte (end)");
-    S_test_validity(runner, "\xE2\x98\xBA\xE2", 4, false,
-                    "missing both continuation bytes (end)");
-    S_test_validity(runner, "\xBA\xE2\x98\xBA", 4, false,
-                    "isolated continuation byte 0xBA");
-    S_test_validity(runner, "\x98\xE2\x98\xBA", 4, false,
-                    "isolated continuation byte 0x98");
-    S_test_validity(runner, "\xE2\x98\xBA\xBA", 4, false,
-                    "isolated continuation byte 0xBA (end)");
-    S_test_validity(runner, "\xE2\x98\xBA\x98", 4, false,
-                    "isolated continuation byte 0x98 (end)");
-}
-
-static void
-test_is_whitespace(TestBatchRunner *runner) {
-    TEST_TRUE(runner, StrHelp_is_whitespace(' '), "space is whitespace");
-    TEST_TRUE(runner, StrHelp_is_whitespace('\n'), "newline is whitespace");
-    TEST_TRUE(runner, StrHelp_is_whitespace('\t'), "tab is whitespace");
-    TEST_TRUE(runner, StrHelp_is_whitespace('\v'),
-              "vertical tab is whitespace");
-    TEST_TRUE(runner, StrHelp_is_whitespace(0x180E),
-              "Mongolian vowel separator is whitespace");
-    TEST_FALSE(runner, StrHelp_is_whitespace('a'), "'a' isn't whitespace");
-    TEST_FALSE(runner, StrHelp_is_whitespace(0), "NULL isn't whitespace");
-    TEST_FALSE(runner, StrHelp_is_whitespace(0x263A),
-               "Smiley isn't whitespace");
-}
-
-static void
-test_back_utf8_char(TestBatchRunner *runner) {
-    char buffer[4];
-    char *buf = buffer + 1;
-    uint32_t len = StrHelp_encode_utf8_char(0x263A, buffer);
-    char *end = buffer + len;
-    TEST_TRUE(runner, StrHelp_back_utf8_char(end, buffer) == buffer,
-              "back_utf8_char");
-    TEST_TRUE(runner, StrHelp_back_utf8_char(end, buf) == NULL,
-              "back_utf8_char returns NULL rather than back up beyond start");
-    TEST_TRUE(runner, StrHelp_back_utf8_char(buffer, buffer) == NULL,
-              "back_utf8_char returns NULL when end == start");
-}
-
-void
-TestStrHelp_Run_IMP(TestStringHelper *self, TestBatchRunner *runner) {
-    TestBatchRunner_Plan(runner, (TestBatch*)self, 40);
-    test_overlap(runner);
-    test_to_base36(runner);
-    test_utf8_round_trip(runner);
-    test_utf8_valid(runner);
-    test_is_whitespace(runner);
-    test_back_utf8_char(runner);
-}
-
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/Test/Util/TestStringHelper.cfh
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/Test/Util/TestStringHelper.cfh b/clownfish/runtime/core/Clownfish/Test/Util/TestStringHelper.cfh
deleted file mode 100644
index 0f8351a..0000000
--- a/clownfish/runtime/core/Clownfish/Test/Util/TestStringHelper.cfh
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel TestClownfish;
-
-class Clownfish::Test::Util::TestStringHelper cnick TestStrHelp
-    inherits Clownfish::TestHarness::TestBatch {
-
-    inert incremented TestStringHelper*
-    new();
-
-    void
-    Run(TestStringHelper *self, TestBatchRunner *runner);
-}
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/TestHarness/TestBatch.cfh
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/TestHarness/TestBatch.cfh b/clownfish/runtime/core/Clownfish/TestHarness/TestBatch.cfh
deleted file mode 100644
index 21b1117..0000000
--- a/clownfish/runtime/core/Clownfish/TestHarness/TestBatch.cfh
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel Clownfish;
-
-/** Abstract base class for test modules.
- */
-abstract class Clownfish::TestHarness::TestBatch inherits Clownfish::Obj {
-    /** Run the tests of the test batch.
-     */
-    abstract void
-    Run(TestBatch *self, TestBatchRunner *runner);
-}
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/TestHarness/TestBatchRunner.c
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/TestHarness/TestBatchRunner.c b/clownfish/runtime/core/Clownfish/TestHarness/TestBatchRunner.c
deleted file mode 100644
index 72cebf2..0000000
--- a/clownfish/runtime/core/Clownfish/TestHarness/TestBatchRunner.c
+++ /dev/null
@@ -1,306 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
-#define C_CFISH_TESTBATCHRUNNER
-#define CFISH_USE_SHORT_NAMES
-
-#include "Clownfish/TestHarness/TestBatchRunner.h"
-
-#include "Clownfish/String.h"
-#include "Clownfish/Err.h"
-#include "Clownfish/TestHarness/TestBatch.h"
-#include "Clownfish/TestHarness/TestFormatter.h"
-#include "Clownfish/VArray.h"
-#include "Clownfish/VTable.h"
-
-struct try_run_tests_context {
-    TestBatchRunner *runner;
-    TestBatch       *batch;
-};
-
-static void
-S_try_run_tests(void *context);
-
-static bool
-S_vtest_true(TestBatchRunner *self, bool condition, const char *pattern,
-             va_list args);
-
-TestBatchRunner*
-TestBatchRunner_new(TestFormatter *formatter) {
-    TestBatchRunner *self = (TestBatchRunner*)VTable_Make_Obj(TESTBATCHRUNNER);
-    return TestBatchRunner_init(self, formatter);
-}
-
-TestBatchRunner*
-TestBatchRunner_init(TestBatchRunner *self, TestFormatter *formatter) {
-    // Assign.
-    self->formatter   = (TestFormatter*)INCREF(formatter);
-
-    // Initialize.
-    self->num_planned = 0;
-    self->test_num    = 0;
-    self->num_passed  = 0;
-    self->num_failed  = 0;
-    self->num_skipped = 0;
-
-    return self;
-}
-
-void
-TestBatchRunner_Destroy_IMP(TestBatchRunner *self) {
-    DECREF(self->formatter);
-    SUPER_DESTROY(self, TESTBATCHRUNNER);
-}
-
-bool
-TestBatchRunner_Run_Batch_IMP(TestBatchRunner *self, TestBatch *batch) {
-    struct try_run_tests_context args;
-    args.runner = self;
-    args.batch  = batch;
-    Err *err = Err_trap(S_try_run_tests, &args);
-
-    bool failed = false;
-    if (err) {
-        failed = true;
-        String *mess = Err_Get_Mess(err);
-        Err_warn_mess((String*)INCREF(mess));
-    }
-    if (self->num_failed > 0) {
-        failed = true;
-        TestFormatter_batch_comment(self->formatter, "%d/%d tests failed.\n",
-                                    self->num_failed, self->test_num);
-    }
-    if (self->test_num != self->num_planned) {
-        failed = true;
-        TestFormatter_batch_comment(self->formatter,
-                                    "Bad plan: You planned %d tests but ran"
-                                    " %d.\n",
-                                    self->num_planned, self->test_num);
-    }
-
-    return !failed;
-}
-
-static void
-S_try_run_tests(void *context) {
-    struct try_run_tests_context *args
-        = (struct try_run_tests_context*)context;
-    TestBatch_Run(args->batch, args->runner);
-}
-
-void
-TestBatchRunner_Plan_IMP(TestBatchRunner *self, TestBatch *batch,
-                         uint32_t num_planned) {
-    self->num_planned = num_planned;
-    TestFormatter_Batch_Prologue(self->formatter, batch, num_planned);
-}
-
-uint32_t
-TestBatchRunner_Get_Num_Planned_IMP(TestBatchRunner *self) {
-    return self->num_planned;
-}
-
-uint32_t
-TestBatchRunner_Get_Num_Tests_IMP(TestBatchRunner *self) {
-    return self->test_num;
-}
-
-uint32_t
-TestBatchRunner_Get_Num_Failed_IMP(TestBatchRunner *self) {
-    return self->num_failed;
-}
-
-bool
-TestBatchRunner_test_true(TestBatchRunner *self, bool condition,
-                          const char *pattern, ...) {
-    va_list args;
-    va_start(args, pattern);
-    bool result = TestBatchRunner_VTest_True(self, condition, pattern, args);
-    va_end(args);
-    return result;
-}
-
-bool
-TestBatchRunner_test_false(TestBatchRunner *self, bool condition,
-                           const char *pattern, ...) {
-    va_list args;
-    va_start(args, pattern);
-    bool result = TestBatchRunner_VTest_False(self, condition, pattern, args);
-    va_end(args);
-    return result;
-}
-
-bool
-TestBatchRunner_test_int_equals(TestBatchRunner *self, long got, long expected,
-                                const char *pattern, ...) {
-    va_list args;
-    va_start(args, pattern);
-    bool result = TestBatchRunner_VTest_Int_Equals(self, got, expected,
-                                                   pattern, args);
-    va_end(args);
-    return result;
-}
-
-bool
-TestBatchRunner_test_float_equals(TestBatchRunner *self, double got,
-                                  double expected, const char *pattern, ...) {
-    va_list args;
-    va_start(args, pattern);
-    bool result = TestBatchRunner_VTest_Float_Equals(self, got, expected,
-                                                     pattern, args);
-    va_end(args);
-    return result;
-}
-
-bool
-TestBatchRunner_test_string_equals(TestBatchRunner *self, const char *got,
-                                   const char *expected, const char *pattern,
-                                   ...) {
-    va_list args;
-    va_start(args, pattern);
-    bool result = TestBatchRunner_VTest_String_Equals(self, got, expected,
-                                                      pattern, args);
-    va_end(args);
-    return result;
-}
-
-bool
-TestBatchRunner_pass(TestBatchRunner *self, const char *pattern, ...) {
-    va_list args;
-    va_start(args, pattern);
-    bool result = TestBatchRunner_VPass(self, pattern, args);
-    va_end(args);
-    return result;
-}
-
-bool
-TestBatchRunner_fail(TestBatchRunner *self, const char *pattern, ...) {
-    va_list args;
-    va_start(args, pattern);
-    bool result = TestBatchRunner_VFail(self, pattern, args);
-    va_end(args);
-    return result;
-}
-
-void
-TestBatchRunner_skip(TestBatchRunner *self, const char *pattern, ...) {
-    va_list args;
-    va_start(args, pattern);
-    TestBatchRunner_VSkip(self, pattern, args);
-    va_end(args);
-}
-
-bool
-TestBatchRunner_VTest_True_IMP(TestBatchRunner *self, bool condition,
-                               const char *pattern, va_list args) {
-    return S_vtest_true(self, condition, pattern, args);
-}
-
-bool
-TestBatchRunner_VTest_False_IMP(TestBatchRunner *self, bool condition,
-                                const char *pattern, va_list args) {
-    return S_vtest_true(self, !condition, pattern, args);
-}
-
-bool
-TestBatchRunner_VTest_Int_Equals_IMP(TestBatchRunner *self, long got,
-                                     long expected, const char *pattern,
-                                     va_list args) {
-    bool pass = (got == expected);
-    S_vtest_true(self, pass, pattern, args);
-    if (!pass) {
-        TestFormatter_test_comment(self->formatter,
-                                   "Expected '%ld', got '%ld'.\n",
-                                   expected, got);
-    }
-    return pass;
-}
-
-bool
-TestBatchRunner_VTest_Float_Equals_IMP(TestBatchRunner *self, double got,
-                                       double expected, const char *pattern,
-                                       va_list args) {
-    double relative_error = got / expected - 1.0;
-    bool   pass           = (fabs(relative_error) < 1e-6);
-    S_vtest_true(self, pass, pattern, args);
-    if (!pass) {
-        TestFormatter_test_comment(self->formatter,
-                                   "Expected '%e', got '%e'.\n",
-                                   expected, got);
-    }
-    return pass;
-}
-
-bool
-TestBatchRunner_VTest_String_Equals_IMP(TestBatchRunner *self, const char *got,
-                                        const char *expected,
-                                        const char *pattern, va_list args) {
-    bool pass = (strcmp(got, expected) == 0);
-    S_vtest_true(self, pass, pattern, args);
-    if (!pass) {
-        TestFormatter_test_comment(self->formatter,
-                                   "Expected '%s', got '%s'.\n",
-                                   expected, got);
-    }
-    return pass;
-}
-
-bool
-TestBatchRunner_VPass_IMP(TestBatchRunner *self, const char *pattern,
-                          va_list args) {
-    return S_vtest_true(self, true, pattern, args);
-}
-
-bool
-TestBatchRunner_VFail_IMP(TestBatchRunner *self, const char *pattern,
-                          va_list args) {
-    return S_vtest_true(self, false, pattern, args);
-}
-
-void
-TestBatchRunner_VSkip_IMP(TestBatchRunner *self, const char *pattern,
-                          va_list args) {
-    self->test_num++;
-    // TODO: Add a VTest_Skip method to TestFormatter
-    TestFormatter_VTest_Result(self->formatter, true, self->test_num,
-                               pattern, args);
-    self->num_skipped++;
-}
-
-static bool
-S_vtest_true(TestBatchRunner* self, bool condition, const char *pattern,
-             va_list args) {
-    // Increment test number.
-    self->test_num++;
-
-    if (condition) {
-        self->num_passed++;
-    }
-    else {
-        self->num_failed++;
-    }
-
-    TestFormatter_VTest_Result(self->formatter, condition, self->test_num,
-                               pattern, args);
-
-    return condition;
-}
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/TestHarness/TestBatchRunner.cfh
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/TestHarness/TestBatchRunner.cfh b/clownfish/runtime/core/Clownfish/TestHarness/TestBatchRunner.cfh
deleted file mode 100644
index cde51f7..0000000
--- a/clownfish/runtime/core/Clownfish/TestHarness/TestBatchRunner.cfh
+++ /dev/null
@@ -1,135 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel Clownfish;
-
-/** Run a single test batch and collect statistics.
- */
-class Clownfish::TestHarness::TestBatchRunner inherits Clownfish::Obj {
-    TestFormatter *formatter;
-    uint32_t       test_num;
-    uint32_t       num_planned;
-    uint32_t       num_passed;
-    uint32_t       num_failed;
-    uint32_t       num_skipped;
-
-    inert incremented TestBatchRunner*
-    new(TestFormatter *formatter);
-
-    inert TestBatchRunner*
-    init(TestBatchRunner *self, TestFormatter *formatter);
-
-    public void
-    Destroy(TestBatchRunner *self);
-
-    /** Run the test batch and print test output and diagnosis.
-     *
-     * @return true if the test batch passed.
-     */
-    bool
-    Run_Batch(TestBatchRunner *self, TestBatch *batch);
-
-    void
-    Plan(TestBatchRunner *self, TestBatch *batch, uint32_t num_planned);
-
-    /** Return the number of tests planned.
-     */
-    uint32_t
-    Get_Num_Planned(TestBatchRunner *self);
-
-    /** Return the number of tests run.
-     */
-    uint32_t
-    Get_Num_Tests(TestBatchRunner *self);
-
-    /** Return the number of failed tests.
-     */
-    uint32_t
-    Get_Num_Failed(TestBatchRunner *self);
-
-    inert bool
-    test_true(TestBatchRunner *self, bool condition, const char *pattern, ...);
-
-    inert bool
-    test_false(TestBatchRunner *self, bool condition, const char *pattern,
-               ...);
-
-    inert bool
-    test_int_equals(TestBatchRunner *self, long got, long expected,
-                    const char *pattern, ...);
-
-    inert bool
-    test_float_equals(TestBatchRunner *self, double got, double expected,
-                      const char *pattern, ...);
-
-    inert bool
-    test_string_equals(TestBatchRunner *self, const char *got,
-                       const char *expected, const char *pattern, ...);
-
-    inert bool
-    pass(TestBatchRunner *self, const char *pattern, ...);
-
-    inert bool
-    fail(TestBatchRunner *self, const char *pattern, ...);
-
-    inert void
-    skip(TestBatchRunner *self, const char *pattern, ...);
-
-    bool
-    VTest_True(TestBatchRunner *self, bool condition, const char *pattern,
-               va_list args);
-
-    bool
-    VTest_False(TestBatchRunner *self, bool condition, const char *pattern,
-                va_list args);
-
-    bool
-    VTest_Int_Equals(TestBatchRunner *self, long got, long expected,
-                     const char *pattern, va_list args);
-
-    bool
-    VTest_Float_Equals(TestBatchRunner *self, double got, double expected,
-                       const char *pattern, va_list args);
-
-    bool
-    VTest_String_Equals(TestBatchRunner *self, const char *got,
-                        const char *expected, const char *pattern,
-                        va_list args);
-
-    bool
-    VPass(TestBatchRunner *self, const char *pattern, va_list args);
-
-    bool
-    VFail(TestBatchRunner *self, const char *pattern, va_list args);
-
-    void
-    VSkip(TestBatchRunner *self, const char *pattern, va_list args);
-}
-
-__C__
-#ifdef CFISH_USE_SHORT_NAMES
-  #define TEST_TRUE            cfish_TestBatchRunner_test_true
-  #define TEST_FALSE           cfish_TestBatchRunner_test_false
-  #define TEST_INT_EQ          cfish_TestBatchRunner_test_int_equals
-  #define TEST_FLOAT_EQ        cfish_TestBatchRunner_test_float_equals
-  #define TEST_STR_EQ          cfish_TestBatchRunner_test_string_equals
-  #define PASS                 cfish_TestBatchRunner_pass
-  #define FAIL                 cfish_TestBatchRunner_fail
-  #define SKIP                 cfish_TestBatchRunner_skip
-#endif
-__END_C__
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/TestHarness/TestFormatter.c
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/TestHarness/TestFormatter.c b/clownfish/runtime/core/Clownfish/TestHarness/TestFormatter.c
deleted file mode 100644
index c5016be..0000000
--- a/clownfish/runtime/core/Clownfish/TestHarness/TestFormatter.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h>
-
-#define C_CFISH_TESTFORMATTER
-#define CFISH_USE_SHORT_NAMES
-#define CHY_USE_SHORT_NAMES
-
-#include "charmony.h"
-
-#include "Clownfish/TestHarness/TestFormatter.h"
-
-#include "Clownfish/String.h"
-#include "Clownfish/Err.h"
-#include "Clownfish/TestHarness/TestBatch.h"
-#include "Clownfish/TestHarness/TestSuiteRunner.h"
-#include "Clownfish/Util/Memory.h"
-#include "Clownfish/VTable.h"
-
-TestFormatter*
-TestFormatter_init(TestFormatter *self) {
-    ABSTRACT_CLASS_CHECK(self, TESTFORMATTER);
-    return self;
-}
-
-void
-TestFormatter_test_result(TestFormatter *self, bool pass, uint32_t test_num,
-                          const char *fmt, ...) {
-    va_list args;
-    va_start(args, fmt);
-    TestFormatter_VTest_Result(self, pass, test_num, fmt, args);
-    va_end(args);
-}
-
-void
-TestFormatter_test_comment(TestFormatter *self, const char *fmt, ...) {
-    va_list args;
-    va_start(args, fmt);
-    TestFormatter_VTest_Comment(self, fmt, args);
-    va_end(args);
-}
-
-void
-TestFormatter_batch_comment(TestFormatter *self, const char *fmt, ...) {
-    va_list args;
-    va_start(args, fmt);
-    TestFormatter_VBatch_Comment(self, fmt, args);
-    va_end(args);
-}
-
-TestFormatterCF*
-TestFormatterCF_new() {
-    TestFormatterCF *self
-        = (TestFormatterCF*)VTable_Make_Obj(TESTFORMATTERCF);
-    return TestFormatterCF_init(self);
-}
-
-TestFormatterCF*
-TestFormatterCF_init(TestFormatterCF *self) {
-    return (TestFormatterCF*)TestFormatter_init((TestFormatter*)self);
-}
-
-void
-TestFormatterCF_Batch_Prologue_IMP(TestFormatterCF *self, TestBatch *batch,
-                                   uint32_t num_planned) {
-    UNUSED_VAR(self);
-    UNUSED_VAR(num_planned);
-    String *class_name = TestBatch_Get_Class_Name(batch);
-    char *utf8 = Str_To_Utf8(class_name);
-    printf("Running %s...\n", utf8);
-    FREEMEM(utf8);
-}
-
-void
-TestFormatterCF_VTest_Result_IMP(TestFormatterCF *self, bool pass,
-                                 uint32_t test_num, const char *fmt,
-                                 va_list args) {
-    UNUSED_VAR(self);
-    if (!pass) {
-        printf("  Failed test %u: ", test_num);
-        vprintf(fmt, args);
-        printf("\n");
-    }
-}
-
-void
-TestFormatterCF_VTest_Comment_IMP(TestFormatterCF *self, const char *fmt,
-                                  va_list args) {
-    UNUSED_VAR(self);
-    printf("    ");
-    vprintf(fmt, args);
-}
-
-void
-TestFormatterCF_VBatch_Comment_IMP(TestFormatterCF *self, const char *fmt,
-                                   va_list args) {
-    UNUSED_VAR(self);
-    printf("  ");
-    vprintf(fmt, args);
-}
-
-void
-TestFormatterCF_Summary_IMP(TestFormatterCF *self, TestSuiteRunner *runner) {
-    UNUSED_VAR(self);
-    uint32_t num_batches = TestSuiteRunner_Get_Num_Batches(runner);
-    uint32_t num_batches_failed
-        = TestSuiteRunner_Get_Num_Batches_Failed(runner);
-    uint32_t num_tests = TestSuiteRunner_Get_Num_Tests(runner);
-    uint32_t num_tests_failed = TestSuiteRunner_Get_Num_Tests_Failed(runner);
-
-    if (num_batches == 0) {
-        printf("No tests planned or run.\n");
-    }
-    else if (num_batches_failed == 0) {
-        printf("%u batches passed. %u tests passed.\n", num_batches,
-               num_tests);
-        printf("Result: PASS\n");
-    }
-    else {
-        printf("%u/%u batches failed. %u/%u tests failed.\n",
-               num_batches_failed, num_batches, num_tests_failed, num_tests);
-        printf("Result: FAIL\n");
-    }
-}
-
-TestFormatterTAP*
-TestFormatterTAP_new() {
-    TestFormatterTAP *self
-        = (TestFormatterTAP*)VTable_Make_Obj(TESTFORMATTERTAP);
-    return TestFormatterTAP_init(self);
-}
-
-TestFormatterTAP*
-TestFormatterTAP_init(TestFormatterTAP *self) {
-    return (TestFormatterTAP*)TestFormatter_init((TestFormatter*)self);
-}
-
-void
-TestFormatterTAP_Batch_Prologue_IMP(TestFormatterTAP *self, TestBatch *batch,
-                                uint32_t num_planned) {
-    UNUSED_VAR(self);
-    UNUSED_VAR(batch);
-    printf("1..%u\n", num_planned);
-}
-
-void
-TestFormatterTAP_VTest_Result_IMP(TestFormatterTAP *self, bool pass,
-                                  uint32_t test_num, const char *fmt,
-                                  va_list args) {
-    UNUSED_VAR(self);
-    const char *result = pass ? "ok" : "not ok";
-    printf("%s %u - ", result, test_num);
-    vprintf(fmt, args);
-    printf("\n");
-}
-
-void
-TestFormatterTAP_VTest_Comment_IMP(TestFormatterTAP *self, const char *fmt,
-                                   va_list args) {
-    UNUSED_VAR(self);
-    printf("#   ");
-    vprintf(fmt, args);
-}
-
-void
-TestFormatterTAP_VBatch_Comment_IMP(TestFormatterTAP *self, const char *fmt,
-                                    va_list args) {
-    UNUSED_VAR(self);
-    printf("# ");
-    vprintf(fmt, args);
-}
-
-void
-TestFormatterTAP_Summary_IMP(TestFormatterTAP *self, TestSuiteRunner *runner) {
-    UNUSED_VAR(self);
-    UNUSED_VAR(runner);
-}
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/TestHarness/TestFormatter.cfh
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/TestHarness/TestFormatter.cfh b/clownfish/runtime/core/Clownfish/TestHarness/TestFormatter.cfh
deleted file mode 100644
index 92ca911..0000000
--- a/clownfish/runtime/core/Clownfish/TestHarness/TestFormatter.cfh
+++ /dev/null
@@ -1,142 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel Clownfish;
-
-/** Abstract base class for Clownfish test formatters.
- */
-abstract class Clownfish::TestHarness::TestFormatter inherits Clownfish::Obj {
-    inert TestFormatter*
-    init(TestFormatter *self);
-
-    inert void
-    test_result(TestFormatter *self, bool pass, uint32_t test_num,
-                const char *fmt, ...);
-
-    inert void
-    test_comment(TestFormatter *self, const char *fmt, ...);
-
-    inert void
-    batch_comment(TestFormatter *self, const char *fmt, ...);
-
-    /** Print output at the beginning of a test batch.
-     *
-     * @param batch The test batch.
-     */
-    abstract void
-    Batch_Prologue(TestFormatter *self, TestBatch *batch,
-                   uint32_t num_planned);
-
-    /** Print the result of a single test.
-     *
-     * @param pass True if the test passed, false otherwise.
-     * @param test_num The sequence number of the test.
-     * @param fmt printf-style format string.
-     * @param args Additional arguments.
-     */
-    abstract void
-    VTest_Result(TestFormatter *self, bool pass, uint32_t test_num,
-                 const char *fmt, va_list args);
-
-    /** Print additional diagnosis for a test.
-     *
-     * @param fmt printf-style format string.
-     * @param args Additional arguments.
-     */
-    abstract void
-    VTest_Comment(TestFormatter *self, const char *fmt, va_list args);
-
-    /** Print additional diagnosis for a test batch.
-     *
-     * @param fmt printf-style format string.
-     * @param args Additional arguments.
-     */
-    abstract void
-    VBatch_Comment(TestFormatter *self, const char *fmt, va_list args);
-
-    /** Print test summary after running all test batches.
-     *
-     * @param runner The test runner.
-     */
-    abstract void
-    Summary(TestFormatter *self, TestSuiteRunner *runner);
-}
-
-/** TestFormatter for "Clownfish" format.
- *
- * A TestFormatter that produces human-readable output in a custom
- * "Clownfish" format.
- */
-class Clownfish::Test::Formatter::TestFormatterCF
-    inherits Clownfish::TestHarness::TestFormatter {
-
-    inert incremented TestFormatterCF*
-    new();
-
-    inert TestFormatterCF*
-    init(TestFormatterCF *self);
-
-    void
-    Batch_Prologue(TestFormatterCF *self, TestBatch *batch,
-                   uint32_t num_planned);
-
-    void
-    VTest_Result(TestFormatterCF *self, bool pass, uint32_t test_num,
-                 const char *fmt, va_list args);
-
-    void
-    VTest_Comment(TestFormatterCF *self, const char *fmt, va_list args);
-
-    void
-    VBatch_Comment(TestFormatterCF *self, const char *fmt, va_list args);
-
-    void
-    Summary(TestFormatterCF *self, TestSuiteRunner *runner);
-}
-
-/** TestFormatter for TAP output.
- *
- * A TestFormatter that produces TAP output (Test Anything Protocol).
- * See http://testanything.org/
- */
-class Clownfish::Test::Formatter::TestFormatterTAP
-    inherits Clownfish::TestHarness::TestFormatter {
-
-    inert incremented TestFormatterTAP*
-    new();
-
-    inert TestFormatterTAP*
-    init(TestFormatterTAP *self);
-
-    void
-    Batch_Prologue(TestFormatterTAP *self, TestBatch *batch,
-                   uint32_t num_planned);
-
-    void
-    VTest_Result(TestFormatterTAP *self, bool pass, uint32_t test_num,
-                 const char *fmt, va_list args);
-
-    void
-    VTest_Comment(TestFormatterTAP *self, const char *fmt, va_list args);
-
-    void
-    VBatch_Comment(TestFormatterTAP *self, const char *fmt, va_list args);
-
-    void
-    Summary(TestFormatterTAP *self, TestSuiteRunner *runner);
-}
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/TestHarness/TestSuite.c
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/TestHarness/TestSuite.c b/clownfish/runtime/core/Clownfish/TestHarness/TestSuite.c
deleted file mode 100644
index a396b16..0000000
--- a/clownfish/runtime/core/Clownfish/TestHarness/TestSuite.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h>
-
-#define C_CFISH_TESTSUITE
-#define CHY_USE_SHORT_NAMES
-#define CFISH_USE_SHORT_NAMES
-#define TESTCFISH_USE_SHORT_NAMES
-
-#include "charmony.h"
-
-#include "Clownfish/TestHarness/TestSuite.h"
-
-#include "Clownfish/String.h"
-#include "Clownfish/Err.h"
-#include "Clownfish/TestHarness/TestBatch.h"
-#include "Clownfish/TestHarness/TestBatchRunner.h"
-#include "Clownfish/TestHarness/TestFormatter.h"
-#include "Clownfish/TestHarness/TestSuiteRunner.h"
-#include "Clownfish/VArray.h"
-#include "Clownfish/VTable.h"
-
-static void
-S_unbuffer_stdout();
-
-TestSuite*
-TestSuite_new() {
-    TestSuite *self = (TestSuite*)VTable_Make_Obj(TESTSUITE);
-    return TestSuite_init(self);
-}
-
-TestSuite*
-TestSuite_init(TestSuite *self) {
-    self->batches = VA_new(0);
-    return self;
-}
-
-void
-TestSuite_Destroy_IMP(TestSuite *self) {
-    DECREF(self->batches);
-    SUPER_DESTROY(self, TESTSUITE);
-}
-
-void
-TestSuite_Add_Batch_IMP(TestSuite *self, TestBatch *batch) {
-    VA_Push(self->batches, (Obj*)batch);
-}
-
-bool
-TestSuite_Run_Batch_IMP(TestSuite *self, String *class_name,
-                    TestFormatter *formatter) {
-    S_unbuffer_stdout();
-
-    uint32_t size = VA_Get_Size(self->batches);
-
-    for (uint32_t i = 0; i < size; ++i) {
-        TestBatch *batch = (TestBatch*)VA_Fetch(self->batches, i);
-
-        if (Str_Equals(TestBatch_Get_Class_Name(batch), (Obj*)class_name)) {
-            TestBatchRunner *runner = TestBatchRunner_new(formatter);
-            bool result = TestBatchRunner_Run_Batch(runner, batch);
-            DECREF(runner);
-            return result;
-        }
-    }
-
-    THROW(ERR, "Couldn't find test class '%o'", class_name);
-    UNREACHABLE_RETURN(bool);
-}
-
-bool
-TestSuite_Run_All_Batches_IMP(TestSuite *self, TestFormatter *formatter) {
-    S_unbuffer_stdout();
-
-    TestSuiteRunner *runner = TestSuiteRunner_new(formatter);
-    uint32_t size = VA_Get_Size(self->batches);
-
-    for (uint32_t i = 0; i < size; ++i) {
-        TestBatch *batch = (TestBatch*)VA_Fetch(self->batches, i);
-        TestSuiteRunner_Run_Batch(runner, batch);
-    }
-
-    bool result = TestSuiteRunner_Finish(runner);
-
-    DECREF(runner);
-    return result;
-}
-
-static void
-S_unbuffer_stdout() {
-    int check_val = setvbuf(stdout, NULL, _IONBF, 0);
-    if (check_val != 0) {
-        fprintf(stderr, "Failed when trying to unbuffer stdout\n");
-    }
-}
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/TestHarness/TestSuite.cfh
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/TestHarness/TestSuite.cfh b/clownfish/runtime/core/Clownfish/TestHarness/TestSuite.cfh
deleted file mode 100644
index 52bfa2c..0000000
--- a/clownfish/runtime/core/Clownfish/TestHarness/TestSuite.cfh
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel Clownfish;
-
-/** Manage a collection of test batches.
- */
-class Clownfish::TestHarness::TestSuite inherits Clownfish::Obj {
-    VArray *batches;
-
-    inert incremented TestSuite*
-    new();
-
-    inert TestSuite*
-    init(TestSuite *self);
-
-    public void
-    Destroy(TestSuite *self);
-
-    void
-    Add_Batch(TestSuite *self, decremented TestBatch *batch);
-
-    bool
-    Run_Batch(TestSuite *self, String *class_name, TestFormatter *formatter);
-
-    bool
-    Run_All_Batches(TestSuite *self, TestFormatter *formatter);
-}
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/TestHarness/TestSuiteRunner.c
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/TestHarness/TestSuiteRunner.c b/clownfish/runtime/core/Clownfish/TestHarness/TestSuiteRunner.c
deleted file mode 100644
index 64be5bd..0000000
--- a/clownfish/runtime/core/Clownfish/TestHarness/TestSuiteRunner.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define C_CFISH_TESTSUITERUNNER
-#define CFISH_USE_SHORT_NAMES
-#define CHY_USE_SHORT_NAMES
-
-#include "Clownfish/TestHarness/TestSuiteRunner.h"
-
-#include "Clownfish/Err.h"
-#include "Clownfish/TestHarness/TestBatch.h"
-#include "Clownfish/TestHarness/TestBatchRunner.h"
-#include "Clownfish/TestHarness/TestFormatter.h"
-#include "Clownfish/VTable.h"
-
-TestSuiteRunner*
-TestSuiteRunner_new(TestFormatter *formatter) {
-    TestSuiteRunner *self = (TestSuiteRunner*)VTable_Make_Obj(TESTSUITERUNNER);
-    return TestSuiteRunner_init(self, formatter);
-}
-
-TestSuiteRunner*
-TestSuiteRunner_init(TestSuiteRunner *self, TestFormatter *formatter) {
-    self->formatter          = (TestFormatter*)INCREF(formatter);
-    self->num_tests          = 0;
-    self->num_tests_failed   = 0;
-    self->num_batches        = 0;
-    self->num_batches_failed = 0;
-
-    return self;
-}
-
-void
-TestSuiteRunner_Destroy_IMP(TestSuiteRunner *self) {
-    DECREF(self->formatter);
-    SUPER_DESTROY(self, TESTSUITERUNNER);
-}
-
-bool
-TestSuiteRunner_Run_Batch_IMP(TestSuiteRunner *self, TestBatch *batch) {
-    TestBatchRunner *batch_runner = TestBatchRunner_new(self->formatter);
-    bool success = TestBatchRunner_Run_Batch(batch_runner, batch);
-
-    self->num_tests        += TestBatchRunner_Get_Num_Tests(batch_runner);
-    self->num_tests_failed += TestBatchRunner_Get_Num_Failed(batch_runner);
-    self->num_batches      += 1;
-
-    if (!success) {
-        self->num_batches_failed += 1;
-    }
-
-    DECREF(batch_runner);
-    return success;
-}
-
-bool
-TestSuiteRunner_Finish_IMP(TestSuiteRunner *self) {
-    TestFormatter_Summary(self->formatter, self);
-
-    return self->num_batches != 0 && self->num_batches_failed == 0;
-}
-
-uint32_t
-TestSuiteRunner_Get_Num_Tests_IMP(TestSuiteRunner *self) {
-    return self->num_tests;
-}
-
-uint32_t
-TestSuiteRunner_Get_Num_Tests_Failed_IMP(TestSuiteRunner *self) {
-    return self->num_tests_failed;
-}
-
-uint32_t
-TestSuiteRunner_Get_Num_Batches_IMP(TestSuiteRunner *self) {
-    return self->num_batches;
-}
-
-uint32_t
-TestSuiteRunner_Get_Num_Batches_Failed_IMP(TestSuiteRunner *self) {
-    return self->num_batches_failed;
-}
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/TestHarness/TestSuiteRunner.cfh
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/TestHarness/TestSuiteRunner.cfh b/clownfish/runtime/core/Clownfish/TestHarness/TestSuiteRunner.cfh
deleted file mode 100644
index e9202f1..0000000
--- a/clownfish/runtime/core/Clownfish/TestHarness/TestSuiteRunner.cfh
+++ /dev/null
@@ -1,76 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel Clownfish;
-
-/** Run multiple test batches and collect statistics.
- */
-class Clownfish::TestHarness::TestSuiteRunner inherits Clownfish::Obj {
-    TestFormatter *formatter;
-    uint32_t       num_tests;
-    uint32_t       num_tests_failed;
-    uint32_t       num_batches;
-    uint32_t       num_batches_failed;
-
-    inert incremented TestSuiteRunner*
-    new(TestFormatter *formatter);
-
-    /**
-     * @param formatter The test formatter to format the test output.
-     */
-    inert TestSuiteRunner*
-    init(TestSuiteRunner *self, TestFormatter *formatter);
-
-    public void
-    Destroy(TestSuiteRunner *self);
-
-    /** Run a test batch and collect statistics.
-     *
-     * @param batch The test batch.
-     * @return true if the test batch passed.
-     */
-    bool
-    Run_Batch(TestSuiteRunner *self, TestBatch *batch);
-
-    /** Print a summary after running all test batches.
-     *
-     * @return true if any tests were run and all test batches passed.
-     */
-    bool
-    Finish(TestSuiteRunner *self);
-
-    /** Return the number of tests run.
-     */
-    uint32_t
-    Get_Num_Tests(TestSuiteRunner *self);
-
-    /** Return the number of failed tests.
-     */
-    uint32_t
-    Get_Num_Tests_Failed(TestSuiteRunner *self);
-
-    /** Return the number of test batches run.
-     */
-    uint32_t
-    Get_Num_Batches(TestSuiteRunner *self);
-
-    /** Return the number of failed test batches.
-     */
-    uint32_t
-    Get_Num_Batches_Failed(TestSuiteRunner *self);
-}
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/TestHarness/TestUtils.c
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/TestHarness/TestUtils.c b/clownfish/runtime/core/Clownfish/TestHarness/TestUtils.c
deleted file mode 100644
index 3bf4d12..0000000
--- a/clownfish/runtime/core/Clownfish/TestHarness/TestUtils.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#define CHY_USE_SHORT_NAMES
-#define CFISH_USE_SHORT_NAMES
-
-#include "charmony.h"
-
-#include "Clownfish/TestHarness/TestUtils.h"
-
-#include "Clownfish/CharBuf.h"
-#include "Clownfish/String.h"
-#include "Clownfish/Util/Memory.h"
-
-uint64_t
-TestUtils_random_u64() {
-    uint64_t num = ((uint64_t)(rand()   & 0x7FFF) << 60)
-                   | ((uint64_t)(rand() & 0x7FFF) << 45)
-                   | ((uint64_t)(rand() & 0x7FFF) << 30)
-                   | ((uint64_t)(rand() & 0x7FFF) << 15)
-                   | ((uint64_t)(rand() & 0x7FFF) << 0);
-    return num;
-}
-
-int64_t*
-TestUtils_random_i64s(int64_t *buf, size_t count, int64_t min,
-                      int64_t limit) {
-    uint64_t  range = min < limit ? (uint64_t)limit - (uint64_t)min : 0;
-    int64_t *ints = buf ? buf : (int64_t*)CALLOCATE(count, sizeof(int64_t));
-    for (size_t i = 0; i < count; i++) {
-        ints[i] = min + TestUtils_random_u64() % range;
-    }
-    return ints;
-}
-
-uint64_t*
-TestUtils_random_u64s(uint64_t *buf, size_t count, uint64_t min,
-                      uint64_t limit) {
-    uint64_t  range = min < limit ? limit - min : 0;
-    uint64_t *ints = buf ? buf : (uint64_t*)CALLOCATE(count, sizeof(uint64_t));
-    for (size_t i = 0; i < count; i++) {
-        ints[i] = min + TestUtils_random_u64() % range;
-    }
-    return ints;
-}
-
-double*
-TestUtils_random_f64s(double *buf, size_t count) {
-    double *f64s = buf ? buf : (double*)CALLOCATE(count, sizeof(double));
-    for (size_t i = 0; i < count; i++) {
-        uint64_t num = TestUtils_random_u64();
-        f64s[i] = U64_TO_DOUBLE(num) / UINT64_MAX;
-    }
-    return f64s;
-}
-
-static int32_t
-S_random_code_point(void) {
-    int32_t code_point = 0;
-    while (1) {
-        uint8_t chance = (rand() % 9) + 1;
-        switch (chance) {
-            case 1: case 2: case 3:
-                code_point = rand() % 0x80;
-                break;
-            case 4: case 5: case 6:
-                code_point = (rand() % (0x0800  - 0x0080)) + 0x0080;
-                break;
-            case 7: case 8:
-                code_point = (rand() % (0x10000 - 0x0800)) + 0x0800;
-                break;
-            case 9: {
-                    uint64_t num = TestUtils_random_u64();
-                    code_point = (num % (0x10FFFF - 0x10000)) + 0x10000;
-                }
-        }
-        if (code_point > 0x10FFFF) {
-            continue; // Too high.
-        }
-        if (code_point > 0xD7FF && code_point < 0xE000) {
-            continue; // UTF-16 surrogate.
-        }
-        break;
-    }
-    return code_point;
-}
-
-String*
-TestUtils_random_string(size_t length) {
-    CharBuf *buf = CB_new(length);
-    while (length--) {
-        CB_Cat_Char(buf, S_random_code_point());
-    }
-    String *string = CB_Yield_String(buf);
-    DECREF(buf);
-    return string;
-}
-
-String*
-TestUtils_get_str(const char *ptr) {
-    return Str_new_from_utf8(ptr, strlen(ptr));
-}
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/TestHarness/TestUtils.cfh
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/TestHarness/TestUtils.cfh b/clownfish/runtime/core/Clownfish/TestHarness/TestUtils.cfh
deleted file mode 100644
index 90a9e36..0000000
--- a/clownfish/runtime/core/Clownfish/TestHarness/TestUtils.cfh
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel Clownfish;
-
-inert class Clownfish::TestHarness::TestUtils  {
-
-    /** Testing-only String factory which uses strlen().
-     */
-    inert incremented String*
-    get_str(const char *utf8);
-
-    /** Return a random unsigned 64-bit integer.
-     */
-    inert uint64_t
-    random_u64();
-
-    /** Return an array of <code>count</code> random 64-bit integers where
-     * <code>min <= n < limit</code>.
-     *
-     * If <code>buf</code> is NULL, it will be allocated, otherwise it will
-     * be used.
-     */
-    inert int64_t*
-    random_i64s(int64_t *buf, size_t count, int64_t min, int64_t limit);
-
-    /** Return an array of <code>count</code> random unsigned, 64-bit integers
-     * where <code>min <= n < limit</code>.
-     *
-     * If <code>buf</code> is NULL, it will be allocated, otherwise it will
-     * be used.
-     */
-    inert uint64_t*
-    random_u64s(uint64_t *buf, size_t count, uint64_t min, uint64_t limit);
-
-    /** Return an array of <code>count</code> random double-precision floating
-     * point numbers between 0 and 1.
-     *
-     * If <code>buf</code> is NULL, it will be allocated, otherwise it will
-     * be used.
-     */
-    inert double*
-    random_f64s(double *buf, size_t count);
-
-    /** Return a string with a random (legal) sequence of code points.
-     * @param length Length of the string in code points.
-     */
-    inert incremented String*
-    random_string(size_t length);
-}
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/Util/Atomic.c
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/Util/Atomic.c b/clownfish/runtime/core/Clownfish/Util/Atomic.c
deleted file mode 100644
index 730cd41..0000000
--- a/clownfish/runtime/core/Clownfish/Util/Atomic.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define C_CFISH_ATOMIC
-#define CFISH_USE_SHORT_NAMES
-
-#include "charmony.h"
-
-#include "Clownfish/Util/Atomic.h"
-
-/********************************** Windows ********************************/
-#ifdef CHY_HAS_WINDOWS_H
-#include <windows.h>
-
-bool
-cfish_Atomic_wrapped_cas_ptr(void *volatile *target, void *old_value,
-                            void *new_value) {
-    return InterlockedCompareExchangePointer(target, new_value, old_value)
-           == old_value;
-}
-
-/************************** Fall back to ptheads ***************************/
-#elif defined(CHY_HAS_PTHREAD_H)
-
-#include <pthread.h>
-pthread_mutex_t cfish_Atomic_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-#endif
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/Util/Atomic.cfh
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/Util/Atomic.cfh b/clownfish/runtime/core/Clownfish/Util/Atomic.cfh
deleted file mode 100644
index 2d3bf64..0000000
--- a/clownfish/runtime/core/Clownfish/Util/Atomic.cfh
+++ /dev/null
@@ -1,109 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel Clownfish;
-
-/** Provide atomic memory operations.
- */
-inert class Clownfish::Util::Atomic { }
-
-__C__
-
-/** Compare and swap a pointer.  Test whether the value at <code>target</code>
- * matches <code>old_value</code>.  If it does, set <code>target</code> to
- * <code>new_value</code> and return true.  Otherwise, return false.
- */
-static CFISH_INLINE bool
-cfish_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value);
-
-/************************** Single threaded *******************************/
-#ifdef CFISH_NOTHREADS
-
-static CFISH_INLINE bool
-cfish_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value) {
-    if (*target == old_value) {
-        *target = new_value;
-        return true;
-    }
-    else {
-        return false;
-    }
-}
-
-/************************** Mac OS X 10.4 and later ***********************/
-#elif defined(CFISH_HAS_OSATOMIC_CAS_PTR)
-#include <libkern/OSAtomic.h>
-
-static CFISH_INLINE bool
-cfish_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value) {
-    return OSAtomicCompareAndSwapPtr(old_value, new_value, target);
-}
-
-/********************************** Windows *******************************/
-#elif defined(CFISH_HAS_WINDOWS_H)
-
-bool
-cfish_Atomic_wrapped_cas_ptr(void *volatile *target, void *old_value,
-                            void *new_value);
-
-static CFISH_INLINE bool
-cfish_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value) {
-    return cfish_Atomic_wrapped_cas_ptr(target, old_value, new_value);
-}
-
-/**************************** Solaris 10 and later ************************/
-#elif defined(CFISH_HAS_SYS_ATOMIC_H)
-#include <sys/atomic.h>
-
-static CFISH_INLINE bool
-cfish_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value) {
-    return atomic_cas_ptr(target, old_value, new_value) == old_value;
-}
-
-/************************ Fall back to pthread.h. **************************/
-#elif defined(CFISH_HAS_PTHREAD_H)
-#include <pthread.h>
-
-extern pthread_mutex_t cfish_Atomic_mutex;
-
-static CFISH_INLINE bool
-cfish_Atomic_cas_ptr(void *volatile *target, void *old_value, void *new_value) {
-    pthread_mutex_lock(&cfish_Atomic_mutex);
-    if (*target == old_value) {
-        *target = new_value;
-        pthread_mutex_unlock(&cfish_Atomic_mutex);
-        return true;
-    }
-    else {
-        pthread_mutex_unlock(&cfish_Atomic_mutex);
-        return false;
-    }
-}
-
-/******************** No support for atomics at all. ***********************/
-#else
-
-#error "No support for atomic operations."
-
-#endif // Big platform if-else chain.
-
-#ifdef CFISH_USE_SHORT_NAMES
-  #define Atomic_cas_ptr cfish_Atomic_cas_ptr
-#endif
-
-__END_C__
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/Util/Memory.c
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/Util/Memory.c b/clownfish/runtime/core/Clownfish/Util/Memory.c
deleted file mode 100644
index dcf3214..0000000
--- a/clownfish/runtime/core/Clownfish/Util/Memory.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define C_CFISH_MEMORY
-#define CFISH_USE_SHORT_NAMES
-#define CHY_USE_SHORT_NAMES
-
-#include "charmony.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "Clownfish/Util/Memory.h"
-
-void*
-Memory_wrapped_malloc(size_t count) {
-    void *pointer = malloc(count);
-    if (pointer == NULL && count != 0) {
-        fprintf(stderr, "Can't malloc %" PRIu64 " bytes.\n", (uint64_t)count);
-        exit(1);
-    }
-    return pointer;
-}
-
-void*
-Memory_wrapped_calloc(size_t count, size_t size) {
-    void *pointer = calloc(count, size);
-    if (pointer == NULL && count != 0) {
-        fprintf(stderr, "Can't calloc %" PRIu64 " elements of size %" PRIu64 ".\n",
-                (uint64_t)count, (uint64_t)size);
-        exit(1);
-    }
-    return pointer;
-}
-
-void*
-Memory_wrapped_realloc(void *ptr, size_t size) {
-    void *pointer = realloc(ptr, size);
-    if (pointer == NULL && size != 0) {
-        fprintf(stderr, "Can't realloc %" PRIu64 " bytes.\n", (uint64_t)size);
-        exit(1);
-    }
-    return pointer;
-}
-
-void
-Memory_wrapped_free(void *ptr) {
-    free(ptr);
-}
-
-size_t
-Memory_oversize(size_t minimum, size_t width) {
-    // For larger arrays, grow by an excess of 1/8; grow faster when the array
-    // is small.
-    size_t extra = minimum / 8;
-    if (extra < 3) {
-        extra = 3;
-    }
-    size_t amount = minimum + extra;
-
-    // Detect wraparound and return SIZE_MAX instead.
-    if (amount + 7 < minimum) {
-        return SIZE_MAX;
-    }
-
-    // Round up for small widths so that the number of bytes requested will be
-    // a multiple of the machine's word size.
-    if (sizeof(size_t) == 8) { // 64-bit
-        switch (width) {
-            case 1:
-                amount = (amount + 7) & INT64_C(0xFFFFFFFFFFFFFFF8);
-                break;
-            case 2:
-                amount = (amount + 3) & INT64_C(0xFFFFFFFFFFFFFFFC);
-                break;
-            case 4:
-                amount = (amount + 1) & INT64_C(0xFFFFFFFFFFFFFFFE);
-                break;
-            default:
-                break;
-        }
-    }
-    else { // 32-bit
-        switch (width) {
-            case 1:
-                amount = (amount + 3) & ((size_t)0xFFFFFFFC);
-                break;
-            case 2:
-                amount = (amount + 1) & ((size_t)0xFFFFFFFE);
-                break;
-            default:
-                break;
-        }
-    }
-
-    return amount;
-}
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/Util/Memory.cfh
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/Util/Memory.cfh b/clownfish/runtime/core/Clownfish/Util/Memory.cfh
deleted file mode 100644
index 69ae85f..0000000
--- a/clownfish/runtime/core/Clownfish/Util/Memory.cfh
+++ /dev/null
@@ -1,73 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel Clownfish;
-
-inert class Clownfish::Util::Memory {
-
-    /** Attempt to allocate memory with malloc, but print an error and exit if the
-     * call fails.
-     */
-    inert nullable void*
-    wrapped_malloc(size_t count);
-
-    /** Attempt to allocate memory with calloc, but print an error and exit if the
-     * call fails.
-     */
-    inert nullable void*
-    wrapped_calloc(size_t count, size_t size);
-
-    /** Attempt to allocate memory with realloc, but print an error and exit if
-     * the call fails.
-     */
-    inert nullable void*
-    wrapped_realloc(void *ptr, size_t size);
-
-    /** Free memory.  (Wrapping is necessary in cases where memory allocated
-     * within the Clownfish library has to be freed in an external environment
-     * where "free" may have been redefined.)
-     */
-    inert void
-    wrapped_free(void *ptr);
-
-    /** Provide a number which is somewhat larger than the supplied number, so
-     * that incremental array growth does not trigger pathological
-     * reallocation.
-     *
-     * @param minimum The minimum number of array elements.
-     * @param width The size of each array element in bytes.
-     */
-    inert size_t
-    oversize(size_t minimum, size_t width);
-}
-
-__C__
-
-#define CFISH_MALLOCATE    cfish_Memory_wrapped_malloc
-#define CFISH_CALLOCATE    cfish_Memory_wrapped_calloc
-#define CFISH_REALLOCATE   cfish_Memory_wrapped_realloc
-#define CFISH_FREEMEM      cfish_Memory_wrapped_free
-
-#ifdef CFISH_USE_SHORT_NAMES
-  #define MALLOCATE                       CFISH_MALLOCATE
-  #define CALLOCATE                       CFISH_CALLOCATE
-  #define REALLOCATE                      CFISH_REALLOCATE
-  #define FREEMEM                         CFISH_FREEMEM
-#endif
-
-__END_C__
-
-

http://git-wip-us.apache.org/repos/asf/lucy/blob/1704c275/clownfish/runtime/core/Clownfish/Util/NumberUtils.c
----------------------------------------------------------------------
diff --git a/clownfish/runtime/core/Clownfish/Util/NumberUtils.c b/clownfish/runtime/core/Clownfish/Util/NumberUtils.c
deleted file mode 100644
index dd65059..0000000
--- a/clownfish/runtime/core/Clownfish/Util/NumberUtils.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define C_CFISH_NUMBERUTILS
-#define CFISH_USE_SHORT_NAMES
-#define CHY_USE_SHORT_NAMES
-
-#include <string.h>
-
-#include "Clownfish/Util/NumberUtils.h"
-
-const uint8_t NumUtil_u1masks[8] = {
-    0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
-};
-
-const uint8_t NumUtil_u2shifts[4] = { 0x0, 0x2, 0x4,  0x6  };
-const uint8_t NumUtil_u2masks[4]  = { 0x3, 0xC, 0x30, 0xC0 };
-
-const uint8_t NumUtil_u4shifts[2] = { 0x00, 0x04 };
-const uint8_t NumUtil_u4masks[2]  = { 0x0F, 0xF0 };
-
-