}
}
-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]));
}