From 531647be4d5774a89e4b5f4f234540044701185e Mon Sep 17 00:00:00 2001 From: Emmanuel Christophe <emmanuel.christophe@orfeo-toolbox.org> Date: Fri, 6 May 2011 23:29:36 -0700 Subject: [PATCH] ENH: switch code from TestMain to TestHelper --- Code/Testing/otbTestHelper.cxx | 248 +++++++++++++++++++++++++++++++++ Code/Testing/otbTestHelper.h | 31 ++++- Code/Testing/otbTestMain.h | 225 ++---------------------------- 3 files changed, 285 insertions(+), 219 deletions(-) diff --git a/Code/Testing/otbTestHelper.cxx b/Code/Testing/otbTestHelper.cxx index e2b9f5f733..ff604285bf 100644 --- a/Code/Testing/otbTestHelper.cxx +++ b/Code/Testing/otbTestHelper.cxx @@ -75,6 +75,254 @@ namespace otb { +int TestHelper::RegressionTestAllImages(const StringList& baselineFilenamesImage, + const StringList& testFilenamesImage) +{ + int result = 0; + StringListIt itbaselineFilenames = baselineFilenamesImage.begin(); + StringListIt itTestFilenames = testFilenamesImage.begin(); + int cpt(1); + // For each couple of baseline and test file, do the comparison + for (; (itbaselineFilenames != baselineFilenamesImage.end()) + && (itTestFilenames != testFilenamesImage.end()); + ++itbaselineFilenames, ++itTestFilenames) + { + std::string baselineFilenameImage = (*itbaselineFilenames); + std::string testFilenameImage = (*itTestFilenames); + + std::map<std::string, int> baselines = + this->RegressionTestBaselines(const_cast<char*>(baselineFilenameImage.c_str())); + std::map<std::string, int>::reverse_iterator baseline = baselines.rbegin(); + int multiResult = 1; + std::cout << "Number of baseline images: " << baselines.size() << std::endl; + while (baseline != baselines.rend() && (multiResult != 0)) + { + std::cout << "Testing non-regression on image: " << (baseline->first).c_str() << std::endl; + this->ReportErrorsOff(); + baseline->second = this->RegressionTestImage(cpt, testFilenameImage.c_str(), + (baseline->first).c_str(), + m_ToleranceDiffValue); + + multiResult = baseline->second; + ++baseline; + } + if (multiResult != 0) + { + baseline = baselines.rbegin(); + this->ReportErrorsOn(); + baseline->second + = this->RegressionTestImage(cpt, testFilenameImage.c_str(), + (baseline->first).c_str(), + m_ToleranceDiffValue); + } + cpt++; + result += multiResult; + } + return result; +} + +int TestHelper::RegressionTestAllMetaData(const StringList& baselineFilenamesMetaData, + const StringList& testFilenamesMetaData) +{ + int result = 0; + // Creates iterators on baseline filenames vector and test filenames vector + StringListIt itbaselineFilenames = baselineFilenamesMetaData.begin(); + StringListIt itTestFilenames = testFilenamesMetaData.begin(); + // For each couple of baseline and test file, do the comparison + for (; (itbaselineFilenames != baselineFilenamesMetaData.end()) + && (itTestFilenames != testFilenamesMetaData.end()); + ++itbaselineFilenames, ++itTestFilenames) + { + std::string baselineFilenameImage = (*itbaselineFilenames); + std::string testFilenameImage = (*itTestFilenames); + + std::map<std::string, int> baselines = + this->RegressionTestBaselines(const_cast<char*>(baselineFilenameImage.c_str())); + std::map<std::string, int>::reverse_iterator baseline = baselines.rbegin(); + int multiResult = 1; + std::cout << "Number of baseline images: " << baselines.size() << std::endl; + while (baseline != baselines.rend() && (multiResult != 0)) + { + std::cout << "Testing non-regression on image: " << (baseline->first).c_str() << std::endl; + this->ReportErrorsOff(); + baseline->second = this->RegressionTestMetaData(testFilenameImage.c_str(), + (baseline->first).c_str(), + m_ToleranceDiffValue); + + multiResult = baseline->second; + ++baseline; + } + if (multiResult != 0) + { + baseline = baselines.rbegin(); + this->ReportErrorsOn(); + baseline->second + = this->RegressionTestMetaData(testFilenameImage.c_str(), + (baseline->first).c_str(), + m_ToleranceDiffValue); + } + result += multiResult; + } + return result; +} + +int TestHelper::RegressionTestAllAscii(const StringList& baselineFilenamesAscii, + const StringList& testFilenamesAscii, + const StringList& ignoredLines) +{ + int result = 0; + // Creates iterators on baseline filenames vector and test filenames vector + StringListIt itbaselineFilenames = baselineFilenamesAscii.begin(); + StringListIt itTestFilenames = testFilenamesAscii.begin(); + StringListIt itIgnoredLines = ignoredLines.begin(); + + // Warning message + if (ignoredLines.size() > 0) + { + std::cout << "The lines containing the expressions "; + for (; itIgnoredLines != ignoredLines.end(); ++itIgnoredLines) + { + std::cout << (*itIgnoredLines) << " "; + } + std::cout << "are not considered" << std::endl; + } + + // For each couple of baseline and test file, do the comparison + for (; (itbaselineFilenames != baselineFilenamesAscii.end()) + && (itTestFilenames != testFilenamesAscii.end()); + ++itbaselineFilenames, ++itTestFilenames) + { + std::string baselineFilenameAscii = (*itbaselineFilenames); + std::string testFilenameAscii = (*itTestFilenames); + + std::map<std::string, + int> baselines = + this->RegressionTestBaselines(const_cast<char*>(baselineFilenameAscii.c_str())); + std::map<std::string, int>::reverse_iterator baseline = baselines.rbegin(); + int multiResult = 1; + std::cout << "Number of baseline files: " << baselines.size() << std::endl; + while (baseline != baselines.rend() && (multiResult != 0)) + { + std::cout << "Testing non-regression on file: " << (baseline->first).c_str() << std::endl; + this->ReportErrorsOff(); + baseline->second = this->RegressionTestAsciiFile(testFilenameAscii.c_str(), + (baseline->first).c_str(), + m_Epsilon, + ignoredLines); + + multiResult = baseline->second; + ++baseline; + } + if (multiResult != 0) + { + baseline = baselines.rbegin(); + this->ReportErrorsOn(); + baseline->second + = this->RegressionTestAsciiFile(testFilenameAscii.c_str(), + (baseline->first).c_str(), + m_Epsilon, + ignoredLines); + } + result += multiResult; + } + + return result; +} + +int TestHelper::RegressionTestAllBinary(const StringList& baselineFilenamesBinary, + const StringList& testFilenamesBinary) +{ + int result = 0; + // Creates iterators on baseline filenames vector and test filenames vector + StringListIt itbaselineFilenames = baselineFilenamesBinary.begin(); + StringListIt itTestFilenames = testFilenamesBinary.begin(); + + // For each couple of baseline and test file, do the comparison + for (; (itbaselineFilenames != baselineFilenamesBinary.end()) + && (itTestFilenames != testFilenamesBinary.end()); + ++itbaselineFilenames, ++itTestFilenames) + { + std::string baselineFilenameBinary = (*itbaselineFilenames); + std::string testFilenameBinary = (*itTestFilenames); + + std::map<std::string, + int> baselines = + this->RegressionTestBaselines(const_cast<char*>(baselineFilenameBinary.c_str())); + std::map<std::string, int>::reverse_iterator baseline = baselines.rbegin(); + int multiResult = 1; + std::cout << "Number of baseline files: " << baselines.size() << std::endl; + while (baseline != baselines.rend() && (multiResult != 0)) + { + std::cout << "Testing non-regression on file: " << (baseline->first).c_str() << std::endl; + this->ReportErrorsOff(); + baseline->second = this->RegressionTestBinaryFile(testFilenameBinary.c_str(), + (baseline->first).c_str()); + + multiResult = baseline->second; + ++baseline; + } + if (multiResult != 0) + { + baseline = baselines.rbegin(); + this->ReportErrorsOn(); + baseline->second + = this->RegressionTestBinaryFile(testFilenameBinary.c_str(), + (baseline->first).c_str()); + } + result += multiResult; + } + + return result; +} + +int TestHelper::RegressionTestAllOgr(const StringList& baselineFilenamesOgr, + const StringList& testFilenamesOgr) +{ + int result = 0; + // Creates iterators on baseline filenames vector and test filenames vector + StringListIt itbaselineFilenames = baselineFilenamesOgr.begin(); + StringListIt itTestFilenames = testFilenamesOgr.begin(); + // For each couple of baseline and test file, do the comparison + for (; (itbaselineFilenames != baselineFilenamesOgr.end()) + && (itTestFilenames != testFilenamesOgr.end()); + ++itbaselineFilenames, ++itTestFilenames) + { + std::string baselineFilenameOgr = (*itbaselineFilenames); + std::string testFilenameOgr = (*itTestFilenames); + + std::map<std::string, + int> baselines = + this->RegressionTestBaselines(const_cast<char*>(baselineFilenameOgr.c_str())); + std::map<std::string, int>::reverse_iterator baseline = baselines.rbegin(); + int multiResult = 1; + std::cout << "Number of baseline OGR files: " << baselines.size() << std::endl; + while (baseline != baselines.rend() && (multiResult != 0)) + { + std::cout << "Testing non-regression on OGR file: " << (baseline->first).c_str() << std::endl; + this->ReportErrorsOff(); + baseline->second = this->RegressionTestOgrFile(testFilenameOgr.c_str(), + (baseline->first).c_str(), + m_ToleranceDiffValue); + + multiResult = baseline->second; + ++baseline; + } + if (multiResult != 0) + { + baseline = baselines.rbegin(); + this->ReportErrorsOn(); + baseline->second + = this->RegressionTestOgrFile(testFilenameOgr.c_str(), + (baseline->first).c_str(), + m_ToleranceDiffValue); + } + result += multiResult; + } + + return result; +} + + int TestHelper::RegressionTestAsciiFile(const char * testAsciiFileName, const char * baselineAsciiFileName, const double epsilon, std::vector<std::string> ignoredLines) const { diff --git a/Code/Testing/otbTestHelper.h b/Code/Testing/otbTestHelper.h index 9473112c78..8a45e924e5 100644 --- a/Code/Testing/otbTestHelper.h +++ b/Code/Testing/otbTestHelper.h @@ -40,7 +40,13 @@ namespace otb class /*ITK_EXPORT*/ TestHelper : itk::Object { public: + + typedef std::vector<std::string> StringList; + typedef StringList::const_iterator StringListIt; + TestHelper() : + m_ToleranceDiffValue(0), + m_Epsilon(0), m_EpsilonBoundaryChecking(1.0e-30), m_ReportErrors(false), m_IgnoreLineOrder(false) @@ -48,6 +54,22 @@ public: ~TestHelper(){} + int RegressionTestAllImages(const StringList& baselineFilenamesImage, + const StringList& testFilenamesImage); + + int RegressionTestAllMetaData(const StringList& baselineFilenamesMetaData, + const StringList& testFilenamesMetaData); + + int RegressionTestAllAscii(const StringList& baselineFilenamesAscii, + const StringList& testFilenamesAscii, + const StringList& ignoredLines); + + int RegressionTestAllBinary(const StringList& baselineFilenamesBinary, + const StringList& testFilenamesBinary); + + int RegressionTestAllOgr(const StringList& baselineFilenamesOgr, + const StringList& testFilenamesOgr); + std::map<std::string, int> RegressionTestBaselines(char *baselineFilename) const; int RegressionTestImage(int cpt, const char *testImageFilename, const char *baselineImageFilename, @@ -69,10 +91,9 @@ public: itkSetMacro(IgnoreLineOrder, bool); itkBooleanMacro(IgnoreLineOrder); - void SetEpsilonBoundaryChecking(double epsilonBoundary) - { - m_EpsilonBoundaryChecking = epsilonBoundary; - } + itkSetMacro(ToleranceDiffValue, double); + itkSetMacro(Epsilon, double); + itkSetMacro(EpsilonBoundaryChecking, double); private: bool isNumber(int i) const; @@ -102,6 +123,8 @@ private: static void DumpOGRFeature(FILE* fileid, OGRFeature* feature, char** papszOptions = NULL); static void DumpOGRGeometry(FILE* fileid, OGRGeometry* geometry, const char * pszPrefix, char** papszOptions = NULL); + double m_ToleranceDiffValue; + double m_Epsilon; double m_EpsilonBoundaryChecking; bool m_ReportErrors; bool m_IgnoreLineOrder; diff --git a/Code/Testing/otbTestMain.h b/Code/Testing/otbTestMain.h index 8d2b04fc23..b7488e6f04 100644 --- a/Code/Testing/otbTestMain.h +++ b/Code/Testing/otbTestMain.h @@ -58,8 +58,8 @@ int main(int ac, char* av[]) bool lIgnoreOrder(false); double epsilonBoundary(0.0); - typedef std::vector<std::string> StringList; - typedef StringList::const_iterator StringListIt; + typedef otb::TestHelper::StringList StringList; + typedef otb::TestHelper::StringListIt StringListIt; StringList baselineFilenamesBinary; StringList testFilenamesBinary; @@ -268,7 +268,7 @@ int main(int ac, char* av[]) if (j != StringToTestFunctionMap.end()) { MainFuncPointer f = j->second; - int result, multiResult; + int result; try { // Invoke the test's "main" function. @@ -325,7 +325,8 @@ int main(int ac, char* av[]) // Make a list of possible baselines testHelper.SetIgnoreLineOrder(lIgnoreOrder); - + testHelper.SetToleranceDiffValue(lToleranceDiffValue); // What's the difference + testHelper.SetEpsilon(lEpsilon); // maybe we should consolidate... if (epsilonBoundary != 0.0) { testHelper.SetEpsilonBoundaryChecking(epsilonBoundary); @@ -334,238 +335,32 @@ int main(int ac, char* av[]) // Non regression test for images if ((baselineFilenamesImage.size() > 0) && (testFilenamesImage.size() > 0)) { - // Creates iterators on baseline filenames vector and test filenames vector - StringListIt itbaselineFilenames = baselineFilenamesImage.begin(); - StringListIt itTestFilenames = testFilenamesImage.begin(); - int cpt(1); - // For each couple of baseline and test file, do the comparison - for (; (itbaselineFilenames != baselineFilenamesImage.end()) - && (itTestFilenames != testFilenamesImage.end()); - ++itbaselineFilenames, ++itTestFilenames) - { - std::string baselineFilenameImage = (*itbaselineFilenames); - std::string testFilenameImage = (*itTestFilenames); - - std::map<std::string, int> baselines = - testHelper.RegressionTestBaselines(const_cast<char*>(baselineFilenameImage.c_str())); - std::map<std::string, int>::reverse_iterator baseline = baselines.rbegin(); - multiResult = 1; - std::cout << "Number of baseline images: " << baselines.size() << std::endl; - while (baseline != baselines.rend() && (multiResult != 0)) - { - std::cout << "Testing non-regression on image: " << (baseline->first).c_str() << std::endl; - testHelper.ReportErrorsOff(); - baseline->second = testHelper.RegressionTestImage(cpt, testFilenameImage.c_str(), - (baseline->first).c_str(), - lToleranceDiffValue); - - multiResult = baseline->second; - ++baseline; - } - if (multiResult != 0) - { - baseline = baselines.rbegin(); - testHelper.ReportErrorsOn(); - baseline->second - = testHelper.RegressionTestImage(cpt, testFilenameImage.c_str(), - (baseline->first).c_str(), - lToleranceDiffValue); - } - cpt++; - result += multiResult; - } - + result += testHelper.RegressionTestAllImages(baselineFilenamesImage, testFilenamesImage); } /***********************************************************************************/ // Non-regression test for metadata. if ((baselineFilenamesMetaData.size() > 0) && (testFilenamesMetaData.size() > 0)) { - // Creates iterators on baseline filenames vector and test filenames vector - StringListIt itbaselineFilenames = baselineFilenamesMetaData.begin(); - StringListIt itTestFilenames = testFilenamesMetaData.begin(); - // For each couple of baseline and test file, do the comparison - for (; (itbaselineFilenames != baselineFilenamesMetaData.end()) - && (itTestFilenames != testFilenamesMetaData.end()); - ++itbaselineFilenames, ++itTestFilenames) - { - std::string baselineFilenameImage = (*itbaselineFilenames); - std::string testFilenameImage = (*itTestFilenames); - - std::map<std::string, int> baselines = - testHelper.RegressionTestBaselines(const_cast<char*>(baselineFilenameImage.c_str())); - std::map<std::string, int>::reverse_iterator baseline = baselines.rbegin(); - multiResult = 1; - std::cout << "Number of baseline images: " << baselines.size() << std::endl; - while (baseline != baselines.rend() && (multiResult != 0)) - { - std::cout << "Testing non-regression on image: " << (baseline->first).c_str() << std::endl; - testHelper.ReportErrorsOff(); - baseline->second = testHelper.RegressionTestMetaData(testFilenameImage.c_str(), - (baseline->first).c_str(), - lToleranceDiffValue); - - multiResult = baseline->second; - ++baseline; - } - if (multiResult != 0) - { - baseline = baselines.rbegin(); - testHelper.ReportErrorsOn(); - baseline->second - = testHelper.RegressionTestMetaData(testFilenameImage.c_str(), - (baseline->first).c_str(), - lToleranceDiffValue); - } - result += multiResult; - } + result += testHelper.RegressionTestAllMetaData(baselineFilenamesMetaData, testFilenamesMetaData); } /***********************************************************************************/ // Non regression test for ascii files if ((baselineFilenamesAscii.size() > 0) && (testFilenamesAscii.size() > 0)) { - - // Creates iterators on baseline filenames vector and test filenames vector - StringListIt itbaselineFilenames = baselineFilenamesAscii.begin(); - StringListIt itTestFilenames = testFilenamesAscii.begin(); - StringListIt itIgnoredLines = ignoredLines.begin(); - - // Warning message - if (ignoredLines.size() > 0) - { - std::cout << "The lines containing the expressions "; - for (; itIgnoredLines != ignoredLines.end(); ++itIgnoredLines) - { - std::cout << (*itIgnoredLines) << " "; - } - std::cout << "are not considered" << std::endl; - } - - // For each couple of baseline and test file, do the comparison - for (; (itbaselineFilenames != baselineFilenamesAscii.end()) - && (itTestFilenames != testFilenamesAscii.end()); - ++itbaselineFilenames, ++itTestFilenames) - { - std::string baselineFilenameAscii = (*itbaselineFilenames); - std::string testFilenameAscii = (*itTestFilenames); - - std::map<std::string, - int> baselines = - testHelper.RegressionTestBaselines(const_cast<char*>(baselineFilenameAscii.c_str())); - std::map<std::string, int>::reverse_iterator baseline = baselines.rbegin(); - multiResult = 1; - std::cout << "Number of baseline files: " << baselines.size() << std::endl; - while (baseline != baselines.rend() && (multiResult != 0)) - { - std::cout << "Testing non-regression on file: " << (baseline->first).c_str() << std::endl; - testHelper.ReportErrorsOff(); - baseline->second = testHelper.RegressionTestAsciiFile(testFilenameAscii.c_str(), - (baseline->first).c_str(), - lEpsilon, - ignoredLines); - - multiResult = baseline->second; - ++baseline; - } - if (multiResult != 0) - { - baseline = baselines.rbegin(); - testHelper.ReportErrorsOn(); - baseline->second - = testHelper.RegressionTestAsciiFile(testFilenameAscii.c_str(), - (baseline->first).c_str(), - lEpsilon, - ignoredLines); - } - result += multiResult; - } + result += testHelper.RegressionTestAllAscii(baselineFilenamesAscii, testFilenamesAscii, ignoredLines); } /******************************************************************************/ // Non regression test for binary files if ((baselineFilenamesBinary.size() > 0) && (testFilenamesBinary.size() > 0)) { - // Creates iterators on baseline filenames vector and test filenames vector - StringListIt itbaselineFilenames = baselineFilenamesBinary.begin(); - StringListIt itTestFilenames = testFilenamesBinary.begin(); - - // For each couple of baseline and test file, do the comparison - for (; (itbaselineFilenames != baselineFilenamesBinary.end()) - && (itTestFilenames != testFilenamesBinary.end()); - ++itbaselineFilenames, ++itTestFilenames) - { - std::string baselineFilenameBinary = (*itbaselineFilenames); - std::string testFilenameBinary = (*itTestFilenames); - - std::map<std::string, - int> baselines = - testHelper.RegressionTestBaselines(const_cast<char*>(baselineFilenameBinary.c_str())); - std::map<std::string, int>::reverse_iterator baseline = baselines.rbegin(); - multiResult = 1; - std::cout << "Number of baseline files: " << baselines.size() << std::endl; - while (baseline != baselines.rend() && (multiResult != 0)) - { - std::cout << "Testing non-regression on file: " << (baseline->first).c_str() << std::endl; - testHelper.ReportErrorsOff(); - baseline->second = testHelper.RegressionTestBinaryFile(testFilenameBinary.c_str(), - (baseline->first).c_str()); - - multiResult = baseline->second; - ++baseline; - } - if (multiResult != 0) - { - baseline = baselines.rbegin(); - testHelper.ReportErrorsOn(); - baseline->second - = testHelper.RegressionTestBinaryFile(testFilenameBinary.c_str(), - (baseline->first).c_str()); - } - result += multiResult; - } + result += testHelper.RegressionTestAllBinary(baselineFilenamesBinary, testFilenamesBinary); } /******************************************************************************/ // Non regression test for OGR files if ((baselineFilenamesOgr.size() > 0) && (testFilenamesOgr.size() > 0)) { - // Creates iterators on baseline filenames vector and test filenames vector - StringListIt itbaselineFilenames = baselineFilenamesOgr.begin(); - StringListIt itTestFilenames = testFilenamesOgr.begin(); - // For each couple of baseline and test file, do the comparison - for (; (itbaselineFilenames != baselineFilenamesOgr.end()) - && (itTestFilenames != testFilenamesOgr.end()); - ++itbaselineFilenames, ++itTestFilenames) - { - std::string baselineFilenameOgr = (*itbaselineFilenames); - std::string testFilenameOgr = (*itTestFilenames); - - std::map<std::string, - int> baselines = - testHelper.RegressionTestBaselines(const_cast<char*>(baselineFilenameOgr.c_str())); - std::map<std::string, int>::reverse_iterator baseline = baselines.rbegin(); - multiResult = 1; - std::cout << "Number of baseline OGR files: " << baselines.size() << std::endl; - while (baseline != baselines.rend() && (multiResult != 0)) - { - std::cout << "Testing non-regression on OGR file: " << (baseline->first).c_str() << std::endl; - testHelper.ReportErrorsOff(); - baseline->second = testHelper.RegressionTestOgrFile(testFilenameOgr.c_str(), - (baseline->first).c_str(), - lToleranceDiffValue); - - multiResult = baseline->second; - ++baseline; - } - if (multiResult != 0) - { - baseline = baselines.rbegin(); - testHelper.ReportErrorsOn(); - baseline->second - = testHelper.RegressionTestOgrFile(testFilenameOgr.c_str(), - (baseline->first).c_str(), - lToleranceDiffValue); - } - result += multiResult; - } + result += testHelper.RegressionTestAllOgr(baselineFilenamesOgr, testFilenamesOgr); } } -- GitLab