From 78eb2051d06b6738948d647646a6fde62698bc52 Mon Sep 17 00:00:00 2001
From: peters <peters@irmb.tu-bs.de>
Date: Tue, 29 Jun 2021 13:57:01 +0200
Subject: [PATCH] Add test to UbFileInputASCII and update the string formating.

---
 .../basics/utilities/UbFileInputASCII.cpp     | 39 ++++++++++---------
 .../basics/utilities/UbFileInputASCIITest.cfg |  1 +
 .../basics/utilities/UbFileInputASCIITest.cpp | 18 +++++++++
 3 files changed, 40 insertions(+), 18 deletions(-)
 create mode 100644 src/basics/basics/utilities/UbFileInputASCIITest.cfg
 create mode 100644 src/basics/basics/utilities/UbFileInputASCIITest.cpp

diff --git a/src/basics/basics/utilities/UbFileInputASCII.cpp b/src/basics/basics/utilities/UbFileInputASCII.cpp
index 12ce32ab0..cefa577d2 100644
--- a/src/basics/basics/utilities/UbFileInputASCII.cpp
+++ b/src/basics/basics/utilities/UbFileInputASCII.cpp
@@ -1,5 +1,6 @@
 #include <basics/utilities/UbFileInputASCII.h>
 #include <cstring>
+#include <algorithm>
 
 using namespace std;
 
@@ -138,7 +139,7 @@ bool UbFileInputASCII::containsString(const string &var)
 }
 /*==========================================================*/
 int UbFileInputASCII::readIntegerAfterString(const string &var)
-// last change [10.3.2004] at [9:46]
+// last change [29.6.2021] at [13:52]
 // suchts in einer Datei nach varname und gibt den dahinter stehenden int-Wert zurueck
 // z.B. timesteps 9
 {
@@ -155,14 +156,16 @@ int UbFileInputASCII::readIntegerAfterString(const string &var)
                                                 " wasn't found in " + this->filename));
     } while (strstr(line, var.c_str()) != line); // Ende Schleife, wenn varname ganz in zeile vorkommt
 
-    strcpy(line, (line + strlen(var.c_str()))); // zeile um "varname" kuerzen
-    while ((line[0] == ' ') || (line[0] == '\t'))
-        strcpy(line, (line + 1)); // Whitespaces entfernen
+    std::string temp {line};
+    temp = temp.substr(var.size()); // zeile um "varname" kuerzen
+
+    temp.erase(std::remove(temp.begin(), temp.end(), ' '), temp.end()); // remove whitespace
+    temp.erase(std::remove(temp.begin(), temp.end(), '\t'), temp.end()); // remove tabs
 
-    return (atoi(line)); // Umwandlung in int
+    return std::stoi(temp);
 }
 /*==========================================================*/
-// last change [10.3.2004] at [9:46]
+// last change [29.6.2021] at [13:52]
 // sucht in einer Datei nach varname und gibt den dahinter stehenden int-Wert zurueck
 // z.B. nue 9.5
 double UbFileInputASCII::readDoubleAfterString(const string &var)
@@ -181,14 +184,16 @@ double UbFileInputASCII::readDoubleAfterString(const string &var)
     } while (/*!strncmp(varname,line,sizeof(varname))==0*/ strstr(line, var.c_str()) !=
              line); // Ende Schleife, wenn varname ganz in zeile vorkommt
 
-    strcpy(line, (line + strlen(var.c_str()))); // zeile um "varname" kuerzen
-    while ((line[0] == ' ') || (line[0] == '\t'))
-        strcpy(line, (line + 1)); // Whitespaces entfernen
+    std::string temp {line};
+    temp = temp.substr(var.size()); // zeile um "varname" kuerzen
+
+    temp.erase(std::remove(temp.begin(), temp.end(), ' '), temp.end()); // remove whitespace
+    temp.erase(std::remove(temp.begin(), temp.end(), '\t'), temp.end()); // remove tabs
 
-    return (atof(line)); // Umwandlung in double
+    return std::stod(temp);
 }
 /*==========================================================*/
-//  [9.9.2002]
+// last change [29.6.2021] at [13:52]
 // liefert string-Wert der hinter dem uebergebenen char feld in der datei infile steht
 // zudem wird der wert in die uebergebene variable value uebertragen (falls man das ergebniss als char benoetig)
 string UbFileInputASCII::readStringAfterString(const string &var) //,char *value)
@@ -207,15 +212,13 @@ string UbFileInputASCII::readStringAfterString(const string &var) //,char *value
                                                 " wasn't found in " + this->filename));
     } while (strstr(line, var.c_str()) != line); // Ende Schleife, wenn varname ganz in zeile vorkommt
 
-    strcpy(line, (line + strlen(var.c_str()))); // zeile um "varname" kuerzen
-    while ((line[0] == ' ') || (line[0] == '\t'))
-        strcpy(line, (line + 1)); // Whitespaces entfernen
+    std::string temp {line};
+    temp = temp.substr(var.size()); // zeile um "varname" kuerzen
 
-    char *p;
-    p = strtok(line, " ");  // schneidet alles "ab und inklusive space " nach namen ab
-    p = strtok(line, "\t"); // schneidet alles "ab und inklusive tab   " nach namen ab
+    temp.erase(std::remove(temp.begin(), temp.end(), ' '), temp.end()); // remove whitespace
+    temp.erase(std::remove(temp.begin(), temp.end(), '\t'), temp.end()); // remove tabs
 
-    return static_cast<string>(p); // Umwandlung in string
+    return temp;
 }
 /*==========================================================*/
 // last change [10.3.2004] at [9:46]
diff --git a/src/basics/basics/utilities/UbFileInputASCIITest.cfg b/src/basics/basics/utilities/UbFileInputASCIITest.cfg
new file mode 100644
index 000000000..294d58cd2
--- /dev/null
+++ b/src/basics/basics/utilities/UbFileInputASCIITest.cfg
@@ -0,0 +1 @@
+test = 1
diff --git a/src/basics/basics/utilities/UbFileInputASCIITest.cpp b/src/basics/basics/utilities/UbFileInputASCIITest.cpp
new file mode 100644
index 000000000..87cb5ce58
--- /dev/null
+++ b/src/basics/basics/utilities/UbFileInputASCIITest.cpp
@@ -0,0 +1,18 @@
+#include <gmock/gmock.h>
+#include <filesystem>
+
+#include <basics/utilities/UbFileInputASCII.h>
+
+
+TEST(UbFileInputASCIITest, readIntegerAfterString)
+{
+    // assuming that the config files is stored parallel to this file.
+    std::filesystem::path filePath = __FILE__;
+    filePath.replace_filename("UbFileInputASCIITest.cfg");
+
+    UbFileInputASCII sut {filePath.string()};
+
+    const int actual = sut.readIntegerAfterString("test =");
+
+    EXPECT_THAT(actual, testing::Eq(1));
+}
-- 
GitLab