#include #include #include #include MTS_NAMESPACE_BEGIN struct Sample { Float value; Float variance; int nSamples; }; static std::vector parseRefFile(std::ifstream &is) { std::string line; std::vector result; while (!is.eof() && !is.fail()) { std::getline(is, line); std::vector tokens = tokenize(line, " \t;,[]"); for (size_t i=0; i parseMFile(std::ifstream &is, int testType) { std::string line; std::vector result; while (!is.eof() && !is.fail()) { std::getline(is, line); std::vector tokens = tokenize(line, " \t;,[]"); SAssert(testType == Scene::ERelativeError || (tokens.size() % 3) == 0); for (size_t i=0; igetSourceFile(); result.output = scene->getDestinationFile() + ".m"; result.success = false; std::string refFilename = scene->getDestinationFile() + ".ref"; std::ifstream is(result.output.c_str()); std::ifstream is_ref(refFilename.c_str()); if (is.fail()) { result.message = formatString("Could not open '%s'!", result.output.c_str()); m_mutex->lock(); m_numFailed++; m_results.push_back(result); m_mutex->unlock(); return; } if (is_ref.fail()) { result.message = formatString("Could not open '%s'!", refFilename.c_str()); m_mutex->lock(); m_numFailed++; m_results.push_back(result); m_mutex->unlock(); return; } std::vector actual = parseMFile(is, scene->getTestType()); std::vector ref = parseRefFile(is_ref); is.close(); is_ref.close(); if (actual.size() != ref.size()) { result.message = formatString("Output format does not match the reference (%i vs %i pixels)!", (int) actual.size(), (int) ref.size()); m_mutex->lock(); m_numFailed++; m_results.push_back(result); m_mutex->unlock(); return; } if (scene->getTestType() == Scene::ETTest) { for (size_t i=0; igetTestThreshold()) { Log(EWarn, "t-test REJECTS!"); result.message = formatString("t-test REJECTS: result=%f (ref=%f), diff=%e, var=%f T-stat=%f, df=%i, p-value=%f", actual[i].value, ref[i], actual[i].value - ref[i], var, T, df, pval); m_mutex->lock(); m_numFailed++; m_results.push_back(result); m_mutex->unlock(); return; } else { Log(EDebug, "t-test accepts."); } } } else if (scene->getTestType() == Scene::ERelativeError) { for (size_t i=0; i scene->getTestThreshold()) { Log(EWarn, "Relativ error threshold EXCEEDED!"); result.message = formatString("Relative error threshold EXCEEDED: result=%f (ref=%f), diff=%e, relerr=%f", actual[i].value, ref[i], actual[i].value - ref[i], relerr); m_mutex->lock(); m_numFailed++; m_results.push_back(result); m_mutex->unlock(); return; } else { Log(EDebug, "Relative error accepted."); } } } else if (scene->getTestType() == Scene::ENone) { Log(EError, "No test type specified, don't know what to do!"); } else { Log(EError, "Unknown test type!"); } result.success = true; m_mutex->lock(); m_numSucceeded++; m_results.push_back(result); m_mutex->unlock(); } void TestSupervisor::printSummary() const { m_mutex->lock(); Log(EInfo, "Ran %i/%i testcases, %i succeeded, %i failed.", (int) (m_numFailed+m_numSucceeded), (int) m_total, (int) m_numSucceeded, (int) m_numFailed); for (size_t i=0; iunlock(); } MTS_IMPLEMENT_CLASS(TestSupervisor, false, Object) MTS_NAMESPACE_END