changeset 668:69337f2fc4a4

Add evaltest.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 16 Apr 2013 09:40:03 +0300
parents f9f98a0f4e9a
children 440b77b635a5
files Makefile.gen tests/evaltest.c
diffstat 2 files changed, 126 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile.gen	Tue Apr 16 09:36:53 2013 +0300
+++ b/Makefile.gen	Tue Apr 16 09:40:03 2013 +0300
@@ -240,7 +240,7 @@
 endif
 
 ifeq ($(DM_BUILD_TESTS),yes)
-TESTS_BINARIES += vecmattest fptest
+TESTS_BINARIES += vecmattest fptest evaltest
 endif
 
 FONTCONV_BIN=$(BINPATH)fontconv$(EXEEXT)
@@ -408,6 +408,10 @@
 	@echo " LINK $+"
 	@$(CC) -o $@ $(filter %.o %.a,$+) $(DM_LDFLAGS) $(SDL_LDFLAGS) -lSDL_ttf
 
+$(BINPATH)evaltest$(EXEEXT): $(OBJPATH)evaltest.o $(OBJPATH)dmeval.o $(DMLIB_A)
+	@echo " LINK $+"
+	@$(CC) -o $@ $(filter %.o %.a,$+) $(DM_LDFLAGS) -lm
+
 $(BINPATH)%test$(EXEEXT): $(OBJPATH)%test.o $(DMLIB_A)
 	@echo " LINK $+"
 	@$(CC) -o $@ $(filter %.o %.a,$+) $(DM_LDFLAGS) -lm
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/evaltest.c	Tue Apr 16 09:40:03 2013 +0300
@@ -0,0 +1,121 @@
+#include "dmlib.h"
+#include "dmeval.h"
+#include "dmargs.h"
+
+
+BOOL    optBenchmark = FALSE;
+char *  optFormula = "";
+
+
+DMOptArg optList[] =
+{
+    { 0, '?', "help",       "Show this help", OPT_NONE },
+    { 1, 'v', "verbose",    "Be more verbose", OPT_NONE },
+    { 2, 'b', "benchmark",  "Run in benchmark mode", OPT_NONE },
+};
+
+const int optListN = sizeof(optList) / sizeof(optList[0]);
+
+
+void argShowHelp()
+{
+    dmPrintBanner(stdout, dmProgName, "[options] '<formula>'");
+    dmArgsPrintHelp(stdout, optList, optListN);
+}
+
+
+BOOL argHandleOpt(const int optN, char *optArg, char *currArg)
+{
+    (void) optArg;
+
+    switch (optN)
+    {
+    case 0:
+        argShowHelp();
+        exit(0);
+        break;
+
+    case 1:
+        dmVerbosity++;
+        break;
+    
+    case 2:
+        optBenchmark = TRUE;
+        break;
+    
+    default:
+        dmError("Unknown option '%s'.\n", currArg);
+        return FALSE;
+    }
+    
+    return TRUE;
+}
+
+
+BOOL argHandleNonOpt(char *currArg)
+{
+    optFormula = currArg;
+    return TRUE;
+}
+
+
+int main(int argc, char *argv[])
+{
+    DMEvalContext *ev = dm_eval_new();
+    DMEvalNode *parsed = NULL, *ordered = NULL;
+    DMValue result, t, f = 44100.0f;
+    int ret;
+
+    dmInitProg("evaltest", "evaltest", "0.1", NULL, NULL);
+
+    // Parse arguments
+    if (!dmArgsProcess(argc, argv, optList, optListN,
+        argHandleOpt, argHandleNonOpt, FALSE))
+        exit(1);
+
+
+    dm_eval_add_var(ev, "t", &t);
+    dm_eval_add_var(ev, "f", &f);
+
+    ret = dm_eval_parse_expr(ev, optFormula, &parsed);
+    dmMsg(1, "parse ret=%d\n", ret);
+    if (ev->err)
+        dmError("%s\n", ev->errStr);
+
+    if (dmVerbosity > 0)
+        dm_print_optree(ev, parsed);
+    
+    if (ret != 0)
+        return -1;
+
+    dm_eval_clear_err(ev);
+    
+    ret = dm_eval_reorder(ev, parsed, &ordered);
+    dmMsg(1, "reorder ret=%d\n", ret);
+    if (ev->err)
+        dmError("%s\n", ev->errStr);
+
+    if (dmVerbosity > 0)
+        dm_print_optree(ev, ordered);
+
+    if (ret != 0)
+        return -2;
+
+    if (optBenchmark)
+    {
+        dmMsg(0, "Benchmarking ...\n");
+        for (t = 0; t < 2500000; t++)
+            ret = dm_eval_exec(ev, ordered, &result);
+    }
+    else
+    {
+        ret = dm_eval_exec(ev, ordered, &result);
+        printf("%1.5f\n", result);
+    }
+
+    dmMsg(1, "eval ret=%d\n", ret);
+
+    dm_eval_close(ev);
+
+    return 0;
+}