diff --git a/gtest/FileTest.cpp b/gtest/FileTest.cpp index 3b886b3c..74685e7a 100644 --- a/gtest/FileTest.cpp +++ b/gtest/FileTest.cpp @@ -153,3 +153,19 @@ size_t FileTest::Size(void) { return ::FileSize(_fn.c_str()); } + +size_t FileTest::LineCount(void) +{ + size_t nlines = 0; + if (::FileExists(_fn.c_str())) + { + std::ifstream ifs(_fn.c_str(), std::ifstream::in); + std::string line; + while (std::getline(ifs, line)) + { + ++nlines; + } + ifs.close(); + } + return nlines; +} diff --git a/gtest/FileTest.h b/gtest/FileTest.h index 398380d0..de595fdc 100644 --- a/gtest/FileTest.h +++ b/gtest/FileTest.h @@ -25,6 +25,7 @@ public: bool Exists(void); int Delete(void); size_t Size(void); + size_t LineCount(void); protected: std::string _fn; diff --git a/gtest/TestIPhreeqc.cpp b/gtest/TestIPhreeqc.cpp index 2fa44e5e..448aa985 100644 --- a/gtest/TestIPhreeqc.cpp +++ b/gtest/TestIPhreeqc.cpp @@ -3261,12 +3261,88 @@ TEST(TestIPhreeqc, TestGetSelectedOutputStringLineCount) TEST(TestIPhreeqc, TestGetSelectedOutputStringLineCountMultipleRuns) { IPhreeqc obj; + int retval = 0; - obj.LoadDatabase("llnl.dat"); + ASSERT_EQ(0, obj.LoadDatabase("llnl.dat")); ASSERT_EQ(false, obj.GetSelectedOutputStringOn()); obj.SetSelectedOutputStringOn(true); ASSERT_EQ(true, obj.GetSelectedOutputStringOn()); + retval = obj.RunString(R"( + SOLUTION 1 + C 1 + Ca 1 + Na 1 + + EQUILIBRIUM_PHASES + calcite 0 0.01 + + SELECTED_OUTPUT + -totals C Ca Na + )"); + ASSERT_EQ(0, retval); + + ASSERT_EQ(3, obj.GetSelectedOutputStringLineCount()); // header + i_soln + react + + retval = obj.RunString(R"( + SOLUTION 1 + C 2 + Ca 2 + Na 2 + )"); + ASSERT_EQ(0, retval); + + ASSERT_EQ(2, obj.GetSelectedOutputStringLineCount()); // header + i_soln +} + +TEST(TestIPhreeqc, TestSelectedOutputFileMultipleRuns) +{ + FileTest selout("TestSelectedOutputFileMultipleRuns.sel"); + ASSERT_TRUE(selout.RemoveExisting()); + + IPhreeqc obj; + int retval = 0; + + ASSERT_EQ(0, obj.LoadDatabase("llnl.dat")); + + ASSERT_EQ(false, obj.GetSelectedOutputFileOn()); + obj.SetSelectedOutputFileOn(true); + ASSERT_EQ(true, obj.GetSelectedOutputFileOn()); + + retval = obj.RunString(R"( + SOLUTION 1 + C 1 + Ca 1 + Na 1 + + EQUILIBRIUM_PHASES + calcite 0 0.01 + + SELECTED_OUTPUT + -file TestSelectedOutputFileMultipleRuns.sel + -totals C Ca Na + )"); + ASSERT_EQ(0, retval); + + ASSERT_EQ(3, selout.LineCount()); // header + i_soln + react + + retval = obj.RunString(R"( + SOLUTION 1 + C 2 + Ca 2 + Na 2 + )"); + ASSERT_EQ(0, retval); + + ASSERT_EQ(2, selout.LineCount()); // header + i_soln +} + +TEST(TestIPhreeqc, TestGetSelectedOutputRowCountMultipleRuns) +{ + IPhreeqc obj; + + ASSERT_EQ(0, obj.LoadDatabase("llnl.dat")); + obj.RunString(R"( SOLUTION 1 C 1 @@ -3280,7 +3356,7 @@ TEST(TestIPhreeqc, TestGetSelectedOutputStringLineCountMultipleRuns) -totals C Ca Na )"); - ASSERT_EQ(3, obj.GetSelectedOutputStringLineCount()); // header + i_soln + react + ASSERT_EQ(3, obj.GetSelectedOutputRowCount()); // header + i_soln + react obj.RunString(R"( SOLUTION 1 @@ -3288,7 +3364,7 @@ TEST(TestIPhreeqc, TestGetSelectedOutputStringLineCountMultipleRuns) Ca 2 Na 2 )"); - ASSERT_EQ(2, obj.GetSelectedOutputStringLineCount()); // header + i_soln + ASSERT_EQ(2, obj.GetSelectedOutputRowCount()); // header + i_soln } TEST(TestIPhreeqc, TestGetSelectedOutputStringLine) diff --git a/src/IPhreeqc.cpp b/src/IPhreeqc.cpp index 4212aee8..11f57a0a 100644 --- a/src/IPhreeqc.cpp +++ b/src/IPhreeqc.cpp @@ -1103,17 +1103,8 @@ void IPhreeqc::UnLoadDatabase(void) delete (*itt).second; } this->SelectedOutputMap.clear(); - - std::map< int, std::string >::iterator mit = this->SelectedOutputStringMap.begin(); - for (; mit != this->SelectedOutputStringMap.begin(); ++mit) - { - (*mit).second.clear(); - } - std::map< int, std::vector< std::string > >::iterator it = this->SelectedOutputLinesMap.begin(); - for (; it != this->SelectedOutputLinesMap.begin(); ++it) - { - (*it).second.clear(); - } + this->SelectedOutputStringMap.clear(); + this->SelectedOutputLinesMap.clear(); // clear dump string @@ -1164,6 +1155,8 @@ void IPhreeqc::check_database(const char* sz_routine) delete (*it).second; } this->SelectedOutputMap.clear(); + this->SelectedOutputStringMap.clear(); + this->SelectedOutputLinesMap.clear(); // release this->LogString.clear(); @@ -1171,18 +1164,6 @@ void IPhreeqc::check_database(const char* sz_routine) this->OutputString.clear(); this->OutputLines.clear(); - // clear selected_output string storage - // GetSelectedOutputStringLine and GetSelectedOutputString - std::map< int, std::string >::iterator mit = SelectedOutputStringMap.begin(); - for (; mit != SelectedOutputStringMap.end(); ++mit) - { - (*mit).second.clear(); - } - std::map< int, std::vector< std::string > >::iterator lit = this->SelectedOutputLinesMap.begin(); - for (; lit != this->SelectedOutputLinesMap.end(); ++lit) - { - (*lit).second.clear(); - } if (!this->DatabaseLoaded) {