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