summaryrefslogtreecommitdiffstats
path: root/tiler/testlib.c
diff options
context:
space:
mode:
Diffstat (limited to 'tiler/testlib.c')
-rw-r--r--tiler/testlib.c163
1 files changed, 163 insertions, 0 deletions
diff --git a/tiler/testlib.c b/tiler/testlib.c
new file mode 100644
index 0000000..63d1298
--- /dev/null
+++ b/tiler/testlib.c
@@ -0,0 +1,163 @@
+/*
+ * testlib.c
+ *
+ * Unit test interface.
+ *
+ * Copyright (C) 2009-2011 Texas Instruments, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of Texas Instruments Incorporated nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* retrieve type definitions */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "testlib.h"
+
+#include <utils.h>
+#include <debug_utils.h>
+
+#define TESTLIB_OK 0
+#define TESTLIB_FAIL 1
+
+/** Returns TRUE iff str is a whole unsigned int */
+#define is_uint(str) \
+ ({ unsigned i; char c; sscanf(str, "%u%c", &i, &c) == 1; })
+
+extern int __internal__TestLib_DoList(int id);
+
+/**
+ * Prints test result and returns summary result
+ *
+ * @author a0194118 (9/7/2009)
+ *
+ * @param res Test result
+ *
+ * @return TEST_RESULT_OK on success, TEST_RESULT_FAIL on
+ * failure, TEST_RESULT_UNAVAILABLE if test is not
+ * available
+ */
+int __internal__TestLib_Report(int res)
+{
+ switch (res)
+ {
+ case TESTLIB_UNAVAILABLE:
+ printf("==> TEST NOT AVAILABLE\n");
+ fflush(stdout);
+ return TESTLIB_UNAVAILABLE;
+ case 0:
+ printf("==> TEST OK\n");
+ fflush(stdout);
+ return TESTLIB_OK;
+ default:
+ printf("==> TEST FAIL(%d)\n", res);
+ fflush(stdout);
+ return TESTLIB_FAIL;
+ }
+}
+
+void __internal__TestLib_NullFn(void *ptr)
+{
+}
+
+int TestLib_Run(int argc, char **argv, void(*init_fn)(void *),
+ void(*exit_fn)(void *), void *ptr)
+{
+ int start, end, res, failed = 0, succeeded = 0, unavailable = 0;
+
+ /* all tests */
+ if (argc == 1)
+ {
+ start = 1; end = -1;
+ }
+ /* test list */
+ else if (argc == 2 && !strcmp(argv[1], "list"))
+ {
+ __internal__TestLib_DoList(0);
+ return -1;
+ }
+ /* single test */
+ else if (argc == 2 && is_uint(argv[1]))
+ {
+ start = end = atoi(argv[1]);
+ }
+ /* open range .. b */
+ else if (argc == 3 && !strcmp(argv[1], "..") && is_uint(argv[2]))
+ {
+ start = 1;
+ end = atoi(argv[2]);
+ }
+ /* open range a .. */
+ else if (argc == 3 && !strcmp(argv[2], "..") && is_uint(argv[1]))
+ {
+ start = atoi(argv[1]);
+ end = -1;
+ }
+ else if (argc == 4 && !strcmp(argv[2], "..") && is_uint(argv[1]) && is_uint(argv[3]))
+ {
+ start = atoi(argv[1]);
+ end = atoi(argv[3]);
+ }
+ else
+ {
+ fprintf(stderr, "Usage: %s [<range>], where <range> is\n"
+ " empty: run all tests\n"
+ " list: list tests\n"
+ " ix: run test #ix\n"
+ " a ..: run tests #a, #a+1, ...\n"
+ " .. b: run tests #1, #2, .. #b\n"
+ " a .. b: run tests #a, #a+1, .. #b\n", argv[0]);
+ fflush(stderr);
+ return -1;
+ }
+
+ /* execute tests */
+ init_fn(ptr);
+
+ do
+ {
+ res = __internal__TestLib_DoList(start++);
+ if (res == TESTLIB_FAIL) failed++;
+ else if (res == TESTLIB_OK) succeeded++;
+ else if (res == TESTLIB_UNAVAILABLE) unavailable++;
+ printf("so far FAILED: %d, SUCCEEDED: %d, UNAVAILABLE: %d\n", failed, succeeded,
+ unavailable);
+ fflush(stdout);
+ } while (res != TESTLIB_INVALID && (end < 0 || start <= end));
+
+ printf("FAILED: %d, SUCCEEDED: %d, UNAVAILABLE: %d\n", failed, succeeded,
+ unavailable);
+ fflush(stdout);
+
+ /* also execute internal unit tests - this also verifies that we did not
+ keep any references */
+ exit_fn(ptr);
+
+ return failed;
+}
+