void testText(const char *equation, const char *expect) { bool failure = false; QString txt; yy_scan_string(equation); int rc = yyparse(); if (rc == 0) { vectorsUsed.clear(); Equation::Node *eq = static_cast<Equation::Node*>(ParsedEquation); assert(eq); ParsedEquation = 0L; //eq->collectVectors(vectorsUsed); txt = eq->text(); failure = txt != expect; delete eq; } else { // Parse error delete (Equation::Node*)ParsedEquation; ParsedEquation = 0L; failure = true; } if (failure) { if (!Equation::errorStack.isEmpty()) { printf("Failures on [%s] -------------------------\n", equation); for (QStringList::ConstIterator i = Equation::errorStack.constBegin(); i != Equation::errorStack.constEnd(); ++i) { printf("%s\n", (*i).latin1()); } printf("------------------------------------------\n"); } else { printf("Got [%s], expected [%s]\n", txt.latin1(), expect); } --rc; } }
bool doTest(const char *equation, double x, double result, const double tol = 0.00000000001) { yy_scan_string(equation); int rc = yyparse(); if (rc == 0) { vectorsUsed.clear(); Equation::Node *eq = static_cast<Equation::Node*>(ParsedEquation); assert(eq); ParsedEquation = 0L; Equation::Context ctx; ctx.sampleCount = 2; ctx.noPoint = NOPOINT; ctx.x = x; ctx.xVector = xVector; if (xVector) { ctx.sampleCount = xVector->length(); } Equation::FoldVisitor vis(&ctx, &eq); if (eq->isConst() && !dynamic_cast<Equation::Number*>(eq)) { if (!optimizerFailed) { optimizerFailed = true; ::rc--; printf("Optimizer bug: found an unoptimized const equation. Optimizing for coverage purposes.\n"); } double v = eq->value(&ctx); delete eq; eq = new Equation::Number(v); } KstScalarMap scm; KstStringMap stm; eq->collectObjects(vectorsUsed, scm, stm); // // do not use -1 in the call to eq->update( ... ) // as this will simply return without updating the plugin, // unless an underlying data object was updated... // eq->update(0, &ctx); double v = eq->value(&ctx); delete eq; if (fabs(v - result) < tol || (result != result && v != v) || (result == INF && v == INF) || (result == -INF && v == -INF)) { return true; } else { printf("Result: %.16f\n", v); return false; } } else { // Parse error printf("Failures on [%s] -------------------------\n", equation); for (QStringList::ConstIterator i = Equation::errorStack.constBegin(); i != Equation::errorStack.constEnd(); ++i) { printf("%s\n", (*i).latin1()); } printf("------------------------------------------\n"); delete (Equation::Node*)ParsedEquation; ParsedEquation = 0L; return false; } }
static void exitHelper() { xVector = 0L; vectorsUsed.clear(); KST::vectorList.clear(); KST::scalarList.clear(); }