error routines working on windows

git-svn-id: svn://136.177.114.72/svn_GW/IPhreeqc/branches/ErrorHandling@6082 1feff8c3-07ed-0310-ac33-dd36852eb9cd
This commit is contained in:
Scott R Charlton 2012-01-20 00:28:46 +00:00
parent d2ae34e3f4
commit 7139412258
5 changed files with 248 additions and 8 deletions

View File

@ -33,6 +33,7 @@ IPhreeqc::IPhreeqc(void)
, LogStringOn(false)
, ErrorStringOn(true)
, ErrorReporter(0)
, WarningStringOn(true)
, WarningReporter(0)
, SelectedOutput(0)
, SelectedOutputStringOn(false)
@ -1212,10 +1213,13 @@ void IPhreeqc::error_msg(const char *str, bool stop)
ASSERT(!(this->ErrorFileOn ^ (this->error_ostream != 0)));
this->PHRQ_io::error_msg(str);
this->AddError(str);
if (this->ErrorStringOn && this->error_on)
{
this->AddError(str);
}
if (stop)
{
if (this->error_ostream)
if (this->error_ostream && this->error_on)
{
(*this->error_ostream) << "Stopping.\n";
this->error_ostream->flush();
@ -1231,7 +1235,10 @@ void IPhreeqc::warning_msg(const char *str)
std::ostringstream oss;
oss << str << std::endl;
this->AddWarning(oss.str().c_str());
if (this->WarningStringOn)
{
this->AddWarning(oss.str().c_str());
}
}
void IPhreeqc::output_msg(const char * str)

View File

@ -1482,7 +1482,7 @@ Headings
/**
* Sets the error string switch on or off. This switch controls whether or not the data normally sent
* to the error file are stored in a buffer for retrieval. The initial setting after calling
* \ref CreateIPhreeqc is off.
* \ref CreateIPhreeqc is on.
* @param id The instance id returned from \ref CreateIPhreeqc.
* @param output_string_on If non-zero, captures the error output into a string buffer;
* if zero, error output is not captured to a string buffer.

View File

@ -688,7 +688,7 @@ public:
/**
* Sets the error string switch on or off. This switch controls whether or not the data normally sent
* to the error file are stored in a buffer for retrieval. The initial setting is false.
* to the error file are stored in a buffer for retrieval. The initial setting is true.
* @param bValue If true, captures error output into a string buffer; if false, error output is not captured to a string buffer.
* @see GetErrorFileOn, GetErrorString, GetErrorStringOn, GetErrorStringLine, GetErrorStringLineCount, SetErrorFileOn
*/
@ -833,6 +833,7 @@ protected:
std::string ErrorString;
std::vector< std::string > ErrorLines;
bool WarningStringOn;
IErrorReporter *WarningReporter;
std::string WarningString;
std::vector< std::string > WarningLines;

View File

@ -2084,10 +2084,27 @@ void TestIPhreeqcLib::TestGetErrorStringLine(void)
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetSelectedOutputFileOn(n, 0) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetDumpFileOn(n, 0) );
CPPUNIT_ASSERT_EQUAL( 1, ::RunFile(n, "dump") );
#if 0
CPPUNIT_ASSERT_EQUAL( 8, ::GetErrorStringLineCount(n) );
#else
CPPUNIT_ASSERT_EQUAL( 2, ::GetErrorStringLineCount(n) );
CPPUNIT_ASSERT_EQUAL( std::string("ERROR: Gas not found in PHASES data base, Amm(g)."), std::string(::GetErrorStringLine(n, 0)) );
CPPUNIT_ASSERT_EQUAL( std::string("ERROR: Calculations terminating due to input errors."), std::string(::GetErrorStringLine(n, 1)) );
#endif
int line = 0;
#if 0
CPPUNIT_ASSERT_EQUAL( std::string("WARNING: DATABASE keyword is ignored by IPhreeqc."), std::string(::GetErrorStringLine(n, line++)) );
CPPUNIT_ASSERT_EQUAL( std::string("WARNING: Cell-lengths were read for 1 cells. Last value is used till cell 100."), std::string(::GetErrorStringLine(n, line++)) );
CPPUNIT_ASSERT_EQUAL( std::string("WARNING: No dispersivities were read; disp = 0 assumed."), std::string(::GetErrorStringLine(n, line++)) );
#endif
CPPUNIT_ASSERT_EQUAL( std::string("ERROR: Gas not found in PHASES data base, Amm(g)."), std::string(::GetErrorStringLine(n, line++)) );
#if 0
CPPUNIT_ASSERT_EQUAL( std::string("WARNING: Could not find element in database, Amm."), std::string(::GetErrorStringLine(n, line++)) );
CPPUNIT_ASSERT_EQUAL( std::string("\tConcentration is set to zero."), std::string(::GetErrorStringLine(n, line++)) );
#endif
CPPUNIT_ASSERT_EQUAL( std::string("ERROR: Calculations terminating due to input errors."), std::string(::GetErrorStringLine(n, line++)) );
#if 0
CPPUNIT_ASSERT_EQUAL( std::string("Stopping."), std::string(::GetErrorStringLine(n, line++)) );
#endif
if (n >= 0)
{
@ -3264,3 +3281,206 @@ void TestIPhreeqcLib::TestGetLogStringLine(void)
CPPUNIT_ASSERT_EQUAL( std::string(""), std::string(::GetLogStringLine(n, -4)) );
}
void TestIPhreeqcLib::TestSetErrorFileName(void)
{
char ERR_FILENAME[80];
sprintf(ERR_FILENAME, "error.%06d.out", ::rand());
if (::FileExists(ERR_FILENAME))
{
::DeleteFile(ERR_FILENAME);
}
int n = ::CreateIPhreeqc();
CPPUNIT_ASSERT(n >= 0);
CPPUNIT_ASSERT_EQUAL( 0, ::LoadDatabase(n, "phreeqc.dat"));
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "SOLUTION 1") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " pH 7") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " Na 1") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "PHASES") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " Fix_H+") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " H+ = H+") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " log_k 0") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "EQUILIBRIUM_PHASES") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " Fix_H+ -10 HCl 10") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "END") );
// run
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetErrorFileOn(n, 1) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetLogFileOn(n, 0) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetOutputFileOn(n, 0) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetSelectedOutputFileOn(n, 0) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetDumpStringOn(n, 0) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetDumpFileOn(n, 0) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetErrorFileName(n, ERR_FILENAME) );
CPPUNIT_ASSERT_EQUAL( 1, ::RunAccumulated(n) );
CPPUNIT_ASSERT_EQUAL( true, ::FileExists(ERR_FILENAME) );
std::string lines[100];
{
std::ifstream ifs(ERR_FILENAME);
size_t i = 0;
while (i < sizeof(lines)/sizeof(lines[0]) && std::getline(ifs, lines[i]))
{
++i;
}
CPPUNIT_ASSERT_EQUAL( (size_t)84, i );
}
CPPUNIT_ASSERT_EQUAL( std::string("WARNING: Maximum iterations exceeded, 100"), lines[0] );
CPPUNIT_ASSERT_EQUAL( std::string("WARNING: Numerical method failed with this set of convergence parameters."), lines[2] );
CPPUNIT_ASSERT_EQUAL( std::string("ERROR: Numerical method failed on all combinations of convergence parameters"), lines[82] );
CPPUNIT_ASSERT_EQUAL( std::string("Stopping."), lines[83] );
if (::FileExists(ERR_FILENAME))
{
::DeleteFile(ERR_FILENAME);
}
}
void TestIPhreeqcLib::TestErrorStringOnOff(void)
{
int n = ::CreateIPhreeqc();
CPPUNIT_ASSERT(n >= 0);
CPPUNIT_ASSERT_EQUAL( true, ::GetErrorStringOn(n) != 0 );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetErrorStringOn(n, 1) );
CPPUNIT_ASSERT_EQUAL( true, ::GetErrorStringOn(n) != 0 );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetErrorStringOn(n, 0) );
CPPUNIT_ASSERT_EQUAL( false, ::GetErrorStringOn(n) != 0 );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetErrorStringOn(n, 1) );
CPPUNIT_ASSERT_EQUAL( true, ::GetErrorStringOn(n) != 0 );
}
void TestIPhreeqcLib::TestGetErrorString(void)
{
char ERR_FILENAME[80];
sprintf(ERR_FILENAME, "error.%06d.out", ::rand());
if (::FileExists(ERR_FILENAME))
{
::DeleteFile(ERR_FILENAME);
}
CPPUNIT_ASSERT_EQUAL( false, ::FileExists(ERR_FILENAME) );
int n = ::CreateIPhreeqc();
CPPUNIT_ASSERT(n >= 0);
CPPUNIT_ASSERT_EQUAL( 0, ::LoadDatabase(n, "phreeqc.dat"));
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "SOLUTION 1") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " pH 7") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " Na 1") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "PHASES") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " Fix_H+") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " H+ = H+") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " log_k 0") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "EQUILIBRIUM_PHASES") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " Fix_H+ -10 HCl 10") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "END") );
// run
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetErrorFileOn(n, 1) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetErrorStringOn(n, 1) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetDumpFileOn(n, 0) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetDumpStringOn(n, 0) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetLogFileOn(n, 0) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetOutputFileOn(n, 0) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetOutputStringOn(n, 0) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetSelectedOutputFileOn(n, 0) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetErrorFileName(n, ERR_FILENAME) );
CPPUNIT_ASSERT_EQUAL( std::string(ERR_FILENAME), std::string(::GetErrorFileName(n)) );
CPPUNIT_ASSERT_EQUAL( 1, ::RunAccumulated(n) );
CPPUNIT_ASSERT_EQUAL( std::string(ERR_FILENAME), std::string(::GetErrorFileName(n)) );
CPPUNIT_ASSERT_EQUAL( true, ::FileExists(ERR_FILENAME) );
{
#if 0
std::ifstream ifs(ERR_FILENAME);
std::string fline((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
#else
std::string fline("ERROR: Numerical method failed on all combinations of convergence parameters\n");
#endif
std::string sline(::GetErrorString(n));
CPPUNIT_ASSERT( sline.size() > 0 );
CPPUNIT_ASSERT_EQUAL( fline, sline );
}
if (::FileExists(ERR_FILENAME))
{
::DeleteFile(ERR_FILENAME);
}
}
void TestIPhreeqcLib::TestGetErrorStringLineCount(void)
{
int n = ::CreateIPhreeqc();
CPPUNIT_ASSERT(n >= 0);
CPPUNIT_ASSERT_EQUAL( 0, ::GetErrorStringLineCount(n));
CPPUNIT_ASSERT_EQUAL( 0, ::LoadDatabase(n, "phreeqc.dat"));
CPPUNIT_ASSERT_EQUAL( 0, ::GetErrorStringLineCount(n));
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "SOLUTION 1") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " pH 7") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " Na 1") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "PHASES") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " Fix_H+") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " H+ = H+") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " log_k 0") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "EQUILIBRIUM_PHASES") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " Fix_H+ -10 HCl 10") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "END") );
CPPUNIT_ASSERT_EQUAL( true, ::GetErrorStringOn(n) != 0 );
CPPUNIT_ASSERT_EQUAL( 1, ::RunAccumulated(n) );
CPPUNIT_ASSERT_EQUAL( 1, ::GetErrorStringLineCount(n) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "SOLUTION 1") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " pH 7") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " Na 1") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "PHASES") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " Fix_H+") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " H+ = H+") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " log_k 0") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "EQUILIBRIUM_PHASES") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " Fix_H+ -10 HCl 10") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "END") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetErrorStringOn(n, 1) );
CPPUNIT_ASSERT_EQUAL( 1, ::RunAccumulated(n) );
CPPUNIT_ASSERT_EQUAL( 1, ::GetErrorStringLineCount(n) );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "SOLUTION 1") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " pH 7") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " Na 1") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "PHASES") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " Fix_H+") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " H+ = H+") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " log_k 0") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "EQUILIBRIUM_PHASES") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, " Fix_H+ -10 HCl 10") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::AccumulateLine(n, "END") );
CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetErrorStringOn(n, 0) );
CPPUNIT_ASSERT_EQUAL( 1, ::RunAccumulated(n) );
CPPUNIT_ASSERT_EQUAL( 0, ::GetErrorStringLineCount(n) );
}

View File

@ -40,7 +40,9 @@ class TestIPhreeqcLib : public CppUnit::TestFixture
CPPUNIT_TEST( TestGetDumpStringLine );
CPPUNIT_TEST( TestGetComponentCount );
CPPUNIT_TEST( TestGetComponent );
#if 1
CPPUNIT_TEST( TestGetErrorStringLine );
#endif
CPPUNIT_TEST( TestErrorFileOn );
CPPUNIT_TEST( TestLogFileOn );
CPPUNIT_TEST( TestGetWarningStringLine );
@ -58,6 +60,10 @@ class TestIPhreeqcLib : public CppUnit::TestFixture
CPPUNIT_TEST( TestGetLogStringLineCount );
CPPUNIT_TEST( TestGetLogStringLine );
CPPUNIT_TEST( TestSetErrorFileName );
CPPUNIT_TEST( TestErrorStringOnOff );
CPPUNIT_TEST( TestGetErrorString );
CPPUNIT_TEST( TestGetErrorStringLineCount );
CPPUNIT_TEST_SUITE_END();
public:
@ -115,6 +121,12 @@ public:
void TestGetLogString(void);
void TestGetLogStringLineCount(void);
void TestGetLogStringLine(void);
void TestSetErrorFileName(void);
void TestErrorStringOnOff(void);
void TestGetErrorString(void);
void TestGetErrorStringLineCount(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);
};