From ce2cfdf6d50254473ec4400abc1f2c0b6eedc74d Mon Sep 17 00:00:00 2001 From: Scott R Charlton Date: Thu, 5 Sep 2013 06:39:13 +0000 Subject: [PATCH] added SetCurrentSelectedOutputUserNumber GetCurrentSelectedOutputUserNumber GetSelectedOutputCount GetNthSelectedOutputUserNumber git-svn-id: svn://136.177.114.72/svn_GW/IPhreeqc/trunk@8008 1feff8c3-07ed-0310-ac33-dd36852eb9cd --- src/IPhreeqc.cpp | 34 +++- src/IPhreeqc.h | 88 ++++++++- src/IPhreeqc.hpp | 185 ++++++++++-------- src/IPhreeqcLib.cpp | 59 +++++- unit/TestIPhreeqc.cpp | 381 +++++++++++++++++++++++++++---------- unit/TestIPhreeqc.h | 6 + unit/TestIPhreeqcLib.cpp | 399 ++++++++++++++++++++++++++++++++++++++- unit/TestIPhreeqcLib.h | 8 + 8 files changed, 965 insertions(+), 195 deletions(-) diff --git a/src/IPhreeqc.cpp b/src/IPhreeqc.cpp index 6c14abb4..bd272336 100644 --- a/src/IPhreeqc.cpp +++ b/src/IPhreeqc.cpp @@ -169,6 +169,11 @@ size_t IPhreeqc::GetComponentCount(void) return this->Components.size(); } +int IPhreeqc::GetCurrentSelectedOutputUserNumber(void)const +{ + return this->CurrentSelectedOutputUserNumber; +} + const char* IPhreeqc::GetDumpFileName(void)const { return this->DumpFileName.c_str(); @@ -295,6 +300,21 @@ bool IPhreeqc::GetLogStringOn(void)const return this->LogStringOn; } +int IPhreeqc::GetNthSelectedOutputUserNumber(int n)const +{ + int nth = VR_INVALIDARG; + std::map< int, SelectedOutput >::const_iterator ci = this->PhreeqcPtr->SelectedOutput_map.begin(); + for (int i = 0; ci != this->PhreeqcPtr->SelectedOutput_map.end(); ++ci, ++i) + { + if (i == n) + { + nth = (*ci).first; + break; + } + } + return nth; +} + const char* IPhreeqc::GetOutputFileName(void)const { return this->OutputFileName.c_str(); @@ -345,6 +365,11 @@ int IPhreeqc::GetSelectedOutputColumnCount(void)const return 0; } +int IPhreeqc::GetSelectedOutputCount(void)const +{ + return this->PhreeqcPtr->SelectedOutput_map.size(); +} + const char* IPhreeqc::GetSelectedOutputFileName(void)const { static const char empty[] = ""; @@ -784,9 +809,14 @@ void IPhreeqc::SetBasicFortranCallback(double (*fcn)(double *x1, double *x2, cha this->PhreeqcPtr->register_fortran_basic_callback(fcn); } -void IPhreeqc::SetCurrentSelectedOutputUserNumber(int n) +VRESULT IPhreeqc::SetCurrentSelectedOutputUserNumber(int n) { - this->CurrentSelectedOutputUserNumber = n; + if (this->PhreeqcPtr->SelectedOutput_map.find(n) != this->PhreeqcPtr->SelectedOutput_map.end()) + { + this->CurrentSelectedOutputUserNumber = n; + return VR_OK; + } + return VR_INVALIDARG; } void IPhreeqc::SetDumpFileName(const char *filename) diff --git a/src/IPhreeqc.h b/src/IPhreeqc.h index 3720f378..708945fb 100644 --- a/src/IPhreeqc.h +++ b/src/IPhreeqc.h @@ -69,7 +69,7 @@ extern "C" { * Internally used to create an error condition. * @param id The instance id returned from \ref CreateIPhreeqc. * @param error_msg The error message to display. - * @returns The current error count if successful; otherwise a negative value indicates an error occured (see \ref IPQ_RESULT). + * @return The current error count if successful; otherwise a negative value indicates an error occured (see \ref IPQ_RESULT). * @see GetErrorString, GetErrorStringLine, GetErrorStringLineCount, OutputErrorString * @par Fortran90 Interface: * @htmlonly @@ -92,7 +92,7 @@ extern "C" { * Internally used to create a warning condition. * @param id The instance id returned from \ref CreateIPhreeqc. * @param warn_msg The warning message to display. - * @returns The current warning count if successful; otherwise a negative value indicates an error occured (see \ref IPQ_RESULT). + * @return The current warning count if successful; otherwise a negative value indicates an error occured (see \ref IPQ_RESULT). * @see GetWarningString, GetWarningStringLine, GetWarningStringLineCount, OutputWarningString * @par Fortran90 Interface: * @htmlonly @@ -242,6 +242,25 @@ extern "C" { */ IPQ_DLL_EXPORT int GetComponentCount(int id); +/** + * Sets the currently active SELECTED_OUTPUT user number for use in subsequent calls to GetSelectedOutputXXX routines. + * The initial setting after calling \ref CreateIPhreeqc is 1. + * @param id The instance id returned from \ref CreateIPhreeqc. + * @return The current active SELECTED_OUTPUT user number. + * @see GetNthSelectedOutputUserNumber, GetSelectedOutputCount, SetCurrentSelectedOutputUserNumber + * @par Fortran90 Interface: + * @htmlonly + * + *
+ *  FUNCTION GetCurrentSelectedOutputUserNumber(ID)
+ *    INTEGER(KIND=4),  INTENT(IN)  :: ID
+ *    INTEGER(KIND=4)               :: GetCurrentSelectedOutputUserNumber
+ *  END FUNCTION GetCurrentSelectedOutputUserNumber
+ *  
+ *
+ * @endhtmlonly + */ + IPQ_DLL_EXPORT int GetCurrentSelectedOutputUserNumber(int id); /** * Retrieves the name of the dump file. This file name is used if not specified within DUMP input. @@ -493,7 +512,6 @@ extern "C" { */ IPQ_DLL_EXPORT int GetErrorStringOn(int id); - /** * Retrieves the name of the log file. The default name is phreeqc.id.log. * @param id The instance id returned from \ref CreateIPhreeqc. @@ -624,6 +642,27 @@ extern "C" { IPQ_DLL_EXPORT int GetLogStringOn(int id); +/** + * Retrieves the nth user number of the currently defined SELECTED_OUTPUT keyword blocks. + * @param id The instance id returned from \ref CreateIPhreeqc. + * @return The nth defined user number; a negative value indicates an error occured. + * @see GetCurrentSelectedOutputUserNumber, GetSelectedOutputCount, SetCurrentSelectedOutputUserNumber + * @par Fortran90 Interface: + * @htmlonly + * (Note: N is one-based for the Fortran interface.) + * + *
+ *  FUNCTION GetNthSelectedOutputUserNumber(ID)
+ *    INTEGER(KIND=4),  INTENT(IN)  :: ID
+ *    INTEGER(KIND=4),  INTENT(IN)  :: N
+ *    INTEGER(KIND=4)               :: GetNthSelectedOutputUserNumber
+ *  END FUNCTION GetNthSelectedOutputUserNumber
+ *  
+ *
+ * @endhtmlonly + */ + IPQ_DLL_EXPORT int GetNthSelectedOutputUserNumber(int id, int n); + /** * Retrieves the name of the output file. The default name is phreeqc.id.out. * @param id The instance id returned from \ref CreateIPhreeqc. @@ -768,6 +807,25 @@ extern "C" { */ IPQ_DLL_EXPORT int GetSelectedOutputColumnCount(int id); +/** + * Retrieves the count of SELECTED_OUTPUT blocks that are currently defined. + * @param id The instance id returned from \ref CreateIPhreeqc. + * @return The number of SELECTED_OUTPUT blocks. + * @see GetCurrentSelectedOutputUserNumber, GetNthSelectedOutputUserNumber, SetCurrentSelectedOutputUserNumber + * @par Fortran90 Interface: + * @htmlonly + * + *
+ *  FUNCTION GetSelectedOutputCount(ID)
+ *    INTEGER(KIND=4),  INTENT(IN)  :: ID
+ *    INTEGER(KIND=4)               :: GetSelectedOutputCount
+ *  END FUNCTION GetSelectedOutputCount
+ *  
+ *
+ * @endhtmlonly + */ + IPQ_DLL_EXPORT int GetSelectedOutputCount(int id); + /** * Retrieves the name of the selected output file. This file name is used if not specified within SELECTED_OUTPUT input. @@ -1573,6 +1631,30 @@ Headings IPQ_DLL_EXPORT IPQ_RESULT SetBasicFortranCallback(int id, double (*fcn)(double *x1, double *x2, char *str, int l)); +/** + * Sets the currently active SELECTED_OUTPUT user number for use in subsequent calls to GetSelectedOutputXXX routines. + * The initial setting after calling \ref CreateIPhreeqc is 1. + * @param id The instance id returned from \ref CreateIPhreeqc. + * @param n The user number as specified in the SELECTED_OUTPUT block. + * @retval IPQ_OK Success. + * @retval IPQ_BADINSTANCE The given id is invalid. + * @retval IPQ_INVALIDARG The given user number is invalid. + * @see GetSelectedOutputColumnCount, GetSelectedOutputFileName, GetSelectedOutputRowCount, GetSelectedOutputString, GetSelectedOutputStringLine, GetSelectedOutputStringLineCount, GetSelectedOutputValue + * @par Fortran90 Interface: + * @htmlonly + * + *
+ *  FUNCTION SetCurrentSelectedOutputUserNumber(ID,N)
+ *    INTEGER(KIND=4),  INTENT(IN)  :: ID
+ *    INTEGER(KIND=4),  INTENT(IN)  :: N
+ *    INTEGER(KIND=4)               :: SetCurrentSelectedOutputUserNumber
+ *  END FUNCTION SetCurrentSelectedOutputUserNumber
+ *  
+ *
+ * @endhtmlonly + */ + IPQ_DLL_EXPORT IPQ_RESULT SetCurrentSelectedOutputUserNumber(int id, int n); + /** * Sets the name of the dump file. This file name is used if not specified within DUMP input. * The default value is dump.id.out. diff --git a/src/IPhreeqc.hpp b/src/IPhreeqc.hpp index da0f48c1..fdfd894d 100644 --- a/src/IPhreeqc.hpp +++ b/src/IPhreeqc.hpp @@ -47,9 +47,9 @@ class IPQ_DLL_EXPORT IPhreeqc : public PHRQ_io public: /** * Constructor. - * \anchor IPhreeqc_cpp - * @par Example: - * \include IPhreeqc.cpp + * \anchor IPhreeqc_cpp + * @par Example: + * \include IPhreeqc.cpp */ IPhreeqc(void); @@ -65,7 +65,7 @@ public: * @param line The line(s) to add for input to phreeqc. * @retval VR_OK Success * @retval VR_OUTOFMEMORY Out of memory - * @see ClearAccumulatedLines, OutputAccumulatedLines, RunAccumulated + * @see ClearAccumulatedLines, OutputAccumulatedLines, RunAccumulated */ VRESULT AccumulateLine(const char *line); @@ -73,8 +73,8 @@ public: * Appends the given error message and increments the error count. * Internally used to create an error condition. * @param error_msg The error message to display. - * @returns The current error count. - * @see GetErrorString, GetErrorStringLine, GetErrorStringLineCount, OutputErrorString + * @return The current error count. + * @see GetErrorString, GetErrorStringLine, GetErrorStringLineCount, OutputErrorString */ size_t AddError(const char* error_msg); @@ -82,8 +82,8 @@ public: * Appends the given warning message and increments the warning count. * Internally used to create a warning condition. * @param warning_msg The warning message to display. - * @returns The current warning count. - * @see GetWarningString, GetWarningStringLine, GetWarningStringLineCount, OutputWarningString + * @return The current warning count. + * @see GetWarningString, GetWarningStringLine, GetWarningStringLineCount, OutputWarningString */ size_t AddWarning(const char* warning_msg); @@ -96,7 +96,7 @@ public: /** * Retrieve the accumulated input string. The accumulated input string can be run * with \ref RunAccumulated. - * @returns The accumulated input string. + * @return The accumulated input string. * @see AccumulateLine, ClearAccumulatedLines, OutputAccumulatedLines, RunAccumulated */ const std::string& GetAccumulatedLines(void); @@ -117,6 +117,12 @@ public: */ size_t GetComponentCount(void); + /** + * Retrieves the currently active SELECTED_OUTPUT user number. + * @return The current active SELECTED_OUTPUT user number. + * @see GetSelectedOutputColumnCount, GetSelectedOutputFileName, GetSelectedOutputRowCount, GetSelectedOutputString, GetSelectedOutputStringLine, GetSelectedOutputStringLineCount, GetSelectedOutputValue, SetCurrentSelectedOutputUserNumber + */ + int GetCurrentSelectedOutputUserNumber(void)const; /** * Retrieves the name of the dump file. This file name is used if not specified within DUMP input. @@ -128,15 +134,15 @@ public: /** * Retrieves the current value of the dump file switch. - * @retval true Output is written to the DUMP (dump.id.out if unspecified, where id is obtained from \ref GetId) file. - * @retval false No output is written. + * @retval true Output is written to the DUMP (dump.id.out if unspecified, where id is obtained from \ref GetId) file. + * @retval false No output is written. * @see GetDumpStringLine, GetDumpStringLineCount, GetDumpStringOn, GetDumpString, SetDumpFileOn, SetDumpStringOn */ bool GetDumpFileOn(void)const; /** * Retrieves the string buffer containing DUMP output. - * @return A null terminated string containing DUMP output. + * @return A null terminated string containing DUMP output. * @pre * \ref SetDumpStringOn must have been set to true in order to receive DUMP output. * @see GetDumpStringLine, GetDumpFileOn, GetDumpStringLineCount, GetDumpStringOn, SetDumpFileOn, SetDumpStringOn @@ -148,7 +154,7 @@ public: * @param n The zero-based index of the line to retrieve. * @return A null terminated string containing the given line. * Returns an empty string if n is out of range. - * @pre \ref SetDumpStringOn must have been set to true. + * @pre \ref SetDumpStringOn must have been set to true. * @see GetDumpFileOn, GetDumpString, GetDumpStringLineCount, GetDumpStringOn, SetDumpFileOn, SetDumpStringOn */ const char* GetDumpStringLine(int n); @@ -156,15 +162,15 @@ public: /** * Retrieves the number of lines in the current dump string buffer. * @return The number of lines. - * @pre \ref SetDumpStringOn must have been set to true. + * @pre \ref SetDumpStringOn must have been set to true. * @see GetDumpFileOn, GetDumpString, GetDumpStringLine, GetDumpStringOn, SetDumpFileOn, SetDumpStringOn */ int GetDumpStringLineCount(void)const; /** * Retrieves the current value of the dump string switch. - * @retval true Output defined by the DUMP keyword is stored. - * @retval false No output is stored. + * @retval true Output defined by the DUMP keyword is stored. + * @retval false No output is stored. * @see GetDumpFileOn, GetDumpString, GetDumpStringLine, GetDumpStringLineCount, SetDumpFileOn, SetDumpStringOn */ bool GetDumpStringOn(void)const; @@ -178,22 +184,22 @@ public: /** * Retrieves the current value of the error file switch. - * @retval true Errors are written to the phreeqc.id.err (where id is obtained from \ref GetId) file. - * @retval false No errors are written. + * @retval true Errors are written to the phreeqc.id.err (where id is obtained from \ref GetId) file. + * @retval false No errors are written. * @see SetErrorFileOn */ bool GetErrorFileOn(void)const; /** * Retrieves the error messages from the last call to \ref RunAccumulated, \ref RunFile, \ref RunString, \ref LoadDatabase, or \ref LoadDatabaseString. - * @return A null terminated string containing error messages. + * @return A null terminated string containing error messages. * @see GetErrorStringLine, GetErrorStringLineCount, GetErrorFileOn, OutputErrorString, SetErrorFileOn */ const char* GetErrorString(void); /** * Retrieves the given error line. - * @return A null terminated string containing the given line of the error string buffer. + * @return A null terminated string containing the given line of the error string buffer. * @param n The zero-based index of the line to retrieve. * @see GetErrorStringLineCount, OutputErrorString */ @@ -201,15 +207,15 @@ public: /** * Retrieves the number of lines in the current error string buffer. - * @return The number of lines. + * @return The number of lines. * @see GetErrorStringLine, OutputErrorString */ int GetErrorStringLineCount(void)const; /** * Retrieves the current value of the error string switch. - * @retval true Error output is stored. - * @retval false No error output is stored. + * @retval true Error output is stored. + * @retval false No error output is stored. * @see GetErrorFileOn, GetErrorString, GetErrorStringLine, GetErrorStringLineCount, SetErrorFileOn, SetErrorStringOn */ bool GetErrorStringOn(void)const; @@ -217,7 +223,7 @@ public: /** * Retrieves the id of this object. Each instance receives an id which is incremented for each instance * starting with the value zero. - * @return The id. + * @return The id. */ int GetId(void)const; @@ -230,17 +236,17 @@ public: /** * Retrieves the current value of the log file switch. - * @retval true Log messages are written to the phreeqc.id.log (where id is obtained from \ref GetId) file. - * @retval false No log messages are written. - * @remarks - * Logging must be enabled through the use of the KNOBS -logfile option in order to receive any log messages. + * @retval true Log messages are written to the phreeqc.id.log (where id is obtained from \ref GetId) file. + * @retval false No log messages are written. + * @remarks + * Logging must be enabled through the use of the KNOBS -logfile option in order to receive any log messages. * @see SetLogFileOn */ bool GetLogFileOn(void)const; /** * Retrieves the string buffer containing phreeqc log output. - * @return A null terminated string containing log output. + * @return A null terminated string containing log output. * @pre * \ref SetLogStringOn must have been set to true and enabled through the use of the KNOBS -logfile option in order to receive any log messages. * @see GetLogStringLine, GetLogFileOn, GetLogStringLineCount, GetLogStringOn, SetLogFileOn, SetLogStringOn @@ -252,7 +258,7 @@ public: * @param n The zero-based index of the line to retrieve. * @return A null terminated string containing the given line. * Returns an empty string if n is out of range. - * @pre \ref SetLogStringOn must have been set to true and enabled through the use of the KNOBS -logfile option in order to receive any log messages. + * @pre \ref SetLogStringOn must have been set to true and enabled through the use of the KNOBS -logfile option in order to receive any log messages. * @see GetLogFileOn, GetLogString, GetLogStringLineCount, GetLogStringOn, SetLogFileOn, SetLogStringOn */ const char* GetLogStringLine(int n)const; @@ -260,19 +266,27 @@ public: /** * Retrieves the number of lines in the current log string buffer. * @return The number of lines. - * @pre \ref SetLogStringOn must have been set to true and enabled through the use of the KNOBS -logfile option in order to receive any log messages. + * @pre \ref SetLogStringOn must have been set to true and enabled through the use of the KNOBS -logfile option in order to receive any log messages. * @see GetLogFileOn, GetLogString, GetLogStringLine, GetLogStringOn, SetLogFileOn, SetLogStringOn */ int GetLogStringLineCount(void)const; /** * Retrieves the current value of the log string switch. - * @retval true Log output is stored. - * @retval false No log output is stored. + * @retval true Log output is stored. + * @retval false No log output is stored. * @see GetLogFileOn, GetLogString, GetLogStringLine, GetLogStringLineCount, SetLogFileOn, SetLogStringOn */ bool GetLogStringOn(void)const; + /** + * Retrieves the nth user number of the currently defined SELECTED_OUTPUT blocks. + * @param n The zero-based index of the SELECTED_OUTPUT user number to retrieve. + * @return The nth defined user number; a negative value indicates an error occured. + * @see GetCurrentSelectedOutputUserNumber, GetSelectedOutputCount, SetCurrentSelectedOutputUserNumber + */ + int GetNthSelectedOutputUserNumber(int n)const; + /** * Retrieves the name of the output file. The default value is phreeqc.id.out, where id is obtained from \ref GetId. * @return filename The name of the file to write phreeqc output to. @@ -282,15 +296,15 @@ public: /** * Retrieves the current value of the output file switch. - * @retval true Output is written to the phreeqc.id.out (where id is obtained from \ref GetId) file. - * @retval false No output is written. + * @retval true Output is written to the phreeqc.id.out (where id is obtained from \ref GetId) file. + * @retval false No output is written. * @see GetOutputFileOn, GetOutputString, GetOutputStringOn, GetOutputStringLine, GetOutputStringLineCount, SetOutputFileName, SetOutputFileOn, SetOutputStringOn */ bool GetOutputFileOn(void)const; /** * Retrieves the string buffer containing phreeqc output. - * @return A null terminated string containing phreeqc output. + * @return A null terminated string containing phreeqc output. * @pre * \ref SetOutputStringOn must have been set to true in order to receive output. * @see GetOutputStringLine, GetOutputFileOn, GetOutputStringLineCount, GetOutputStringOn, SetOutputFileOn, SetOutputStringOn @@ -302,7 +316,7 @@ public: * @param n The zero-based index of the line to retrieve. * @return A null terminated string containing the given line. * Returns an empty string if n is out of range. - * @pre \ref SetOutputStringOn must have been set to true. + * @pre \ref SetOutputStringOn must have been set to true. * @see GetOutputFileOn, GetOutputString, GetOutputStringLineCount, GetOutputStringOn, SetOutputFileOn, SetOutputStringOn */ const char* GetOutputStringLine(int n)const; @@ -310,56 +324,62 @@ public: /** * Retrieves the number of lines in the current output string buffer. * @return The number of lines. - * @pre \ref SetOutputStringOn must have been set to true. + * @pre \ref SetOutputStringOn must have been set to true. * @see GetOutputFileOn, GetOutputString, GetOutputStringLine, GetOutputStringOn, SetOutputFileOn, SetOutputStringOn */ int GetOutputStringLineCount(void)const; /** * Retrieves the current value of the output string switch. - * @retval true Phreeqc output is stored. - * @retval false No phreeqc output is stored. + * @retval true Phreeqc output is stored. + * @retval false No phreeqc output is stored. * @see GetOutputFileOn, GetOutputString, GetOutputStringLine, GetOutputStringLineCount, SetOutputFileOn, SetOutputStringOn */ bool GetOutputStringOn(void)const; /** * Retrieves the number of columns in the selected-output buffer. - * @return The number of columns. - * @see GetSelectedOutputRowCount, GetSelectedOutputValue, SetCurrentSelectedOutputUserNumber + * @return The number of columns. + * @see GetCurrentSelectedOutputUserNumber, GetSelectedOutputRowCount, GetSelectedOutputValue, SetCurrentSelectedOutputUserNumber */ int GetSelectedOutputColumnCount(void)const; /** + * Retrieves the count of SELECTED_OUTPUT blocks that are currently defined. + * @return The number of SELECTED_OUTPUT blocks. + * @see GetCurrentSelectedOutputUserNumber, GetNthSelectedOutputUserNumber, SetCurrentSelectedOutputUserNumber + */ + int GetSelectedOutputCount(void)const; + /** * Retrieves the name of the selected output file. This file name is used if not specified within SELECTED_OUTPUT input. * The default value is selected.id.out, where id is obtained from \ref GetId. * @return filename The name of the file to write to. - * @see GetSelectedOutputFileOn, GetSelectedOutputString, GetSelectedOutputStringOn, GetSelectedOutputStringLine, GetSelectedOutputStringLineCount, SetCurrentSelectedOutputUserNumber, SetSelectedOutputFileName, SetSelectedOutputFileOn, SetSelectedOutputStringOn + * @see GetCurrentSelectedOutputUserNumber, GetSelectedOutputFileOn, GetSelectedOutputString, GetSelectedOutputStringOn, GetSelectedOutputStringLine, GetSelectedOutputStringLineCount, SetCurrentSelectedOutputUserNumber, SetSelectedOutputFileName, SetSelectedOutputFileOn, SetSelectedOutputStringOn */ const char* GetSelectedOutputFileName(void)const; /** * Retrieves the selected-output file switch. - * @retval true Output is written to the selected-output (selected.id.out if unspecified, where id is obtained from \ref GetId) file. - * @retval false No output is written. + * @retval true Output is written to the selected-output (selected.id.out if unspecified, where id is obtained from \ref GetId) file. + * @retval false No output is written. * @see GetSelectedOutputValue, GetSelectedOutputColumnCount, GetSelectedOutputRowCount, SetSelectedOutputFileOn */ bool GetSelectedOutputFileOn(void)const; /** * Retrieves the number of rows in the selected-output buffer. - * @return The number of rows. - * @see GetSelectedOutputColumnCount, GetSelectedOutputFileOn, GetSelectedOutputValue, SetCurrentSelectedOutputUserNumber, SetSelectedOutputFileOn + * @return The number of rows. + * @see GetCurrentSelectedOutputUserNumber, GetSelectedOutputColumnCount, GetSelectedOutputFileOn, GetSelectedOutputValue, SetCurrentSelectedOutputUserNumber, SetSelectedOutputFileOn */ int GetSelectedOutputRowCount(void)const; /** * Retrieves the string buffer containing SELECTED_OUTPUT. - * @return A null terminated string containing SELECTED_OUTPUT. + * @return A null terminated string containing SELECTED_OUTPUT. * @pre * \ref SetSelectedOutputStringOn must have been set to true in order to receive SELECTED_OUTPUT. - * @see GetSelectedOutputStringLine, GetSelectedOutputFileOn, GetSelectedOutputStringLineCount, GetSelectedOutputStringOn, GetSelectedOutputString, SetCurrentSelectedOutputUserNumber, SetSelectedOutputFileOn, SetSelectedOutputStringOn + * @see GetCurrentSelectedOutputUserNumber, GetSelectedOutputStringLine, GetSelectedOutputFileOn, GetSelectedOutputStringLineCount, GetSelectedOutputStringOn, GetSelectedOutputString, SetCurrentSelectedOutputUserNumber, SetSelectedOutputFileOn, SetSelectedOutputStringOn */ const char* GetSelectedOutputString(void)const; @@ -368,23 +388,23 @@ public: * @param n The zero-based index of the line to retrieve. * @return A null terminated string containing the given line. * Returns an empty string if n is out of range. - * @pre \ref SetSelectedOutputStringOn must have been set to true. - * @see GetSelectedOutputFileOn, GetSelectedOutputString, GetSelectedOutputStringLineCount, GetSelectedOutputStringOn, SetCurrentSelectedOutputUserNumber, SetSelectedOutputFileOn, SetSelectedOutputStringOn + * @pre \ref SetSelectedOutputStringOn must have been set to true. + * @see GetCurrentSelectedOutputUserNumber, GetSelectedOutputFileOn, GetSelectedOutputString, GetSelectedOutputStringLineCount, GetSelectedOutputStringOn, SetCurrentSelectedOutputUserNumber, SetSelectedOutputFileOn, SetSelectedOutputStringOn */ const char* GetSelectedOutputStringLine(int n); /** * Retrieves the number of lines in the current selected output string buffer. * @return The number of lines. - * @pre \ref SetSelectedOutputStringOn must have been set to true. - * @see GetSelectedOutputFileOn, GetSelectedOutputString, GetSelectedOutputStringLine, GetSelectedOutputStringOn, SetCurrentSelectedOutputUserNumber, SetSelectedOutputFileOn, SetSelectedOutputStringOn + * @pre \ref SetSelectedOutputStringOn must have been set to true. + * @see GetCurrentSelectedOutputUserNumber, GetSelectedOutputFileOn, GetSelectedOutputString, GetSelectedOutputStringLine, GetSelectedOutputStringOn, SetCurrentSelectedOutputUserNumber, SetSelectedOutputFileOn, SetSelectedOutputStringOn */ int GetSelectedOutputStringLineCount(void)const; /** * Retrieves the current value of the selected output string switch. - * @retval true Output defined by the SELECTED_OUTPUT keyword is stored. - * @retval false No output is stored. + * @retval true Output defined by the SELECTED_OUTPUT keyword is stored. + * @retval false No output is stored. * @see GetSelectedOutputFileOn, GetSelectedOutputString, GetSelectedOutputStringLine, GetSelectedOutputStringLineCount, SetSelectedOutputFileOn, SetSelectedOutputStringOn */ bool GetSelectedOutputStringOn(void)const; @@ -399,7 +419,7 @@ public: * @retval VR_INVALIDCOL The given column is out of range. * @retval VR_OUTOFMEMORY Memory could not be allocated. * @retval VR_BADINSTANCE The given id is invalid. - * @see GetSelectedOutputColumnCount, GetSelectedOutputFileOn, GetSelectedOutputRowCount, GetSelectedOutputValue2, SetCurrentSelectedOutputUserNumber, SetSelectedOutputFileOn + * @see GetCurrentSelectedOutputUserNumber, GetSelectedOutputColumnCount, GetSelectedOutputFileOn, GetSelectedOutputRowCount, GetSelectedOutputValue2, SetCurrentSelectedOutputUserNumber, SetSelectedOutputFileOn * @remarks * Row 0 contains the column headings to the selected_ouput. * @par Examples: @@ -566,22 +586,22 @@ public: /** * Retrieves the warning messages from the last call to \ref RunAccumulated, \ref RunFile, \ref RunString, \ref LoadDatabase, or \ref LoadDatabaseString. - * @return A null terminated string containing warning messages. + * @return A null terminated string containing warning messages. * @see GetWarningStringLine, GetWarningStringLineCount, OutputWarningString */ const char* GetWarningString(void); /** - * Retrieves the given warning line. + * Retrieves the given warning line. * @param n The zero-based index of the line to retrieve. - * @return A null terminated string containing the given warning line message. + * @return A null terminated string containing the given warning line message. * @see GetWarningStringLineCount, OutputWarningString */ const char* GetWarningStringLine(int n); /** * Retrieves the number of lines in the current warning string buffer. - * @return The number of lines. + * @return The number of lines. * @see GetWarningStringLine, GetWarningString, OutputWarningString */ int GetWarningStringLineCount(void)const; @@ -601,7 +621,7 @@ public: * @return The number of errors encountered. * @see LoadDatabaseString * @remarks - * All previous definitions are cleared. + * All previous definitions are cleared. */ int LoadDatabase(const char* filename); @@ -611,12 +631,12 @@ public: * @return The number of errors encountered. * @see LoadDatabaseString * @remarks - * All previous definitions are cleared. + * All previous definitions are cleared. */ int LoadDatabaseString(const char* input); /** - * Output the accumulated input buffer to stdout. The input buffer can be run with a call to \ref RunAccumulated. + * Output the accumulated input buffer to stdout. The input buffer can be run with a call to \ref RunAccumulated. * @see AccumulateLine, ClearAccumulatedLines, RunAccumulated */ void OutputAccumulatedLines(void); @@ -655,6 +675,16 @@ public: */ int RunFile(const char* filename); + /** + * Runs the specified string as input to phreeqc. + * @param input String containing phreeqc input. + * @return The number of errors encountered during the run. + * @see RunAccumulated, RunFile + * @pre + * \ref LoadDatabase/\ref LoadDatabaseString must have been called and returned 0 (zero) errors. + */ + int RunString(const char* input); + /** * Sets a C callback function for Basic programs. The syntax for the Basic command is * 10 result = CALLBACK(x1, x2, string$) @@ -676,14 +706,14 @@ public: void SetBasicFortranCallback(double (*fcn)(double *x1, double *x2, char *str, int l)); /** - * Runs the specified string as input to phreeqc. - * @param input String containing phreeqc input. - * @return The number of errors encountered during the run. - * @see RunAccumulated, RunFile - * @pre - * \ref LoadDatabase/\ref LoadDatabaseString must have been called and returned 0 (zero) errors. + * Sets the currently active SELECTED_OUTPUT user number for use in subsequent calls to GetSelectedOutputXXX routines. + * The initial setting is 1. + * @param n The user number as specified in the SELECTED_OUTPUT block. + * @retval VR_OK Success + * @retval VR_INVALIDARG The given user number has not been defined. + * @see GetCurrentSelectedOutputUserNumber, GetSelectedOutputColumnCount, GetSelectedOutputFileName, GetSelectedOutputRowCount, GetSelectedOutputString, GetSelectedOutputStringLine, GetSelectedOutputStringLineCount, GetSelectedOutputValue */ - int RunString(const char* input); + VRESULT SetCurrentSelectedOutputUserNumber(int n); /** * Sets the name of the dump file. This file name is used if not specified within DUMP input. @@ -747,8 +777,8 @@ public: * Sets the log file switch on or off. This switch controls whether or not phreeqc * writes log messages to the phreeqc.id.log (where id is obtained from \ref GetId) file. The initial setting is false. * @param bValue If true, turns on output to the log file; if false, no log messages are written to the log file. - * @remarks - * Logging must be enabled through the use of the KNOBS -logfile option in order to receive any log messages. + * @remarks + * Logging must be enabled through the use of the KNOBS -logfile option in order to receive any log messages. * @see GetLogFileOn */ void SetLogFileOn(bool bValue); @@ -811,17 +841,6 @@ public: */ void SetSelectedOutputStringOn(bool bValue); - - /** - * Sets the given user number for use in subsequent calls to GetSelectedOutputXXX routines. - * The initial setting is 1. - * @param n The user number as specified in the SELECTED_OUTPUT block. - * @see GetSelectedOutputColumnCount, GetSelectedOutputFileName, GetSelectedOutputRowCount, GetSelectedOutputString, GetSelectedOutputStringLine, GetSelectedOutputStringLineCount, GetSelectedOutputValue - */ - void SetCurrentSelectedOutputUserNumber(int n); - - - public: // overrides virtual void error_msg(const char *str, bool stop=false); diff --git a/src/IPhreeqcLib.cpp b/src/IPhreeqcLib.cpp index 795a9f35..fa77c7f7 100644 --- a/src/IPhreeqcLib.cpp +++ b/src/IPhreeqcLib.cpp @@ -106,6 +106,17 @@ GetComponentCount(int id) return IPQ_BADINSTANCE; } +int +GetCurrentSelectedOutputUserNumber(int id) +{ + IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); + if (IPhreeqcPtr) + { + return IPhreeqcPtr->GetCurrentSelectedOutputUserNumber(); + } + return IPQ_BADINSTANCE; +} + const char* GetDumpFileName(int id) { @@ -355,6 +366,22 @@ GetLogStringOn(int id) return IPQ_BADINSTANCE; } +int +GetNthSelectedOutputUserNumber(int id, int n) +{ + IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); + if (IPhreeqcPtr) + { + int nth = IPhreeqcPtr->GetNthSelectedOutputUserNumber(n); + switch (nth) + { + case VR_INVALIDARG: return IPQ_INVALIDARG; + } + return nth; + } + return IPQ_BADINSTANCE; +} + const char* GetOutputFileName(int id) { @@ -449,6 +476,17 @@ GetSelectedOutputColumnCount(int id) return IPQ_BADINSTANCE; } +int +GetSelectedOutputCount(int id) +{ + IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); + if (IPhreeqcPtr) + { + return IPhreeqcPtr->GetSelectedOutputCount(); + } + return IPQ_BADINSTANCE; +} + const char* GetSelectedOutputFileName(int id) { @@ -549,7 +587,7 @@ GetSelectedOutputValue(int id, int row, int col, VAR* pVAR) IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { - switch(IPhreeqcPtr->GetSelectedOutputValue(row, col, pVAR)) + switch (IPhreeqcPtr->GetSelectedOutputValue(row, col, pVAR)) { case VR_OK: return IPQ_OK; case VR_OUTOFMEMORY: return IPQ_OUTOFMEMORY; @@ -570,7 +608,7 @@ GetSelectedOutputValue2(int id, int row, int col, int *vtype, double* dvalue, ch IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { - switch(IPhreeqcPtr->GetSelectedOutputValue2(row, col, vtype, dvalue, svalue, svalue_length)) + switch (IPhreeqcPtr->GetSelectedOutputValue2(row, col, vtype, dvalue, svalue, svalue_length)) { case VR_OK: return IPQ_OK; case VR_OUTOFMEMORY: return IPQ_OUTOFMEMORY; @@ -737,6 +775,23 @@ SetBasicFortranCallback(int id, double (*fcn)(double *x1, double *x2, char *str, } return IPQ_BADINSTANCE; } + +IPQ_RESULT +SetCurrentSelectedOutputUserNumber(int id, int n) +{ + IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); + if (IPhreeqcPtr) + { + switch (IPhreeqcPtr->SetCurrentSelectedOutputUserNumber(n)) + { + case VR_INVALIDARG: return IPQ_INVALIDARG; + case VR_OK: return IPQ_OK; + default: assert(false); + } + } + return IPQ_BADINSTANCE; +} + IPQ_RESULT SetDumpFileName(int id, const char* filename) { diff --git a/unit/TestIPhreeqc.cpp b/unit/TestIPhreeqc.cpp index 7834387b..6222b7c3 100644 --- a/unit/TestIPhreeqc.cpp +++ b/unit/TestIPhreeqc.cpp @@ -3620,11 +3620,6 @@ void TestIPhreeqc::TestMultiPunchSelectedOutputStringOn(void) CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(8), "Dummy2\t") != NULL ); } -#if 0 -#include -#include "Debug.h" -#endif - void TestIPhreeqc::TestMultiPunchCSelectedOutput(void) { CVar var; @@ -3636,38 +3631,6 @@ void TestIPhreeqc::TestMultiPunchCSelectedOutput(void) CPPUNIT_ASSERT_EQUAL(6, obj.GetSelectedOutputRowCount()); CPPUNIT_ASSERT_EQUAL(35, obj.GetSelectedOutputColumnCount()); -#if 0 - char buffer[80]; - for (int r = 0; r < obj.GetSelectedOutputRowCount(); ++r) - { - for (int c = 0; c < obj.GetSelectedOutputColumnCount(); ++c) - { - CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(r, c, &var)); - switch (var.type) - { - case TT_EMPTY: - break; - case TT_LONG: - sprintf(buffer, "%d\t", (int)var.lVal); - ::OutputDebugString(buffer); - break; - case TT_DOUBLE: - sprintf(buffer, "%g\t", var.dVal); - ::OutputDebugString(buffer); - break; - case TT_STRING: - sprintf(buffer, "%s\t", var.sVal); - ::OutputDebugString(buffer); - break; - default: - ASSERT(FALSE); - } - } - ::OutputDebugString("\n"); - } -#endif - - // headings int ncol = 0; CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("sim"), std::string(var.sVal)); @@ -3735,72 +3698,298 @@ void TestIPhreeqc::TestMultiPunchCSelectedOutput(void) CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 34, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 4.2784e-003, var.dVal, ::pow(10., -6) ); // edge cases + int r = obj.GetSelectedOutputRowCount(); + int c = obj.GetSelectedOutputColumnCount(); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, obj.GetSelectedOutputValue(-1, 0, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, var.vresult); - CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, obj.GetSelectedOutputValue( 6, 0, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, var.vresult); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, obj.GetSelectedOutputValue( r, 0, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, var.vresult); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, obj.GetSelectedOutputValue( 0, -1, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, var.vresult); - CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, obj.GetSelectedOutputValue( 0, 35, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, var.vresult); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, obj.GetSelectedOutputValue( 0, c, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, var.vresult); obj.SetCurrentSelectedOutputUserNumber(2); CPPUNIT_ASSERT_EQUAL(7, obj.GetSelectedOutputRowCount()); CPPUNIT_ASSERT_EQUAL(16, obj.GetSelectedOutputColumnCount()); -#if 0 - for (int r = 0; r < obj.GetSelectedOutputRowCount(); ++r) - { - for (int c = 0; c < obj.GetSelectedOutputColumnCount(); ++c) - { - CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(r, c, &var)); - switch (var.type) - { - case TT_EMPTY: - break; - case TT_LONG: - sprintf(buffer, "%d\t", (int)var.lVal); - ::OutputDebugString(buffer); - break; - case TT_DOUBLE: - sprintf(buffer, "%g\t", var.dVal); - ::OutputDebugString(buffer); - break; - case TT_STRING: - sprintf(buffer, "%s\t", var.sVal); - ::OutputDebugString(buffer); - break; - default: - ASSERT(FALSE); - } - } - ::OutputDebugString("\n"); - } -#endif + // headings + ncol = 0; + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("si_Halite"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("si_Calcite"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("DUMMY_1"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("DUMMY_2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Sum_resid"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Sum_Delta/U"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("MaxFracErr"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_2_min"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_2_max"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_3"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_3_min"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_3_max"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Halite"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Halite_min"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Halite_max"), std::string(var.sVal)); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(0), "si_Halite\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(0), "si_Calcite\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(2), "Dummy1\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(2), "Dummy2\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(3), "Dummy1\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(3), "Dummy2\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(4), "Dummy1\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(4), "Dummy2\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(5), "Dummy1\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(5), "Dummy2\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(6), "Sum_resid\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(6), "Sum_Delta/U\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(6), "MaxFracErr\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(6), "Soln_2\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(6), "Soln_2_min\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(6), "Soln_2_max\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(6), "Soln_3\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(6), "Soln_3_min\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(6), "Soln_3_max\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(6), "Halite\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(6), "Halite_max\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(8), "Dummy1\t") != NULL ); -// COMMENT: {8/26/2013 11:32:00 PM} CPPUNIT_ASSERT( ::strstr(obj.GetSelectedOutputStringLine(8), "Dummy2\t") != NULL ); + // si_Halite + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 0, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -7.70857, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 0, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -7.67087, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 0, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -7.6362, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 0, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -999.999, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 0, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -7.60092, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 0, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -7.60411, var.dVal, ::pow(10., -2) ); + + // si_Calcite + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 1, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.692077, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 1, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.678847, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 1, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.678847, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 1, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -999.999, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 1, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -999.999, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 1, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.672429, var.dVal, ::pow(10., -2) ); + + // DUMMY_1 + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 2, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 2, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy1"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 2, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy1"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 2, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy1"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 2, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy1"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 2, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy1"), std::string(var.sVal)); + + // DUMMY_2 + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 3, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 3, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 3, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 3, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 3, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 3, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy2"), std::string(var.sVal)); + + // Sum_resid + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 4, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 4, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 4, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 4, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 4, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 4, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 3.69E-13, var.dVal, ::pow(10., log10(3.69E-13)-2) ); + + // Sum_Delta/U + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 5, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 5, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 5, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 5, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 5, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 5, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // MaxFracErr + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 6, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 6, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 6, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 6, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 6, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 6, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_2 + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 7, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 7, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 7, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 7, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 7, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 7, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1, var.dVal, ::pow(10., -3) ); + + // Soln_2_min + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 8, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 8, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 8, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 8, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 8, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 8, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_2_max + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 9, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 9, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 9, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 9, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 9, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 9, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_3 + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 10, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 10, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 10, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 10, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 10, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 10, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1, var.dVal, ::pow(10., -3) ); + + // Soln_3_min + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 11, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 11, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 11, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 11, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 11, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 11, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_3_max + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 12, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 12, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 12, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 12, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 12, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 12, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Halite + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 13, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 13, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 13, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 13, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 13, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 13, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.001, var.dVal, ::pow(10., -3) ); + + // Halite_min + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 14, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 14, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 14, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 14, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 14, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 14, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Halite_max + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 15, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(2, 15, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(3, 15, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(4, 15, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(5, 15, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(6, 15, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // edge cases + r = obj.GetSelectedOutputRowCount(); + c = obj.GetSelectedOutputColumnCount(); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, obj.GetSelectedOutputValue(-1, 0, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, var.vresult); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, obj.GetSelectedOutputValue( r, 0, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, var.vresult); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, obj.GetSelectedOutputValue( 0, -1, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, var.vresult); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, obj.GetSelectedOutputValue( 0, c, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, var.vresult); + + obj.SetCurrentSelectedOutputUserNumber(3); + CPPUNIT_ASSERT_EQUAL(2, obj.GetSelectedOutputRowCount()); + CPPUNIT_ASSERT_EQUAL(12, obj.GetSelectedOutputColumnCount()); + + // headings + ncol = 0; + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Sum_resid"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Sum_Delta/U"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("MaxFracErr"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_2_min"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_2_max"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_3"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_3_min"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_3_max"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Halite"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Halite_min"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Halite_max"), std::string(var.sVal)); + + // Sum_resid + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 0, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 3.69E-13, var.dVal, ::pow(10., log10(3.69E-13)-2) ); + + // Sum_Delta/U + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 1, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // MaxFracErr + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 2, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_2 + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 3, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1, var.dVal, ::pow(10., -3) ); + + // Soln_2_min + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 4, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_2_max + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 5, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_3 + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 6, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1, var.dVal, ::pow(10., -3) ); + + // Soln_3_min + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 7, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_3_max + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 8, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Halite + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 9, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.001, var.dVal, ::pow(10., -3) ); + + // Halite_min + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 10, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Halite_max + CPPUNIT_ASSERT_EQUAL(VR_OK, obj.GetSelectedOutputValue(1, 11, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + + // edge cases + r = obj.GetSelectedOutputRowCount(); + c = obj.GetSelectedOutputColumnCount(); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, obj.GetSelectedOutputValue(-1, 0, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, var.vresult); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, obj.GetSelectedOutputValue( r, 0, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, var.vresult); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, obj.GetSelectedOutputValue( 0, -1, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, var.vresult); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, obj.GetSelectedOutputValue( 0, c, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, var.vresult); + + CPPUNIT_ASSERT_EQUAL(VR_INVALIDARG, obj.SetCurrentSelectedOutputUserNumber(-1)); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDARG, obj.SetCurrentSelectedOutputUserNumber(0)); +} + +void TestIPhreeqc::TestGetSelectedOutputCount(void) +{ + CVar var; + IPhreeqc obj; + + CPPUNIT_ASSERT_EQUAL(0, obj.GetSelectedOutputCount()); + CPPUNIT_ASSERT_EQUAL(0, obj.LoadDatabase("../database/phreeqc.dat")); + CPPUNIT_ASSERT_EQUAL(0, obj.GetSelectedOutputCount()); + CPPUNIT_ASSERT_EQUAL(0, obj.RunFile("multi_punch")); + CPPUNIT_ASSERT_EQUAL(3, obj.GetSelectedOutputCount()); +} + +void TestIPhreeqc::TestGetNthSelectedOutputUserNumber(void) +{ + CVar var; + IPhreeqc obj; + + CPPUNIT_ASSERT_EQUAL(0, obj.LoadDatabase("../database/phreeqc.dat")); + CPPUNIT_ASSERT_EQUAL(0, obj.RunFile("multi_punch")); + + CPPUNIT_ASSERT_EQUAL(3, obj.GetSelectedOutputCount()); + + CPPUNIT_ASSERT_EQUAL(1, obj.GetNthSelectedOutputUserNumber(0)); + CPPUNIT_ASSERT_EQUAL(2, obj.GetNthSelectedOutputUserNumber(1)); + CPPUNIT_ASSERT_EQUAL(3, obj.GetNthSelectedOutputUserNumber(2)); + + // edge cases + CPPUNIT_ASSERT_EQUAL((int)VR_INVALIDARG, obj.GetNthSelectedOutputUserNumber(-1)); + CPPUNIT_ASSERT_EQUAL((int)VR_INVALIDARG, obj.GetNthSelectedOutputUserNumber(4)); +} + +void TestIPhreeqc::TestGetCurrentSelectedOutputUserNumber(void) +{ + IPhreeqc obj; + CPPUNIT_ASSERT_EQUAL(1, obj.GetCurrentSelectedOutputUserNumber()); + + CPPUNIT_ASSERT_EQUAL(0, obj.LoadDatabase("../database/phreeqc.dat")); + CPPUNIT_ASSERT_EQUAL(1, obj.GetCurrentSelectedOutputUserNumber()); + CPPUNIT_ASSERT_EQUAL(0, obj.RunFile("multi_punch")); + + CPPUNIT_ASSERT_EQUAL(1, obj.GetCurrentSelectedOutputUserNumber()); + CPPUNIT_ASSERT_EQUAL(6, obj.GetSelectedOutputRowCount()); + CPPUNIT_ASSERT_EQUAL(35, obj.GetSelectedOutputColumnCount()); + + obj.SetCurrentSelectedOutputUserNumber(2); + CPPUNIT_ASSERT_EQUAL(2, obj.GetCurrentSelectedOutputUserNumber()); + CPPUNIT_ASSERT_EQUAL(7, obj.GetSelectedOutputRowCount()); + CPPUNIT_ASSERT_EQUAL(16, obj.GetSelectedOutputColumnCount()); + + obj.SetCurrentSelectedOutputUserNumber(3); + CPPUNIT_ASSERT_EQUAL(3, obj.GetCurrentSelectedOutputUserNumber()); + CPPUNIT_ASSERT_EQUAL(2, obj.GetSelectedOutputRowCount()); + CPPUNIT_ASSERT_EQUAL(12, obj.GetSelectedOutputColumnCount()); + + // edge cases + CPPUNIT_ASSERT_EQUAL(VR_INVALIDARG, obj.SetCurrentSelectedOutputUserNumber(-1)); + CPPUNIT_ASSERT_EQUAL(3, obj.GetCurrentSelectedOutputUserNumber()); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDARG, obj.SetCurrentSelectedOutputUserNumber(0)); + CPPUNIT_ASSERT_EQUAL(3, obj.GetCurrentSelectedOutputUserNumber()); } diff --git a/unit/TestIPhreeqc.h b/unit/TestIPhreeqc.h index 90b87989..ced63c3a 100644 --- a/unit/TestIPhreeqc.h +++ b/unit/TestIPhreeqc.h @@ -70,6 +70,9 @@ class TestIPhreeqc : public CppUnit::TestFixture CPPUNIT_TEST( TestRunFileMultiPunchNoSet ); CPPUNIT_TEST( TestMultiPunchSelectedOutputStringOn ); CPPUNIT_TEST( TestMultiPunchCSelectedOutput ); + CPPUNIT_TEST( TestGetSelectedOutputCount ); + CPPUNIT_TEST( TestGetNthSelectedOutputUserNumber ); + CPPUNIT_TEST( TestGetCurrentSelectedOutputUserNumber ); CPPUNIT_TEST_SUITE_END(); public: @@ -140,6 +143,9 @@ public: void TestRunFileMultiPunchNoSet(void); void TestMultiPunchSelectedOutputStringOn(void); void TestMultiPunchCSelectedOutput(void); + void TestGetSelectedOutputCount(void); + void TestGetNthSelectedOutputUserNumber(void); + void TestGetCurrentSelectedOutputUserNumber(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 c7cb794f..5d4287e3 100644 --- a/unit/TestIPhreeqcLib.cpp +++ b/unit/TestIPhreeqcLib.cpp @@ -2537,13 +2537,13 @@ void TestIPhreeqcLib::TestOutputStringOnOff(void) int n = ::CreateIPhreeqc(); CPPUNIT_ASSERT(n >= 0); - CPPUNIT_ASSERT_EQUAL( false, ::GetOutputStringOn(n) != 0 ); + CPPUNIT_ASSERT_EQUAL( false, ::GetOutputStringOn(n) != 0 ); - CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetOutputStringOn(n, 1) ); - CPPUNIT_ASSERT_EQUAL( true, ::GetOutputStringOn(n) != 0 ); + CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetOutputStringOn(n, 1) ); + CPPUNIT_ASSERT_EQUAL( true, ::GetOutputStringOn(n) != 0 ); - CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetOutputStringOn(n, 0) ); - CPPUNIT_ASSERT_EQUAL( false, ::GetOutputStringOn(n) != 0 ); + CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetOutputStringOn(n, 0) ); + CPPUNIT_ASSERT_EQUAL( false, ::GetOutputStringOn(n) != 0 ); if (n >= 0) { @@ -2562,9 +2562,9 @@ void TestIPhreeqcLib::TestGetOutputString(void) { ::DeleteFile(OUTPUT_FILENAME); } - CPPUNIT_ASSERT_EQUAL( false, ::FileExists(OUTPUT_FILENAME) ); + CPPUNIT_ASSERT_EQUAL( false, ::FileExists(OUTPUT_FILENAME) ); - CPPUNIT_ASSERT_EQUAL( 0, ::LoadDatabase(n, "phreeqc.dat")); + CPPUNIT_ASSERT_EQUAL( 0, ::LoadDatabase(n, "phreeqc.dat")); // add solution block CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0) ); @@ -2643,7 +2643,7 @@ void TestIPhreeqcLib::TestGetOutputStringLineCount(void) CPPUNIT_ASSERT_EQUAL( IPQ_OK, ::SetOutputStringOn(n, 1) ); CPPUNIT_ASSERT_EQUAL( 0, ::RunAccumulated(n) ); - CPPUNIT_ASSERT_EQUAL( 100, ::GetOutputStringLineCount(n) ); + CPPUNIT_ASSERT_EQUAL( 100, ::GetOutputStringLineCount(n) ); // add solution block @@ -3813,7 +3813,8 @@ void TestIPhreeqcLib::TestBasicSURF(void) CPPUNIT_ASSERT_EQUAL(13, ::GetSelectedOutputColumnCount(n)); CPPUNIT_ASSERT_EQUAL(3, ::GetSelectedOutputRowCount(n)); - CVar v; + VAR v; + VarInit(&v); const int offset = 8; @@ -3970,3 +3971,383 @@ void TestIPhreeqcLib::TestDelete(void) CPPUNIT_ASSERT(::DeleteFile(OUTPUT_FILE)); } } + +void TestIPhreeqcLib::TestMultiPunchCSelectedOutput(void) +{ + VAR var; + ::VarInit(&var); + + int id = ::CreateIPhreeqc(); + CPPUNIT_ASSERT(id >= 0); + + CPPUNIT_ASSERT_EQUAL(0, ::LoadDatabase(id, "../database/phreeqc.dat")); + CPPUNIT_ASSERT_EQUAL(0, ::RunFile(id, "multi_punch")); + + CPPUNIT_ASSERT_EQUAL(6, ::GetSelectedOutputRowCount(id)); + CPPUNIT_ASSERT_EQUAL(35, ::GetSelectedOutputColumnCount(id)); + + // headings + int ncol = 0; + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("sim"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("state"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("soln"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("dist_x"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("time"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("step"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("pH"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("pe"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("reaction"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("temp(C)"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Alk(eq/kgw)"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("mu"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("mass_H2O"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("charge(eq)"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("pct_err"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Na(mol/kgw)"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Ca(mol/kgw)"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("m_Na+(mol/kgw)"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("m_HCO3-(mol/kgw)"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("la_Ca+2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("la_CO3-2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("CO2(g)"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("d_CO2(g)"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("dolomite"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("d_dolomite"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("si_Halite"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("pressure"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("total mol"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("volume"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("g_N2(g)"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("k_Calcite"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("dk_Calcite"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("s_Anhydrite"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("s_Barite"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("V_TOTAL_C"), std::string(var.sVal)); + + // sim + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 0, &var)); CPPUNIT_ASSERT_EQUAL((long) 8, var.lVal); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 0, &var)); CPPUNIT_ASSERT_EQUAL((long)10, var.lVal); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 0, &var)); CPPUNIT_ASSERT_EQUAL((long)11, var.lVal); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 0, &var)); CPPUNIT_ASSERT_EQUAL((long)12, var.lVal); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 0, &var)); CPPUNIT_ASSERT_EQUAL((long)14, var.lVal); + + // state + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 1, &var)); CPPUNIT_ASSERT_EQUAL(std::string("react"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 1, &var)); CPPUNIT_ASSERT_EQUAL(std::string("react"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 1, &var)); CPPUNIT_ASSERT_EQUAL(std::string("i_soln"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 1, &var)); CPPUNIT_ASSERT_EQUAL(std::string("i_soln"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 1, &var)); CPPUNIT_ASSERT_EQUAL(std::string("react"), std::string(var.sVal)); + + // pH + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 6, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 7.30475, var.dVal, ::pow(10., -5) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 6, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 7.29765, var.dVal, ::pow(10., -5) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 6, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 6.99738, var.dVal, ::pow(10., -5) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 6, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 6.99698, var.dVal, ::pow(10., -5) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 6, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 7.2942 , var.dVal, ::pow(10., -5) ); + + // V_TOTAL_C + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 34, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 4.3729e-003, var.dVal, ::pow(10., -6) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 34, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 4.3090e-003, var.dVal, ::pow(10., -6) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 34, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0000e+000, var.dVal, ::pow(10., -6) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 34, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0000e+000, var.dVal, ::pow(10., -6) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 34, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 4.2784e-003, var.dVal, ::pow(10., -6) ); + + // edge cases + int r = ::GetSelectedOutputRowCount(id); + int c = ::GetSelectedOutputColumnCount(id); + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDROW, ::GetSelectedOutputValue(id, -1, 0, &var)); + CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); + CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, var.vresult); + + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDROW, ::GetSelectedOutputValue(id, r, 0, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, var.vresult); + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDCOL, ::GetSelectedOutputValue(id, 0, -1, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, var.vresult); + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDCOL, ::GetSelectedOutputValue(id, 0, c, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, var.vresult); + + ::SetCurrentSelectedOutputUserNumber(id, 2); + CPPUNIT_ASSERT_EQUAL(7, ::GetSelectedOutputRowCount(id)); + CPPUNIT_ASSERT_EQUAL(16, ::GetSelectedOutputColumnCount(id)); + + // headings + ncol = 0; + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("si_Halite"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("si_Calcite"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("DUMMY_1"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("DUMMY_2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Sum_resid"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Sum_Delta/U"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("MaxFracErr"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_2_min"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_2_max"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_3"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_3_min"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_3_max"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Halite"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Halite_min"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Halite_max"), std::string(var.sVal)); + + // si_Halite + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 0, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -7.70857, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 0, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -7.67087, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 0, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -7.6362, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 0, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -999.999, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 0, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -7.60092, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 0, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -7.60411, var.dVal, ::pow(10., -2) ); + + // si_Calcite + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 1, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.692077, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 1, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.678847, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 1, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.678847, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 1, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -999.999, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 1, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( -999.999, var.dVal, ::pow(10., -2) ); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 1, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.672429, var.dVal, ::pow(10., -2) ); + + // DUMMY_1 + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 2, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 2, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy1"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 2, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy1"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 2, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy1"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 2, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy1"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 2, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy1"), std::string(var.sVal)); + + // DUMMY_2 + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 3, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 3, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 3, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 3, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 3, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 3, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Dummy2"), std::string(var.sVal)); + + // Sum_resid + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 4, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 4, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 4, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 4, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 4, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 4, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 3.69E-13, var.dVal, ::pow(10., log10(3.69E-13)-2) ); + + // Sum_Delta/U + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 5, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 5, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 5, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 5, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 5, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 5, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // MaxFracErr + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 6, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 6, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 6, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 6, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 6, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 6, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_2 + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 7, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 7, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 7, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 7, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 7, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 7, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1, var.dVal, ::pow(10., -3) ); + + // Soln_2_min + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 8, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 8, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 8, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 8, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 8, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 8, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_2_max + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 9, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 9, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 9, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 9, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 9, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 9, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_3 + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 10, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 10, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 10, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 10, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 10, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 10, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1, var.dVal, ::pow(10., -3) ); + + // Soln_3_min + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 11, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 11, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 11, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 11, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 11, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 11, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_3_max + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 12, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 12, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 12, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 12, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 12, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 12, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Halite + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 13, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 13, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 13, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 13, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 13, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 13, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.001, var.dVal, ::pow(10., -3) ); + + // Halite_min + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 14, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 14, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 14, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 14, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 14, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 14, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Halite_max + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 15, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 2, 15, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 3, 15, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 4, 15, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 5, 15, &var)); CPPUNIT_ASSERT_EQUAL(TT_EMPTY, var.type); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 6, 15, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // edge cases + r = ::GetSelectedOutputRowCount(id); + c = ::GetSelectedOutputColumnCount(id); + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDROW, ::GetSelectedOutputValue(id, -1, 0, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, var.vresult); + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDROW, ::GetSelectedOutputValue(id, r, 0, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, var.vresult); + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDCOL, ::GetSelectedOutputValue(id, 0, -1, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, var.vresult); + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDCOL, ::GetSelectedOutputValue(id, 0, c, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, var.vresult); + + ::SetCurrentSelectedOutputUserNumber(id, 3); + CPPUNIT_ASSERT_EQUAL(2, ::GetSelectedOutputRowCount(id)); + CPPUNIT_ASSERT_EQUAL(12, ::GetSelectedOutputColumnCount(id)); + + // headings + ncol = 0; + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Sum_resid"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Sum_Delta/U"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("MaxFracErr"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_2"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_2_min"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_2_max"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_3"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_3_min"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Soln_3_max"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Halite"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Halite_min"), std::string(var.sVal)); + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); CPPUNIT_ASSERT_EQUAL(std::string("Halite_max"), std::string(var.sVal)); + + // Sum_resid + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 0, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 3.69E-13, var.dVal, ::pow(10., log10(3.69E-13)-2) ); + + // Sum_Delta/U + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 1, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // MaxFracErr + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 2, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_2 + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 3, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1, var.dVal, ::pow(10., -3) ); + + // Soln_2_min + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 4, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_2_max + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 5, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_3 + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 6, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 1, var.dVal, ::pow(10., -3) ); + + // Soln_3_min + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 7, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Soln_3_max + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 8, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Halite + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 9, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.001, var.dVal, ::pow(10., -3) ); + + // Halite_min + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 10, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + // Halite_max + CPPUNIT_ASSERT_EQUAL(IPQ_OK, ::GetSelectedOutputValue(id, 1, 11, &var)); CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, var.dVal, ::pow(10., -3) ); + + + // edge cases + r = ::GetSelectedOutputRowCount(id); + c = ::GetSelectedOutputColumnCount(id); + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDROW, ::GetSelectedOutputValue(id, -1, 0, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, var.vresult); + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDROW, ::GetSelectedOutputValue(id, r, 0, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDROW, var.vresult); + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDCOL, ::GetSelectedOutputValue(id, 0, -1, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, var.vresult); + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDCOL, ::GetSelectedOutputValue(id, 0, c, &var)); CPPUNIT_ASSERT_EQUAL(TT_ERROR, var.type); CPPUNIT_ASSERT_EQUAL(VR_INVALIDCOL, var.vresult); + + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDARG, ::SetCurrentSelectedOutputUserNumber(id, -1)); + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDARG, ::SetCurrentSelectedOutputUserNumber(id, 0)); +} + +void TestIPhreeqcLib::TestGetSelectedOutputCount(void) +{ + int id = ::CreateIPhreeqc(); + CPPUNIT_ASSERT(id >= 0); + + CPPUNIT_ASSERT_EQUAL(0, ::GetSelectedOutputCount(id)); + CPPUNIT_ASSERT_EQUAL(0, ::LoadDatabase(id, "../database/phreeqc.dat")); + CPPUNIT_ASSERT_EQUAL(0, ::GetSelectedOutputCount(id)); + CPPUNIT_ASSERT_EQUAL(0, ::RunFile(id, "multi_punch")); + CPPUNIT_ASSERT_EQUAL(3, ::GetSelectedOutputCount(id)); +} + +void TestIPhreeqcLib::TestGetNthSelectedOutputUserNumber(void) +{ + int id = ::CreateIPhreeqc(); + CPPUNIT_ASSERT(id >= 0); + + CPPUNIT_ASSERT_EQUAL(0, ::LoadDatabase(id, "../database/phreeqc.dat")); + CPPUNIT_ASSERT_EQUAL(0, ::RunFile(id, "multi_punch")); + + CPPUNIT_ASSERT_EQUAL(3, ::GetSelectedOutputCount(id)); + + CPPUNIT_ASSERT_EQUAL(1, ::GetNthSelectedOutputUserNumber(id, 0)); + CPPUNIT_ASSERT_EQUAL(2, ::GetNthSelectedOutputUserNumber(id, 1)); + CPPUNIT_ASSERT_EQUAL(3, ::GetNthSelectedOutputUserNumber(id, 2)); + + // edge cases + CPPUNIT_ASSERT_EQUAL((int)IPQ_INVALIDARG, ::GetNthSelectedOutputUserNumber(id, -1)); + CPPUNIT_ASSERT_EQUAL((int)IPQ_INVALIDARG, ::GetNthSelectedOutputUserNumber(id, 4)); +} + +void TestIPhreeqcLib::TestGetCurrentSelectedOutputUserNumber(void) +{ + int id = ::CreateIPhreeqc(); + CPPUNIT_ASSERT(id >= 0); + CPPUNIT_ASSERT_EQUAL(1, ::GetCurrentSelectedOutputUserNumber(id)); + + CPPUNIT_ASSERT_EQUAL(0, ::LoadDatabase(id, "../database/phreeqc.dat")); + CPPUNIT_ASSERT_EQUAL(1, ::GetCurrentSelectedOutputUserNumber(id)); + CPPUNIT_ASSERT_EQUAL(0, ::RunFile(id, "multi_punch")); + + CPPUNIT_ASSERT_EQUAL(1, ::GetCurrentSelectedOutputUserNumber(id)); + CPPUNIT_ASSERT_EQUAL(6, ::GetSelectedOutputRowCount(id)); + CPPUNIT_ASSERT_EQUAL(35, ::GetSelectedOutputColumnCount(id)); + + ::SetCurrentSelectedOutputUserNumber(id, 2); + CPPUNIT_ASSERT_EQUAL(2, ::GetCurrentSelectedOutputUserNumber(id)); + CPPUNIT_ASSERT_EQUAL(7, ::GetSelectedOutputRowCount(id)); + CPPUNIT_ASSERT_EQUAL(16, ::GetSelectedOutputColumnCount(id)); + + ::SetCurrentSelectedOutputUserNumber(id, 3); + CPPUNIT_ASSERT_EQUAL(3, ::GetCurrentSelectedOutputUserNumber(id)); + CPPUNIT_ASSERT_EQUAL(2, ::GetSelectedOutputRowCount(id)); + CPPUNIT_ASSERT_EQUAL(12, ::GetSelectedOutputColumnCount(id)); + + // edge cases + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDARG, ::SetCurrentSelectedOutputUserNumber(id, -1)); + CPPUNIT_ASSERT_EQUAL(3, ::GetCurrentSelectedOutputUserNumber(id)); + CPPUNIT_ASSERT_EQUAL(IPQ_INVALIDARG, ::SetCurrentSelectedOutputUserNumber(id, 0)); + CPPUNIT_ASSERT_EQUAL(3, ::GetCurrentSelectedOutputUserNumber(id)); +} diff --git a/unit/TestIPhreeqcLib.h b/unit/TestIPhreeqcLib.h index 589b7214..0e2efa68 100644 --- a/unit/TestIPhreeqcLib.h +++ b/unit/TestIPhreeqcLib.h @@ -71,6 +71,10 @@ class TestIPhreeqcLib : public CppUnit::TestFixture CPPUNIT_TEST( TestBasicSURF ); CPPUNIT_TEST( TestIEEE ); CPPUNIT_TEST( TestDelete ); + CPPUNIT_TEST( TestMultiPunchCSelectedOutput ); + CPPUNIT_TEST( TestGetSelectedOutputCount ); + CPPUNIT_TEST( TestGetNthSelectedOutputUserNumber ); + CPPUNIT_TEST( TestGetCurrentSelectedOutputUserNumber ); CPPUNIT_TEST_SUITE_END(); public: @@ -142,6 +146,10 @@ public: void TestBasicSURF(void); void TestIEEE(void); void TestDelete(void); + void TestMultiPunchCSelectedOutput(void); + void TestGetSelectedOutputCount(void); + void TestGetNthSelectedOutputUserNumber(void); + void TestGetCurrentSelectedOutputUserNumber(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);