From: Michael D. Lowis Date: Fri, 8 Mar 2019 22:38:11 +0000 (-0500) Subject: updated qcheck interface X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=efe328e4a4b41024ab4907017c6ad61af188d142;p=projs%2Ftide.git updated qcheck interface --- diff --git a/config.mk b/config.mk index d7a9e03..a39e99c 100644 --- a/config.mk +++ b/config.mk @@ -18,7 +18,7 @@ INCS += -I/usr/include/freetype2 # Compiler Setup CC = ./acc CFLAGS = -O2 -MMD $(INCS) -CFLAGS += -Wno-missing-field-initializers -Wno-implicit-fallthrough +CFLAGS += -Wno-missing-field-initializers -Wno-implicit-fallthrough -Wno-unknown-pragmas # Linker Setup LD = $(CC) diff --git a/inc/qcheck.h b/inc/qcheck.h index ff0322b..16fcfb7 100644 --- a/inc/qcheck.h +++ b/inc/qcheck.h @@ -142,48 +142,54 @@ void qcshow(int nvals, QCValue** vals) { } } -QCResult vqcheck(QCProp prop, int nvals, va_list vals) { +QCResult qcheckone(QCProp prop, int ngenfns, QCGenFn* genfns) { /* generate the input values */ QCValue** values = NULL; - if (nvals) { - values = malloc(sizeof(QCValue*) * nvals); - for (int i = 0; i < nvals; i++) - values[i] = (va_arg(vals, QCGenFn))(); + if (ngenfns) { + values = malloc(sizeof(QCValue*) * ngenfns); + for (int i = 0; i < ngenfns; i++) + values[i] = (genfns[i])(); } /* run the test and get the result */ QCResult result = { .status = 0 }; - result.status = prop(nvals, values); - result.nvals = nvals; + result.status = prop(ngenfns, values); + result.nvals = ngenfns; result.vals = values; return result; } -int qcheck(char* desc, QCProp prop, int nvals, ...) { - int passed = 0; +int qcheckall(char* desc, QCProp prop, int nvals, QCGenFn* vals) { QCResult result; - va_list vals; - #pragma omp parallel for - for (int i = 0; i < NTrials; i++) { - va_start(vals, nvals); - result = vqcheck(prop, nvals, vals); - va_end(vals); + int pass; + for (pass = 0; pass < NTrials; pass++) { + result = qcheckone(prop, nvals, vals); if (!result.status) break; qcfree(result.nvals, result.vals); - passed++; } - /* show 'em the results */ - if (passed == NTrials) { - printf("%d tests passed for property: %s\n", passed, desc); - } else if (!result.status) { - printf("\nProperty: %s\nFalsifiable after %d tests (seed: %d)\n", desc, passed+1, Seed); + /* print the results */ + if (!result.status) { + printf("\nProperty: %s\nFalsifiable after %d tests (seed: %d)\n", desc, pass+1, Seed); qcshow(result.nvals, result.vals); qcfree(result.nvals, result.vals); puts(""); return 0; + } else { + printf("%d tests passed for property: %s\n", pass, desc); } return 1; } +int qcheck(char* desc, QCProp prop, int nvals, ...) { + QCGenFn vals[nvals]; + va_list vargs; + va_start(vargs, nvals); + for (int i = 0; i < nvals; i++) + vals[i] = va_arg(vargs, QCGenFn); + va_end(vargs); + return qcheckall(desc, prop, nvals, vals); + return 1; +} + void show_long(QCValue* val) { printf("%ld\n", (val->data[0])); }