void verifyEvaluation(const string& expression, double x, double y, double expectedValue) { map<string, double> variables; variables["x"] = x; variables["y"] = y; ParsedExpression parsed = Parser::parse(expression); double value = parsed.evaluate(variables); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); // Try optimizing it and make sure the result is still correct. value = parsed.optimize().evaluate(variables); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); // Try optimizing with predefined values for the variables. value = parsed.optimize(variables).evaluate(); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); // Create an ExpressionProgram and see if that also gives the same result. ExpressionProgram program = parsed.createProgram(); value = program.evaluate(variables); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); // Create a CompiledExpression and see if that also gives the same result. CompiledExpression compiled = parsed.createCompiledExpression(); if (compiled.getVariables().find("x") != compiled.getVariables().end()) compiled.getVariableReference("x") = x; if (compiled.getVariables().find("y") != compiled.getVariables().end()) compiled.getVariableReference("y") = y; value = compiled.evaluate(); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); // Make sure that variable renaming works. variables.clear(); variables["w"] = x; variables["y"] = y; map<string, string> replacements; replacements["x"] = "w"; value = parsed.renameVariables(replacements).evaluate(variables); ASSERT_EQUAL_TOL(expectedValue, value, 1e-10); }