From 4b428a8d8c7abcdfc7b11330016bde12b170f6e0 Mon Sep 17 00:00:00 2001 From: Mickael Savinaud <mickael.savinaud@c-s.fr> Date: Tue, 22 Mar 2011 17:06:32 +0100 Subject: [PATCH] ENH: add white spaces around some special character to simplify numerical comparisoncd --- Code/Testing/otbTestHelper.cxx | 50 ++++- Code/Testing/otbTestHelper.h | 1 + ...tbCompareAsciiTestsEpsilon3_WhiteSpace.cxx | 174 +++++++++--------- 3 files changed, 131 insertions(+), 94 deletions(-) diff --git a/Code/Testing/otbTestHelper.cxx b/Code/Testing/otbTestHelper.cxx index 6c10def615..7025e1d984 100644 --- a/Code/Testing/otbTestHelper.cxx +++ b/Code/Testing/otbTestHelper.cxx @@ -1207,6 +1207,42 @@ bool TestHelper::isHexaPointerAddress(std::string str) const return result; } +void TestHelper::AddWhiteSpace(std::string strIn, std::string &strOut) const +{ + std::string strLine = strIn; + + std::vector<std::string> keys; + keys.push_back("["); + keys.push_back("]"); + keys.push_back("("); + keys.push_back(")"); + keys.push_back(","); + keys.push_back("="); + keys.push_back(":"); + + std::vector<std::string> keysOut; + keysOut.push_back("[ "); + keysOut.push_back(" ]"); + keysOut.push_back("( "); + keysOut.push_back(" )"); + keysOut.push_back(" , "); + keysOut.push_back(" = "); + keysOut.push_back(" : "); + + for (unsigned int it = 0; it < keys.size(); it++) + { + size_t found; + found=strLine.find(keys[it]); + while (found!=string::npos) + { + strLine.replace(found, 1, keysOut[it]); + found=strLine.find(keys[it], found + keysOut[it].size()); + } + } + + strOut = strLine; +} + bool TestHelper::CompareLines(std::string strfileref, std::string strfiletest, int& nbdiff, @@ -1216,9 +1252,16 @@ bool TestHelper::CompareLines(std::string strfileref, std::vector<std::string>& listStrDiffLineFileTest, double epsilon) const { + // add white spaces + std::string strLineRef; + std::string strLineTest; + AddWhiteSpace(strfileref, strLineRef); + AddWhiteSpace(strfiletest, strLineTest); + //otbMsgDevMacro(<<"Comparing (after replace) : " << strLineRef << " vs " << strLineTest); + otb::StringStream buffstreamRef, buffstreamTest; - buffstreamRef << strfileref; - buffstreamTest << strfiletest; + buffstreamRef << strLineRef; + buffstreamTest << strLineTest; //Number of differences in the current line bool differenceFoundInCurrentLine = false; @@ -1268,6 +1311,9 @@ bool TestHelper::CompareLines(std::string strfileref, float vRef = atof(strRef.c_str()); float vTest = atof(strTest.c_str()); float vNorm = (vcl_abs(vRef) + vcl_abs(vTest))/2; + //otbMsgDevMacro(<< "numerical comparison: " <<vRef << " vs " <<vTest << " -> " + // << "vNorm= " << vNorm << ", " << vcl_abs(vRef-vTest) << " > "<< epsilon * vNorm + // << "? -> " << (vcl_abs(vRef-vTest) > epsilon * vNorm )); if ((vNorm > m_EpsilonBoundaryChecking) //make sure that either the test of the ref are non 0 && (vcl_abs(vRef-vTest) > epsilon * vNorm)) //epsilon as relative error { diff --git a/Code/Testing/otbTestHelper.h b/Code/Testing/otbTestHelper.h index c7943d1e45..995fbbaacb 100644 --- a/Code/Testing/otbTestHelper.h +++ b/Code/Testing/otbTestHelper.h @@ -117,6 +117,7 @@ private: bool m_ReportErrors; bool m_IgnoreLineOrder; + void AddWhiteSpace(std::string strIn, std::string &strOut) const; }; } diff --git a/Testing/Code/TestSystem/otbCompareAsciiTestsEpsilon3_WhiteSpace.cxx b/Testing/Code/TestSystem/otbCompareAsciiTestsEpsilon3_WhiteSpace.cxx index e08f22fd38..357c4eaf1f 100644 --- a/Testing/Code/TestSystem/otbCompareAsciiTestsEpsilon3_WhiteSpace.cxx +++ b/Testing/Code/TestSystem/otbCompareAsciiTestsEpsilon3_WhiteSpace.cxx @@ -23,98 +23,88 @@ int otbCompareAsciiTestsEpsilon3_WhiteSpace(int argc, char * argv[]) { - /*if (argc != 3) - { - std::cerr << "Usage: " << argv[0]; - std::cerr << " referenceFile testFile" << std::endl; - return EXIT_FAILURE; - } - - std::ofstream fileRef; - fileRef.open(argv[1]); - fileRef << "1\n"; - fileRef << "1\n"; - fileRef << "1\n"; - fileRef << "2\n"; - fileRef << "2\n"; - fileRef << "2\n"; - fileRef << "3\n"; - fileRef << "3\n"; - fileRef << "3\n"; - fileRef << "4\n"; - fileRef << "4\n"; - fileRef << "4\n"; - fileRef << "A = 10\n"; - fileRef << "A = 11\n"; - fileRef << "A = 12\n"; - fileRef << "B =10\n"; - fileRef << "B =11\n"; - fileRef << "B =12\n"; - fileRef << "C= 10\n"; - fileRef << "C= 11\n"; - fileRef << "C= 12\n"; - fileRef << "D=10\n"; - fileRef << "D=11\n"; - fileRef << "D=12\n"; - fileRef << "E = 10\n"; - fileRef << "E = 11\n"; - fileRef << "E = 12\n"; - fileRef << "F = [20, 21, 22]\n"; - fileRef << "F = [20, 21, 22]\n"; - fileRef << "F = [20, 21, 22]\n"; - fileRef << "G = [20, 21, 22]\n"; - fileRef << "G = [20, 21, 22]\n"; - fileRef << "G = [20, 21, 22]\n"; - fileRef << "H = [ 20 , 21 , 22 ]\n"; - fileRef << "H = [ 20 , 21 , 22 ]\n"; - fileRef << "H = [ 20 , 21 , 22 ]\n"; - fileRef << "I = [120, 121, 122]\n"; - fileRef << "I = [120, 121, 122]\n"; - fileRef << "I = [120, 121, 122]\n"; - fileRef.close(); - - std::ofstream fileTest; - fileTest.open(argv[2]); - fileTest << "1\n"; - fileTest << "1.001\n"; - fileTest << "1.010\n"; - fileTest << " 2\n"; - fileTest << " 2.001\n"; - fileTest << " 2.010\n"; - fileTest << "3\n "; - fileTest << "3.001 \n"; - fileTest << "3.010 \n"; - fileTest << " 4 \n "; - fileTest << " 4.001 \n"; - fileTest << " 4.010 \n"; - fileTest << "A = 10\n"; - fileTest << "A = 11.001\n"; - fileTest << "A = 12.010\n"; - fileTest << "B =10\n"; - fileTest << "B =11.001\n"; - fileTest << "B =12.010\n"; - fileTest << "C= 10\n"; - fileTest << "C= 11.001\n"; - fileTest << "C= 12.010\n"; - fileTest << "D=10\n"; - fileTest << "D=11.001\n"; - fileTest << "D=12.010\n"; - fileTest << "E = 10\n"; - fileTest << "E = 11.001\n"; - fileTest << "E = 12.010\n"; - fileTest << "F = [20, 21, 22]\n"; - fileTest << "F = [20.001, 21.001, 22.001]\n"; - fileTest << "F = [20.010, 21.010, 22.010]\n"; - fileTest << "G = [20, 21, 22]\n"; - fileTest << "G = [20.001, 21.001, 22.001]\n"; - fileTest << "G = [20.010, 21.010, 22.010]\n"; - fileTest << "H = [ 20 , 21 , 22 ]\n"; - fileTest << "H = [ 20.001 , 21.001 , 22.001 ]\n"; - fileTest << "H = [ 20.010 , 21.010 , 22.010 ]\n"; - fileTest << "I = [320, 321, 322]\n"; - fileTest << "I = [120, 321, 122]\n"; - fileTest << "I = [120, 320, 122]\n"; - fileTest.close(); + std::cout << "ASCII COMPARISON TEST :" << std::endl; + + std::cout << "nb of differences should be equal to 30 (for more details see the test function)" << std::endl; + + /*std::cout << "L1 expected = true and output = true" << std::endl; + std::cout << "L2 expected = true and output = true" << std::endl; + std::cout << "L3 expected = false and output = false" << std::endl; + std::cout << "L4 expected = true and output = true" << std::endl; + std::cout << "L5 expected = true and output = true" << std::endl; + std::cout << "L6 expected = false and output = false" << std::endl; + std::cout << "L7 expected = true and output = true" << std::endl; + std::cout << "L8 expected = true and output = true" << std::endl; + std::cout << "L9 expected = false and output = false" << std::endl; + std::cout << "L10 expected = true and output = true" << std::endl; + std::cout << "L11 expected = true and output = true" << std::endl; + std::cout << "L12 expected = false and output = false" << std::endl; + + // A + std::cout << "L13 expected = true and output = true" << std::endl; + std::cout << "L14 expected = true and output = true" << std::endl; + std::cout << "L15 expected = false and output = false" << std::endl; + + // B + std::cout << "L16 expected = true and output = true" << std::endl; + std::cout << "L17 expected = true and output = true" << std::endl; + std::cout << "L18 expected = false and output = false" << std::endl; + + // C + std::cout << "L19 expected = true and output = true" << std::endl; + std::cout << "L20 expected = true and output = true" << std::endl; + std::cout << "L21 expected = false and output = false" << std::endl; + + // D + std::cout << "L22 expected = true and output = true" << std::endl; + std::cout << "L23 expected = true and output = true" << std::endl; + std::cout << "L24 expected = false and output = false" << std::endl; + + // E + std::cout << "L25 expected = true and output = true" << std::endl; + std::cout << "L26 expected = true and output = true" << std::endl; + std::cout << "L27 expected = false and output = false" << std::endl; + + // F + std::cout << "L29: expected = true and output = true" << std::endl; + std::cout << "L30: expected = true and output = true" << std::endl; + std::cout << "L31: expected = false and output = false" << std::endl; + std::cout << "L32: expected = false and output = false" << std::endl; + std::cout << "L33: expected = false and output = false" << std::endl; + std::cout << "L34: expected = false and output = false" << std::endl; + std::cout << "L35: expected = false and output = false" << std::endl; + + // G + std::cout << "L37: expected = true and output = true" << std::endl; + std::cout << "L38: expected = true and output = true" << std::endl; + std::cout << "L39: expected = false and output = false" << std::endl; + std::cout << "L40: expected = false and output = false" << std::endl; + std::cout << "L41: expected = false and output = false" << std::endl; + std::cout << "L42: expected = false and output = false" << std::endl; + std::cout << "L43: expected = false and output = false" << std::endl; + + // H + std::cout << "L45: expected = true and output = true" << std::endl; + std::cout << "L46: expected = true and output = true" << std::endl; + std::cout << "L44: expected = false and output = false" << std::endl; + std::cout << "L48: expected = false and output = false" << std::endl; + std::cout << "L49: expected = false and output = false" << std::endl; + std::cout << "L50: expected = false and output = false" << std::endl; + std::cout << "L51: expected = false and output = false" << std::endl; + + // I + std::cout << "L53: expected = true and output = true" << std::endl; + std::cout << "L54: expected = true and output = true" << std::endl; + std::cout << "L55: expected = false and output = false" << std::endl; + std::cout << "L56: expected = false and output = false" << std::endl; + std::cout << "L57: expected = false and output = false" << std::endl; + std::cout << "L58: expected = false and output = false" << std::endl; + std::cout << "L59: expected = false and output = false" << std::endl; + + // J + std::cout << "L61: expected = false and output = false" << std::endl; + std::cout << "L62: expected = false and output = false" << std::endl; + std::cout << "L63: expected = false and output = false" << std::endl; */ return EXIT_SUCCESS; } -- GitLab