diff --git a/src/IPhreeqc.cpp b/src/IPhreeqc.cpp index 45c34369..2d3be5a4 100644 --- a/src/IPhreeqc.cpp +++ b/src/IPhreeqc.cpp @@ -369,6 +369,7 @@ int IPhreeqc::GetSelectedOutputColumnCount(void)const int IPhreeqc::GetSelectedOutputCount(void)const { + ASSERT(this->PhreeqcPtr->SelectedOutput_map.size() == this->CurrentSelectedOutputMap.size()); return (int) this->PhreeqcPtr->SelectedOutput_map.size(); } @@ -459,21 +460,27 @@ VRESULT IPhreeqc::GetSelectedOutputValue(int row, int col, VAR* pVAR) { case VR_OK: break; + case VR_INVALIDROW: + this->AddError("GetSelectedOutputValue: VR_INVALIDROW Row index out of range.\n"); + this->update_errors(); + break; + case VR_INVALIDCOL: + this->AddError("GetSelectedOutputValue: VR_INVALIDCOL Column index out of range.\n"); + this->update_errors(); + break; case VR_OUTOFMEMORY: this->AddError("GetSelectedOutputValue: VR_OUTOFMEMORY Out of memory.\n"); + this->update_errors(); break; case VR_BADVARTYPE: this->AddError("GetSelectedOutputValue: VR_BADVARTYPE pVar must be initialized(VarInit) and/or cleared(VarClear).\n"); + this->update_errors(); break; case VR_INVALIDARG: // not possible break; - case VR_INVALIDROW: - this->AddError("GetSelectedOutputValue: VR_INVALIDROW Row index out of range.\n"); - break; - case VR_INVALIDCOL: - this->AddError("GetSelectedOutputValue: VR_INVALIDCOL Column index out of range.\n"); - break; + default: + assert(0); } } else @@ -482,8 +489,8 @@ VRESULT IPhreeqc::GetSelectedOutputValue(int row, int col, VAR* pVAR) v = VR_INVALIDARG; ::sprintf(buffer, "GetSelectedOutputValue: VR_INVALIDARG Invalid selected-output user number %d.\n", this->CurrentSelectedOutputUserNumber); this->AddError(buffer); + this->update_errors(); } - this->update_errors(); return v; } @@ -1124,6 +1131,7 @@ void IPhreeqc::do_run(const char* sz_routine, std::istream* pis, PFN_PRERUN_CALL ASSERT(this->SelectedOutputMap[(*mit).first] == this->CurrentSelectedOutputMap[&(*mit).second]); } } + ASSERT(this->PhreeqcPtr->SelectedOutput_map.size() == this->CurrentSelectedOutputMap.size()); if (this->PhreeqcPtr->title_x != NULL) { ::sprintf(token, "TITLE"); diff --git a/unit/TestIPhreeqc.cpp b/unit/TestIPhreeqc.cpp index 537b2f8e..ef4382ad 100644 --- a/unit/TestIPhreeqc.cpp +++ b/unit/TestIPhreeqc.cpp @@ -4078,3 +4078,83 @@ void TestIPhreeqc::TestMultiSetSelectedOutputFileName(void) CPPUNIT_ASSERT( set1.VerifyExists() ); CPPUNIT_ASSERT( set2.VerifyExists() ); } + +void TestIPhreeqc::TestWissmeier20131203(void) +{ + IPhreeqc obj; + CPPUNIT_ASSERT_EQUAL(0, obj.LoadDatabase("../database/phreeqc.dat")); + + obj.AccumulateLine("selected_output 1"); + obj.AccumulateLine("-totals O"); + obj.AccumulateLine(""); + obj.AccumulateLine("END"); + obj.AccumulateLine("selected_output 1"); + obj.AccumulateLine("-totals H"); + obj.AccumulateLine(""); + obj.AccumulateLine("solution"); + obj.AccumulateLine("END"); + obj.AccumulateLine("selected_output"); + + // original asserts here + CPPUNIT_ASSERT_EQUAL(0, obj.RunAccumulated()); + + CPPUNIT_ASSERT_EQUAL( 1, obj.GetSelectedOutputCount() ); + + CPPUNIT_ASSERT_EQUAL( 9, obj.GetSelectedOutputColumnCount() ); + CPPUNIT_ASSERT_EQUAL( 2, obj.GetSelectedOutputRowCount() ); +} + +void TestIPhreeqc::TestWissmeier20131203_2(void) +{ + IPhreeqc obj; + CPPUNIT_ASSERT_EQUAL(0, obj.LoadDatabase("../database/phreeqc.dat")); + + obj.AccumulateLine("selected_output 22"); + obj.AccumulateLine("-totals O"); + obj.AccumulateLine(""); + obj.AccumulateLine("END"); + obj.AccumulateLine("selected_output 22"); + obj.AccumulateLine("-totals H"); + obj.AccumulateLine(""); + obj.AccumulateLine("solution"); + obj.AccumulateLine("END"); + obj.AccumulateLine("selected_output 22"); + + // original asserts here + CPPUNIT_ASSERT_EQUAL(0, obj.RunAccumulated()); + + CPPUNIT_ASSERT_EQUAL( 1, obj.GetSelectedOutputCount() ); + + CPPUNIT_ASSERT_EQUAL( VR_OK, obj.SetCurrentSelectedOutputUserNumber(22) ); + CPPUNIT_ASSERT_EQUAL( 1, obj.GetSelectedOutputColumnCount() ); + CPPUNIT_ASSERT_EQUAL( 2, obj.GetSelectedOutputRowCount() ); +} + +void TestIPhreeqc::TestWissmeier20131203_3(void) +{ + IPhreeqc obj; + + CPPUNIT_ASSERT_EQUAL(0, obj.LoadDatabase("../database/phreeqc.dat")); + + obj.AccumulateLine("selected_output 1"); + obj.AccumulateLine("-reset false"); + obj.AccumulateLine("-totals O"); + obj.AccumulateLine(""); + obj.AccumulateLine("END"); + obj.AccumulateLine("selected_output 1"); + obj.AccumulateLine("-reset false"); + obj.AccumulateLine("-totals H"); + obj.AccumulateLine(""); + obj.AccumulateLine("solution"); + obj.AccumulateLine("END"); + obj.AccumulateLine("selected_output"); + obj.AccumulateLine("-reset false"); + + // original asserts here + CPPUNIT_ASSERT_EQUAL(0, obj.RunAccumulated()); + + CPPUNIT_ASSERT_EQUAL( 1, obj.GetSelectedOutputCount() ); + + CPPUNIT_ASSERT_EQUAL( 1, obj.GetSelectedOutputColumnCount() ); + CPPUNIT_ASSERT_EQUAL( 2, obj.GetSelectedOutputRowCount() ); +} diff --git a/unit/TestIPhreeqc.h b/unit/TestIPhreeqc.h index d57e1bd0..bef7fb04 100644 --- a/unit/TestIPhreeqc.h +++ b/unit/TestIPhreeqc.h @@ -74,6 +74,9 @@ class TestIPhreeqc : public CppUnit::TestFixture CPPUNIT_TEST( TestGetNthSelectedOutputUserNumber ); CPPUNIT_TEST( TestGetCurrentSelectedOutputUserNumber ); CPPUNIT_TEST( TestMultiSetSelectedOutputFileName ); + CPPUNIT_TEST( TestWissmeier20131203 ); + CPPUNIT_TEST( TestWissmeier20131203_2 ); + CPPUNIT_TEST( TestWissmeier20131203_3 ); CPPUNIT_TEST_SUITE_END(); public: @@ -148,6 +151,9 @@ public: void TestGetNthSelectedOutputUserNumber(void); void TestGetCurrentSelectedOutputUserNumber(void); void TestMultiSetSelectedOutputFileName(void); + void TestWissmeier20131203(void); + void TestWissmeier20131203_2(void); + void TestWissmeier20131203_3(void); protected: void TestFileOnOff(const char* FILENAME, bool output_file_on, bool error_file_on, bool log_file_on, bool selected_output_file_on, bool dump_file_on); diff --git a/unit/TestIPhreeqcLib.cpp b/unit/TestIPhreeqcLib.cpp index 26015c1c..35fa58c6 100644 --- a/unit/TestIPhreeqcLib.cpp +++ b/unit/TestIPhreeqcLib.cpp @@ -4404,4 +4404,89 @@ void TestIPhreeqcLib::TestMultiSetSelectedOutputFileName(void) CPPUNIT_ASSERT( set1.VerifyExists() ); CPPUNIT_ASSERT( set2.VerifyExists() ); +} + +void TestIPhreeqcLib::TestWissmeier20131203(void) +{ + int id = ::CreateIPhreeqc(); + CPPUNIT_ASSERT(id >= 0); + + CPPUNIT_ASSERT_EQUAL(0, ::LoadDatabase(id, "../database/phreeqc.dat")); + + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "selected_output 1")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "-totals O")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "END")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "selected_output 1")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "-totals H")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "solution")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "END")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "selected_output")); + + // original asserts here + CPPUNIT_ASSERT_EQUAL( 0, ::RunAccumulated(id)); + + CPPUNIT_ASSERT_EQUAL( 1, ::GetSelectedOutputCount(id) ); + + CPPUNIT_ASSERT_EQUAL( 9, ::GetSelectedOutputColumnCount(id) ); + CPPUNIT_ASSERT_EQUAL( 2, ::GetSelectedOutputRowCount(id) ); +} + +void TestIPhreeqcLib::TestWissmeier20131203_2(void) +{ + int id = ::CreateIPhreeqc(); + CPPUNIT_ASSERT(id >= 0); + + CPPUNIT_ASSERT_EQUAL(0, ::LoadDatabase(id, "../database/phreeqc.dat")); + + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "selected_output 22")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "-totals O")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "END")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "selected_output 22")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "-totals H")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "solution")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "END")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "selected_output 22")); + + // original asserts here + CPPUNIT_ASSERT_EQUAL( 0, ::RunAccumulated(id)); + + CPPUNIT_ASSERT_EQUAL( 1, ::GetSelectedOutputCount(id) ); + + CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetCurrentSelectedOutputUserNumber(id, 22) ); + CPPUNIT_ASSERT_EQUAL( 1, ::GetSelectedOutputColumnCount(id) ); + CPPUNIT_ASSERT_EQUAL( 2, ::GetSelectedOutputRowCount(id) ); +} + +void TestIPhreeqcLib::TestWissmeier20131203_3(void) +{ + int id = ::CreateIPhreeqc(); + CPPUNIT_ASSERT(id >= 0); + + CPPUNIT_ASSERT_EQUAL(0, ::LoadDatabase(id, "../database/phreeqc.dat")); + + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "selected_output 1")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "-reset false")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "-totals O")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "END")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "selected_output 1")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "-reset false")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "-totals H")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "solution")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "END")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "selected_output")); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::AccumulateLine(id, "-reset false")); + + // original asserts here + CPPUNIT_ASSERT_EQUAL( 0, ::RunAccumulated(id)); + + CPPUNIT_ASSERT_EQUAL( 1, ::GetSelectedOutputCount(id) ); + + CPPUNIT_ASSERT_EQUAL( 1, ::GetSelectedOutputColumnCount(id) ); + CPPUNIT_ASSERT_EQUAL( 2, ::GetSelectedOutputRowCount(id) ); } \ No newline at end of file diff --git a/unit/TestIPhreeqcLib.h b/unit/TestIPhreeqcLib.h index a0b6ccb7..3c41a032 100644 --- a/unit/TestIPhreeqcLib.h +++ b/unit/TestIPhreeqcLib.h @@ -76,6 +76,9 @@ class TestIPhreeqcLib : public CppUnit::TestFixture CPPUNIT_TEST( TestGetNthSelectedOutputUserNumber ); CPPUNIT_TEST( TestGetCurrentSelectedOutputUserNumber ); CPPUNIT_TEST( TestMultiSetSelectedOutputFileName ); + CPPUNIT_TEST( TestWissmeier20131203 ); + CPPUNIT_TEST( TestWissmeier20131203_2 ); + CPPUNIT_TEST( TestWissmeier20131203_3 ); CPPUNIT_TEST_SUITE_END(); public: @@ -152,6 +155,9 @@ public: void TestGetNthSelectedOutputUserNumber(void); void TestGetCurrentSelectedOutputUserNumber(void); void TestMultiSetSelectedOutputFileName(void); + void TestWissmeier20131203(void); + void TestWissmeier20131203_2(void); + void TestWissmeier20131203_3(void); protected: void TestFileOnOff(const char* FILENAME, int output_file_on, int error_file_on, int log_file_on, int selected_output_file_on, int dump_file_on); diff --git a/unit/unit.cpp b/unit/unit.cpp index 667fabe0..d27f9e4b 100644 --- a/unit/unit.cpp +++ b/unit/unit.cpp @@ -92,7 +92,7 @@ int main(int argc, char **argv) #if defined(_MSC_VER) s.stopTimer(); - std::cerr << s.getElapsedTime() << std::endl; + std::cerr << "Elapsed time: " << s.getElapsedTime() << std::endl; #endif return wasSucessful ? 0 : 1;