pyEQL 1.4.0rc9__cp313-cp313-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. pyEQL/__init__.py +50 -0
  2. pyEQL/_phreeqc.cpython-313-darwin.so +0 -0
  3. pyEQL/activity_correction.py +879 -0
  4. pyEQL/database/geothermal.dat +5693 -0
  5. pyEQL/database/llnl.dat +19305 -0
  6. pyEQL/database/phreeqc_license.txt +54 -0
  7. pyEQL/database/pyeql_db.json +35607 -0
  8. pyEQL/engines.py +1153 -0
  9. pyEQL/equilibrium.py +227 -0
  10. pyEQL/functions.py +281 -0
  11. pyEQL/phreeqc/__init__.py +5 -0
  12. pyEQL/phreeqc/bindings.cpp +84 -0
  13. pyEQL/phreeqc/core.py +239 -0
  14. pyEQL/phreeqc/database/Amm.dat +1968 -0
  15. pyEQL/phreeqc/database/CMakeLists.txt +32 -0
  16. pyEQL/phreeqc/database/ColdChem.dat +267 -0
  17. pyEQL/phreeqc/database/Concrete_PHR.dat +158 -0
  18. pyEQL/phreeqc/database/Concrete_PZ.dat +195 -0
  19. pyEQL/phreeqc/database/Kinec.v2.dat +12039 -0
  20. pyEQL/phreeqc/database/Kinec_v3.dat +12159 -0
  21. pyEQL/phreeqc/database/Makefile.am +28 -0
  22. pyEQL/phreeqc/database/Makefile.in +530 -0
  23. pyEQL/phreeqc/database/PHREEQC_ThermoddemV1.10_15Dec2020.dat +12965 -0
  24. pyEQL/phreeqc/database/Tipping_Hurley.dat +4137 -0
  25. pyEQL/phreeqc/database/__init__.py +0 -0
  26. pyEQL/phreeqc/database/core10.dat +6824 -0
  27. pyEQL/phreeqc/database/frezchem.dat +634 -0
  28. pyEQL/phreeqc/database/iso.dat +7235 -0
  29. pyEQL/phreeqc/database/llnl.dat +19310 -0
  30. pyEQL/phreeqc/database/minteq.dat +5654 -0
  31. pyEQL/phreeqc/database/minteq.v4.dat +13212 -0
  32. pyEQL/phreeqc/database/phreeqc.dat +1972 -0
  33. pyEQL/phreeqc/database/phreeqc_rates.dat +3158 -0
  34. pyEQL/phreeqc/database/pitzer.dat +1044 -0
  35. pyEQL/phreeqc/database/sit.dat +14348 -0
  36. pyEQL/phreeqc/database/wateq4f.dat +4036 -0
  37. pyEQL/phreeqc/ext/README.md +10 -0
  38. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/CMakeLists.txt +476 -0
  39. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/INSTALL +302 -0
  40. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/IPhreeqc.rc +61 -0
  41. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/IPhreeqcConfig.cmake.in +4 -0
  42. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/Makefile.am +8 -0
  43. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/Makefile.in +816 -0
  44. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/aclocal.m4 +1217 -0
  45. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/CTestScript.cmake +167 -0
  46. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/CSelectedOutput.cpp.o +0 -0
  47. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/IPhreeqc.cpp.o +0 -0
  48. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/IPhreeqcLib.cpp.o +0 -0
  49. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/IPhreeqc_interface_F.cpp.o +0 -0
  50. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/Var.c.o +0 -0
  51. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/Dictionary.cpp.o +0 -0
  52. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/ExchComp.cxx.o +0 -0
  53. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/Exchange.cxx.o +0 -0
  54. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/GasComp.cxx.o +0 -0
  55. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/GasPhase.cxx.o +0 -0
  56. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/ISolution.cxx.o +0 -0
  57. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/ISolutionComp.cxx.o +0 -0
  58. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/KineticsComp.cxx.o +0 -0
  59. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/NameDouble.cxx.o +0 -0
  60. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/NumKeyword.cxx.o +0 -0
  61. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/PBasic.cpp.o +0 -0
  62. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/PHRQ_io_output.cpp.o +0 -0
  63. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/PPassemblage.cxx.o +0 -0
  64. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/PPassemblageComp.cxx.o +0 -0
  65. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/Phreeqc.cpp.o +0 -0
  66. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/PhreeqcKeywords/Keywords.cpp.o +0 -0
  67. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/Pressure.cxx.o +0 -0
  68. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/Reaction.cxx.o +0 -0
  69. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/ReadClass.cxx.o +0 -0
  70. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/SS.cxx.o +0 -0
  71. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/SSassemblage.cxx.o +0 -0
  72. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/SScomp.cxx.o +0 -0
  73. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/SelectedOutput.cpp.o +0 -0
  74. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/Serializer.cxx.o +0 -0
  75. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/Solution.cxx.o +0 -0
  76. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/SolutionIsotope.cxx.o +0 -0
  77. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/StorageBin.cxx.o +0 -0
  78. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/StorageBinList.cpp.o +0 -0
  79. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/Surface.cxx.o +0 -0
  80. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/SurfaceCharge.cxx.o +0 -0
  81. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/SurfaceComp.cxx.o +0 -0
  82. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/System.cxx.o +0 -0
  83. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/Temperature.cxx.o +0 -0
  84. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/Use.cpp.o +0 -0
  85. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/UserPunch.cpp.o +0 -0
  86. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/advection.cpp.o +0 -0
  87. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/basicsubs.cpp.o +0 -0
  88. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/cl1.cpp.o +0 -0
  89. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/common/PHRQ_base.cxx.o +0 -0
  90. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/common/PHRQ_io.cpp.o +0 -0
  91. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/common/Parser.cxx.o +0 -0
  92. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/common/Utils.cxx.o +0 -0
  93. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/cvdense.cpp.o +0 -0
  94. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/cvode.cpp.o +0 -0
  95. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/cxxKinetics.cxx.o +0 -0
  96. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/cxxMix.cxx.o +0 -0
  97. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/dense.cpp.o +0 -0
  98. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/dumper.cpp.o +0 -0
  99. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/gases.cpp.o +0 -0
  100. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/input.cpp.o +0 -0
  101. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/integrate.cpp.o +0 -0
  102. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/inverse.cpp.o +0 -0
  103. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/isotopes.cpp.o +0 -0
  104. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/kinetics.cpp.o +0 -0
  105. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/mainsubs.cpp.o +0 -0
  106. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/model.cpp.o +0 -0
  107. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/nvector.cpp.o +0 -0
  108. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/nvector_serial.cpp.o +0 -0
  109. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/parse.cpp.o +0 -0
  110. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/phqalloc.cpp.o +0 -0
  111. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/pitzer.cpp.o +0 -0
  112. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/pitzer_structures.cpp.o +0 -0
  113. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/prep.cpp.o +0 -0
  114. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/print.cpp.o +0 -0
  115. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/read.cpp.o +0 -0
  116. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/readtr.cpp.o +0 -0
  117. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/runner.cpp.o +0 -0
  118. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/sit.cpp.o +0 -0
  119. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/smalldense.cpp.o +0 -0
  120. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/spread.cpp.o +0 -0
  121. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/step.cpp.o +0 -0
  122. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/structures.cpp.o +0 -0
  123. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/sundialsmath.cpp.o +0 -0
  124. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/tally.cpp.o +0 -0
  125. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/tidy.cpp.o +0 -0
  126. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/transport.cpp.o +0 -0
  127. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/IPhreeqc.dir/src/phreeqcpp/utilities.cpp.o +0 -0
  128. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CTestTestfile.cmake +6 -0
  129. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/DartConfiguration.tcl +109 -0
  130. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/cmake_install.cmake +45 -0
  131. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/libIPhreeqc.a +0 -0
  132. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/ar-lib +270 -0
  133. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/compile +347 -0
  134. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/config.guess +1441 -0
  135. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/config.sub +1813 -0
  136. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/depcomp +791 -0
  137. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/install-sh +508 -0
  138. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/ltmain.sh +11156 -0
  139. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/missing +215 -0
  140. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/test-driver +148 -0
  141. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/configure +23867 -0
  142. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/configure.ac +136 -0
  143. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Amm.dat +1968 -0
  144. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/CMakeLists.txt +32 -0
  145. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/ColdChem.dat +267 -0
  146. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Concrete_PHR.dat +158 -0
  147. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Concrete_PZ.dat +195 -0
  148. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Kinec.v2.dat +12039 -0
  149. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Kinec_v3.dat +12159 -0
  150. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Makefile.am +28 -0
  151. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Makefile.in +530 -0
  152. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/PHREEQC_ThermoddemV1.10_15Dec2020.dat +12965 -0
  153. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Tipping_Hurley.dat +4137 -0
  154. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/core10.dat +6824 -0
  155. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/frezchem.dat +634 -0
  156. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/iso.dat +7235 -0
  157. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/llnl.dat +19310 -0
  158. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/minteq.dat +5654 -0
  159. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/minteq.v4.dat +13212 -0
  160. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/phreeqc.dat +1972 -0
  161. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/phreeqc_rates.dat +3158 -0
  162. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/pitzer.dat +1044 -0
  163. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/sit.dat +14348 -0
  164. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/wateq4f.dat +4036 -0
  165. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/CMakeLists.txt +35 -0
  166. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/IPhreeqc.pdf +0 -0
  167. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/Makefile.am +24 -0
  168. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/Makefile.in +545 -0
  169. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/NOTICE +51 -0
  170. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/Phreeqc_2_1999_manual.pdf +0 -0
  171. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/Phreeqc_3_2013_manual.pdf +0 -0
  172. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/README +428 -0
  173. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/RELEASE +7294 -0
  174. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/IPhreeqc_8h.html +5096 -0
  175. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/IPhreeqc_8h_source.html +389 -0
  176. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/IPhreeqc_8hpp.html +83 -0
  177. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/IPhreeqc_8hpp_source.html +478 -0
  178. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/Var_8h.html +318 -0
  179. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/Var_8h_source.html +200 -0
  180. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/bc_s.png +0 -0
  181. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/bdwn.png +0 -0
  182. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/classIPhreeqc.html +2274 -0
  183. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/classIPhreeqc.png +0 -0
  184. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/classIPhreeqcStop.html +69 -0
  185. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/classIPhreeqcStop.png +0 -0
  186. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/closed.png +0 -0
  187. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html +68 -0
  188. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/doxygen.css +1440 -0
  189. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/doxygen.png +0 -0
  190. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/dynsections.js +97 -0
  191. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2blank.png +0 -0
  192. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2doc.png +0 -0
  193. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2folderclosed.png +0 -0
  194. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2folderopen.png +0 -0
  195. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2lastnode.png +0 -0
  196. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2link.png +0 -0
  197. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2mlastnode.png +0 -0
  198. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2mnode.png +0 -0
  199. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2node.png +0 -0
  200. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2plastnode.png +0 -0
  201. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2pnode.png +0 -0
  202. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2splitbar.png +0 -0
  203. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2vertline.png +0 -0
  204. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/index.html +58 -0
  205. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/jquery.js +31 -0
  206. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/nav_f.png +0 -0
  207. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/nav_g.png +0 -0
  208. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/nav_h.png +0 -0
  209. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/open.png +0 -0
  210. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/structVAR.html +143 -0
  211. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/sync_off.png +0 -0
  212. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/sync_on.png +0 -0
  213. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/tab_a.png +0 -0
  214. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/tab_b.png +0 -0
  215. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/tab_h.png +0 -0
  216. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/tab_s.png +0 -0
  217. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/tabs.css +60 -0
  218. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/phreeqc3.chm +0 -0
  219. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/CMakeLists.txt +11 -0
  220. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/Makefile.am +88 -0
  221. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/Makefile.in +696 -0
  222. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/c/CMakeLists.txt +1 -0
  223. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/c/advect/CMakeLists.txt +35 -0
  224. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/c/advect/CMakeLists.txt.in +21 -0
  225. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/c/advect/README.txt +44 -0
  226. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/c/advect/advect.c +101 -0
  227. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/c/advect/ic +17 -0
  228. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/c/advect/phreeqc.dat +1579 -0
  229. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/CMakeLists.txt +10 -0
  230. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/README.txt +3 -0
  231. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/excel/CMakeLists.txt +9 -0
  232. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/excel/phreeqc.dat +1582 -0
  233. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/excel/runphreeqc.xls +0 -0
  234. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/excel/withcallback.xls +0 -0
  235. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/python/CMakeLists.txt +11 -0
  236. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/python/Gypsum.py +52 -0
  237. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/python/parallel_advect.py +465 -0
  238. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/python/phreeqc.dat +1582 -0
  239. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/python/pitzer.dat +790 -0
  240. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/python/wateq4f.dat +3846 -0
  241. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/cpp/CMakeLists.txt +1 -0
  242. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/cpp/advect/CMakeLists.txt +35 -0
  243. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/cpp/advect/CMakeLists.txt.in +20 -0
  244. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/cpp/advect/README.txt +45 -0
  245. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/cpp/advect/advect.cpp +110 -0
  246. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/cpp/advect/ic +17 -0
  247. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/cpp/advect/phreeqc.dat +1579 -0
  248. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/fortran/CMakeLists.txt +1 -0
  249. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/fortran/advect/CMakeLists.txt +44 -0
  250. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/fortran/advect/CMakeLists.txt.in +24 -0
  251. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/fortran/advect/README.txt +45 -0
  252. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/fortran/advect/advect.F90 +102 -0
  253. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/fortran/advect/ic +17 -0
  254. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/fortran/advect/phreeqc.dat +1579 -0
  255. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/using-cmake/CMakeLists.txt +26 -0
  256. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/using-cmake/CMakeLists.txt.in +20 -0
  257. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/using-cmake/README.txt +37 -0
  258. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/using-cmake/ex2 +26 -0
  259. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/using-cmake/main.cpp +20 -0
  260. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/using-cmake/phreeqc.dat +1837 -0
  261. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/using-cmake/post-install.cmake.in +7 -0
  262. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/CMakeLists.txt +185 -0
  263. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/FileTest.cpp +171 -0
  264. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/FileTest.h +34 -0
  265. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/Makefile.am +18 -0
  266. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/Makefile.in +466 -0
  267. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/TestCVar.cpp +9 -0
  268. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/TestIPhreeqc.cpp +4901 -0
  269. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/TestIPhreeqcLib.cpp +4644 -0
  270. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/TestSelectedOutput.cpp +669 -0
  271. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/TestVar.cpp +10 -0
  272. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/conv_fail.in +11 -0
  273. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/dump +42 -0
  274. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/iso.dat +7231 -0
  275. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/kinn20140218 +349 -0
  276. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/missing_e.dat +1556 -0
  277. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/multi_punch +105 -0
  278. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/multi_punch_no_set +102 -0
  279. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/phreeqc.dat.90a6449 +1935 -0
  280. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/phreeqc.dat.old +1556 -0
  281. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/m4/libtool.m4 +8388 -0
  282. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/m4/ltoptions.m4 +437 -0
  283. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/m4/ltsugar.m4 +124 -0
  284. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/m4/ltversion.m4 +23 -0
  285. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/m4/lt~obsolete.m4 +99 -0
  286. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/resource.h +14 -0
  287. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/CSelectedOutput.cpp +401 -0
  288. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/CSelectedOutput.hxx +77 -0
  289. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/CVar.hxx +162 -0
  290. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/Debug.h +12 -0
  291. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/ErrorReporter.hxx +70 -0
  292. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc.cpp +1889 -0
  293. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc.f.inc +91 -0
  294. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc.f90.inc +603 -0
  295. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc.h +2182 -0
  296. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc.hpp +1027 -0
  297. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqcCallbacks.h +19 -0
  298. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqcF.f +653 -0
  299. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqcLib.cpp +1098 -0
  300. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc_interface.F90 +1283 -0
  301. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc_interface_F.cpp +535 -0
  302. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc_interface_F.h +162 -0
  303. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/Makefile.am +210 -0
  304. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/Makefile.in +1294 -0
  305. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/README.Fortran +17 -0
  306. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/Var.c +84 -0
  307. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/Var.h +152 -0
  308. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/Version.h +36 -0
  309. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fimpl.h +282 -0
  310. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap.cpp +646 -0
  311. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap.h +163 -0
  312. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap1.cpp +24 -0
  313. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap2.cpp +24 -0
  314. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap3.cpp +24 -0
  315. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap4.cpp +24 -0
  316. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap5.cpp +24 -0
  317. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap6.cpp +25 -0
  318. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap7.cpp +25 -0
  319. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap8.cpp +24 -0
  320. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ChartHandler.cpp +225 -0
  321. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ChartHandler.h +59 -0
  322. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ChartObject.cpp +1382 -0
  323. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ChartObject.h +444 -0
  324. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/CurveObject.cpp +42 -0
  325. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/CurveObject.h +79 -0
  326. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Dictionary.cpp +41 -0
  327. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Dictionary.h +28 -0
  328. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ExchComp.cxx +398 -0
  329. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ExchComp.h +117 -0
  330. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Exchange.cxx +466 -0
  331. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Exchange.h +74 -0
  332. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Form1.h +1184 -0
  333. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Form1.resX +36 -0
  334. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/GasComp.cxx +265 -0
  335. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/GasComp.h +59 -0
  336. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/GasPhase.cxx +659 -0
  337. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/GasPhase.h +103 -0
  338. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ISolution.cxx +40 -0
  339. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ISolution.h +53 -0
  340. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ISolutionComp.cxx +202 -0
  341. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ISolutionComp.h +138 -0
  342. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/KineticsComp.cxx +318 -0
  343. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/KineticsComp.h +81 -0
  344. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/NA.h +1 -0
  345. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/NameDouble.cxx +537 -0
  346. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/NameDouble.h +66 -0
  347. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/NumKeyword.cxx +190 -0
  348. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/NumKeyword.h +67 -0
  349. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PBasic.cpp +8350 -0
  350. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PBasic.h +572 -0
  351. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PHRQ_io_output.cpp +411 -0
  352. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PPassemblage.cxx +375 -0
  353. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PPassemblage.h +70 -0
  354. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PPassemblageComp.cxx +441 -0
  355. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PPassemblageComp.h +83 -0
  356. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Phreeqc.cpp +2087 -0
  357. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Phreeqc.h +2164 -0
  358. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PhreeqcKeywords/Keywords.cpp +242 -0
  359. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PhreeqcKeywords/Keywords.h +104 -0
  360. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Pressure.cxx +417 -0
  361. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Pressure.h +43 -0
  362. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Reaction.cxx +284 -0
  363. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Reaction.h +57 -0
  364. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ReadClass.cxx +1150 -0
  365. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SS.cxx +609 -0
  366. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SS.h +128 -0
  367. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SSassemblage.cxx +317 -0
  368. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SSassemblage.h +59 -0
  369. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SScomp.cxx +297 -0
  370. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SScomp.h +66 -0
  371. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SelectedOutput.cpp +115 -0
  372. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SelectedOutput.h +209 -0
  373. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Serializer.cxx +213 -0
  374. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Serializer.h +42 -0
  375. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Solution.cxx +1795 -0
  376. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Solution.h +154 -0
  377. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SolutionIsotope.cxx +333 -0
  378. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SolutionIsotope.h +85 -0
  379. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/StorageBin.cxx +1507 -0
  380. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/StorageBin.h +141 -0
  381. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/StorageBinList.cpp +358 -0
  382. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/StorageBinList.h +81 -0
  383. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Surface.cxx +837 -0
  384. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Surface.h +108 -0
  385. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SurfaceCharge.cxx +617 -0
  386. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SurfaceCharge.h +137 -0
  387. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SurfaceComp.cxx +509 -0
  388. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SurfaceComp.h +70 -0
  389. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/System.cxx +103 -0
  390. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/System.h +89 -0
  391. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Temperature.cxx +423 -0
  392. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Temperature.h +42 -0
  393. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Use.cpp +78 -0
  394. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Use.h +159 -0
  395. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/UserPunch.cpp +32 -0
  396. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/UserPunch.h +39 -0
  397. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ZedGraph.dll +0 -0
  398. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/advection.cpp +140 -0
  399. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/basicsubs.cpp +4333 -0
  400. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cl1.cpp +881 -0
  401. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/PHRQ_base.cxx +117 -0
  402. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/PHRQ_base.h +48 -0
  403. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/PHRQ_exports.h +20 -0
  404. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/PHRQ_io.cpp +914 -0
  405. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/PHRQ_io.h +207 -0
  406. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/Parser.cxx +1331 -0
  407. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/Parser.h +310 -0
  408. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/Utils.cxx +263 -0
  409. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/Utils.h +29 -0
  410. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/phrqtype.h +18 -0
  411. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cvdense.cpp +566 -0
  412. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cvdense.h +267 -0
  413. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cvode.cpp +3939 -0
  414. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cvode.h +940 -0
  415. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cxxKinetics.cxx +617 -0
  416. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cxxKinetics.h +78 -0
  417. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cxxMix.cxx +154 -0
  418. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cxxMix.h +58 -0
  419. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/dense.cpp +175 -0
  420. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/dense.h +341 -0
  421. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/dumper.cpp +277 -0
  422. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/dumper.h +60 -0
  423. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/gases.cpp +748 -0
  424. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/global_structures.h +1672 -0
  425. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/input.cpp +133 -0
  426. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/integrate.cpp +1219 -0
  427. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/inverse.cpp +5135 -0
  428. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/isotopes.cpp +1813 -0
  429. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/kinetics.cpp +3180 -0
  430. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/mainsubs.cpp +2320 -0
  431. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/model.cpp +5843 -0
  432. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/nvector.cpp +272 -0
  433. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/nvector.h +485 -0
  434. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/nvector_serial.cpp +1032 -0
  435. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/nvector_serial.h +369 -0
  436. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/parse.cpp +1044 -0
  437. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/phqalloc.cpp +316 -0
  438. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/phqalloc.h +47 -0
  439. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/pitzer.cpp +2709 -0
  440. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/pitzer_structures.cpp +225 -0
  441. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/prep.cpp +6267 -0
  442. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/print.cpp +3673 -0
  443. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/read.cpp +10245 -0
  444. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/readtr.cpp +1495 -0
  445. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/runner.cpp +158 -0
  446. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/runner.h +33 -0
  447. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/sit.cpp +1684 -0
  448. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/smalldense.cpp +324 -0
  449. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/smalldense.h +261 -0
  450. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/spread.cpp +1309 -0
  451. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/step.cpp +1566 -0
  452. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/structures.cpp +3381 -0
  453. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/sundialsmath.cpp +133 -0
  454. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/sundialsmath.h +162 -0
  455. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/sundialstypes.h +183 -0
  456. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/tally.cpp +1288 -0
  457. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/tidy.cpp +5600 -0
  458. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/transport.cpp +6403 -0
  459. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/utilities.cpp +1339 -0
  460. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/thread.h +64 -0
  461. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/CMakeLists.txt +133 -0
  462. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/Makefile.am +45 -0
  463. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/Makefile.in +1128 -0
  464. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/ex2.in +26 -0
  465. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/main.f90 +31 -0
  466. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/main77.f +6 -0
  467. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/main_fortran.cxx +8 -0
  468. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/phreeqc.dat.in +1556 -0
  469. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/test_c.c +148 -0
  470. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/test_cxx.cxx +152 -0
  471. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/test_f90.F90 +328 -0
  472. pyEQL/phreeqc/iphreeqc_wrapper.cpp +75 -0
  473. pyEQL/phreeqc/solution.py +74 -0
  474. pyEQL/phreeqc/var.py +50 -0
  475. pyEQL/presets/Ringers lactate.yaml +20 -0
  476. pyEQL/presets/__init__.py +17 -0
  477. pyEQL/presets/normal saline.yaml +17 -0
  478. pyEQL/presets/rainwater.yaml +17 -0
  479. pyEQL/presets/seawater.yaml +29 -0
  480. pyEQL/presets/urine.yaml +26 -0
  481. pyEQL/presets/wastewater.yaml +21 -0
  482. pyEQL/py.typed +0 -0
  483. pyEQL/salt_ion_match.py +112 -0
  484. pyEQL/solute.py +163 -0
  485. pyEQL/solution.py +2714 -0
  486. pyEQL/utils.py +237 -0
  487. pyeql-1.4.0rc9.dist-info/METADATA +130 -0
  488. pyeql-1.4.0rc9.dist-info/RECORD +491 -0
  489. pyeql-1.4.0rc9.dist-info/WHEEL +6 -0
  490. pyeql-1.4.0rc9.dist-info/licenses/AUTHORS.md +21 -0
  491. pyeql-1.4.0rc9.dist-info/licenses/LICENSE.txt +20 -0
@@ -0,0 +1,4644 @@
1
+ #include <gtest/gtest.h>
2
+ #include <gmock/gmock.h>
3
+
4
+ #include "IPhreeqc.h"
5
+ #include "Phreeqc.h" /* snprintf */
6
+ #include "CVar.hxx"
7
+
8
+ using ::testing::HasSubstr;
9
+
10
+ #if defined(_WIN32)
11
+ #include <windows.h>
12
+ #endif
13
+
14
+ #include <fstream>
15
+ #include <string>
16
+ #include <string.h> // strstr
17
+ #include <cmath>
18
+ #include <cfloat>
19
+ #include <stdlib.h>
20
+
21
+ #include "FileTest.h"
22
+
23
+
24
+ IPQ_RESULT SOLUTION(int n, double C, double Ca, double Na);
25
+ IPQ_RESULT EQUILIBRIUM_PHASES(int n, const char* phase, double si, double amount);
26
+ IPQ_RESULT USER_PUNCH(int n, const char* element, int max);
27
+ IPQ_RESULT SELECTED_OUTPUT(int n);
28
+ IPQ_RESULT DUMP(int n);
29
+
30
+ void TestFileOnOff(const char* FILENAME_FORMAT, int output_file_on, int error_file_on, int log_file_on, int selected_output_file_on, int dump_file_on);
31
+
32
+
33
+ const char ex15_dat[] =
34
+ "SOLUTION_MASTER_SPECIES\n"
35
+ "C CO2 2.0 61.0173 12.0111\n"
36
+ "Cl Cl- 0.0 Cl 35.453\n"
37
+ "Co Co+2 0.0 58.93 58.93 \n"
38
+ "E e- 0.0 0.0 0.0\n"
39
+ "H H+ -1. 1.008 1.008\n"
40
+ "H(0) H2 0.0 1.008\n"
41
+ "H(1) H+ -1. 1.008\n"
42
+ "N NH4+ 0.0 14.0067 14.0067\n"
43
+ "Na Na+ 0.0 Na 22.9898\n"
44
+ "Nta Nta-3 3.0 1. 1.\n"
45
+ "O H2O 0.0 16.00 16.00\n"
46
+ "O(-2) H2O 0.0 18.016\n"
47
+ "O(0) O2 0.0 16.00\n"
48
+ "SOLUTION_SPECIES\n"
49
+ "2H2O = O2 + 4H+ + 4e- \n"
50
+ " log_k -86.08; -gamma 1e7 0.0\n"
51
+ "2 H+ + 2 e- = H2\n"
52
+ " log_k -3.15; -gamma 1e7 0.0\n"
53
+ "H+ = H+\n"
54
+ " log_k 0.0; -gamma 1e7 0.0\n"
55
+ "e- = e-\n"
56
+ " log_k 0.0; -gamma 1e7 0.0\n"
57
+ "H2O = H2O\n"
58
+ " log_k 0.0; -gamma 1e7 0.0\n"
59
+ "CO2 = CO2\n"
60
+ " log_k 0.0; -gamma 1e7 0.0\n"
61
+ "Na+ = Na+\n"
62
+ " log_k 0.0; -gamma 1e7 0.0\n"
63
+ "Cl- = Cl-\n"
64
+ " log_k 0.0; -gamma 1e7 0.0\n"
65
+ "Co+2 = Co+2\n"
66
+ " log_k 0.0; -gamma 1e7 0.0\n"
67
+ "NH4+ = NH4+\n"
68
+ " log_k 0.0; -gamma 1e7 0.0\n"
69
+ "Nta-3 = Nta-3\n"
70
+ " log_k 0.0; -gamma 1e7 0.0\n"
71
+ "Nta-3 + 3H+ = H3Nta\n"
72
+ " log_k 14.9; -gamma 1e7 0.0\n"
73
+ "Nta-3 + 2H+ = H2Nta-\n"
74
+ " log_k 13.3; -gamma 1e7 0.0\n"
75
+ "Nta-3 + H+ = HNta-2\n"
76
+ " log_k 10.3; -gamma 1e7 0.0\n"
77
+ "Nta-3 + Co+2 = CoNta-\n"
78
+ " log_k 11.7; -gamma 1e7 0.0\n"
79
+ "2 Nta-3 + Co+2 = CoNta2-4\n"
80
+ " log_k 14.5; -gamma 1e7 0.0\n"
81
+ "Nta-3 + Co+2 + H2O = CoOHNta-2 + H+\n"
82
+ " log_k 0.5; -gamma 1e7 0.0\n"
83
+ "Co+2 + H2O = CoOH+ + H+\n"
84
+ " log_k -9.7; -gamma 1e7 0.0\n"
85
+ "Co+2 + 2H2O = Co(OH)2 + 2H+\n"
86
+ " log_k -22.9; -gamma 1e7 0.0\n"
87
+ "Co+2 + 3H2O = Co(OH)3- + 3H+\n"
88
+ " log_k -31.5; -gamma 1e7 0.0\n"
89
+ "CO2 + H2O = HCO3- + H+\n"
90
+ " log_k -6.35; -gamma 1e7 0.0\n"
91
+ "CO2 + H2O = CO3-2 + 2H+\n"
92
+ " log_k -16.68; -gamma 1e7 0.0\n"
93
+ "NH4+ = NH3 + H+\n"
94
+ " log_k -9.3; -gamma 1e7 0.0\n"
95
+ "H2O = OH- + H+\n"
96
+ " log_k -14.0; -gamma 1e7 0.0\n"
97
+ "END\n";
98
+
99
+
100
+ TEST(TestIPhreeqcLib, TestCreateIPhreeqc)
101
+ {
102
+ int n = ::CreateIPhreeqc();
103
+ ASSERT_GE(n, 0);
104
+
105
+ if (n >= 0)
106
+ {
107
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
108
+ }
109
+ }
110
+
111
+ TEST(TestIPhreeqcLib, TestDestroyIPhreeqc)
112
+ {
113
+ for (int i = 0; i < 10; ++i)
114
+ {
115
+ ASSERT_EQ(IPQ_BADINSTANCE, ::DestroyIPhreeqc(i));
116
+ }
117
+
118
+ int n = ::CreateIPhreeqc();
119
+ ASSERT_GE(n, 0);
120
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
121
+ }
122
+
123
+ TEST(TestIPhreeqcLib, TestLoadDatabase)
124
+ {
125
+ int n = ::CreateIPhreeqc();
126
+ ASSERT_TRUE(n >= 0);
127
+
128
+ std::string FILES[] = { "phreeqc.dat", "pitzer.dat", "wateq4f.dat",
129
+ "Amm.dat", "frezchem.dat", "iso.dat",
130
+ "llnl.dat", "minteq.dat", "minteq.v4.dat",
131
+ "sit.dat","ColdChem.dat","core10.dat",
132
+ "Tipping_Hurley.dat"
133
+ };
134
+
135
+ for (int j = 0; j < sizeof(FILES) / sizeof(std::string); ++j)
136
+ {
137
+ for (int i = 0; i < 10; ++i)
138
+ {
139
+ ASSERT_EQ(true, ::FileExists(FILES[j].c_str()));
140
+ ASSERT_TRUE(::FileSize(FILES[j].c_str()) > 0);
141
+ ASSERT_EQ(0, ::LoadDatabase(n, FILES[j].c_str()));
142
+ }
143
+ }
144
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
145
+ }
146
+
147
+ TEST(TestIPhreeqcLib, TestLoadDatabaseString)
148
+ {
149
+ int n = ::CreateIPhreeqc();
150
+ ASSERT_TRUE(n >= 0);
151
+
152
+ for (int i = 0; i < 10; ++i)
153
+ {
154
+ ASSERT_EQ(0, ::LoadDatabaseString(n, ex15_dat));
155
+ }
156
+
157
+ if (n >= 0)
158
+ {
159
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
160
+ }
161
+ }
162
+
163
+ TEST(TestIPhreeqcLib, TestLoadDatabaseMissingFile)
164
+ {
165
+ ASSERT_EQ(false, ::FileExists("missing.file"));
166
+
167
+ int n = ::CreateIPhreeqc();
168
+ ASSERT_TRUE(n >= 0);
169
+
170
+ for (int i = 0; i < 10; ++i)
171
+ {
172
+ ASSERT_EQ(1, ::LoadDatabase(n, "missing.file"));
173
+ }
174
+
175
+ const char expected[] =
176
+ "ERROR: LoadDatabase: Unable to open:\"missing.file\".\n";
177
+
178
+ const char* err = ::GetErrorString(n);
179
+
180
+ ASSERT_EQ(std::string(expected), std::string(err));
181
+
182
+ if (n >= 0)
183
+ {
184
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
185
+ }
186
+ }
187
+
188
+ TEST(TestIPhreeqcLib, TestSetErrorOn)
189
+ {
190
+ int n = ::CreateIPhreeqc();
191
+ ASSERT_TRUE(n >= 0);
192
+
193
+ ASSERT_EQ(1, ::GetErrorOn(n)); // initial setting is true
194
+ ASSERT_EQ(IPQ_OK, ::SetErrorOn(n, 0));
195
+ ASSERT_EQ(0, ::GetErrorOn(n));
196
+
197
+ if (n >= 0)
198
+ {
199
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
200
+ }
201
+ }
202
+
203
+ TEST(TestIPhreeqcLib, TestLoadDatabaseWithErrors)
204
+ {
205
+ ASSERT_EQ(true, ::FileExists("missing_e.dat"));
206
+
207
+ int n = ::CreateIPhreeqc();
208
+ ASSERT_TRUE(n >= 0);
209
+
210
+ for (int i = 0; i < 10; ++i)
211
+ {
212
+ ASSERT_EQ(true, ::FileExists("missing_e.dat"));
213
+ ASSERT_TRUE(::FileSize("missing_e.dat") > 0);
214
+ ASSERT_EQ(6, ::LoadDatabase(n, "missing_e.dat"));
215
+
216
+ static const char* expected =
217
+ "ERROR: Could not reduce equation to primary master species, CH4.\n"
218
+ "ERROR: Could not reduce equation to primary master species, Cu+.\n"
219
+ "ERROR: Could not reduce equation to primary master species, Fe+3.\n"
220
+ "ERROR: Could not reduce equation to primary master species, H2.\n"
221
+ "ERROR: Could not reduce equation to primary master species, Mn+3.\n"
222
+ "ERROR: Could not reduce equation to primary master species, NH4+.\n"
223
+ "ERROR: Could not reduce equation to primary master species, N2.\n"
224
+ "ERROR: Could not reduce equation to primary master species, NO2-.\n"
225
+ "ERROR: Could not reduce equation to primary master species, O2.\n"
226
+ "ERROR: Could not reduce equation to primary master species, HS-.\n"
227
+ "ERROR: Could not reduce equation to secondary master species, e-.\n"
228
+ "ERROR: Non-master species in secondary reaction, e-.\n"
229
+ "ERROR: No master species for element e.\n"
230
+ "ERROR: Could not find primary master species for e.\n"
231
+ "ERROR: No master species for element e.\n"
232
+ "ERROR: Could not reduce equation to secondary master species, Hausmannite.\n"
233
+ "ERROR: Could not reduce equation to secondary master species, Manganite.\n"
234
+ "ERROR: Could not reduce equation to secondary master species, Pyrite.\n"
235
+ "ERROR: Could not reduce equation to secondary master species, Pyrolusite.\n"
236
+ "ERROR: Could not reduce equation to secondary master species, Sulfur.\n"
237
+ "ERROR: e-, primary master species for E-, not defined.\n"
238
+ "ERROR: Calculations terminating due to input errors.\n";
239
+
240
+ const char* err = ::GetErrorString(n);
241
+
242
+ ASSERT_EQ(std::string(expected), std::string(err));
243
+ }
244
+
245
+ if (n >= 0)
246
+ {
247
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
248
+ }
249
+ }
250
+
251
+ TEST(TestIPhreeqcLib, TestRunAccumulated)
252
+ {
253
+ int n = ::CreateIPhreeqc();
254
+ ASSERT_TRUE(n >= 0);
255
+
256
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
257
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "solution 12"));
258
+ ASSERT_EQ(0, ::GetOutputFileOn(n));
259
+ ASSERT_EQ(0, ::GetErrorFileOn(n));
260
+ ASSERT_EQ(0, ::GetLogFileOn(n));
261
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
262
+ ASSERT_EQ(0, ::GetDumpFileOn(n));
263
+ ASSERT_EQ(0, ::GetDumpStringOn(n));
264
+ ASSERT_EQ(0, ::RunAccumulated(n));
265
+
266
+ if (n >= 0)
267
+ {
268
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
269
+ }
270
+ }
271
+
272
+ TEST(TestIPhreeqcLib, TestRunWithErrors)
273
+ {
274
+ const char dump_file[] = "error.inp";
275
+
276
+ // remove dump file if it exists
277
+ //
278
+ FileTest dump(dump_file);
279
+ ASSERT_TRUE(dump.RemoveExisting());
280
+
281
+ int n = ::CreateIPhreeqc();
282
+ ASSERT_TRUE(n >= 0);
283
+
284
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
285
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "SOLUTION 1"));
286
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " pH 7"));
287
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Na 1"));
288
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "PHASES"));
289
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Fix_H+"));
290
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " H+ = H+"));
291
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " log_k 0"));
292
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "EQUILIBRIUM_PHASES"));
293
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Fix_H+ -10 HCl 10"));
294
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "END"));
295
+ ASSERT_EQ(0, ::GetOutputFileOn(n));
296
+ ASSERT_EQ(0, ::GetErrorFileOn(n));
297
+ ASSERT_EQ(0, ::GetLogFileOn(n));
298
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
299
+ ASSERT_EQ(0, ::GetDumpFileOn(n));
300
+ ASSERT_EQ(0, ::GetDumpStringOn(n));
301
+ ASSERT_EQ(1, ::RunAccumulated(n));
302
+
303
+ const char expected[] =
304
+ "ERROR: Numerical method failed on all combinations of convergence parameters, cell/soln/mix 1\n";
305
+ const char* err = ::GetErrorString(n);
306
+
307
+ ASSERT_EQ(std::string(expected), std::string(err));
308
+
309
+ if (n >= 0)
310
+ {
311
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
312
+ }
313
+ ASSERT_TRUE(dump.VerifyExists());
314
+ }
315
+
316
+ TEST(TestIPhreeqcLib, TestRunFile)
317
+ {
318
+ static const char dump_file[] = "error.inp";
319
+
320
+ // remove dump file if it exists
321
+ //
322
+ if (::FileExists(dump_file))
323
+ {
324
+ ASSERT_TRUE(::DeleteFile(dump_file));
325
+ }
326
+ ASSERT_EQ(false, ::FileExists(dump_file));
327
+
328
+ int n = ::CreateIPhreeqc();
329
+ ASSERT_TRUE(n >= 0);
330
+
331
+ ASSERT_EQ(true, ::FileExists("phreeqc.dat"));
332
+ ASSERT_TRUE(::FileSize("phreeqc.dat") > 0);
333
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
334
+ ASSERT_EQ(0, ::GetOutputFileOn(n));
335
+ ASSERT_EQ(0, ::GetErrorFileOn(n));
336
+ ASSERT_EQ(0, ::GetLogFileOn(n));
337
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
338
+ ASSERT_EQ(0, ::GetDumpFileOn(n));
339
+ ASSERT_EQ(0, ::GetDumpStringOn(n));
340
+ ASSERT_EQ(true, ::FileExists("conv_fail.in"));
341
+ ASSERT_TRUE(::FileSize("conv_fail.in") > 0);
342
+ ASSERT_EQ(1, ::RunFile(n, "conv_fail.in"));
343
+
344
+ static const char expected[] =
345
+ "ERROR: Numerical method failed on all combinations of convergence parameters, cell/soln/mix 1\n";
346
+ const char* err = ::GetErrorString(n);
347
+
348
+ ASSERT_EQ(std::string(expected), std::string(err));
349
+
350
+ if (n >= 0)
351
+ {
352
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
353
+ }
354
+
355
+ // Note: should this file exist since GetDumpFileOn is false?
356
+ ASSERT_EQ(true, ::FileExists(dump_file));
357
+ ASSERT_TRUE(::FileSize(dump_file) > 0);
358
+ ASSERT_TRUE(::DeleteFile(dump_file));
359
+ }
360
+
361
+ TEST(TestIPhreeqcLib, TestRunString)
362
+ {
363
+ const char input[] =
364
+ "TITLE Example 1.--Add uranium and speciate seawater.\n"
365
+ "SOLUTION 1 SEAWATER FROM NORDSTROM ET AL. (1979)\n"
366
+ " units ppm\n"
367
+ " pH 8.22\n"
368
+ " pe 8.451\n"
369
+ " density 1.023\n"
370
+ " temp 25.0\n"
371
+ " redox O(0)/O(-2)\n"
372
+ " Ca 412.3\n"
373
+ " Mg 1291.8\n"
374
+ " Na 10768.0\n"
375
+ " K 399.1\n"
376
+ " Fe 0.002\n"
377
+ " Mn 0.0002 pe\n"
378
+ " Si 4.28\n"
379
+ " Cl 19353.0\n"
380
+ " Alkalinity 141.682 as HCO3\n"
381
+ " S(6) 2712.0\n"
382
+ " N(5) 0.29 gfw 62.0\n"
383
+ " N(-3) 0.03 as NH4\n"
384
+ " U 3.3 ppb N(5)/N(-3)\n"
385
+ " O(0) 1.0 O2(g) -0.7\n"
386
+ "SOLUTION_MASTER_SPECIES\n"
387
+ " U U+4 0.0 238.0290 238.0290\n"
388
+ " U(4) U+4 0.0 238.0290\n"
389
+ " U(5) UO2+ 0.0 238.0290\n"
390
+ " U(6) UO2+2 0.0 238.0290\n"
391
+ "SOLUTION_SPECIES\n"
392
+ " #primary master species for U\n"
393
+ " #is also secondary master species for U(4)\n"
394
+ " U+4 = U+4\n"
395
+ " log_k 0.0\n"
396
+ " U+4 + 4 H2O = U(OH)4 + 4 H+\n"
397
+ " log_k -8.538\n"
398
+ " delta_h 24.760 kcal\n"
399
+ " U+4 + 5 H2O = U(OH)5- + 5 H+\n"
400
+ " log_k -13.147\n"
401
+ " delta_h 27.580 kcal\n"
402
+ " #secondary master species for U(5)\n"
403
+ " U+4 + 2 H2O = UO2+ + 4 H+ + e-\n"
404
+ " log_k -6.432\n"
405
+ " delta_h 31.130 kcal\n"
406
+ " #secondary master species for U(6)\n"
407
+ " U+4 + 2 H2O = UO2+2 + 4 H+ + 2 e-\n"
408
+ " log_k -9.217\n"
409
+ " delta_h 34.430 kcal\n"
410
+ " UO2+2 + H2O = UO2OH+ + H+\n"
411
+ " log_k -5.782\n"
412
+ " delta_h 11.015 kcal\n"
413
+ " 2UO2+2 + 2H2O = (UO2)2(OH)2+2 + 2H+\n"
414
+ " log_k -5.626\n"
415
+ " delta_h -36.04 kcal\n"
416
+ " 3UO2+2 + 5H2O = (UO2)3(OH)5+ + 5H+\n"
417
+ " log_k -15.641\n"
418
+ " delta_h -44.27 kcal\n"
419
+ " UO2+2 + CO3-2 = UO2CO3\n"
420
+ " log_k 10.064\n"
421
+ " delta_h 0.84 kcal\n"
422
+ " UO2+2 + 2CO3-2 = UO2(CO3)2-2\n"
423
+ " log_k 16.977\n"
424
+ " delta_h 3.48 kcal\n"
425
+ " UO2+2 + 3CO3-2 = UO2(CO3)3-4\n"
426
+ " log_k 21.397\n"
427
+ " delta_h -8.78 kcal\n"
428
+ "PHASES\n"
429
+ " Uraninite\n"
430
+ " UO2 + 4 H+ = U+4 + 2 H2O\n"
431
+ " log_k -3.490\n"
432
+ " delta_h -18.630 kcal\n"
433
+ "END\n"
434
+ "\n";
435
+
436
+ int n = ::CreateIPhreeqc();
437
+ ASSERT_TRUE(n >= 0);
438
+
439
+ char OUTPUT_FILE[80];
440
+ snprintf(OUTPUT_FILE, sizeof(OUTPUT_FILE), "phreeqc.%d.out", n);
441
+
442
+ if (::FileExists(OUTPUT_FILE))
443
+ {
444
+ ASSERT_TRUE(::DeleteFile(OUTPUT_FILE));
445
+ }
446
+ ASSERT_EQ(false, ::FileExists(OUTPUT_FILE));
447
+
448
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
449
+ ::SetOutputFileOn(n, 1);
450
+ ::SetErrorFileOn(n, 0);
451
+ ::SetLogFileOn(n, 0);
452
+ ::SetSelectedOutputFileOn(n, 0);
453
+ ::SetDumpFileOn(n, 0);
454
+ ASSERT_EQ(false, ::FileExists(OUTPUT_FILE));
455
+ ASSERT_EQ(0, ::RunString(n, input));
456
+ ASSERT_EQ(true, ::FileExists(OUTPUT_FILE));
457
+ ASSERT_TRUE(::FileSize(OUTPUT_FILE) > 0);
458
+ if (n >= 0)
459
+ {
460
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
461
+ }
462
+ if (::FileExists(OUTPUT_FILE))
463
+ {
464
+ ASSERT_TRUE(::DeleteFile(OUTPUT_FILE));
465
+ }
466
+ }
467
+
468
+ TEST(TestIPhreeqcLib, TestGetSelectedOutputRowCount)
469
+ {
470
+ int n = ::CreateIPhreeqc();
471
+ ASSERT_TRUE(n >= 0);
472
+
473
+ ASSERT_EQ(true, ::FileExists("llnl.dat"));
474
+ ASSERT_TRUE(::FileSize("llnl.dat") > 0);
475
+ ASSERT_EQ(0, ::LoadDatabase(n, "llnl.dat"));
476
+
477
+ int max = 6;
478
+
479
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
480
+ ASSERT_EQ(IPQ_OK, ::EQUILIBRIUM_PHASES(n, "calcite", 0.0, 0.010));
481
+ ASSERT_EQ(IPQ_OK, ::USER_PUNCH(n, "Ca", max));
482
+ ASSERT_EQ(0, ::GetOutputFileOn(n));
483
+ ASSERT_EQ(0, ::GetErrorFileOn(n));
484
+ ASSERT_EQ(0, ::GetLogFileOn(n));
485
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
486
+ ASSERT_EQ(0, ::GetDumpFileOn(n));
487
+ ASSERT_EQ(0, ::GetDumpStringOn(n));
488
+ ASSERT_EQ(0, ::RunAccumulated(n));
489
+ ASSERT_EQ(3, ::GetSelectedOutputRowCount(n)); // rows + header
490
+
491
+ if (n >= 0)
492
+ {
493
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
494
+ }
495
+ }
496
+ #define USE_VAR
497
+ TEST(TestIPhreeqcLib, TestGetSelectedOutputValue)
498
+ {
499
+ int n = ::CreateIPhreeqc();
500
+ ASSERT_TRUE(n >= 0);
501
+
502
+ ASSERT_EQ(0, ::LoadDatabase(n, "llnl.dat"));
503
+
504
+ int max = 6;
505
+
506
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
507
+ ASSERT_EQ(IPQ_OK, ::EQUILIBRIUM_PHASES(n, "calcite", 0.0, 0.010));
508
+ ASSERT_EQ(IPQ_OK, ::USER_PUNCH(n, "Ca", max));
509
+ ASSERT_EQ(0, ::GetOutputFileOn(n));
510
+ ASSERT_EQ(0, ::GetErrorFileOn(n));
511
+ ASSERT_EQ(0, ::GetLogFileOn(n));
512
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
513
+ ASSERT_EQ(0, ::GetDumpFileOn(n));
514
+ ASSERT_EQ(0, ::GetDumpStringOn(n));
515
+ ASSERT_EQ(0, ::RunAccumulated(n));
516
+
517
+ /*
518
+ EXPECTED selected.out:
519
+ sim state soln dist_x time step pH pe C Ca Na m_CO3-2 m_CaOH+ m_NaCO3- la_CO3-2 la_CaOH+ la_NaCO3- Calcite d_Calcite si_CO2(g) si_Siderite pressure total mol volume g_CO2(g) g_N2(g) k_Albite dk_Albite k_Pyrite dk_Pyrite s_CaSO4 s_SrSO4 1.name 1.type 1.moles 2.name 2.type 2.moles 3.name 3.type 3.moles 4.name 4.type 4.moles 5.name 5.type 5.moles 6.name 6.type 6.moles
520
+ 1 i_soln 1 -99 -99 -99 7 4 1.0000e-003 1.0000e-003 1.0000e-003 4.2975e-007 1.1819e-009 1.1881e-009 -6.4686e+000 -8.9530e+000 -8.9507e+000 0.0000e+000 0.0000e+000 -2.2870 -999.9990 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 Ca+2 aq 9.9178e-004 CaHCO3+ aq 7.5980e-006 CaCO3 aq 6.2155e-007 CaOH+ aq 1.1819e-009
521
+ 1 react 1 -99 0 1 7.86135 10.18 1.1556e-003 1.1556e-003 1.0000e-003 4.2718e-006 9.7385e-009 1.1620e-008 -5.4781e+000 -8.0388e+000 -7.9621e+000 9.8444e-003 -1.5555e-004 -3.0192 -999.9990 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 calcite equi 9.8444e-003 Ca+2 aq 1.1371e-003 CaHCO3+ aq 1.1598e-005 CaCO3 aq 6.8668e-006 CaOH+ aq 9.7385e-009
522
+ */
523
+
524
+ #if defined(USE_VAR)
525
+ VAR v;
526
+ ::VarInit(&v);
527
+ #else
528
+ CVar v;
529
+ #endif
530
+
531
+ ASSERT_EQ(IPQ_INVALIDROW, ::GetSelectedOutputValue(n, -1, 0, &v));
532
+ ASSERT_EQ(TT_ERROR, v.type);
533
+ ASSERT_EQ(VR_INVALIDROW, v.vresult);
534
+
535
+ ASSERT_EQ(IPQ_INVALIDROW, ::GetSelectedOutputValue(n, ::GetSelectedOutputRowCount(n), 0, &v));
536
+ ASSERT_EQ(TT_ERROR, v.type);
537
+ ASSERT_EQ(VR_INVALIDROW, v.vresult);
538
+
539
+ ASSERT_EQ(IPQ_INVALIDCOL, ::GetSelectedOutputValue(n, 0, -1, &v));
540
+ ASSERT_EQ(TT_ERROR, v.type);
541
+ ASSERT_EQ(VR_INVALIDCOL, v.vresult);
542
+
543
+ ASSERT_EQ(IPQ_INVALIDCOL, ::GetSelectedOutputValue(n, 0, ::GetSelectedOutputColumnCount(n), &v));
544
+ ASSERT_EQ(TT_ERROR, v.type);
545
+ ASSERT_EQ(VR_INVALIDCOL, v.vresult);
546
+
547
+
548
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, 0, &v));
549
+ ASSERT_EQ(TT_STRING, v.type);
550
+ ASSERT_EQ(std::string("sim"), std::string(v.sVal));
551
+
552
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, 1, &v));
553
+ ASSERT_EQ(TT_STRING, v.type);
554
+ ASSERT_EQ(std::string("state"), std::string(v.sVal));
555
+
556
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, 2, &v));
557
+ ASSERT_EQ(TT_STRING, v.type);
558
+ ASSERT_EQ(std::string("soln"), std::string(v.sVal));
559
+
560
+ //{{{{{{
561
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, 3, &v));
562
+ ASSERT_EQ(TT_STRING, v.type);
563
+ ASSERT_EQ(std::string("dist_x"), std::string(v.sVal));
564
+
565
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, 4, &v));
566
+ ASSERT_EQ(TT_STRING, v.type);
567
+ ASSERT_EQ(std::string("time"), std::string(v.sVal));
568
+
569
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, 5, &v));
570
+ ASSERT_EQ(TT_STRING, v.type);
571
+ ASSERT_EQ(std::string("step"), std::string(v.sVal));
572
+
573
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, 6, &v));
574
+ ASSERT_EQ(TT_STRING, v.type);
575
+ ASSERT_EQ(std::string("pH"), std::string(v.sVal));
576
+
577
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, 7, &v));
578
+ ASSERT_EQ(TT_STRING, v.type);
579
+ ASSERT_EQ(std::string("pe"), std::string(v.sVal));
580
+
581
+ int col = 7;
582
+
583
+ // -totals C Ca Na
584
+ ++col;
585
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
586
+ ASSERT_EQ(TT_STRING, v.type);
587
+ ASSERT_EQ(std::string("C(mol/kgw)"), std::string(v.sVal));
588
+ ++col;
589
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
590
+ ASSERT_EQ(TT_STRING, v.type);
591
+ ASSERT_EQ(std::string("Ca(mol/kgw)"), std::string(v.sVal));
592
+ ++col;
593
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
594
+ ASSERT_EQ(TT_STRING, v.type);
595
+ ASSERT_EQ(std::string("Na(mol/kgw)"), std::string(v.sVal));
596
+
597
+ // -molalities CO3-2 CaOH+ NaCO3-
598
+ ++col;
599
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
600
+ ASSERT_EQ(TT_STRING, v.type);
601
+ ASSERT_EQ(std::string("m_CO3-2(mol/kgw)"), std::string(v.sVal));
602
+ ++col;
603
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
604
+ ASSERT_EQ(TT_STRING, v.type);
605
+ ASSERT_EQ(std::string("m_CaOH+(mol/kgw)"), std::string(v.sVal));
606
+ ++col;
607
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
608
+ ASSERT_EQ(TT_STRING, v.type);
609
+ ASSERT_EQ(std::string("m_NaCO3-(mol/kgw)"), std::string(v.sVal));
610
+
611
+ // -activities CO3-2 CaOH+ NaCO3-
612
+ ++col;
613
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
614
+ ASSERT_EQ(TT_STRING, v.type);
615
+ ASSERT_EQ(std::string("la_CO3-2"), std::string(v.sVal));
616
+ ++col;
617
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
618
+ ASSERT_EQ(TT_STRING, v.type);
619
+ ASSERT_EQ(std::string("la_CaOH+"), std::string(v.sVal));
620
+ ++col;
621
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
622
+ ASSERT_EQ(TT_STRING, v.type);
623
+ ASSERT_EQ(std::string("la_NaCO3-"), std::string(v.sVal));
624
+
625
+ // -equilibrium_phases Calcite
626
+ ++col;
627
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
628
+ ASSERT_EQ(TT_STRING, v.type);
629
+ ASSERT_EQ(std::string("Calcite"), std::string(v.sVal));
630
+ ++col;
631
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
632
+ ASSERT_EQ(TT_STRING, v.type);
633
+ ASSERT_EQ(std::string("d_Calcite"), std::string(v.sVal));
634
+
635
+
636
+ // -saturation_indices CO2(g) Siderite
637
+ ++col;
638
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
639
+ ASSERT_EQ(TT_STRING, v.type);
640
+ ASSERT_EQ(std::string("si_CO2(g)"), std::string(v.sVal));
641
+ ++col;
642
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
643
+ ASSERT_EQ(TT_STRING, v.type);
644
+ ASSERT_EQ(std::string("si_Siderite"), std::string(v.sVal));
645
+
646
+ // -gases CO2(g) N2(g)
647
+ // pressure "total mol" volume g_CO2(g) g_N2(g)
648
+ ++col;
649
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
650
+ ASSERT_EQ(TT_STRING, v.type);
651
+ ASSERT_EQ(std::string("pressure"), std::string(v.sVal));
652
+ ++col;
653
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
654
+ ASSERT_EQ(TT_STRING, v.type);
655
+ ASSERT_EQ(std::string("total mol"), std::string(v.sVal));
656
+ ++col;
657
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
658
+ ASSERT_EQ(TT_STRING, v.type);
659
+ ASSERT_EQ(std::string("volume"), std::string(v.sVal));
660
+ ++col;
661
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
662
+ ASSERT_EQ(TT_STRING, v.type);
663
+ ASSERT_EQ(std::string("g_CO2(g)"), std::string(v.sVal));
664
+ ++col;
665
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
666
+ ASSERT_EQ(TT_STRING, v.type);
667
+ ASSERT_EQ(std::string("g_N2(g)"), std::string(v.sVal));
668
+
669
+ // -kinetic_reactants Albite Pyrite
670
+ // k_Albite dk_Albite k_Pyrite dk_Pyrite
671
+ ++col;
672
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
673
+ ASSERT_EQ(TT_STRING, v.type);
674
+ ASSERT_EQ(std::string("k_Albite"), std::string(v.sVal));
675
+ ++col;
676
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
677
+ ASSERT_EQ(TT_STRING, v.type);
678
+ ASSERT_EQ(std::string("dk_Albite"), std::string(v.sVal));
679
+ ++col;
680
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
681
+ ASSERT_EQ(TT_STRING, v.type);
682
+ ASSERT_EQ(std::string("k_Pyrite"), std::string(v.sVal));
683
+ ++col;
684
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
685
+ ASSERT_EQ(TT_STRING, v.type);
686
+ ASSERT_EQ(std::string("dk_Pyrite"), std::string(v.sVal));
687
+
688
+ // -solid_solutions CaSO4 SrSO4
689
+ // s_CaSO4 s_SrSO4
690
+ ++col;
691
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
692
+ ASSERT_EQ(TT_STRING, v.type);
693
+ ASSERT_EQ(std::string("s_CaSO4"), std::string(v.sVal));
694
+ ++col;
695
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col, &v));
696
+ ASSERT_EQ(TT_STRING, v.type);
697
+ ASSERT_EQ(std::string("s_SrSO4"), std::string(v.sVal));
698
+
699
+ for (int i = 0; i < max; ++i)
700
+ {
701
+ std::ostringstream oss1, oss2, oss3;
702
+
703
+ // 1.name
704
+ //
705
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col + 1 + (i * 3), &v));
706
+ ASSERT_EQ(TT_STRING, v.type);
707
+ oss1 << i + 1 << ".name";
708
+ ASSERT_EQ(oss1.str(), std::string(v.sVal));
709
+
710
+ // 1.type
711
+ //
712
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col + 2 + (i * 3), &v));
713
+ ASSERT_EQ(TT_STRING, v.type);
714
+ oss2 << i + 1 << ".type";
715
+ ASSERT_EQ(oss2.str(), std::string(v.sVal));
716
+
717
+ // 1.moles
718
+ //
719
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, col + 3 + (i * 3), &v));
720
+ ASSERT_EQ(TT_STRING, v.type);
721
+ oss3 << i + 1 << ".moles";
722
+ ASSERT_EQ(oss3.str(), std::string(v.sVal));
723
+ }
724
+
725
+ // sim
726
+ //
727
+ col = 0;
728
+ // i_soln
729
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
730
+ ASSERT_EQ(TT_LONG, v.type);
731
+ ASSERT_EQ(1L, v.lVal);
732
+ // react
733
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
734
+ ASSERT_EQ(TT_LONG, v.type);
735
+ ASSERT_EQ(1L, v.lVal);
736
+
737
+ // state
738
+ //
739
+ ++col;
740
+ // i_soln
741
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
742
+ ASSERT_EQ(TT_STRING, v.type);
743
+ ASSERT_EQ(std::string("i_soln"), std::string(v.sVal));
744
+ // react
745
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
746
+ ASSERT_EQ(TT_STRING, v.type);
747
+ ASSERT_EQ(std::string("react"), std::string(v.sVal));
748
+
749
+ // soln
750
+ //
751
+ ++col;
752
+ // i_soln
753
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
754
+ ASSERT_EQ(TT_LONG, v.type);
755
+ ASSERT_EQ(1L, v.lVal);
756
+ // react
757
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
758
+ ASSERT_EQ(TT_LONG, v.type);
759
+ ASSERT_EQ(1L, v.lVal);
760
+
761
+ // dist_x -- sometimes as double sometimes as long (depends on state)
762
+ //
763
+ ++col;
764
+ // i_soln
765
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
766
+ ASSERT_EQ(TT_DOUBLE, v.type);
767
+ ASSERT_EQ(-99., v.dVal);
768
+ // react
769
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
770
+ ASSERT_EQ(TT_DOUBLE, v.type);
771
+ ASSERT_EQ(-99., v.dVal);
772
+
773
+
774
+ // time -- sometimes as double sometimes as long (depends on state)
775
+ //
776
+ ++col;
777
+ // i_soln
778
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
779
+ ASSERT_EQ(TT_DOUBLE, v.type);
780
+ ASSERT_EQ(-99., v.dVal);
781
+ // react
782
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
783
+ ASSERT_EQ(TT_DOUBLE, v.type);
784
+ //CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, v.dVal, ::pow(10., -DBL_DIG));
785
+ ASSERT_NEAR(0.0, v.dVal, ::pow(10., -DBL_DIG));
786
+ ASSERT_DOUBLE_EQ(0.0, v.dVal);
787
+
788
+ // step
789
+ //
790
+ ++col;
791
+ // i_soln
792
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
793
+ ASSERT_EQ(TT_LONG, v.type);
794
+ ASSERT_EQ(-99L, v.lVal);
795
+ // react
796
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
797
+ ASSERT_EQ(TT_LONG, v.type);
798
+ ASSERT_EQ(1L, v.lVal);
799
+
800
+
801
+ // pH
802
+ //
803
+ ++col;
804
+ // i_soln
805
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
806
+ ASSERT_EQ(TT_DOUBLE, v.type);
807
+ ASSERT_NEAR(7.0, v.dVal, ::pow(10., -DBL_DIG));
808
+ // react
809
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
810
+ ASSERT_EQ(TT_DOUBLE, v.type);
811
+ ASSERT_NEAR(7.861354, v.dVal, ::pow(10., -6));
812
+
813
+ // pe
814
+ //
815
+ ++col;
816
+ // i_soln
817
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
818
+ ASSERT_EQ(TT_DOUBLE, v.type);
819
+ ASSERT_NEAR(4.0, v.dVal, ::pow(10., -DBL_DIG));
820
+ // react
821
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
822
+ ASSERT_EQ(TT_DOUBLE, v.type);
823
+ // COMMENT: {8/8/2013 3:38:12 PM} ASSERT_NEAR( 9.90852, v.dVal, ::pow(10., -1) );
824
+
825
+ //
826
+ // -totals C Ca Na
827
+ //
828
+
829
+ // C(mol/kgw)
830
+ //
831
+ ++col;
832
+ // i_soln
833
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
834
+ ASSERT_EQ(TT_DOUBLE, v.type);
835
+ ASSERT_NEAR(1.0000e-003, v.dVal, ::pow(10., -DBL_DIG));
836
+ // react
837
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
838
+ ASSERT_EQ(TT_DOUBLE, v.type);
839
+ ASSERT_NEAR(1.1556e-003, v.dVal, ::pow(10., -7));
840
+
841
+
842
+ // Ca(mol/kgw)
843
+ //
844
+ ++col;
845
+ // i_soln
846
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
847
+ ASSERT_EQ(TT_DOUBLE, v.type);
848
+ ASSERT_NEAR(1.0000e-003, v.dVal, ::pow(10., -DBL_DIG));
849
+ // react
850
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
851
+ ASSERT_EQ(TT_DOUBLE, v.type);
852
+ ASSERT_NEAR(1.1556e-003, v.dVal, ::pow(10., -7));
853
+
854
+
855
+ // Na(mol/kgw)
856
+ //
857
+ ++col;
858
+ // i_soln
859
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
860
+ ASSERT_EQ(TT_DOUBLE, v.type);
861
+ ASSERT_NEAR(1.0000e-003, v.dVal, ::pow(10., -DBL_DIG));
862
+ // react
863
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
864
+ ASSERT_EQ(TT_DOUBLE, v.type);
865
+ ASSERT_NEAR(1.0000e-003, v.dVal, ::pow(10., -7));
866
+
867
+ // -molalities CO3-2 CaOH+ NaCO3-
868
+ col += 3;
869
+
870
+ // -activities CO3-2 CaOH+ NaCO3-
871
+ col += 3;
872
+
873
+ // -equilibrium_phases Calcite
874
+ col += 2;
875
+
876
+ // -saturation_indices CO2(g) Siderite
877
+ col += 2;
878
+
879
+ // -gases CO2(g) N2(g)
880
+ col += 5;
881
+
882
+ // -kinetic_reactants Albite Pyrite
883
+ // k_Albite dk_Albite k_Pyrite dk_Pyrite
884
+ col += 4;
885
+
886
+ // -solid_solutions CaSO4 SrSO4
887
+ // s_CaSO4 s_SrSO4
888
+ col += 2;
889
+
890
+
891
+ // 1.name
892
+ //
893
+ ++col;
894
+ // i_soln
895
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
896
+ ASSERT_EQ(TT_STRING, v.type);
897
+ ASSERT_EQ(std::string("Ca+2"), std::string(v.sVal));
898
+ // react
899
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
900
+ ASSERT_EQ(TT_STRING, v.type);
901
+ ASSERT_EQ(std::string("Calcite"), std::string(v.sVal));
902
+
903
+ // 1.type
904
+ //
905
+ ++col;
906
+ // i_soln
907
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
908
+ ASSERT_EQ(TT_STRING, v.type);
909
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
910
+ // react
911
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
912
+ ASSERT_EQ(TT_STRING, v.type);
913
+ ASSERT_EQ(std::string("equi"), std::string(v.sVal));
914
+
915
+ // 1.moles
916
+ //
917
+ ++col;
918
+ // i_soln
919
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
920
+ ASSERT_EQ(TT_DOUBLE, v.type);
921
+ ASSERT_NEAR(9.9177923E-04, v.dVal, ::pow(10., -11));
922
+ // react
923
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
924
+ ASSERT_EQ(TT_DOUBLE, v.type);
925
+ ASSERT_NEAR(9.8444477E-03, v.dVal, ::pow(10., -10));
926
+
927
+ // 2.name
928
+ //
929
+ ++col;
930
+ // i_soln
931
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
932
+ ASSERT_EQ(TT_STRING, v.type);
933
+ ASSERT_EQ(std::string("CaHCO3+"), std::string(v.sVal));
934
+ // react
935
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
936
+ ASSERT_EQ(TT_STRING, v.type);
937
+ ASSERT_EQ(std::string("Ca+2"), std::string(v.sVal));
938
+
939
+ // 2.type
940
+ //
941
+ ++col;
942
+ // i_soln
943
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
944
+ ASSERT_EQ(TT_STRING, v.type);
945
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
946
+ // react
947
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
948
+ ASSERT_EQ(TT_STRING, v.type);
949
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
950
+
951
+ // 2.moles
952
+ //
953
+ ++col;
954
+ // i_soln
955
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
956
+ ASSERT_EQ(TT_DOUBLE, v.type);
957
+ ASSERT_NEAR(7.5980e-006, v.dVal, ::pow(10., -10));
958
+ // react
959
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
960
+ ASSERT_EQ(TT_DOUBLE, v.type);
961
+ ASSERT_NEAR(1.1371e-003, v.dVal, ::pow(10., -7));
962
+
963
+
964
+ // 3.name
965
+ //
966
+ ++col;
967
+ // i_soln
968
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
969
+ ASSERT_EQ(TT_STRING, v.type);
970
+ ASSERT_EQ(std::string("CaCO3"), std::string(v.sVal));
971
+ // react
972
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
973
+ ASSERT_EQ(TT_STRING, v.type);
974
+ ASSERT_EQ(std::string("CaHCO3+"), std::string(v.sVal));
975
+
976
+ // 3.type
977
+ //
978
+ ++col;
979
+ // i_soln
980
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
981
+ ASSERT_EQ(TT_STRING, v.type);
982
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
983
+ // react
984
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
985
+ ASSERT_EQ(TT_STRING, v.type);
986
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
987
+
988
+ // 3.moles
989
+ //
990
+ ++col;
991
+ // i_soln
992
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
993
+ ASSERT_EQ(TT_DOUBLE, v.type);
994
+ ASSERT_NEAR(6.2155e-007, v.dVal, ::pow(10., -11));
995
+ // react
996
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
997
+ ASSERT_EQ(TT_DOUBLE, v.type);
998
+ ASSERT_NEAR(1.1598e-005, v.dVal, ::pow(10., -9));
999
+
1000
+
1001
+
1002
+ // 4.name
1003
+ //
1004
+ ++col;
1005
+ // i_soln
1006
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
1007
+ ASSERT_EQ(TT_STRING, v.type);
1008
+ ASSERT_EQ(std::string("CaOH+"), std::string(v.sVal));
1009
+ // react
1010
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
1011
+ ASSERT_EQ(TT_STRING, v.type);
1012
+ ASSERT_EQ(std::string("CaCO3"), std::string(v.sVal));
1013
+
1014
+ // 4.type
1015
+ //
1016
+ ++col;
1017
+ // i_soln
1018
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
1019
+ ASSERT_EQ(TT_STRING, v.type);
1020
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
1021
+ // react
1022
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
1023
+ ASSERT_EQ(TT_STRING, v.type);
1024
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
1025
+
1026
+ // 4.moles
1027
+ //
1028
+ ++col;
1029
+ // i_soln
1030
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
1031
+ ASSERT_EQ(TT_DOUBLE, v.type);
1032
+ ASSERT_NEAR(1.1819e-009, v.dVal, ::pow(10., -13));
1033
+ // react
1034
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
1035
+ ASSERT_EQ(TT_DOUBLE, v.type);
1036
+ ASSERT_NEAR(6.8668e-006, v.dVal, ::pow(10., -10));
1037
+
1038
+
1039
+ // 5.name
1040
+ //
1041
+ ++col;
1042
+ // i_soln
1043
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
1044
+ ASSERT_EQ(TT_EMPTY, v.type);
1045
+ // react
1046
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
1047
+ ASSERT_EQ(TT_STRING, v.type);
1048
+ ASSERT_EQ(std::string("CaOH+"), std::string(v.sVal));
1049
+
1050
+ // 5.type
1051
+ //
1052
+ ++col;
1053
+ // i_soln
1054
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
1055
+ ASSERT_EQ(TT_EMPTY, v.type);
1056
+ // react
1057
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
1058
+ ASSERT_EQ(TT_STRING, v.type);
1059
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
1060
+
1061
+ // 5.moles
1062
+ //
1063
+ ++col;
1064
+ // i_soln
1065
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
1066
+ ASSERT_EQ(TT_EMPTY, v.type);
1067
+ // react
1068
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
1069
+ ASSERT_EQ(TT_DOUBLE, v.type);
1070
+ ASSERT_NEAR(9.7385e-009, v.dVal, ::pow(10., -13));
1071
+
1072
+
1073
+ // 6.name
1074
+ //
1075
+ ++col;
1076
+ // i_soln
1077
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
1078
+ ASSERT_EQ(TT_EMPTY, v.type);
1079
+ // react
1080
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
1081
+ ASSERT_EQ(TT_EMPTY, v.type);
1082
+
1083
+ // 6.type
1084
+ //
1085
+ ++col;
1086
+ // i_soln
1087
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
1088
+ ASSERT_EQ(TT_EMPTY, v.type);
1089
+ // react
1090
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
1091
+ ASSERT_EQ(TT_EMPTY, v.type);
1092
+
1093
+ // 6.moles
1094
+ //
1095
+ ++col;
1096
+ // i_soln
1097
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, col, &v));
1098
+ ASSERT_EQ(TT_EMPTY, v.type);
1099
+ // react
1100
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, col, &v));
1101
+ ASSERT_EQ(TT_EMPTY, v.type);
1102
+
1103
+ if (n >= 0)
1104
+ {
1105
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
1106
+ }
1107
+
1108
+ #if defined(USE_VAR)
1109
+ ::VarClear(&v);
1110
+ #endif
1111
+ }
1112
+
1113
+ IPQ_RESULT
1114
+ SOLUTION(int n, double C, double Ca, double Na)
1115
+ {
1116
+ std::ostringstream oss;
1117
+
1118
+ oss << "SOLUTION 1\n";
1119
+ oss << "C " << C << "\n";
1120
+ oss << "Ca " << Ca << "\n";
1121
+ oss << "Na " << Na << "\n";
1122
+
1123
+ return ::AccumulateLine(n, oss.str().c_str());
1124
+ }
1125
+
1126
+ IPQ_RESULT
1127
+ EQUILIBRIUM_PHASES(int n, const char* phase, double si, double amount)
1128
+ {
1129
+ std::ostringstream oss;
1130
+
1131
+ oss << "EQUILIBRIUM_PHASES\n";
1132
+ oss << phase << " " << si << " " << amount << "\n";
1133
+ return ::AccumulateLine(n, oss.str().c_str());
1134
+ }
1135
+
1136
+ IPQ_RESULT
1137
+ USER_PUNCH(int n, const char* element, int max)
1138
+ {
1139
+ std::ostringstream oss;
1140
+
1141
+ oss << "USER_PUNCH\n";
1142
+
1143
+ oss << "-head ";
1144
+ for (int i = 1; i <= max; ++i)
1145
+ {
1146
+ oss << i << ".name " << i << ".type " << i << ".moles ";
1147
+ }
1148
+ oss << "\n";
1149
+ oss << "-start" << "\n";
1150
+ oss << "10 n = sys(\"" << element << "\"" << ", count, names$, types$, moles)" << "\n";
1151
+ oss << "20 n = " << max << "\n";
1152
+ oss << "30 if count < " << max << " then n = count" << "\n";
1153
+ oss << "40 for i = 1 to count" << "\n";
1154
+ oss << "50 PUNCH names$(i), types$(i), moles(i)" << "\n";
1155
+ oss << "60 next i" << "\n";
1156
+ oss << "70 list" << "\n";
1157
+ oss << "-end" << "\n";
1158
+ oss << "SELECTED_OUTPUT" << "\n";
1159
+ oss << "-totals C Ca Na" << "\n";
1160
+ oss << "-molalities CO3-2 CaOH+ NaCO3-" << "\n";
1161
+ oss << "-activities CO3-2 CaOH+ NaCO3-" << "\n";
1162
+ oss << "-equilibrium_phases Calcite" << "\n";
1163
+ oss << "-saturation_indices CO2(g) Siderite" << "\n";
1164
+ oss << "-gases CO2(g) N2(g)" << "\n";
1165
+ oss << "-kinetic_reactants Albite Pyrite" << "\n";
1166
+ oss << "-solid_solutions CaSO4 SrSO4" << "\n";
1167
+
1168
+ return ::AccumulateLine(n, oss.str().c_str());
1169
+ }
1170
+
1171
+ IPQ_RESULT
1172
+ USER_PUNCH_NEH(int n)
1173
+ {
1174
+ std::ostringstream oss;
1175
+
1176
+ oss << "USER_PUNCH\n";
1177
+
1178
+ oss << "-head head0 head1 head2\n";
1179
+ oss << "-start" << "\n";
1180
+ oss << "10 PUNCH \"have0\", \"have1\", \"have2\"" << "\n";
1181
+ oss << "20 PUNCH \"missing0\", \"missing1\", \"missing2\"" << "\n";
1182
+ oss << "-end" << "\n";
1183
+ oss << "SELECTED_OUTPUT" << "\n";
1184
+ oss << "-totals C Ca Na" << "\n";
1185
+ oss << "-molalities CO3-2 CaOH+ NaCO3-" << "\n";
1186
+ oss << "-activities CO3-2 CaOH+ NaCO3-" << "\n";
1187
+ oss << "-equilibrium_phases Calcite" << "\n";
1188
+ oss << "-saturation_indices CO2(g) Siderite" << "\n";
1189
+ oss << "-gases CO2(g) N2(g)" << "\n";
1190
+ oss << "-kinetic_reactants Albite Pyrite" << "\n";
1191
+ oss << "-solid_solutions CaSO4 SrSO4" << "\n";
1192
+
1193
+ return ::AccumulateLine(n, oss.str().c_str());
1194
+ }
1195
+
1196
+
1197
+ IPQ_RESULT
1198
+ SELECTED_OUTPUT(int n)
1199
+ {
1200
+ std::ostringstream oss;
1201
+
1202
+ oss << "SELECTED_OUTPUT" << "\n";
1203
+ oss << "-totals C Ca Na" << "\n";
1204
+
1205
+ return ::AccumulateLine(n, oss.str().c_str());
1206
+ }
1207
+
1208
+ IPQ_RESULT
1209
+ DUMP(int n)
1210
+ {
1211
+ std::ostringstream oss;
1212
+ oss << "DUMP" << "\n";
1213
+ oss << "-solution 1" << "\n";
1214
+ return ::AccumulateLine(n, oss.str().c_str());
1215
+ }
1216
+
1217
+ TEST(TestIPhreeqcLib, TestGetSelectedOutputColumnCount)
1218
+ {
1219
+ int n = ::CreateIPhreeqc();
1220
+ ASSERT_TRUE(n >= 0);
1221
+
1222
+ ASSERT_EQ(0, ::LoadDatabase(n, "llnl.dat"));
1223
+ ASSERT_EQ(0, ::GetSelectedOutputColumnCount(n));
1224
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1225
+ ASSERT_EQ(IPQ_OK, ::EQUILIBRIUM_PHASES(n, "calcite", 1.0, 1.0));
1226
+ ASSERT_EQ(IPQ_OK, ::USER_PUNCH(n, "Ca", 10));
1227
+ ASSERT_EQ(0, ::RunAccumulated(n));
1228
+ ASSERT_EQ(62, ::GetSelectedOutputColumnCount(n));
1229
+ if (n >= 0)
1230
+ {
1231
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
1232
+ }
1233
+ }
1234
+
1235
+ TEST(TestIPhreeqcLib, TestAddError)
1236
+ {
1237
+ int n = ::CreateIPhreeqc();
1238
+ ASSERT_TRUE(n >= 0);
1239
+
1240
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1241
+
1242
+ // make sure initialized to empty
1243
+ //
1244
+ const char* err = ::GetErrorString(n);
1245
+ ASSERT_EQ(std::string(""), std::string(err));
1246
+
1247
+ // make sure initialized to empty
1248
+ //
1249
+ const char* expected = "TESTING AddError\n";
1250
+ ASSERT_EQ(1, ::AddError(n, expected));
1251
+
1252
+ // check 1
1253
+ //
1254
+ err = ::GetErrorString(n);
1255
+ ASSERT_EQ(std::string(expected), std::string(err));
1256
+
1257
+ // check increment
1258
+ //
1259
+ const char* expected2 = "XXXXXX\n";
1260
+ ASSERT_EQ(2, ::AddError(n, expected2));
1261
+
1262
+ // check concatenation
1263
+ //
1264
+ err = ::GetErrorString(n);
1265
+ ASSERT_EQ(std::string(expected) + std::string(expected2), std::string(err));
1266
+
1267
+
1268
+ // clear errors
1269
+ //
1270
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1271
+
1272
+ // make sure back to empty
1273
+ //
1274
+ err = ::GetErrorString(n);
1275
+ ASSERT_EQ(std::string(""), std::string(err));
1276
+
1277
+ if (n >= 0)
1278
+ {
1279
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
1280
+ }
1281
+ }
1282
+
1283
+ TEST(TestIPhreeqcLib, TestAccumulateLine)
1284
+ {
1285
+ // TODO
1286
+ }
1287
+
1288
+ TEST(TestIPhreeqcLib, TestOutputErrorString)
1289
+ {
1290
+ // TODO
1291
+ }
1292
+
1293
+ TEST(TestIPhreeqcLib, TestRunWithCallback)
1294
+ {
1295
+ // TODO
1296
+ }
1297
+
1298
+ TEST(TestIPhreeqcLib, TestRunNoDatabaseLoaded)
1299
+ {
1300
+ int n = ::CreateIPhreeqc();
1301
+ ASSERT_TRUE(n >= 0);
1302
+
1303
+ ASSERT_EQ(1, ::RunAccumulated(n));
1304
+
1305
+ const char expected[] =
1306
+ "ERROR: RunAccumulated: No database is loaded\n";
1307
+ const char* err = ::GetErrorString(n);
1308
+
1309
+ ASSERT_EQ(std::string(expected), std::string(err));
1310
+
1311
+ if (n >= 0)
1312
+ {
1313
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
1314
+ }
1315
+ }
1316
+
1317
+ TEST(TestIPhreeqcLib, TestCase1)
1318
+ {
1319
+ // Case 1 (see do_run)
1320
+ // pr.punch == TRUE
1321
+ // punch.new_def == FALSE
1322
+ // output_isopen(OUTPUT_PUNCH) == FALSE
1323
+ // selected_output_on == TRUE
1324
+
1325
+ int n = ::CreateIPhreeqc();
1326
+ ASSERT_TRUE(n >= 0);
1327
+
1328
+ char SELECTED_OUT[80];
1329
+ snprintf(SELECTED_OUT, sizeof(SELECTED_OUT), "selected_1.%d.out", n);
1330
+
1331
+ // remove punch file if it exists
1332
+ if (::FileExists(SELECTED_OUT))
1333
+ {
1334
+ ASSERT_TRUE(::DeleteFile(SELECTED_OUT));
1335
+ }
1336
+ ASSERT_EQ(false, ::FileExists(SELECTED_OUT));
1337
+ ASSERT_EQ(true, ::FileExists("phreeqc.dat"));
1338
+ ASSERT_TRUE(::FileSize("phreeqc.dat") > 0);
1339
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1340
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1341
+ ASSERT_EQ(IPQ_OK, ::USER_PUNCH(n, "Ca", 10));
1342
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 1));
1343
+ ASSERT_EQ(0, ::RunAccumulated(n));
1344
+ ASSERT_EQ(true, ::FileExists(SELECTED_OUT));
1345
+ ASSERT_TRUE(::FileSize(SELECTED_OUT) > 0);
1346
+ ASSERT_EQ(62, ::GetSelectedOutputColumnCount(n));
1347
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1348
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 1));
1349
+ ASSERT_EQ(0, ::RunAccumulated(n));
1350
+ ASSERT_EQ(true, ::FileExists(SELECTED_OUT));
1351
+ ASSERT_TRUE(::FileSize(SELECTED_OUT) > 0);
1352
+ ASSERT_EQ(62, ::GetSelectedOutputColumnCount(n));
1353
+
1354
+ if (n >= 0)
1355
+ {
1356
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
1357
+ }
1358
+ }
1359
+
1360
+ TEST(TestIPhreeqcLib, TestCase2)
1361
+ {
1362
+ // Case 2 (see do_run)
1363
+ // pr.punch == TRUE
1364
+ // punch.new_def == TRUE
1365
+ // output_isopen(OUTPUT_PUNCH) == FALSE
1366
+ // selected_output_on == TRUE
1367
+
1368
+ int n = ::CreateIPhreeqc();
1369
+ ASSERT_TRUE(n >= 0);
1370
+
1371
+ char SELECTED_OUT[80];
1372
+ snprintf(SELECTED_OUT, sizeof(SELECTED_OUT), "selected_1.%d.out", n);
1373
+
1374
+ // remove punch files if they exists
1375
+ //
1376
+ if (::FileExists(SELECTED_OUT))
1377
+ {
1378
+ ASSERT_TRUE(::DeleteFile(SELECTED_OUT));
1379
+ }
1380
+ if (::FileExists("case2.punch"))
1381
+ {
1382
+ ASSERT_TRUE(::DeleteFile("case2.punch"));
1383
+ }
1384
+ ASSERT_EQ(false, ::FileExists(SELECTED_OUT));
1385
+ ASSERT_EQ(false, ::FileExists("case2.punch"));
1386
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1387
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1388
+ ASSERT_EQ(IPQ_OK, ::USER_PUNCH(n, "Ca", 10));
1389
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "-file case2.punch")); // force have_punch_name to TRUE (see read_selected_ouput)
1390
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 1));
1391
+ ASSERT_EQ(0, ::RunAccumulated(n));
1392
+ ASSERT_EQ(false, ::FileExists(SELECTED_OUT));
1393
+ ASSERT_EQ(true, ::FileExists("case2.punch"));
1394
+ ASSERT_TRUE(::FileSize("case2.punch") > 0);
1395
+ ASSERT_EQ(62, ::GetSelectedOutputColumnCount(n));
1396
+
1397
+
1398
+ // remove punch files if they exists
1399
+ //
1400
+ if (::FileExists(SELECTED_OUT))
1401
+ {
1402
+ ASSERT_TRUE(::DeleteFile(SELECTED_OUT));
1403
+ }
1404
+ if (::FileExists("case2.punch"))
1405
+ {
1406
+ ASSERT_TRUE(::DeleteFile("case2.punch"));
1407
+ }
1408
+ ASSERT_EQ(false, ::FileExists(SELECTED_OUT));
1409
+ ASSERT_EQ(false, ::FileExists("case2.punch"));
1410
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1411
+ ASSERT_EQ(IPQ_OK, ::USER_PUNCH(n, "Ca", 10));
1412
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 1));
1413
+ ASSERT_EQ(0, ::RunAccumulated(n));
1414
+ ASSERT_EQ(false, ::FileExists(SELECTED_OUT));
1415
+ ASSERT_EQ(true, ::FileExists("case2.punch"));
1416
+ ASSERT_TRUE(::FileSize("case2.punch") > 0);
1417
+ ASSERT_EQ(62, ::GetSelectedOutputColumnCount(n));
1418
+
1419
+ if (::FileExists("case2.punch"))
1420
+ {
1421
+ ASSERT_TRUE(::DeleteFile("case2.punch"));
1422
+ }
1423
+ ASSERT_EQ(false, ::FileExists("case2.punch"));
1424
+
1425
+ if (n >= 0)
1426
+ {
1427
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
1428
+ }
1429
+ }
1430
+
1431
+ TEST(TestIPhreeqcLib, TestPrintSelectedOutputFalse)
1432
+ {
1433
+ int n = ::CreateIPhreeqc();
1434
+ ASSERT_TRUE(n >= 0);
1435
+
1436
+ // remove punch files if they exists
1437
+ //
1438
+ if (::FileExists("selected.out"))
1439
+ {
1440
+ ::DeleteFile("selected.out");
1441
+ }
1442
+ ASSERT_EQ(false, ::FileExists("selected.out"));
1443
+
1444
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1445
+
1446
+ // add solution block
1447
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1448
+
1449
+ // add selected output block
1450
+ ASSERT_EQ(IPQ_OK, ::SELECTED_OUTPUT(n));
1451
+
1452
+ // turn off selected output
1453
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "PRINT; -selected_output false \n"));
1454
+
1455
+ // run
1456
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 1));
1457
+ ASSERT_EQ(0, ::RunAccumulated(n));
1458
+
1459
+ ASSERT_EQ(0, ::GetSelectedOutputColumnCount(n));
1460
+ ASSERT_EQ(0, ::GetSelectedOutputRowCount(n));
1461
+
1462
+
1463
+ // reset pr.punch to TRUE
1464
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1465
+
1466
+ // add solution block
1467
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1468
+
1469
+ // add selected output block
1470
+ ASSERT_EQ(IPQ_OK, ::SELECTED_OUTPUT(n));
1471
+
1472
+ // run
1473
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 1));
1474
+ ASSERT_EQ(0, ::RunAccumulated(n));
1475
+
1476
+ ASSERT_EQ(11, ::GetSelectedOutputColumnCount(n));
1477
+ ASSERT_EQ(2, ::GetSelectedOutputRowCount(n));
1478
+
1479
+ if (n >= 0)
1480
+ {
1481
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
1482
+ }
1483
+ }
1484
+
1485
+ TEST(TestIPhreeqcLib, TestOutputFileOnOff)
1486
+ {
1487
+ int onoff[5];
1488
+ onoff[0] = 1; // output_file_on
1489
+ onoff[1] = 0; // error_file_on
1490
+ onoff[2] = 0; // log_file_on
1491
+ onoff[3] = 0; // selected_output_file_on
1492
+ onoff[4] = 0; // dump_file_on
1493
+ TestFileOnOff("phreeqc.%d.out", onoff[0], onoff[1], onoff[2], onoff[3], onoff[4]);
1494
+ }
1495
+
1496
+ TEST(TestIPhreeqcLib, TestErrorFileOnOff)
1497
+ {
1498
+ int onoff[5];
1499
+ onoff[0] = 0; // output_file_on
1500
+ onoff[1] = 1; // error_file_on
1501
+ onoff[2] = 0; // log_file_on
1502
+ onoff[3] = 0; // selected_output_file_on
1503
+ onoff[4] = 0; // dump_file_on
1504
+ TestFileOnOff("phreeqc.%d.err", onoff[0], onoff[1], onoff[2], onoff[3], onoff[4]);
1505
+ }
1506
+
1507
+ TEST(TestIPhreeqcLib, TestLogFileOnOff)
1508
+ {
1509
+ int onoff[5];
1510
+ onoff[0] = 0; // output_file_on
1511
+ onoff[1] = 0; // error_file_on
1512
+ onoff[2] = 1; // log_file_on
1513
+ onoff[3] = 0; // selected_output_file_on
1514
+ onoff[4] = 0; // dump_file_on
1515
+ TestFileOnOff("phreeqc.%d.log", onoff[0], onoff[1], onoff[2], onoff[3], onoff[4]);
1516
+ }
1517
+
1518
+ TEST(TestIPhreeqcLib, TestDumpFileOnOff)
1519
+ {
1520
+ int onoff[5];
1521
+ onoff[0] = 0; // output_file_on
1522
+ onoff[1] = 0; // error_file_on
1523
+ onoff[2] = 0; // log_file_on
1524
+ onoff[3] = 0; // selected_output_file_on
1525
+ onoff[4] = 1; // dump_file_on
1526
+ TestFileOnOff("dump.%d.out", onoff[0], onoff[1], onoff[2], onoff[3], onoff[4]);
1527
+ }
1528
+
1529
+ TEST(TestIPhreeqcLib, TestSelOutFileOnOff)
1530
+ {
1531
+ int onoff[5];
1532
+ onoff[0] = 0; // output_file_on
1533
+ onoff[1] = 0; // error_file_on
1534
+ onoff[2] = 0; // log_file_on
1535
+ onoff[3] = 1; // selected_output_file_on
1536
+ onoff[4] = 0; // dump_file_on
1537
+ TestFileOnOff("selected_1.%d.out", onoff[0], onoff[1], onoff[2], onoff[3], onoff[4]);
1538
+ }
1539
+
1540
+ //void TestIPhreeqcLib::TestFileOnOff(const char* FILENAME_FORMAT, int output_file_on, int error_file_on, int log_file_on, int selected_output_file_on, int dump_file_on)
1541
+ void TestFileOnOff(const char* FILENAME_FORMAT, int output_file_on, int error_file_on, int log_file_on, int selected_output_file_on, int dump_file_on)
1542
+ {
1543
+ int dump_string_on = 0;
1544
+
1545
+ int n = ::CreateIPhreeqc();
1546
+ ASSERT_TRUE(n >= 0);
1547
+
1548
+ char FILENAME[80];
1549
+ snprintf(FILENAME, sizeof(FILENAME), FILENAME_FORMAT, n);
1550
+
1551
+ // remove FILENAME if it exists
1552
+ //
1553
+ if (::FileExists(FILENAME))
1554
+ {
1555
+ ::DeleteFile(FILENAME);
1556
+ }
1557
+ ASSERT_EQ(false, ::FileExists(FILENAME));
1558
+
1559
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1560
+
1561
+ // add solution block
1562
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1563
+
1564
+ // add selected output block
1565
+ ASSERT_EQ(IPQ_OK, ::SELECTED_OUTPUT(n));
1566
+
1567
+ // add dump block
1568
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
1569
+
1570
+ // run all off
1571
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
1572
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
1573
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
1574
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
1575
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
1576
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
1577
+ ASSERT_EQ(0, ::RunAccumulated(n));
1578
+ ASSERT_EQ(false, ::FileExists(FILENAME));
1579
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1580
+
1581
+ // add solution block
1582
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1583
+
1584
+ // add selected output block
1585
+ ASSERT_EQ(IPQ_OK, ::SELECTED_OUTPUT(n));
1586
+
1587
+ // add dump block
1588
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
1589
+
1590
+ // run
1591
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, dump_file_on));
1592
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, error_file_on));
1593
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, log_file_on));
1594
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, output_file_on));
1595
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, selected_output_file_on));
1596
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, dump_string_on));
1597
+ ASSERT_EQ(0, ::RunAccumulated(n));
1598
+ ASSERT_EQ(true, ::FileExists(FILENAME));
1599
+ ASSERT_TRUE(::DeleteFile(FILENAME));
1600
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1601
+
1602
+ // add solution block
1603
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1604
+
1605
+ // add selected output block
1606
+ ASSERT_EQ(IPQ_OK, ::SELECTED_OUTPUT(n));
1607
+
1608
+ // add dump block
1609
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
1610
+
1611
+ // run
1612
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
1613
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
1614
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
1615
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
1616
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
1617
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
1618
+ ASSERT_EQ(0, ::RunAccumulated(n));
1619
+ ASSERT_EQ(false, ::FileExists(FILENAME));
1620
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1621
+
1622
+ // add solution block
1623
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1624
+
1625
+ // add selected output block
1626
+ ASSERT_EQ(IPQ_OK, ::SELECTED_OUTPUT(n));
1627
+
1628
+ // add dump block
1629
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
1630
+
1631
+ // run
1632
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, dump_file_on));
1633
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, error_file_on));
1634
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, log_file_on));
1635
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, output_file_on));
1636
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, selected_output_file_on));
1637
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, dump_string_on));
1638
+ ASSERT_EQ(0, ::RunAccumulated(n));
1639
+ ASSERT_EQ(true, ::FileExists(FILENAME));
1640
+ ASSERT_TRUE(::DeleteFile(FILENAME));
1641
+
1642
+ if (n >= 0)
1643
+ {
1644
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
1645
+ }
1646
+ }
1647
+
1648
+
1649
+ TEST(TestIPhreeqcLib, TestLongHeadings)
1650
+ {
1651
+ char long_header[] = "this_is_a_long_header_0123456789012345678901234567890123456789";
1652
+ char long_value[] = "this_is_a_long_value_01234567890123456789012345678901234567890";
1653
+
1654
+ int n = ::CreateIPhreeqc();
1655
+ ASSERT_TRUE(n >= 0);
1656
+
1657
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1658
+
1659
+ std::ostringstream oss;
1660
+ oss << "SOLUTION" << "\n";
1661
+
1662
+ oss << "SELECTED_OUTPUT" << "\n";
1663
+ oss << "-reset false" << "\n";
1664
+
1665
+ oss << "USER_PUNCH" << "\n";
1666
+ oss << "-head " << long_header << "\n";
1667
+ oss << "-start" << "\n";
1668
+ oss << "10 PUNCH \"" << long_value << "\"\n";
1669
+ oss << "-end" << "\n";
1670
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, oss.str().c_str()));
1671
+
1672
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
1673
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
1674
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
1675
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
1676
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
1677
+ ASSERT_EQ(0, ::RunAccumulated(n));
1678
+
1679
+ ASSERT_EQ(2, ::GetSelectedOutputRowCount(n));
1680
+ ASSERT_EQ(1, ::GetSelectedOutputColumnCount(n));
1681
+
1682
+ CVar v;
1683
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, 0, &v));
1684
+ ASSERT_EQ(TT_STRING, v.type);
1685
+ ASSERT_EQ(std::string(long_header), std::string(v.sVal));
1686
+
1687
+ CVar v1;
1688
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, 0, &v1));
1689
+ ASSERT_EQ(TT_STRING, v1.type);
1690
+ ASSERT_EQ(std::string(long_value), std::string(v1.sVal));
1691
+
1692
+ ASSERT_EQ(IPQ_INVALIDCOL, ::GetSelectedOutputValue(n, 1, 1, &v1));
1693
+ ASSERT_EQ(IPQ_INVALIDROW, ::GetSelectedOutputValue(n, 2, 0, &v1));
1694
+
1695
+ if (n >= 0)
1696
+ {
1697
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
1698
+ }
1699
+ }
1700
+
1701
+ TEST(TestIPhreeqcLib, TestDatabaseKeyword)
1702
+ {
1703
+ int n = ::CreateIPhreeqc();
1704
+ ASSERT_TRUE(n >= 0);
1705
+
1706
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1707
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
1708
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 1));
1709
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
1710
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
1711
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
1712
+ ASSERT_EQ(1, ::RunFile(n, "dump"));
1713
+
1714
+ const char* exp_errs =
1715
+ "ERROR: Gas not found in PHASES database, Amm(g).\n"
1716
+ "ERROR: Calculations terminating due to input errors.\n";
1717
+
1718
+ const char* err = ::GetErrorString(n);
1719
+ ASSERT_EQ(std::string(exp_errs), std::string(err));
1720
+
1721
+ const char* exp_warn =
1722
+ "WARNING: DATABASE keyword is ignored by IPhreeqc.\n"
1723
+ "WARNING: Cell-lengths were read for 1 cells. Last value is used till cell 100.\n"
1724
+ "WARNING: No dispersivities were read; disp = 0 assumed.\n"
1725
+ "WARNING: Could not find element in database, Amm.\n"
1726
+ " Concentration is set to zero.\n";
1727
+
1728
+ const char* warn = ::GetWarningString(n);
1729
+ ASSERT_EQ(std::string(exp_warn), std::string(warn));
1730
+
1731
+ if (n >= 0)
1732
+ {
1733
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
1734
+ }
1735
+ }
1736
+
1737
+ TEST(TestIPhreeqcLib, TestDumpString)
1738
+ {
1739
+ int n = ::CreateIPhreeqc();
1740
+ ASSERT_TRUE(n >= 0);
1741
+
1742
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1743
+
1744
+ // add solution block
1745
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1746
+
1747
+ // add dump block
1748
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
1749
+
1750
+ // run
1751
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
1752
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
1753
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
1754
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
1755
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
1756
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 1));
1757
+ ASSERT_EQ(0, ::RunAccumulated(n));
1758
+
1759
+ const char* dump_str = ::GetDumpString(n);
1760
+
1761
+ EXPECT_THAT(dump_str, HasSubstr("SOLUTION_RAW"));
1762
+ EXPECT_THAT(dump_str, HasSubstr("-temp"));
1763
+ EXPECT_THAT(dump_str, HasSubstr("-pressure"));
1764
+ EXPECT_THAT(dump_str, HasSubstr("-potential"));
1765
+ EXPECT_THAT(dump_str, HasSubstr("-total_h"));
1766
+ EXPECT_THAT(dump_str, HasSubstr("-total_o"));
1767
+ EXPECT_THAT(dump_str, HasSubstr("-cb"));
1768
+ EXPECT_THAT(dump_str, HasSubstr("-density"));
1769
+ EXPECT_THAT(dump_str, HasSubstr("-viscosity"));
1770
+ EXPECT_THAT(dump_str, HasSubstr("-totals"));
1771
+ EXPECT_THAT(dump_str, HasSubstr(" C(4) "));
1772
+ EXPECT_THAT(dump_str, HasSubstr(" Ca "));
1773
+ EXPECT_THAT(dump_str, HasSubstr(" H(0) "));
1774
+ EXPECT_THAT(dump_str, HasSubstr(" Na "));
1775
+ EXPECT_THAT(dump_str, HasSubstr("-pH"));
1776
+ EXPECT_THAT(dump_str, HasSubstr("-pe"));
1777
+ EXPECT_THAT(dump_str, HasSubstr("-mu"));
1778
+ EXPECT_THAT(dump_str, HasSubstr("-ah2o"));
1779
+ EXPECT_THAT(dump_str, HasSubstr("-mass_water"));
1780
+ EXPECT_THAT(dump_str, HasSubstr("-total_alkalinity"));
1781
+ EXPECT_THAT(dump_str, HasSubstr("-activities"));
1782
+ EXPECT_THAT(dump_str, HasSubstr(" C(-4) "));
1783
+ EXPECT_THAT(dump_str, HasSubstr(" C(4) "));
1784
+ EXPECT_THAT(dump_str, HasSubstr(" Ca "));
1785
+ EXPECT_THAT(dump_str, HasSubstr(" E "));
1786
+ EXPECT_THAT(dump_str, HasSubstr(" H(0) "));
1787
+ EXPECT_THAT(dump_str, HasSubstr(" Na "));
1788
+ EXPECT_THAT(dump_str, HasSubstr(" O(0) "));
1789
+ EXPECT_THAT(dump_str, HasSubstr("-gammas"));
1790
+ EXPECT_THAT(dump_str, HasSubstr("USE mix none"));
1791
+ EXPECT_THAT(dump_str, HasSubstr("USE reaction none"));
1792
+ EXPECT_THAT(dump_str, HasSubstr("USE reaction_temperature none"));
1793
+ EXPECT_THAT(dump_str, HasSubstr("USE reaction_pressure none"));
1794
+
1795
+ if (n >= 0)
1796
+ {
1797
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
1798
+ }
1799
+ }
1800
+
1801
+ TEST(TestIPhreeqcLib, TestGetDumpStringLineCount)
1802
+ {
1803
+ int n = ::CreateIPhreeqc();
1804
+ ASSERT_TRUE(n >= 0);
1805
+
1806
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1807
+
1808
+ // add solution block
1809
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1810
+
1811
+ // add dump block
1812
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
1813
+
1814
+ // run
1815
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
1816
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
1817
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
1818
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
1819
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
1820
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 1));
1821
+ ASSERT_EQ(0, ::RunAccumulated(n));
1822
+ ASSERT_EQ(35, ::GetDumpStringLineCount(n));
1823
+
1824
+ if (n >= 0)
1825
+ {
1826
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
1827
+ }
1828
+ }
1829
+
1830
+ TEST(TestIPhreeqcLib, TestGetDumpStringLine)
1831
+ {
1832
+ int n = ::CreateIPhreeqc();
1833
+ ASSERT_TRUE(n >= 0);
1834
+
1835
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1836
+
1837
+ // add solution block
1838
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1839
+
1840
+ // add dump block
1841
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
1842
+
1843
+ // run
1844
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
1845
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
1846
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
1847
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
1848
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
1849
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 1));
1850
+ ASSERT_EQ(0, ::RunAccumulated(n));
1851
+ ASSERT_EQ(35, ::GetDumpStringLineCount(n));
1852
+
1853
+ int line = 0;
1854
+
1855
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("SOLUTION_RAW"));
1856
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-temp"));
1857
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-pressure"));
1858
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-potential"));
1859
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-total_h"));
1860
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-total_o"));
1861
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-cb"));
1862
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-density"));
1863
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-viscosity"));
1864
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-viscos_0"));
1865
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-totals"));
1866
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr(" C(4) "));
1867
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr(" Ca "));
1868
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr(" H(0) "));
1869
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr(" Na "));
1870
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-pH"));
1871
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-pe"));
1872
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-mu"));
1873
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-ah2o"));
1874
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-mass_water"));
1875
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-soln_vol"));
1876
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-total_alkalinity"));
1877
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-activities"));
1878
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr(" C(-4) "));
1879
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr(" C(4) "));
1880
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr(" Ca "));
1881
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr(" E "));
1882
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr(" H(0) "));
1883
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr(" Na "));
1884
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr(" O(0) "));
1885
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("-gammas"));
1886
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("USE mix none"));
1887
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("USE reaction none"));
1888
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("USE reaction_temperature none"));
1889
+ EXPECT_THAT(::GetDumpStringLine(n, line++), HasSubstr("USE reaction_pressure none"));
1890
+
1891
+ // remaining lines should be empty
1892
+ ASSERT_EQ(std::string(""), std::string(::GetDumpStringLine(n, line++)));
1893
+ ASSERT_EQ(std::string(""), std::string(::GetDumpStringLine(n, line++)));
1894
+ ASSERT_EQ(std::string(""), std::string(::GetDumpStringLine(n, line++)));
1895
+ ASSERT_EQ(std::string(""), std::string(::GetDumpStringLine(n, line++)));
1896
+
1897
+ // negative lines should be empty
1898
+ ASSERT_EQ(std::string(""), std::string(::GetDumpStringLine(n, -1)));
1899
+ ASSERT_EQ(std::string(""), std::string(::GetDumpStringLine(n, -2)));
1900
+ ASSERT_EQ(std::string(""), std::string(::GetDumpStringLine(n, -3)));
1901
+ ASSERT_EQ(std::string(""), std::string(::GetDumpStringLine(n, -4)));
1902
+
1903
+ if (n >= 0)
1904
+ {
1905
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
1906
+ }
1907
+ }
1908
+
1909
+ TEST(TestIPhreeqcLib, TestGetComponentCount)
1910
+ {
1911
+ int n = ::CreateIPhreeqc();
1912
+ ASSERT_TRUE(n >= 0);
1913
+
1914
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1915
+
1916
+ // add solution block
1917
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1918
+
1919
+ // run
1920
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
1921
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
1922
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
1923
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
1924
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
1925
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
1926
+ ASSERT_EQ(0, ::RunAccumulated(n));
1927
+ ASSERT_EQ(3, ::GetComponentCount(n));
1928
+
1929
+ if (n >= 0)
1930
+ {
1931
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
1932
+ }
1933
+ }
1934
+
1935
+ TEST(TestIPhreeqcLib, TestGetComponent)
1936
+ {
1937
+ int n = ::CreateIPhreeqc();
1938
+ ASSERT_TRUE(n >= 0);
1939
+
1940
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1941
+
1942
+ // add solution block
1943
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1944
+
1945
+ // run
1946
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
1947
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
1948
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
1949
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
1950
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
1951
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
1952
+ ASSERT_EQ(0, ::RunAccumulated(n));
1953
+ ASSERT_EQ(3, ::GetComponentCount(n));
1954
+
1955
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, -2)));
1956
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, -1)));
1957
+
1958
+ ASSERT_EQ(std::string("C"), std::string(::GetComponent(n, 0)));
1959
+ ASSERT_EQ(std::string("Ca"), std::string(::GetComponent(n, 1)));
1960
+ ASSERT_EQ(std::string("Na"), std::string(::GetComponent(n, 2)));
1961
+
1962
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, 3)));
1963
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, 4)));
1964
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, 5)));
1965
+
1966
+ // add solution block
1967
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
1968
+
1969
+ // run
1970
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
1971
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
1972
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
1973
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
1974
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
1975
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
1976
+ ASSERT_EQ(0, ::RunAccumulated(n));
1977
+ ASSERT_EQ(3, ::GetComponentCount(n));
1978
+
1979
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, -2)));
1980
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, -1)));
1981
+
1982
+ ASSERT_EQ(std::string("C"), std::string(::GetComponent(n, 0)));
1983
+ ASSERT_EQ(std::string("Ca"), std::string(::GetComponent(n, 1)));
1984
+ ASSERT_EQ(std::string("Na"), std::string(::GetComponent(n, 2)));
1985
+
1986
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, 3)));
1987
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, 4)));
1988
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, 5)));
1989
+
1990
+ // clear using LoadDatabase
1991
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
1992
+ ASSERT_EQ(0, ::GetComponentCount(n));
1993
+
1994
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, -2)));
1995
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, -1)));
1996
+
1997
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, 0)));
1998
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, 1)));
1999
+
2000
+ // add solution block
2001
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
2002
+ ASSERT_EQ(0, ::RunAccumulated(n));
2003
+ ASSERT_EQ(3, ::GetComponentCount(n));
2004
+
2005
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, -2)));
2006
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, -1)));
2007
+
2008
+ ASSERT_EQ(std::string("C"), std::string(::GetComponent(n, 0)));
2009
+ ASSERT_EQ(std::string("Ca"), std::string(::GetComponent(n, 1)));
2010
+ ASSERT_EQ(std::string("Na"), std::string(::GetComponent(n, 2)));
2011
+
2012
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, 3)));
2013
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, 4)));
2014
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, 5)));
2015
+
2016
+
2017
+ // clear using LoadDatabaseString
2018
+ ASSERT_EQ(0, ::LoadDatabaseString(n, ex15_dat));
2019
+ ASSERT_EQ(0, ::GetComponentCount(n));
2020
+
2021
+ // add solution block
2022
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
2023
+ ASSERT_EQ(0, ::RunAccumulated(n));
2024
+
2025
+ // ex15.dat doesn't have Ca
2026
+ ASSERT_EQ(2, ::GetWarningStringLineCount(n));
2027
+ ASSERT_EQ(std::string("WARNING: Could not find element in database, Ca."), std::string(::GetWarningStringLine(n, 0)));
2028
+ ASSERT_EQ(std::string("\tConcentration is set to zero."), std::string(::GetWarningStringLine(n, 1)));
2029
+
2030
+ ASSERT_EQ(2, ::GetComponentCount(n));
2031
+
2032
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, -2)));
2033
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, -1)));
2034
+
2035
+ ASSERT_EQ(std::string("C"), std::string(::GetComponent(n, 0)));
2036
+ ASSERT_EQ(std::string("Na"), std::string(::GetComponent(n, 1)));
2037
+
2038
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, 2)));
2039
+ ASSERT_EQ(std::string(""), std::string(::GetComponent(n, 3)));
2040
+
2041
+ if (n >= 0)
2042
+ {
2043
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
2044
+ }
2045
+ }
2046
+
2047
+ TEST(TestIPhreeqcLib, TestGetErrorStringLine)
2048
+ {
2049
+ int n = ::CreateIPhreeqc();
2050
+ ASSERT_TRUE(n >= 0);
2051
+
2052
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
2053
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
2054
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
2055
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
2056
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
2057
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
2058
+ ASSERT_EQ(1, ::RunFile(n, "dump"));
2059
+ #if 0
2060
+ ASSERT_EQ(8, ::GetErrorStringLineCount(n));
2061
+ #else
2062
+ ASSERT_EQ(2, ::GetErrorStringLineCount(n));
2063
+ #endif
2064
+
2065
+ int line = 0;
2066
+ #if 0
2067
+ ASSERT_EQ(std::string("WARNING: DATABASE keyword is ignored by IPhreeqc."), std::string(::GetErrorStringLine(n, line++)));
2068
+ ASSERT_EQ(std::string("WARNING: Cell-lengths were read for 1 cells. Last value is used till cell 100."), std::string(::GetErrorStringLine(n, line++)));
2069
+ ASSERT_EQ(std::string("WARNING: No dispersivities were read; disp = 0 assumed."), std::string(::GetErrorStringLine(n, line++)));
2070
+ #endif
2071
+ ASSERT_EQ(std::string("ERROR: Gas not found in PHASES database, Amm(g)."), std::string(::GetErrorStringLine(n, line++)));
2072
+ #if 0
2073
+ ASSERT_EQ(std::string("WARNING: Could not find element in database, Amm."), std::string(::GetErrorStringLine(n, line++)));
2074
+ ASSERT_EQ(std::string("\tConcentration is set to zero."), std::string(::GetErrorStringLine(n, line++)));
2075
+ #endif
2076
+ ASSERT_EQ(std::string("ERROR: Calculations terminating due to input errors."), std::string(::GetErrorStringLine(n, line++)));
2077
+ #if 0
2078
+ ASSERT_EQ(std::string("Stopping."), std::string(::GetErrorStringLine(n, line++)));
2079
+ #endif
2080
+
2081
+ if (n >= 0)
2082
+ {
2083
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
2084
+ }
2085
+ }
2086
+
2087
+ TEST(TestIPhreeqcLib, TestErrorFileOn)
2088
+ {
2089
+ int n = ::CreateIPhreeqc();
2090
+ ASSERT_TRUE(n >= 0);
2091
+
2092
+ char FILENAME[80];
2093
+ snprintf(FILENAME, sizeof(FILENAME), "phreeqc.%d.err", n);
2094
+
2095
+ if (::FileExists(FILENAME))
2096
+ {
2097
+ ::DeleteFile(FILENAME);
2098
+ }
2099
+
2100
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
2101
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
2102
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 1));
2103
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
2104
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
2105
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
2106
+ ASSERT_EQ(1, ::RunFile(n, "dump"));
2107
+ ASSERT_EQ(true, ::FileExists(FILENAME));
2108
+
2109
+ std::string lines[10];
2110
+ std::ifstream ifs(FILENAME);
2111
+
2112
+ size_t i = 0;
2113
+ while (i < sizeof(lines) / sizeof(lines[0]) && std::getline(ifs, lines[i]))
2114
+ {
2115
+ ++i;
2116
+ }
2117
+
2118
+ ASSERT_EQ((size_t)8, i);
2119
+
2120
+ ASSERT_EQ(std::string("WARNING: DATABASE keyword is ignored by IPhreeqc."), lines[0]);
2121
+ ASSERT_EQ(std::string("WARNING: Cell-lengths were read for 1 cells. Last value is used till cell 100."), lines[1]);
2122
+ ASSERT_EQ(std::string("WARNING: No dispersivities were read; disp = 0 assumed."), lines[2]);
2123
+ ASSERT_EQ(std::string("ERROR: Gas not found in PHASES database, Amm(g)."), lines[3]);
2124
+ ASSERT_EQ(std::string("WARNING: Could not find element in database, Amm."), lines[4]);
2125
+ ASSERT_EQ(std::string("\tConcentration is set to zero."), lines[5]);
2126
+ ASSERT_EQ(std::string("ERROR: Calculations terminating due to input errors."), lines[6]);
2127
+ ASSERT_EQ(std::string("Stopping."), lines[7]);
2128
+ ASSERT_EQ(std::string(""), lines[8]);
2129
+ ASSERT_EQ(std::string(""), lines[9]);
2130
+
2131
+ if (n >= 0)
2132
+ {
2133
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
2134
+ }
2135
+ }
2136
+
2137
+ TEST(TestIPhreeqcLib, TestLogFileOn)
2138
+ {
2139
+ int n = ::CreateIPhreeqc();
2140
+ ASSERT_TRUE(n >= 0);
2141
+
2142
+ char FILENAME[80];
2143
+ snprintf(FILENAME, sizeof(FILENAME), "phreeqc.%d.log", n);
2144
+
2145
+ if (::FileExists(FILENAME))
2146
+ {
2147
+ ::DeleteFile(FILENAME);
2148
+ }
2149
+
2150
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
2151
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
2152
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
2153
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 1));
2154
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
2155
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
2156
+
2157
+ ASSERT_EQ(1, ::RunFile(n, "dump"));
2158
+ ASSERT_EQ(true, ::FileExists(FILENAME));
2159
+
2160
+ std::string lines[10];
2161
+ std::ifstream ifs(FILENAME);
2162
+
2163
+ size_t i = 0;
2164
+ while (i < sizeof(lines) / sizeof(lines[0]) && std::getline(ifs, lines[i]))
2165
+ {
2166
+ ++i;
2167
+ }
2168
+
2169
+ ASSERT_EQ((size_t)6, i);
2170
+
2171
+ ASSERT_EQ(std::string("WARNING: Cell-lengths were read for 1 cells. Last value is used till cell 100."), lines[0]);
2172
+ ASSERT_EQ(std::string("WARNING: No dispersivities were read; disp = 0 assumed."), lines[1]);
2173
+ ASSERT_EQ(std::string("ERROR: Gas not found in PHASES database, Amm(g)."), lines[2]);
2174
+ ASSERT_EQ(std::string("WARNING: Could not find element in database, Amm."), lines[3]);
2175
+ ASSERT_EQ(std::string("\tConcentration is set to zero."), lines[4]);
2176
+ ASSERT_EQ(std::string("ERROR: Calculations terminating due to input errors."), lines[5]);
2177
+ ASSERT_EQ(std::string(""), lines[8]);
2178
+ ASSERT_EQ(std::string(""), lines[9]);
2179
+
2180
+ if (n >= 0)
2181
+ {
2182
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
2183
+ }
2184
+ }
2185
+
2186
+ TEST(TestIPhreeqcLib, TestGetWarningStringLine)
2187
+ {
2188
+ int n = ::CreateIPhreeqc();
2189
+ ASSERT_TRUE(n >= 0);
2190
+
2191
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
2192
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
2193
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
2194
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
2195
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
2196
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
2197
+ ASSERT_EQ(1, ::RunFile(n, "dump"));
2198
+
2199
+ ASSERT_EQ(5, ::GetWarningStringLineCount(n));
2200
+ ASSERT_EQ(std::string("WARNING: DATABASE keyword is ignored by IPhreeqc."), std::string(::GetWarningStringLine(n, 0)));
2201
+ ASSERT_EQ(std::string("WARNING: Cell-lengths were read for 1 cells. Last value is used till cell 100."), std::string(::GetWarningStringLine(n, 1)));
2202
+ ASSERT_EQ(std::string("WARNING: No dispersivities were read; disp = 0 assumed."), std::string(::GetWarningStringLine(n, 2)));
2203
+ ASSERT_EQ(std::string("WARNING: Could not find element in database, Amm."), std::string(::GetWarningStringLine(n, 3)));
2204
+ ASSERT_EQ(std::string(" Concentration is set to zero."), std::string(::GetWarningStringLine(n, 4)));
2205
+
2206
+ if (n >= 0)
2207
+ {
2208
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
2209
+ }
2210
+ }
2211
+
2212
+ TEST(TestIPhreeqcLib, TestPitzer)
2213
+ {
2214
+ ASSERT_EQ(true, ::FileExists("pitzer.dat"));
2215
+ ASSERT_TRUE(::FileSize("pitzer.dat") > 0);
2216
+
2217
+ int id = ::CreateIPhreeqc();
2218
+ ASSERT_TRUE(id >= 0);
2219
+
2220
+ ASSERT_EQ(0, ::LoadDatabase(id, "pitzer.dat"));
2221
+
2222
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "SOLUTION 1"));
2223
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "units mol/kgw"));
2224
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "pH 7"));
2225
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "temp 25"));
2226
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "Mg 0.1 charge"));
2227
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "Cl 0"));
2228
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "S(6) 1.0612244897959"));
2229
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "EQUILIBRIUM_PHASES 1"));
2230
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "Halite 0 10"));
2231
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "Sylvite 0 10"));
2232
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "Bischofite 0 0"));
2233
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "Carnallite 0 0"));
2234
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "Epsomite 0 0"));
2235
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "Kieserite 0 0"));
2236
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "END"));
2237
+
2238
+ // this fails -r4375
2239
+ // fixed in -r4380
2240
+ ASSERT_EQ(0, ::RunAccumulated(id));
2241
+
2242
+ if (id >= 0)
2243
+ {
2244
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(id));
2245
+ }
2246
+ }
2247
+
2248
+ TEST(TestIPhreeqcLib, TestClearAccumulatedLines)
2249
+ {
2250
+ ASSERT_EQ(true, ::FileExists("wateq4f.dat"));
2251
+ ASSERT_TRUE(::FileSize("wateq4f.dat") > 0);
2252
+
2253
+ int id = ::CreateIPhreeqc();
2254
+ ASSERT_TRUE(id >= 0);
2255
+
2256
+ ASSERT_EQ(0, ::LoadDatabase(id, "wateq4f.dat"));
2257
+
2258
+ // phreeqc can now handle pH of -2 (-r5885)
2259
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "SOLUTION 1"));
2260
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, " pH 7"));
2261
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, " Na 1"));
2262
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "PHASES"));
2263
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, " Fix_H+"));
2264
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, " H+ = H+"));
2265
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, " log_k 0"));
2266
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "EQUILIBRIUM_PHASES"));
2267
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, " Fix_H+ -10 HCl 10"));
2268
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "END"));
2269
+
2270
+ ASSERT_EQ(1, ::RunAccumulated(id));
2271
+
2272
+ ASSERT_EQ(1, ::GetErrorStringLineCount(id));
2273
+
2274
+ const char expected[] =
2275
+ "ERROR: Numerical method failed on all combinations of convergence parameters, cell/soln/mix 1\n";
2276
+ const char* err = ::GetErrorString(id);
2277
+
2278
+ ASSERT_EQ(std::string(expected), std::string(err));
2279
+
2280
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "SOLUTION 1"));
2281
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "pH 2"));
2282
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "END"));
2283
+
2284
+ // RunAccumulated clears accumulated lines on next call to AccumulateLine
2285
+ //
2286
+ ASSERT_EQ(0, ::RunAccumulated(id));
2287
+ ASSERT_EQ(0, ::GetErrorStringLineCount(id));
2288
+
2289
+ ASSERT_EQ(IPQ_OK, ::ClearAccumulatedLines(id));
2290
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "SOLUTION 1"));
2291
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "pH 2"));
2292
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "END"));
2293
+
2294
+ ASSERT_EQ(0, ::RunAccumulated(id));
2295
+
2296
+ if (id >= 0)
2297
+ {
2298
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(id));
2299
+ }
2300
+ }
2301
+
2302
+ TEST(TestIPhreeqcLib, TestSetDumpFileName)
2303
+ {
2304
+ char DUMP_FILENAME[80];
2305
+ snprintf(DUMP_FILENAME, sizeof(DUMP_FILENAME), "dump.%06d.out", ::rand());
2306
+ if (::FileExists(DUMP_FILENAME))
2307
+ {
2308
+ ::DeleteFile(DUMP_FILENAME);
2309
+ }
2310
+
2311
+ int n = ::CreateIPhreeqc();
2312
+ ASSERT_TRUE(n >= 0);
2313
+
2314
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
2315
+
2316
+ // add solution block
2317
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
2318
+
2319
+ // add dump block
2320
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
2321
+
2322
+ // run
2323
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
2324
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
2325
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
2326
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
2327
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
2328
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 1));
2329
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileName(n, DUMP_FILENAME));
2330
+
2331
+ ASSERT_EQ(std::string(DUMP_FILENAME), std::string(::GetDumpFileName(n)));
2332
+
2333
+ ASSERT_EQ(0, ::RunAccumulated(n));
2334
+
2335
+ ASSERT_EQ(std::string(DUMP_FILENAME), std::string(::GetDumpFileName(n)));
2336
+
2337
+ ASSERT_EQ(true, ::FileExists(DUMP_FILENAME));
2338
+
2339
+ std::string lines[35];
2340
+ std::ifstream ifs(DUMP_FILENAME);
2341
+
2342
+ size_t i = 0;
2343
+ while (i < sizeof(lines) / sizeof(lines[0]) && std::getline(ifs, lines[i]))
2344
+ {
2345
+ ++i;
2346
+ }
2347
+ ifs.close();
2348
+
2349
+ int line = 0;
2350
+ EXPECT_THAT(lines[line++], HasSubstr("SOLUTION_RAW"));
2351
+ EXPECT_THAT(lines[line++], HasSubstr("-temp"));
2352
+ EXPECT_THAT(lines[line++], HasSubstr("-pressure"));
2353
+ EXPECT_THAT(lines[line++], HasSubstr("-potential"));
2354
+ EXPECT_THAT(lines[line++], HasSubstr("-total_h"));
2355
+ EXPECT_THAT(lines[line++], HasSubstr("-total_o"));
2356
+ EXPECT_THAT(lines[line++], HasSubstr("-cb"));
2357
+ EXPECT_THAT(lines[line++], HasSubstr("-density"));
2358
+ EXPECT_THAT(lines[line++], HasSubstr("-viscosity"));
2359
+ EXPECT_THAT(lines[line++], HasSubstr("-viscos_0"));
2360
+ EXPECT_THAT(lines[line++], HasSubstr("-totals"));
2361
+ EXPECT_THAT(lines[line++], HasSubstr(" C(4) "));
2362
+ EXPECT_THAT(lines[line++], HasSubstr(" Ca "));
2363
+ EXPECT_THAT(lines[line++], HasSubstr(" H(0) "));
2364
+ EXPECT_THAT(lines[line++], HasSubstr(" Na "));
2365
+ EXPECT_THAT(lines[line++], HasSubstr("-pH"));
2366
+ EXPECT_THAT(lines[line++], HasSubstr("-pe"));
2367
+ EXPECT_THAT(lines[line++], HasSubstr("-mu"));
2368
+ EXPECT_THAT(lines[line++], HasSubstr("-ah2o"));
2369
+ EXPECT_THAT(lines[line++], HasSubstr("-mass_water"));
2370
+ EXPECT_THAT(lines[line++], HasSubstr("-soln_vol"));
2371
+ EXPECT_THAT(lines[line++], HasSubstr("-total_alkalinity"));
2372
+ EXPECT_THAT(lines[line++], HasSubstr("-activities"));
2373
+ EXPECT_THAT(lines[line++], HasSubstr(" C(-4) "));
2374
+ EXPECT_THAT(lines[line++], HasSubstr(" C(4) "));
2375
+ EXPECT_THAT(lines[line++], HasSubstr(" Ca "));
2376
+ EXPECT_THAT(lines[line++], HasSubstr(" E "));
2377
+ EXPECT_THAT(lines[line++], HasSubstr(" H(0) "));
2378
+ EXPECT_THAT(lines[line++], HasSubstr(" Na "));
2379
+ EXPECT_THAT(lines[line++], HasSubstr(" O(0) "));
2380
+ EXPECT_THAT(lines[line++], HasSubstr("-gammas"));
2381
+ EXPECT_THAT(lines[line++], HasSubstr("USE mix none"));
2382
+ EXPECT_THAT(lines[line++], HasSubstr("USE reaction none"));
2383
+ EXPECT_THAT(lines[line++], HasSubstr("USE reaction_temperature none"));
2384
+ EXPECT_THAT(lines[line++], HasSubstr("USE reaction_pressure none"));
2385
+
2386
+ if (::FileExists(DUMP_FILENAME))
2387
+ {
2388
+ ::DeleteFile(DUMP_FILENAME);
2389
+ }
2390
+
2391
+ if (n >= 0)
2392
+ {
2393
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
2394
+ }
2395
+ }
2396
+
2397
+ TEST(TestIPhreeqcLib, TestSetOutputFileName)
2398
+ {
2399
+ char OUTPUT_FILENAME[80];
2400
+ snprintf(OUTPUT_FILENAME, sizeof(OUTPUT_FILENAME), "output.%06d.out", ::rand());
2401
+ if (::FileExists(OUTPUT_FILENAME))
2402
+ {
2403
+ ::DeleteFile(OUTPUT_FILENAME);
2404
+ }
2405
+
2406
+ int n = ::CreateIPhreeqc();
2407
+ ASSERT_TRUE(n >= 0);
2408
+
2409
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat.old"));
2410
+
2411
+ // add solution block
2412
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
2413
+
2414
+ // add dump block
2415
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
2416
+
2417
+ // run
2418
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 1));
2419
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
2420
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
2421
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
2422
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
2423
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
2424
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileName(n, OUTPUT_FILENAME));
2425
+
2426
+ ASSERT_EQ(std::string(OUTPUT_FILENAME), std::string(::GetOutputFileName(n)));
2427
+
2428
+
2429
+ ASSERT_EQ(0, ::RunAccumulated(n));
2430
+
2431
+ ASSERT_EQ(true, ::FileExists(OUTPUT_FILENAME));
2432
+
2433
+ std::string lines[200];
2434
+ std::ifstream ifs(OUTPUT_FILENAME);
2435
+
2436
+ size_t i = 0;
2437
+ while (i < sizeof(lines) / sizeof(lines[0]) && std::getline(ifs, lines[i]))
2438
+ {
2439
+ ++i;
2440
+ }
2441
+
2442
+ #ifndef TESTING
2443
+ ASSERT_EQ((size_t)100, i);
2444
+ #else
2445
+ ASSERT_EQ((size_t)96, i);
2446
+ #endif
2447
+
2448
+ int line = 0;
2449
+
2450
+ EXPECT_THAT(lines[line++], HasSubstr("------------------------------------"));
2451
+ EXPECT_THAT(lines[line++], HasSubstr("Reading input data for simulation 1."));
2452
+ EXPECT_THAT(lines[line++], HasSubstr("------------------------------------"));
2453
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2454
+ EXPECT_THAT(lines[line++], HasSubstr(" SOLUTION 1"));
2455
+ EXPECT_THAT(lines[line++], HasSubstr(" C 1"));
2456
+ EXPECT_THAT(lines[line++], HasSubstr(" Ca 1"));
2457
+ EXPECT_THAT(lines[line++], HasSubstr(" Na 1"));
2458
+ EXPECT_THAT(lines[line++], HasSubstr(" DUMP"));
2459
+ EXPECT_THAT(lines[line++], HasSubstr(" -solution 1"));
2460
+ EXPECT_THAT(lines[line++], HasSubstr("-------------------------------------------"));
2461
+ EXPECT_THAT(lines[line++], HasSubstr("Beginning of initial solution calculations."));
2462
+ EXPECT_THAT(lines[line++], HasSubstr("-------------------------------------------"));
2463
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2464
+ EXPECT_THAT(lines[line++], HasSubstr("Initial solution 1. "));
2465
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2466
+ EXPECT_THAT(lines[line++], HasSubstr("-----------------------------Solution composition--------"));
2467
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2468
+ EXPECT_THAT(lines[line++], HasSubstr(" Elements Molality Moles"));
2469
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2470
+ EXPECT_THAT(lines[line++], HasSubstr(" C "));
2471
+ EXPECT_THAT(lines[line++], HasSubstr(" Ca "));
2472
+ EXPECT_THAT(lines[line++], HasSubstr(" Na "));
2473
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2474
+ EXPECT_THAT(lines[line++], HasSubstr("----------------------------Description of solution------"));
2475
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2476
+ EXPECT_THAT(lines[line++], HasSubstr(" pH = "));
2477
+ EXPECT_THAT(lines[line++], HasSubstr(" pe = "));
2478
+ EXPECT_THAT(lines[line++], HasSubstr(" Activity of water = "));
2479
+ EXPECT_THAT(lines[line++], HasSubstr(" Ionic strength (mol/kgw) = "));
2480
+ EXPECT_THAT(lines[line++], HasSubstr(" Mass of water (kg) = "));
2481
+ EXPECT_THAT(lines[line++], HasSubstr(" Total alkalinity (eq/kg) = "));
2482
+ EXPECT_THAT(lines[line++], HasSubstr(" Total CO2 (mol/kg) = "));
2483
+ EXPECT_THAT(lines[line++], HasSubstr(" Temperature (°C) = "));
2484
+ EXPECT_THAT(lines[line++], HasSubstr(" Electrical balance (eq) = "));
2485
+ EXPECT_THAT(lines[line++], HasSubstr(" Percent error, 100*(Cat-|An|)/(Cat+|An|) = "));
2486
+ EXPECT_THAT(lines[line++], HasSubstr(" Iterations = "));
2487
+ EXPECT_THAT(lines[line++], HasSubstr(" Total H = "));
2488
+ EXPECT_THAT(lines[line++], HasSubstr(" Total O = "));
2489
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2490
+ EXPECT_THAT(lines[line++], HasSubstr("----------------------------Distribution of species----------------------------"));
2491
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2492
+ EXPECT_THAT(lines[line++], HasSubstr(" Log Log Log mole V"));
2493
+ EXPECT_THAT(lines[line++], HasSubstr(" Species Molality Activity Molality Activity Gamma cm³/mol"));
2494
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2495
+ EXPECT_THAT(lines[line++], HasSubstr(" OH- "));
2496
+ EXPECT_THAT(lines[line++], HasSubstr(" H+ "));
2497
+ EXPECT_THAT(lines[line++], HasSubstr(" H2O "));
2498
+ EXPECT_THAT(lines[line++], HasSubstr("C(-4) "));
2499
+ EXPECT_THAT(lines[line++], HasSubstr(" CH4 "));
2500
+ EXPECT_THAT(lines[line++], HasSubstr("C(4) "));
2501
+ EXPECT_THAT(lines[line++], HasSubstr(" HCO3- "));
2502
+ EXPECT_THAT(lines[line++], HasSubstr(" CO2 "));
2503
+ EXPECT_THAT(lines[line++], HasSubstr(" CaHCO3+ "));
2504
+ EXPECT_THAT(lines[line++], HasSubstr(" CaCO3 "));
2505
+ EXPECT_THAT(lines[line++], HasSubstr(" CO3-2 "));
2506
+ EXPECT_THAT(lines[line++], HasSubstr(" NaHCO3 "));
2507
+ EXPECT_THAT(lines[line++], HasSubstr(" NaCO3- "));
2508
+ EXPECT_THAT(lines[line++], HasSubstr("Ca "));
2509
+ EXPECT_THAT(lines[line++], HasSubstr(" Ca+2 "));
2510
+ EXPECT_THAT(lines[line++], HasSubstr(" CaHCO3+ "));
2511
+ EXPECT_THAT(lines[line++], HasSubstr(" CaCO3 "));
2512
+ EXPECT_THAT(lines[line++], HasSubstr(" CaOH+ "));
2513
+ EXPECT_THAT(lines[line++], HasSubstr("H(0) "));
2514
+ EXPECT_THAT(lines[line++], HasSubstr(" H2 "));
2515
+ EXPECT_THAT(lines[line++], HasSubstr("Na "));
2516
+ EXPECT_THAT(lines[line++], HasSubstr(" Na+ "));
2517
+ EXPECT_THAT(lines[line++], HasSubstr(" NaHCO3 "));
2518
+ EXPECT_THAT(lines[line++], HasSubstr(" NaCO3- "));
2519
+ EXPECT_THAT(lines[line++], HasSubstr(" NaOH "));
2520
+ EXPECT_THAT(lines[line++], HasSubstr("O(0) "));
2521
+ EXPECT_THAT(lines[line++], HasSubstr(" O2 "));
2522
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2523
+ EXPECT_THAT(lines[line++], HasSubstr("------------------------------Saturation indices-------------------------------"));
2524
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2525
+ EXPECT_THAT(lines[line++], HasSubstr(" Phase SI** log IAP log K(298 K, 1 atm)"));
2526
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2527
+ EXPECT_THAT(lines[line++], HasSubstr(" Aragonite"));
2528
+ EXPECT_THAT(lines[line++], HasSubstr(" Calcite"));
2529
+ EXPECT_THAT(lines[line++], HasSubstr(" CH4(g)"));
2530
+ EXPECT_THAT(lines[line++], HasSubstr(" CO2(g)"));
2531
+ EXPECT_THAT(lines[line++], HasSubstr(" H2(g)"));
2532
+ EXPECT_THAT(lines[line++], HasSubstr(" H2O(g)"));
2533
+ EXPECT_THAT(lines[line++], HasSubstr(" O2(g)"));
2534
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2535
+ EXPECT_THAT(lines[line++], HasSubstr("**For a gas, SI = log10(fugacity). Fugacity = pressure * phi / 1 atm."));
2536
+ EXPECT_THAT(lines[line++], HasSubstr(" For ideal gases, phi = 1."));
2537
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2538
+ EXPECT_THAT(lines[line++], HasSubstr("------------------"));
2539
+ EXPECT_THAT(lines[line++], HasSubstr("End of simulation."));
2540
+ EXPECT_THAT(lines[line++], HasSubstr("------------------"));
2541
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2542
+ EXPECT_THAT(lines[line++], HasSubstr("------------------------------------"));
2543
+ EXPECT_THAT(lines[line++], HasSubstr("Reading input data for simulation 2."));
2544
+ EXPECT_THAT(lines[line++], HasSubstr("------------------------------------"));
2545
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2546
+ #ifndef TESTING
2547
+ EXPECT_THAT(lines[line++], HasSubstr("----------------"));
2548
+ EXPECT_THAT(lines[line++], HasSubstr("End of Run after "));
2549
+ EXPECT_THAT(lines[line++], HasSubstr("----------------"));
2550
+ #endif
2551
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2552
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2553
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2554
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2555
+ ///#endif
2556
+
2557
+ if (n >= 0)
2558
+ {
2559
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
2560
+ }
2561
+
2562
+ if (::FileExists(OUTPUT_FILENAME))
2563
+ {
2564
+ ::DeleteFile(OUTPUT_FILENAME);
2565
+ }
2566
+ }
2567
+
2568
+ TEST(TestIPhreeqcLib, TestOutputStringOnOff)
2569
+ {
2570
+ int n = ::CreateIPhreeqc();
2571
+ ASSERT_TRUE(n >= 0);
2572
+
2573
+ ASSERT_EQ(false, ::GetOutputStringOn(n) != 0);
2574
+
2575
+ ASSERT_EQ(IPQ_OK, ::SetOutputStringOn(n, 1));
2576
+ ASSERT_EQ(true, ::GetOutputStringOn(n) != 0);
2577
+
2578
+ ASSERT_EQ(IPQ_OK, ::SetOutputStringOn(n, 0));
2579
+ ASSERT_EQ(false, ::GetOutputStringOn(n) != 0);
2580
+
2581
+ if (n >= 0)
2582
+ {
2583
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
2584
+ }
2585
+ }
2586
+
2587
+ TEST(TestIPhreeqcLib, TestGetOutputString)
2588
+ {
2589
+ int n = ::CreateIPhreeqc();
2590
+ ASSERT_TRUE(n >= 0);
2591
+
2592
+ char OUTPUT_FILENAME[80];
2593
+ snprintf(OUTPUT_FILENAME, sizeof(OUTPUT_FILENAME), "output.%06d.out", ::rand());
2594
+ if (::FileExists(OUTPUT_FILENAME))
2595
+ {
2596
+ ::DeleteFile(OUTPUT_FILENAME);
2597
+ }
2598
+ ASSERT_EQ(false, ::FileExists(OUTPUT_FILENAME));
2599
+
2600
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
2601
+
2602
+ // add solution block
2603
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
2604
+
2605
+ // add dump block
2606
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
2607
+
2608
+ // run
2609
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 1));
2610
+ ASSERT_EQ(IPQ_OK, ::SetOutputStringOn(n, 1));
2611
+
2612
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
2613
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
2614
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
2615
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
2616
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
2617
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileName(n, OUTPUT_FILENAME));
2618
+
2619
+ ASSERT_EQ(0, ::RunAccumulated(n));
2620
+
2621
+ ASSERT_EQ(true, ::FileExists(OUTPUT_FILENAME));
2622
+
2623
+ {
2624
+ std::ifstream ifs(OUTPUT_FILENAME);
2625
+ std::string fline((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
2626
+
2627
+ std::string sline(::GetOutputString(n));
2628
+ ASSERT_TRUE(sline.size() > 0);
2629
+
2630
+ ASSERT_EQ(fline, sline);
2631
+ }
2632
+
2633
+ if (::FileExists(OUTPUT_FILENAME))
2634
+ {
2635
+ ::DeleteFile(OUTPUT_FILENAME);
2636
+ }
2637
+ if (n >= 0)
2638
+ {
2639
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
2640
+ }
2641
+ }
2642
+
2643
+ TEST(TestIPhreeqcLib, TestGetOutputStringLineCount)
2644
+ {
2645
+ int n = ::CreateIPhreeqc();
2646
+ ASSERT_TRUE(n >= 0);
2647
+
2648
+ ASSERT_EQ(0, ::GetOutputStringLineCount(n));
2649
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat.old"));
2650
+ ASSERT_EQ(0, ::GetOutputStringLineCount(n));
2651
+
2652
+ // add solution block
2653
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
2654
+
2655
+ // add dump block
2656
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
2657
+
2658
+ // run
2659
+ ASSERT_EQ(IPQ_OK, ::SetOutputStringOn(n, 0));
2660
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
2661
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
2662
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
2663
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
2664
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
2665
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
2666
+
2667
+ ASSERT_EQ(0, ::RunAccumulated(n));
2668
+ ASSERT_EQ(0, ::GetOutputStringLineCount(n));
2669
+
2670
+ // add solution block
2671
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
2672
+
2673
+ // add dump block
2674
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
2675
+
2676
+ ASSERT_EQ(IPQ_OK, ::SetOutputStringOn(n, 1));
2677
+
2678
+ ASSERT_EQ(0, ::RunAccumulated(n));
2679
+ #ifndef TESTING
2680
+ ASSERT_EQ(100, ::GetOutputStringLineCount(n));
2681
+ #else
2682
+ ASSERT_EQ(96, ::GetOutputStringLineCount(n));
2683
+ #endif
2684
+
2685
+ // add solution block
2686
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
2687
+
2688
+ // add dump block
2689
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
2690
+
2691
+ ASSERT_EQ(IPQ_OK, ::SetOutputStringOn(n, 0));
2692
+
2693
+ ASSERT_EQ(0, ::RunAccumulated(n));
2694
+ ASSERT_EQ(0, ::GetOutputStringLineCount(n));
2695
+
2696
+ if (n >= 0)
2697
+ {
2698
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
2699
+ }
2700
+ }
2701
+
2702
+ TEST(TestIPhreeqcLib, TestGetOutputStringLine)
2703
+ {
2704
+ int n = ::CreateIPhreeqc();
2705
+ ASSERT_TRUE(n >= 0);
2706
+
2707
+ ASSERT_EQ(0, ::GetOutputStringLineCount(n));
2708
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat.old"));
2709
+ ASSERT_EQ(0, ::GetOutputStringLineCount(n));
2710
+
2711
+ // add solution block
2712
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
2713
+
2714
+ // add dump block
2715
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
2716
+
2717
+ // run
2718
+ ASSERT_EQ(IPQ_OK, ::SetOutputStringOn(n, 0));
2719
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
2720
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
2721
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
2722
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
2723
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
2724
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
2725
+
2726
+ ASSERT_EQ(0, ::RunAccumulated(n));
2727
+ ASSERT_EQ(0, ::GetOutputStringLineCount(n));
2728
+
2729
+ int line = 0;
2730
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, line++)));
2731
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, line++)));
2732
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, line++)));
2733
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, line++)));
2734
+
2735
+ // negative lines should be empty
2736
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, -1)));
2737
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, -2)));
2738
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, -3)));
2739
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, -4)));
2740
+
2741
+ // add solution block
2742
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
2743
+
2744
+ // add dump block
2745
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
2746
+
2747
+ ASSERT_EQ(IPQ_OK, ::SetOutputStringOn(n, 1));
2748
+
2749
+ ASSERT_EQ(0, ::RunAccumulated(n));
2750
+ #ifndef TESTING
2751
+ ASSERT_EQ(100, ::GetOutputStringLineCount(n));
2752
+ #else
2753
+ ASSERT_EQ(96, ::GetOutputStringLineCount(n));
2754
+ #endif
2755
+
2756
+ ASSERT_EQ(std::string("------------------------------------"), std::string(::GetOutputStringLine(n, 0)));
2757
+ ASSERT_EQ(std::string("Reading input data for simulation 1."), std::string(::GetOutputStringLine(n, 1)));
2758
+ ASSERT_EQ(std::string("------------------------------------"), std::string(::GetOutputStringLine(n, 2)));
2759
+ ASSERT_EQ(std::string("-----------------------------Solution composition------------------------------"), std::string(::GetOutputStringLine(n, 16)));
2760
+ ASSERT_EQ(std::string("----------------------------Description of solution----------------------------"), std::string(::GetOutputStringLine(n, 24)));
2761
+ ASSERT_EQ(std::string("----------------------------Distribution of species----------------------------"), std::string(::GetOutputStringLine(n, 40)));
2762
+ ASSERT_EQ(std::string("------------------------------Saturation indices-------------------------------"), std::string(::GetOutputStringLine(n, 73)));
2763
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, 100)));
2764
+
2765
+ // add solution block
2766
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
2767
+
2768
+ // add dump block
2769
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
2770
+
2771
+ ASSERT_EQ(IPQ_OK, ::SetOutputStringOn(n, 0));
2772
+
2773
+ ASSERT_EQ(0, ::RunAccumulated(n));
2774
+ ASSERT_EQ(0, ::GetOutputStringLineCount(n));
2775
+
2776
+ line = 0;
2777
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, line++)));
2778
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, line++)));
2779
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, line++)));
2780
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, line++)));
2781
+
2782
+ // negative lines should be empty
2783
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, -1)));
2784
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, -2)));
2785
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, -3)));
2786
+ ASSERT_EQ(std::string(""), std::string(::GetOutputStringLine(n, -4)));
2787
+
2788
+ if (n >= 0)
2789
+ {
2790
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
2791
+ }
2792
+ }
2793
+
2794
+ TEST(TestIPhreeqcLib, TestSetLogFileName)
2795
+ {
2796
+ char LOG_FILENAME[80];
2797
+ snprintf(LOG_FILENAME, sizeof(LOG_FILENAME), "log.%06d.out", ::rand());
2798
+ if (::FileExists(LOG_FILENAME))
2799
+ {
2800
+ ::DeleteFile(LOG_FILENAME);
2801
+ }
2802
+
2803
+ int n = ::CreateIPhreeqc();
2804
+ ASSERT_TRUE(n >= 0);
2805
+
2806
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
2807
+
2808
+ // add solution block
2809
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
2810
+
2811
+ // add dump block
2812
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
2813
+
2814
+ // add knobs
2815
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "KNOBS"));
2816
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "\t-logfile TRUE"));
2817
+
2818
+ // run
2819
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 1));
2820
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
2821
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
2822
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
2823
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
2824
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
2825
+ ASSERT_EQ(IPQ_OK, ::SetLogFileName(n, LOG_FILENAME));
2826
+
2827
+
2828
+ ASSERT_EQ(0, ::RunAccumulated(n));
2829
+
2830
+ ASSERT_EQ(true, ::FileExists(LOG_FILENAME));
2831
+
2832
+ std::string lines[33];
2833
+ std::ifstream ifs(LOG_FILENAME);
2834
+
2835
+ size_t i = 0;
2836
+ while (i < sizeof(lines) / sizeof(lines[0]) && std::getline(ifs, lines[i]))
2837
+ {
2838
+ ++i;
2839
+ }
2840
+
2841
+ #ifndef TESTING
2842
+ ASSERT_EQ((size_t)25, i);
2843
+ #else
2844
+ ASSERT_EQ((size_t)21, i);
2845
+ #endif
2846
+
2847
+ int line = 0;
2848
+ ASSERT_EQ(std::string("-------------------------------------------"), lines[line++]);
2849
+ ASSERT_EQ(std::string("Beginning of initial solution calculations."), lines[line++]);
2850
+ ASSERT_EQ(std::string("-------------------------------------------"), lines[line++]);
2851
+ ASSERT_EQ(std::string(""), lines[line++]);
2852
+ ASSERT_EQ(std::string("Initial solution 1. "), lines[line++]);
2853
+ ASSERT_EQ(std::string(""), lines[line++]);
2854
+ ASSERT_EQ(std::string("Iterations in revise_guesses: 2"), lines[line++]);
2855
+ ASSERT_EQ(std::string(""), lines[line++]);
2856
+ ASSERT_EQ(std::string("Number of infeasible solutions: 0"), lines[line++]);
2857
+ ASSERT_EQ(std::string("Number of basis changes: 0"), lines[line++]);
2858
+ ASSERT_EQ(std::string(""), lines[line++]);
2859
+ ASSERT_EQ(std::string("Number of iterations: 8"), lines[line++]);
2860
+ ASSERT_EQ(std::string(""), lines[line++]);
2861
+ ASSERT_EQ(std::string("------------------"), lines[line++]);
2862
+ ASSERT_EQ(std::string("End of simulation."), lines[line++]);
2863
+ ASSERT_EQ(std::string("------------------"), lines[line++]);
2864
+ ASSERT_EQ(std::string(""), lines[line++]);
2865
+ ASSERT_EQ(std::string("------------------------------------"), lines[line++]);
2866
+ ASSERT_EQ(std::string("Reading input data for simulation 2."), lines[line++]);
2867
+ ASSERT_EQ(std::string("------------------------------------"), lines[line++]);
2868
+ ASSERT_EQ(std::string(""), lines[line++]);
2869
+ line++;
2870
+ line++;
2871
+ line++;
2872
+ ASSERT_EQ(std::string(""), lines[line++]);
2873
+
2874
+ if (::FileExists(LOG_FILENAME))
2875
+ {
2876
+ ::DeleteFile(LOG_FILENAME);
2877
+ }
2878
+
2879
+ if (n >= 0)
2880
+ {
2881
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
2882
+ }
2883
+ }
2884
+
2885
+ TEST(TestIPhreeqcLib, TestLogStringOnOff)
2886
+ {
2887
+ int n = ::CreateIPhreeqc();
2888
+ ASSERT_TRUE(n >= 0);
2889
+
2890
+ ASSERT_EQ(false, ::GetLogStringOn(n) != 0);
2891
+
2892
+ ASSERT_EQ(IPQ_OK, ::SetLogStringOn(n, 1));
2893
+ ASSERT_EQ(true, ::GetLogStringOn(n) != 0);
2894
+
2895
+ ASSERT_EQ(IPQ_OK, ::SetLogStringOn(n, 0));
2896
+ ASSERT_EQ(false, ::GetLogStringOn(n) != 0);
2897
+
2898
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
2899
+ }
2900
+
2901
+ TEST(TestIPhreeqcLib, TestGetLogString)
2902
+ {
2903
+ char LOG_FILENAME[80];
2904
+ snprintf(LOG_FILENAME, sizeof(LOG_FILENAME), "log.%06d.out", ::rand());
2905
+ if (::FileExists(LOG_FILENAME))
2906
+ {
2907
+ ::DeleteFile(LOG_FILENAME);
2908
+ }
2909
+ ASSERT_EQ(false, ::FileExists(LOG_FILENAME));
2910
+
2911
+ int n = ::CreateIPhreeqc();
2912
+ ASSERT_TRUE(n >= 0);
2913
+
2914
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
2915
+
2916
+ // add solution block
2917
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
2918
+
2919
+ // add dump block
2920
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
2921
+
2922
+ // add knobs
2923
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "KNOBS"));
2924
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "\t-logfile TRUE"));
2925
+
2926
+
2927
+ // run
2928
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 1));
2929
+ ASSERT_EQ(IPQ_OK, ::SetLogStringOn(n, 1));
2930
+
2931
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
2932
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
2933
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
2934
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
2935
+ ASSERT_EQ(IPQ_OK, ::SetOutputStringOn(n, 0));
2936
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
2937
+
2938
+ ASSERT_EQ(IPQ_OK, ::SetLogFileName(n, LOG_FILENAME));
2939
+ ASSERT_EQ(std::string(LOG_FILENAME), std::string(::GetLogFileName(n)));
2940
+
2941
+ ASSERT_EQ(0, ::RunAccumulated(n));
2942
+
2943
+ ASSERT_EQ(std::string(LOG_FILENAME), std::string(::GetLogFileName(n)));
2944
+
2945
+ ASSERT_EQ(true, ::FileExists(LOG_FILENAME));
2946
+
2947
+ {
2948
+ std::ifstream ifs(LOG_FILENAME);
2949
+ std::string fline((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
2950
+
2951
+ std::string sline(::GetLogString(n));
2952
+ ASSERT_TRUE(sline.size() > 0);
2953
+
2954
+ ASSERT_EQ(fline, sline);
2955
+ }
2956
+
2957
+ if (::FileExists(LOG_FILENAME))
2958
+ {
2959
+ ::DeleteFile(LOG_FILENAME);
2960
+ }
2961
+
2962
+ if (n >= 0)
2963
+ {
2964
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
2965
+ }
2966
+ }
2967
+
2968
+ TEST(TestIPhreeqcLib, TestGetLogStringLineCount)
2969
+ {
2970
+ int n = ::CreateIPhreeqc();
2971
+ ASSERT_TRUE(n >= 0);
2972
+
2973
+ ASSERT_EQ(0, ::GetLogStringLineCount(n));
2974
+
2975
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
2976
+
2977
+ ASSERT_EQ(0, ::GetLogStringLineCount(n));
2978
+
2979
+ // add solution block
2980
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
2981
+
2982
+ // add dump block
2983
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
2984
+
2985
+ // add knobs
2986
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "KNOBS"));
2987
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "\t-logfile TRUE"));
2988
+
2989
+ // run
2990
+ ASSERT_EQ(IPQ_OK, ::SetLogStringOn(n, 0));
2991
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
2992
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
2993
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
2994
+ ASSERT_EQ(IPQ_OK, ::SetOutputStringOn(n, 0));
2995
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
2996
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
2997
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
2998
+
2999
+ ASSERT_EQ(0, ::RunAccumulated(n));
3000
+ ASSERT_EQ(0, ::GetLogStringLineCount(n));
3001
+
3002
+ // add solution block
3003
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
3004
+
3005
+ // add dump block
3006
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
3007
+
3008
+ // add knobs
3009
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "KNOBS"));
3010
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "\t-logfile TRUE"));
3011
+
3012
+ ASSERT_EQ(IPQ_OK, ::SetLogStringOn(n, 1));
3013
+
3014
+ ASSERT_EQ(0, ::RunAccumulated(n));
3015
+ #ifndef TESTING
3016
+ ASSERT_EQ(29, ::GetLogStringLineCount(n));
3017
+ #else
3018
+ ASSERT_EQ(25, ::GetLogStringLineCount(n));
3019
+ #endif
3020
+
3021
+ // add solution block
3022
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
3023
+
3024
+ // add dump block
3025
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
3026
+
3027
+ // add knobs
3028
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "KNOBS"));
3029
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "\t-logfile TRUE"));
3030
+
3031
+ ASSERT_EQ(IPQ_OK, ::SetLogStringOn(n, 0));
3032
+
3033
+ ASSERT_EQ(0, ::RunAccumulated(n));
3034
+ ASSERT_EQ(0, ::GetLogStringLineCount(n));
3035
+
3036
+ if (n >= 0)
3037
+ {
3038
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
3039
+ }
3040
+ }
3041
+
3042
+ TEST(TestIPhreeqcLib, TestGetLogStringLine)
3043
+ {
3044
+ int n = ::CreateIPhreeqc();
3045
+ ASSERT_TRUE(n >= 0);
3046
+ ASSERT_EQ(0, ::GetLogStringLineCount(n));
3047
+
3048
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
3049
+
3050
+ ASSERT_EQ(0, ::GetLogStringLineCount(n));
3051
+
3052
+ // add solution block
3053
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
3054
+
3055
+ // add dump block
3056
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
3057
+
3058
+ // add knobs
3059
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "KNOBS"));
3060
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "\t-logfile TRUE"));
3061
+
3062
+ // run
3063
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
3064
+ ASSERT_EQ(IPQ_OK, ::SetOutputStringOn(n, 0));
3065
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
3066
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
3067
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
3068
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
3069
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
3070
+
3071
+ ASSERT_EQ(0, ::RunAccumulated(n));
3072
+ ASSERT_EQ(0, ::GetLogStringLineCount(n));
3073
+
3074
+ int line = 0;
3075
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3076
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3077
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3078
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3079
+
3080
+ // negative lines should be empty
3081
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, -1)));
3082
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, -2)));
3083
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, -3)));
3084
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, -4)));
3085
+
3086
+ // add solution block
3087
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
3088
+
3089
+ // add dump block
3090
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
3091
+
3092
+ // add knobs
3093
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "KNOBS"));
3094
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "\t-logfile TRUE"));
3095
+
3096
+ ASSERT_EQ(IPQ_OK, ::SetLogStringOn(n, 1));
3097
+
3098
+ ASSERT_EQ(0, ::RunAccumulated(n));
3099
+ #ifndef TESTING
3100
+ ASSERT_EQ(29, ::GetLogStringLineCount(n));
3101
+ #else
3102
+ ASSERT_EQ(25, ::GetLogStringLineCount(n));
3103
+ #endif
3104
+
3105
+ line = 0;
3106
+ ASSERT_EQ(std::string("------------------------------------"), std::string(::GetLogStringLine(n, line++)));
3107
+ ASSERT_EQ(std::string("Reading input data for simulation 1."), std::string(::GetLogStringLine(n, line++)));
3108
+ ASSERT_EQ(std::string("------------------------------------"), std::string(::GetLogStringLine(n, line++)));
3109
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3110
+ ASSERT_EQ(std::string("-------------------------------------------"), std::string(::GetLogStringLine(n, line++)));
3111
+ ASSERT_EQ(std::string("Beginning of initial solution calculations."), std::string(::GetLogStringLine(n, line++)));
3112
+ ASSERT_EQ(std::string("-------------------------------------------"), std::string(::GetLogStringLine(n, line++)));
3113
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3114
+ ASSERT_EQ(std::string("Initial solution 1. "), std::string(::GetLogStringLine(n, line++)));
3115
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3116
+ ASSERT_EQ(std::string("Iterations in revise_guesses: 2"), std::string(::GetLogStringLine(n, line++)));
3117
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3118
+ ASSERT_EQ(std::string("Number of infeasible solutions: 0"), std::string(::GetLogStringLine(n, line++)));
3119
+ ASSERT_EQ(std::string("Number of basis changes: 0"), std::string(::GetLogStringLine(n, line++)));
3120
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3121
+ ASSERT_EQ(std::string("Number of iterations: 8"), std::string(::GetLogStringLine(n, line++)));
3122
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3123
+ ASSERT_EQ(std::string("------------------"), std::string(::GetLogStringLine(n, line++)));
3124
+ ASSERT_EQ(std::string("End of simulation."), std::string(::GetLogStringLine(n, line++)));
3125
+ ASSERT_EQ(std::string("------------------"), std::string(::GetLogStringLine(n, line++)));
3126
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3127
+ ASSERT_EQ(std::string("------------------------------------"), std::string(::GetLogStringLine(n, line++)));
3128
+ ASSERT_EQ(std::string("Reading input data for simulation 2."), std::string(::GetLogStringLine(n, line++)));
3129
+ ASSERT_EQ(std::string("------------------------------------"), std::string(::GetLogStringLine(n, line++)));
3130
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3131
+ line++;
3132
+ line++;
3133
+ line++;
3134
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3135
+
3136
+ // add solution block
3137
+ // add solution block
3138
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
3139
+
3140
+ // add dump block
3141
+ ASSERT_EQ(IPQ_OK, ::DUMP(n));
3142
+
3143
+ // add knobs
3144
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "KNOBS"));
3145
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "\t-logfile TRUE"));
3146
+
3147
+ ASSERT_EQ(IPQ_OK, ::SetLogStringOn(n, 0));
3148
+
3149
+
3150
+ ASSERT_EQ(0, ::RunAccumulated(n));
3151
+ ASSERT_EQ(0, ::GetLogStringLineCount(n));
3152
+
3153
+ line = 0;
3154
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3155
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3156
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3157
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, line++)));
3158
+
3159
+ // negative lines should be empty
3160
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, -1)));
3161
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, -2)));
3162
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, -3)));
3163
+ ASSERT_EQ(std::string(""), std::string(::GetLogStringLine(n, -4)));
3164
+
3165
+ if (n >= 0)
3166
+ {
3167
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
3168
+ }
3169
+ }
3170
+
3171
+ TEST(TestIPhreeqcLib, TestSetErrorFileName)
3172
+ {
3173
+ char ERR_FILENAME[80];
3174
+ snprintf(ERR_FILENAME, sizeof(ERR_FILENAME), "error.%s.out", "TestIPhreeqcLib-TestSetErrorFileName");
3175
+ if (::FileExists(ERR_FILENAME))
3176
+ {
3177
+ ::DeleteFile(ERR_FILENAME);
3178
+ }
3179
+
3180
+ int n = ::CreateIPhreeqc();
3181
+ ASSERT_TRUE(n >= 0);
3182
+
3183
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
3184
+
3185
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "SOLUTION 1"));
3186
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " pH 7"));
3187
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Na 1"));
3188
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "PHASES"));
3189
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Fix_H+"));
3190
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " H+ = H+"));
3191
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " log_k 0"));
3192
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "EQUILIBRIUM_PHASES"));
3193
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Fix_H+ -10 HCl 10"));
3194
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "END"));
3195
+
3196
+ // run
3197
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 1));
3198
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
3199
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 1));
3200
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
3201
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
3202
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
3203
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileName(n, ERR_FILENAME));
3204
+
3205
+
3206
+ ASSERT_EQ(1, ::RunAccumulated(n));
3207
+
3208
+ ASSERT_EQ(true, ::FileExists(ERR_FILENAME));
3209
+
3210
+ std::string lines[100];
3211
+ {
3212
+ std::ifstream ifs(ERR_FILENAME);
3213
+
3214
+ size_t i = 0;
3215
+ while (i < sizeof(lines) / sizeof(lines[0]) && std::getline(ifs, lines[i]))
3216
+ {
3217
+ ++i;
3218
+ }
3219
+
3220
+ ASSERT_EQ((size_t)90, i);
3221
+ }
3222
+
3223
+ ASSERT_EQ(std::string("WARNING: Maximum iterations exceeded, 100"), lines[0]);
3224
+ ASSERT_EQ(std::string("WARNING: Numerical method failed with this set of convergence parameters."), lines[2]);
3225
+ ASSERT_EQ(std::string("ERROR: Numerical method failed on all combinations of convergence parameters, cell/soln/mix 1"), lines[88]);
3226
+ ASSERT_EQ(std::string("Stopping."), lines[89]);
3227
+
3228
+ if (::FileExists(ERR_FILENAME))
3229
+ {
3230
+ ::DeleteFile(ERR_FILENAME);
3231
+ }
3232
+
3233
+ if (n >= 0)
3234
+ {
3235
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
3236
+ }
3237
+ }
3238
+
3239
+ TEST(TestIPhreeqcLib, TestErrorStringOnOff)
3240
+ {
3241
+ int n = ::CreateIPhreeqc();
3242
+ ASSERT_TRUE(n >= 0);
3243
+
3244
+ ASSERT_EQ(true, ::GetErrorStringOn(n) != 0);
3245
+
3246
+ ASSERT_EQ(IPQ_OK, ::SetErrorStringOn(n, 1));
3247
+ ASSERT_EQ(true, ::GetErrorStringOn(n) != 0);
3248
+
3249
+ ASSERT_EQ(IPQ_OK, ::SetErrorStringOn(n, 0));
3250
+ ASSERT_EQ(false, ::GetErrorStringOn(n) != 0);
3251
+
3252
+ ASSERT_EQ(IPQ_OK, ::SetErrorStringOn(n, 1));
3253
+ ASSERT_EQ(true, ::GetErrorStringOn(n) != 0);
3254
+
3255
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
3256
+ }
3257
+
3258
+ TEST(TestIPhreeqcLib, TestGetErrorString)
3259
+ {
3260
+ char ERR_FILENAME[80];
3261
+ snprintf(ERR_FILENAME, sizeof(ERR_FILENAME), "error.%06d.out", ::rand());
3262
+ if (::FileExists(ERR_FILENAME))
3263
+ {
3264
+ ::DeleteFile(ERR_FILENAME);
3265
+ }
3266
+ ASSERT_EQ(false, ::FileExists(ERR_FILENAME));
3267
+
3268
+ int n = ::CreateIPhreeqc();
3269
+ ASSERT_TRUE(n >= 0);
3270
+
3271
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
3272
+
3273
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "SOLUTION 1"));
3274
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " pH 7"));
3275
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Na 1"));
3276
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "PHASES"));
3277
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Fix_H+"));
3278
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " H+ = H+"));
3279
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " log_k 0"));
3280
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "EQUILIBRIUM_PHASES"));
3281
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Fix_H+ -10 HCl 10"));
3282
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "END"));
3283
+
3284
+ // run
3285
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 1));
3286
+ ASSERT_EQ(IPQ_OK, ::SetErrorStringOn(n, 1));
3287
+
3288
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
3289
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
3290
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
3291
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
3292
+ ASSERT_EQ(IPQ_OK, ::SetOutputStringOn(n, 0));
3293
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
3294
+
3295
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileName(n, ERR_FILENAME));
3296
+ ASSERT_EQ(std::string(ERR_FILENAME), std::string(::GetErrorFileName(n)));
3297
+
3298
+ ASSERT_EQ(1, ::RunAccumulated(n));
3299
+
3300
+ ASSERT_EQ(std::string(ERR_FILENAME), std::string(::GetErrorFileName(n)));
3301
+
3302
+ ASSERT_EQ(true, ::FileExists(ERR_FILENAME));
3303
+
3304
+ {
3305
+ #if 0
3306
+ std::ifstream ifs(ERR_FILENAME);
3307
+ std::string fline((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
3308
+ #else
3309
+ std::string fline("ERROR: Numerical method failed on all combinations of convergence parameters, cell/soln/mix 1\n");
3310
+ #endif
3311
+
3312
+ std::string sline(::GetErrorString(n));
3313
+ ASSERT_TRUE(sline.size() > 0);
3314
+
3315
+ ASSERT_EQ(fline, sline);
3316
+ }
3317
+
3318
+ if (::FileExists(ERR_FILENAME))
3319
+ {
3320
+ ::DeleteFile(ERR_FILENAME);
3321
+ }
3322
+
3323
+ if (n >= 0)
3324
+ {
3325
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
3326
+ }
3327
+ }
3328
+
3329
+ TEST(TestIPhreeqcLib, TestGetErrorStringLineCount)
3330
+ {
3331
+ int n = ::CreateIPhreeqc();
3332
+ ASSERT_TRUE(n >= 0);
3333
+
3334
+ ASSERT_EQ(0, ::GetErrorStringLineCount(n));
3335
+
3336
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
3337
+
3338
+ ASSERT_EQ(0, ::GetErrorStringLineCount(n));
3339
+
3340
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "SOLUTION 1"));
3341
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " pH 7"));
3342
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Na 1"));
3343
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "PHASES"));
3344
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Fix_H+"));
3345
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " H+ = H+"));
3346
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " log_k 0"));
3347
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "EQUILIBRIUM_PHASES"));
3348
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Fix_H+ -10 HCl 10"));
3349
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "END"));
3350
+
3351
+ ASSERT_EQ(true, ::GetErrorStringOn(n) != 0);
3352
+ ASSERT_EQ(1, ::RunAccumulated(n));
3353
+ ASSERT_EQ(1, ::GetErrorStringLineCount(n));
3354
+
3355
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "SOLUTION 1"));
3356
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " pH 7"));
3357
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Na 1"));
3358
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "PHASES"));
3359
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Fix_H+"));
3360
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " H+ = H+"));
3361
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " log_k 0"));
3362
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "EQUILIBRIUM_PHASES"));
3363
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Fix_H+ -10 HCl 10"));
3364
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "END"));
3365
+
3366
+ ASSERT_EQ(IPQ_OK, ::SetErrorStringOn(n, 1));
3367
+ ASSERT_EQ(1, ::RunAccumulated(n));
3368
+ ASSERT_EQ(1, ::GetErrorStringLineCount(n));
3369
+
3370
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "SOLUTION 1"));
3371
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " pH 7"));
3372
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Na 1"));
3373
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "PHASES"));
3374
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Fix_H+"));
3375
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " H+ = H+"));
3376
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " log_k 0"));
3377
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "EQUILIBRIUM_PHASES"));
3378
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Fix_H+ -10 HCl 10"));
3379
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "END"));
3380
+
3381
+ ASSERT_EQ(IPQ_OK, ::SetErrorStringOn(n, 0));
3382
+
3383
+ ASSERT_EQ(1, ::RunAccumulated(n));
3384
+ ASSERT_EQ(0, ::GetErrorStringLineCount(n));
3385
+
3386
+ if (n >= 0)
3387
+ {
3388
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
3389
+ }
3390
+ }
3391
+
3392
+ TEST(TestIPhreeqcLib, TestSetSelectedOutputFileName)
3393
+ {
3394
+ char SELOUT_FILENAME[80];
3395
+ snprintf(SELOUT_FILENAME, sizeof(SELOUT_FILENAME), "selected_output.%06d.out", ::rand());
3396
+ if (::FileExists(SELOUT_FILENAME))
3397
+ {
3398
+ ::DeleteFile(SELOUT_FILENAME);
3399
+ }
3400
+
3401
+ int n = ::CreateIPhreeqc();
3402
+ ASSERT_TRUE(n >= 0);
3403
+
3404
+ ASSERT_EQ(0, ::LoadDatabase(n, "llnl.dat"));
3405
+
3406
+ int max = 6;
3407
+
3408
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
3409
+ ASSERT_EQ(IPQ_OK, ::EQUILIBRIUM_PHASES(n, "calcite", 0.0, 0.010));
3410
+ ASSERT_EQ(IPQ_OK, ::USER_PUNCH(n, "Ca", max));
3411
+
3412
+ ASSERT_EQ(0, ::GetOutputFileOn(n));
3413
+ ASSERT_EQ(0, ::GetErrorFileOn(n));
3414
+ ASSERT_EQ(0, ::GetLogFileOn(n));
3415
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
3416
+ ASSERT_EQ(0, ::GetDumpFileOn(n));
3417
+ ASSERT_EQ(0, ::GetDumpStringOn(n));
3418
+
3419
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 1));
3420
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileName(n, SELOUT_FILENAME));
3421
+
3422
+ ASSERT_EQ(0, ::RunAccumulated(n));
3423
+
3424
+ ASSERT_EQ(true, ::FileExists(SELOUT_FILENAME));
3425
+
3426
+ /*
3427
+ EXPECTED selected.out:
3428
+ sim state soln dist_x time step pH pe C Ca Na m_CO3-2 m_CaOH+ m_NaCO3- la_CO3-2 la_CaOH+ la_NaCO3- Calcite d_Calcite si_CO2(g) si_Siderite pressure total mol volume g_CO2(g) g_N2(g) k_Albite dk_Albite k_Pyrite dk_Pyrite s_CaSO4 s_SrSO4 1.name 1.type 1.moles 2.name 2.type 2.moles 3.name 3.type 3.moles 4.name 4.type 4.moles 5.name 5.type 5.moles 6.name 6.type 6.moles
3429
+ 1 i_soln 1 -99 -99 -99 7 4 1.0000e-003 1.0000e-003 1.0000e-003 4.2975e-007 1.1819e-009 1.1881e-009 -6.4686e+000 -8.9530e+000 -8.9507e+000 0.0000e+000 0.0000e+000 -2.2870 -999.9990 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 Ca+2 aq 9.9178e-004 CaHCO3+ aq 7.5980e-006 CaCO3 aq 6.2155e-007 CaOH+ aq 1.1819e-009
3430
+ 1 react 1 -99 0 1 7.86135 10.18 1.1556e-003 1.1556e-003 1.0000e-003 4.2718e-006 9.7385e-009 1.1620e-008 -5.4781e+000 -8.0388e+000 -7.9621e+000 9.8444e-003 -1.5555e-004 -3.0192 -999.9990 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 calcite equi 9.8444e-003 Ca+2 aq 1.1371e-003 CaHCO3+ aq 1.1598e-005 CaCO3 aq 6.8668e-006 CaOH+ aq 9.7385e-009
3431
+ */
3432
+
3433
+ if (n >= 0)
3434
+ {
3435
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
3436
+ }
3437
+
3438
+ if (::FileExists(SELOUT_FILENAME))
3439
+ {
3440
+ ::DeleteFile(SELOUT_FILENAME);
3441
+ }
3442
+ }
3443
+
3444
+ TEST(TestIPhreeqcLib, TestSelectedOutputStringOnOff)
3445
+ {
3446
+ int n = ::CreateIPhreeqc();
3447
+ ASSERT_TRUE(n >= 0);
3448
+
3449
+ ASSERT_EQ(false, ::GetSelectedOutputFileOn(n) != 0);
3450
+
3451
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 1));
3452
+ ASSERT_EQ(true, ::GetSelectedOutputFileOn(n) != 0);
3453
+
3454
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
3455
+ ASSERT_EQ(false, ::GetSelectedOutputFileOn(n) != 0);
3456
+
3457
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
3458
+ }
3459
+
3460
+ TEST(TestIPhreeqcLib, TestGetSelectedOutputString)
3461
+ {
3462
+ int n = ::CreateIPhreeqc();
3463
+ ASSERT_TRUE(n >= 0);
3464
+
3465
+ ASSERT_EQ(0, ::LoadDatabase(n, "llnl.dat"));
3466
+
3467
+ int max = 6;
3468
+
3469
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
3470
+ ASSERT_EQ(IPQ_OK, ::EQUILIBRIUM_PHASES(n, "calcite", 0.0, 0.010));
3471
+ ASSERT_EQ(IPQ_OK, ::USER_PUNCH(n, "Ca", max));
3472
+
3473
+ ASSERT_EQ(0, ::GetOutputFileOn(n));
3474
+ ASSERT_EQ(0, ::GetErrorFileOn(n));
3475
+ ASSERT_EQ(0, ::GetLogFileOn(n));
3476
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
3477
+ ASSERT_EQ(0, ::GetDumpFileOn(n));
3478
+ ASSERT_EQ(0, ::GetDumpStringOn(n));
3479
+
3480
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputStringOn(n, 1));
3481
+
3482
+ ASSERT_EQ(0, ::RunAccumulated(n));
3483
+
3484
+ std::string sline(::GetSelectedOutputString(n));
3485
+
3486
+ ASSERT_TRUE(::strstr(sline.c_str(), "sim\t") != NULL);
3487
+ ASSERT_TRUE(::strstr(sline.c_str(), "state\t") != NULL);
3488
+ ASSERT_TRUE(::strstr(sline.c_str(), "soln\t") != NULL);
3489
+ ASSERT_TRUE(::strstr(sline.c_str(), "dist_x\t") != NULL);
3490
+ ASSERT_TRUE(::strstr(sline.c_str(), "time\t") != NULL);
3491
+ ASSERT_TRUE(::strstr(sline.c_str(), "step\t") != NULL);
3492
+ ASSERT_TRUE(::strstr(sline.c_str(), "pH\t") != NULL);
3493
+ ASSERT_TRUE(::strstr(sline.c_str(), "pe\t") != NULL);
3494
+ ASSERT_TRUE(::strstr(sline.c_str(), "C\t") != NULL);
3495
+ ASSERT_TRUE(::strstr(sline.c_str(), "Ca\t") != NULL);
3496
+ ASSERT_TRUE(::strstr(sline.c_str(), "Na\t") != NULL);
3497
+ ASSERT_TRUE(::strstr(sline.c_str(), "m_CO3-2\t") != NULL);
3498
+ ASSERT_TRUE(::strstr(sline.c_str(), "m_CaOH+\t") != NULL);
3499
+ ASSERT_TRUE(::strstr(sline.c_str(), "m_NaCO3-\t") != NULL);
3500
+ ASSERT_TRUE(::strstr(sline.c_str(), "la_CO3-2\t") != NULL);
3501
+ ASSERT_TRUE(::strstr(sline.c_str(), "la_CaOH+\t") != NULL);
3502
+ ASSERT_TRUE(::strstr(sline.c_str(), "la_NaCO3-\t") != NULL);
3503
+ ASSERT_TRUE(::strstr(sline.c_str(), "Calcite\t") != NULL);
3504
+ ASSERT_TRUE(::strstr(sline.c_str(), "d_Calcite\t") != NULL);
3505
+ ASSERT_TRUE(::strstr(sline.c_str(), "si_CO2(g)\t") != NULL);
3506
+ ASSERT_TRUE(::strstr(sline.c_str(), "si_Siderite\t") != NULL);
3507
+ ASSERT_TRUE(::strstr(sline.c_str(), "pressure\t") != NULL);
3508
+ ASSERT_TRUE(::strstr(sline.c_str(), "total mol\t") != NULL);
3509
+ ASSERT_TRUE(::strstr(sline.c_str(), "volume\t") != NULL);
3510
+ ASSERT_TRUE(::strstr(sline.c_str(), "g_CO2(g)\t") != NULL);
3511
+ ASSERT_TRUE(::strstr(sline.c_str(), "g_N2(g)\t") != NULL);
3512
+ ASSERT_TRUE(::strstr(sline.c_str(), "k_Albite\t") != NULL);
3513
+ ASSERT_TRUE(::strstr(sline.c_str(), "dk_Albite\t") != NULL);
3514
+ ASSERT_TRUE(::strstr(sline.c_str(), "k_Pyrite\t") != NULL);
3515
+ ASSERT_TRUE(::strstr(sline.c_str(), "dk_Pyrite\t") != NULL);
3516
+ ASSERT_TRUE(::strstr(sline.c_str(), "s_CaSO4\t") != NULL);
3517
+ ASSERT_TRUE(::strstr(sline.c_str(), "s_SrSO4\t") != NULL);
3518
+ ASSERT_TRUE(::strstr(sline.c_str(), "1.name\t") != NULL);
3519
+ ASSERT_TRUE(::strstr(sline.c_str(), "1.type\t") != NULL);
3520
+ ASSERT_TRUE(::strstr(sline.c_str(), "1.moles\t") != NULL);
3521
+ ASSERT_TRUE(::strstr(sline.c_str(), "2.name\t") != NULL);
3522
+ ASSERT_TRUE(::strstr(sline.c_str(), "2.type\t") != NULL);
3523
+ ASSERT_TRUE(::strstr(sline.c_str(), "2.moles\t") != NULL);
3524
+ ASSERT_TRUE(::strstr(sline.c_str(), "3.name\t") != NULL);
3525
+ ASSERT_TRUE(::strstr(sline.c_str(), "3.type\t") != NULL);
3526
+ ASSERT_TRUE(::strstr(sline.c_str(), "3.moles\t") != NULL);
3527
+ ASSERT_TRUE(::strstr(sline.c_str(), "4.name\t") != NULL);
3528
+ ASSERT_TRUE(::strstr(sline.c_str(), "4.type\t") != NULL);
3529
+ ASSERT_TRUE(::strstr(sline.c_str(), "4.moles\t") != NULL);
3530
+ ASSERT_TRUE(::strstr(sline.c_str(), "5.name\t") != NULL);
3531
+ ASSERT_TRUE(::strstr(sline.c_str(), "5.type\t") != NULL);
3532
+ ASSERT_TRUE(::strstr(sline.c_str(), "5.moles\t") != NULL);
3533
+ ASSERT_TRUE(::strstr(sline.c_str(), "6.name\t") != NULL);
3534
+ ASSERT_TRUE(::strstr(sline.c_str(), "6.type\t") != NULL);
3535
+ ASSERT_TRUE(::strstr(sline.c_str(), "6.moles\t") != NULL);
3536
+ ASSERT_TRUE(::strstr(sline.c_str(), "\n") != NULL);
3537
+ ASSERT_TRUE(::strstr(sline.c_str(), "i_soln\t") != NULL);
3538
+ ASSERT_TRUE(::strstr(sline.c_str(), "react\t") != NULL);
3539
+ ASSERT_TRUE(::strstr(sline.c_str(), "Ca+2\t") != NULL);
3540
+ ASSERT_TRUE(::strstr(sline.c_str(), "aq\t") != NULL);
3541
+ ASSERT_TRUE(::strstr(sline.c_str(), "CaHCO3+\t") != NULL);
3542
+ ASSERT_TRUE(::strstr(sline.c_str(), "CaCO3\t") != NULL);
3543
+ ASSERT_TRUE(::strstr(sline.c_str(), "CaOH+\t") != NULL);
3544
+ ASSERT_TRUE(::strstr(sline.c_str(), "Calcite\t") != NULL);
3545
+ ASSERT_TRUE(::strstr(sline.c_str(), "equi\t") != NULL);
3546
+
3547
+ if (n >= 0)
3548
+ {
3549
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
3550
+ }
3551
+ }
3552
+
3553
+ TEST(TestIPhreeqcLib, TestGetSelectedOutputStringLineCount)
3554
+ {
3555
+ int n = ::CreateIPhreeqc();
3556
+ ASSERT_TRUE(n >= 0);
3557
+
3558
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
3559
+
3560
+ ASSERT_EQ(0, ::LoadDatabase(n, "llnl.dat"));
3561
+
3562
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
3563
+
3564
+ int max = 6;
3565
+
3566
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
3567
+ ASSERT_EQ(IPQ_OK, ::EQUILIBRIUM_PHASES(n, "calcite", 0.0, 0.010));
3568
+ ASSERT_EQ(IPQ_OK, ::USER_PUNCH(n, "Ca", max));
3569
+
3570
+ ASSERT_EQ(0, ::GetOutputFileOn(n));
3571
+ ASSERT_EQ(0, ::GetErrorFileOn(n));
3572
+ ASSERT_EQ(0, ::GetLogFileOn(n));
3573
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
3574
+ ASSERT_EQ(0, ::GetDumpFileOn(n));
3575
+ ASSERT_EQ(0, ::GetDumpStringOn(n));
3576
+
3577
+ ASSERT_EQ(false, ::GetSelectedOutputStringOn(n) != 0);
3578
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputStringOn(n, 1));
3579
+
3580
+ ASSERT_EQ(0, ::RunAccumulated(n));
3581
+
3582
+ ASSERT_EQ(3, ::GetSelectedOutputStringLineCount(n));
3583
+
3584
+ if (n >= 0)
3585
+ {
3586
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
3587
+ }
3588
+ }
3589
+
3590
+ TEST(TestIPhreeqcLib, TestGetSelectedOutputStringLine)
3591
+ {
3592
+ int n = ::CreateIPhreeqc();
3593
+ ASSERT_TRUE(n >= 0);
3594
+
3595
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
3596
+
3597
+ ASSERT_EQ(0, ::LoadDatabase(n, "llnl.dat"));
3598
+
3599
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
3600
+
3601
+ int max = 6;
3602
+
3603
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
3604
+ ASSERT_EQ(IPQ_OK, ::EQUILIBRIUM_PHASES(n, "calcite", 0.0, 0.010));
3605
+ ASSERT_EQ(IPQ_OK, ::USER_PUNCH(n, "Ca", max));
3606
+
3607
+ ASSERT_EQ(0, ::GetOutputFileOn(n));
3608
+ ASSERT_EQ(0, ::GetErrorFileOn(n));
3609
+ ASSERT_EQ(0, ::GetLogFileOn(n));
3610
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
3611
+ ASSERT_EQ(0, ::GetDumpFileOn(n));
3612
+ ASSERT_EQ(0, ::GetDumpStringOn(n));
3613
+
3614
+ ASSERT_EQ(false, ::GetSelectedOutputStringOn(n) != 0);
3615
+
3616
+ ASSERT_EQ(0, ::RunAccumulated(n));
3617
+ ASSERT_EQ(0, ::GetSelectedOutputStringLineCount(n));
3618
+
3619
+ int line = 0;
3620
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, line++)));
3621
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, line++)));
3622
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, line++)));
3623
+
3624
+ // negative lines should be empty
3625
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, -1)));
3626
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, -2)));
3627
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, -3)));
3628
+
3629
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
3630
+ ASSERT_EQ(IPQ_OK, ::EQUILIBRIUM_PHASES(n, "calcite", 0.0, 0.010));
3631
+ ASSERT_EQ(IPQ_OK, ::USER_PUNCH(n, "Ca", max));
3632
+
3633
+ ASSERT_EQ(false, ::GetSelectedOutputStringOn(n) != 0);
3634
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputStringOn(n, 1));
3635
+
3636
+ ASSERT_EQ(0, ::RunAccumulated(n));
3637
+ ASSERT_EQ(3, ::GetSelectedOutputStringLineCount(n));
3638
+
3639
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "sim\t") != NULL);
3640
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "state\t") != NULL);
3641
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "soln\t") != NULL);
3642
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "dist_x\t") != NULL);
3643
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "time\t") != NULL);
3644
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "step\t") != NULL);
3645
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "pH\t") != NULL);
3646
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "pe\t") != NULL);
3647
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "C\t") != NULL);
3648
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "Ca\t") != NULL);
3649
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "Na\t") != NULL);
3650
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "m_CO3-2\t") != NULL);
3651
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "m_CaOH+\t") != NULL);
3652
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "m_NaCO3-\t") != NULL);
3653
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "la_CO3-2\t") != NULL);
3654
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "la_CaOH+\t") != NULL);
3655
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "la_NaCO3-\t") != NULL);
3656
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "Calcite\t") != NULL);
3657
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "d_Calcite\t") != NULL);
3658
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "si_CO2(g)\t") != NULL);
3659
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "si_Siderite\t") != NULL);
3660
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "pressure\t") != NULL);
3661
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "total mol\t") != NULL);
3662
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "volume\t") != NULL);
3663
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "g_CO2(g)\t") != NULL);
3664
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "g_N2(g)\t") != NULL);
3665
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "k_Albite\t") != NULL);
3666
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "dk_Albite\t") != NULL);
3667
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "k_Pyrite\t") != NULL);
3668
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "dk_Pyrite\t") != NULL);
3669
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "s_CaSO4\t") != NULL);
3670
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "s_SrSO4\t") != NULL);
3671
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "1.name\t") != NULL);
3672
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "1.type\t") != NULL);
3673
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "1.moles\t") != NULL);
3674
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "2.name\t") != NULL);
3675
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "2.type\t") != NULL);
3676
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "2.moles\t") != NULL);
3677
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "3.name\t") != NULL);
3678
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "3.type\t") != NULL);
3679
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "3.moles\t") != NULL);
3680
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "4.name\t") != NULL);
3681
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "4.type\t") != NULL);
3682
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "4.moles\t") != NULL);
3683
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "5.name\t") != NULL);
3684
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "5.type\t") != NULL);
3685
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "5.moles\t") != NULL);
3686
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "6.name\t") != NULL);
3687
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "6.type\t") != NULL);
3688
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "6.moles\t") != NULL);
3689
+
3690
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 1), "i_soln\t") != NULL);
3691
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 1), "Ca+2\t") != NULL);
3692
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 1), "aq\t") != NULL);
3693
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 1), "CaHCO3+\t") != NULL);
3694
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 1), "CaCO3\t") != NULL);
3695
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 1), "CaOH+\t") != NULL);
3696
+
3697
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 2), "react\t") != NULL);
3698
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 2), "Calcite\t") != NULL);
3699
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 2), "equi\t") != NULL);
3700
+
3701
+ // after obj.GetSelectedOutputStringLineCount() should be empty
3702
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, ::GetSelectedOutputStringLineCount(n))));
3703
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, ::GetSelectedOutputStringLineCount(n) + 1)));
3704
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, ::GetSelectedOutputStringLineCount(n) + 2)));
3705
+
3706
+ // negative lines should be empty
3707
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, -1)));
3708
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, -2)));
3709
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, -3)));
3710
+
3711
+ if (n >= 0)
3712
+ {
3713
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
3714
+ }
3715
+ }
3716
+
3717
+ TEST(TestIPhreeqcLib, TestGetSelectedOutputStringLineNotEnoughHeadings)
3718
+ {
3719
+ int n = ::CreateIPhreeqc();
3720
+ ASSERT_TRUE(n >= 0);
3721
+
3722
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
3723
+
3724
+ ASSERT_EQ(0, ::LoadDatabase(n, "llnl.dat"));
3725
+
3726
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
3727
+
3728
+ ASSERT_EQ(IPQ_OK, ::SOLUTION(n, 1.0, 1.0, 1.0));
3729
+ ASSERT_EQ(IPQ_OK, ::EQUILIBRIUM_PHASES(n, "calcite", 0.0, 0.010));
3730
+ ASSERT_EQ(IPQ_OK, ::USER_PUNCH_NEH(n));
3731
+
3732
+ ASSERT_EQ(0, ::GetOutputFileOn(n));
3733
+ ASSERT_EQ(0, ::GetErrorFileOn(n));
3734
+ ASSERT_EQ(0, ::GetLogFileOn(n));
3735
+ ASSERT_EQ(0, ::GetSelectedOutputFileOn(n));
3736
+ ASSERT_EQ(0, ::GetDumpFileOn(n));
3737
+ ASSERT_EQ(0, ::GetDumpStringOn(n));
3738
+
3739
+ ASSERT_EQ(false, ::GetSelectedOutputStringOn(n) != 0);
3740
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputStringOn(n, 1));
3741
+
3742
+ ASSERT_EQ(0, ::RunAccumulated(n));
3743
+ ASSERT_EQ(3, ::GetSelectedOutputStringLineCount(n));
3744
+
3745
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "sim\t") != NULL);
3746
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "state\t") != NULL);
3747
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "soln\t") != NULL);
3748
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "dist_x\t") != NULL);
3749
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "time\t") != NULL);
3750
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "step\t") != NULL);
3751
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "pH\t") != NULL);
3752
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "pe\t") != NULL);
3753
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "C\t") != NULL);
3754
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "Ca\t") != NULL);
3755
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "Na\t") != NULL);
3756
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "m_CO3-2\t") != NULL);
3757
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "m_CaOH+\t") != NULL);
3758
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "m_NaCO3-\t") != NULL);
3759
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "la_CO3-2\t") != NULL);
3760
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "la_CaOH+\t") != NULL);
3761
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "la_NaCO3-\t") != NULL);
3762
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "Calcite\t") != NULL);
3763
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "d_Calcite\t") != NULL);
3764
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "si_CO2(g)\t") != NULL);
3765
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "si_Siderite\t") != NULL);
3766
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "pressure\t") != NULL);
3767
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "total mol\t") != NULL);
3768
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "volume\t") != NULL);
3769
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "g_CO2(g)\t") != NULL);
3770
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "g_N2(g)\t") != NULL);
3771
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "k_Albite\t") != NULL);
3772
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "dk_Albite\t") != NULL);
3773
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "k_Pyrite\t") != NULL);
3774
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "dk_Pyrite\t") != NULL);
3775
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "s_CaSO4\t") != NULL);
3776
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "s_SrSO4\t") != NULL);
3777
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "head0\t") != NULL);
3778
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "head1\t") != NULL);
3779
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 0), "head2\t") != NULL);
3780
+
3781
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 1), "i_soln\t") != NULL);
3782
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 1), "have0\t") != NULL);
3783
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 1), "have1\t") != NULL);
3784
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 1), "have2\t") != NULL);
3785
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 1), "missing0\t") != NULL);
3786
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 1), "missing2\t") != NULL);
3787
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 1), "missing2\t") != NULL);
3788
+
3789
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 2), "react\t") != NULL);
3790
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 2), "have0\t") != NULL);
3791
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 2), "have1\t") != NULL);
3792
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 2), "have2\t") != NULL);
3793
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 2), "missing0\t") != NULL);
3794
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 2), "missing2\t") != NULL);
3795
+ ASSERT_TRUE(::strstr(::GetSelectedOutputStringLine(n, 2), "missing2\t") != NULL);
3796
+
3797
+ // after obj.GetSelectedOutputStringLineCount() should be empty
3798
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, ::GetSelectedOutputStringLineCount(n))));
3799
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, ::GetSelectedOutputStringLineCount(n) + 1)));
3800
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, ::GetSelectedOutputStringLineCount(n) + 2)));
3801
+
3802
+ // negative lines should be empty
3803
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, -1)));
3804
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, -2)));
3805
+ ASSERT_EQ(std::string(""), std::string(::GetSelectedOutputStringLine(n, -3)));
3806
+
3807
+ if (n >= 0)
3808
+ {
3809
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
3810
+ }
3811
+ }
3812
+
3813
+ TEST(TestIPhreeqcLib, TestLongUser_Punch)
3814
+ {
3815
+ const char input[] =
3816
+ "PRINT\n"
3817
+ " -selected_output t\n"
3818
+ "SOLUTION\n"
3819
+ "SELECTED_OUTPUT\n"
3820
+ " -reset false\n"
3821
+ "USER_PUNCH\n"
3822
+ "1 REM 255 CHARACTER STRING\n"
3823
+ "10 temp$ = \"XXXXX123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345\"\n"
3824
+ "20 PUNCH temp$\n";
3825
+
3826
+ int n = ::CreateIPhreeqc();
3827
+ ASSERT_TRUE(n >= 0);
3828
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputStringOn(n, 1));
3829
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
3830
+ ASSERT_EQ(0, ::RunString(n, input));
3831
+
3832
+ if (n >= 0)
3833
+ {
3834
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
3835
+ }
3836
+ }
3837
+
3838
+ TEST(TestIPhreeqcLib, TestBasicSURF)
3839
+ {
3840
+ int n = ::CreateIPhreeqc();
3841
+ ASSERT_TRUE(n >= 0);
3842
+
3843
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
3844
+
3845
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "SURFACE_MASTER_SPECIES"));
3846
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Surfa Surfa"));
3847
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Surfb Surfb"));
3848
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "SURFACE_SPECIES"));
3849
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Surfa = Surfa"));
3850
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " log_k 0"));
3851
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Surfb = Surfb"));
3852
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " log_k 0"));
3853
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Surfa + Zn+2 = SurfaZn+2"));
3854
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " log_k 5."));
3855
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Surfb + Zn+2 = SurfbZn+2"));
3856
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " log_k 6."));
3857
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Surfa + Cu+2 = SurfaCu+2"));
3858
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " log_k 4.5"));
3859
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Surfb + Cu+2 = SurfbCu+2"));
3860
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " log_k 6.5"));
3861
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "SOLUTION 1"));
3862
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " pH 8"));
3863
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " units mol/kgw"));
3864
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Fe(3) 1e-2"));
3865
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Zn 1e-4"));
3866
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Cu 1e-5"));
3867
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Na 1e-1"));
3868
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Cl 1e-1"));
3869
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "EQUILIBRIUM_PHASES 1"));
3870
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Fe(OH)3(a) 0 0"));
3871
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "SELECTED_OUTPUT"));
3872
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "USER_PUNCH"));
3873
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " -headings Hfo-Zn Surfa-Zn Surfb-Zn Surfa-Cu Surfb-Cu"));
3874
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "-start"));
3875
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "10 PUNCH SURF(\"Zn\",\"Hfo\")"));
3876
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "20 PUNCH SURF(\"Zn\",\"Surfa\")"));
3877
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "30 PUNCH SURF(\"Zn\",\"Surfb\")"));
3878
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "40 PUNCH SURF(\"Cu\",\"Surfa\")"));
3879
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "50 PUNCH SURF(\"Cu\",\"Surfb\")"));
3880
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "-end"));
3881
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "SURFACE 1"));
3882
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Hfo_sOH Fe(OH)3(a) equilibrium_phase 0.005 53300"));
3883
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Hfo_wOH Fe(OH)3(a) equilibrium_phase 0.2"));
3884
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Surfa 0.2 100. 2"));
3885
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, " Surfb 0.1 100. 1"));
3886
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(n, "END"));
3887
+
3888
+
3889
+ ASSERT_EQ(IPQ_OK, ::SetOutputFileOn(n, 0));
3890
+ ASSERT_EQ(IPQ_OK, ::SetOutputStringOn(n, 0));
3891
+ ASSERT_EQ(IPQ_OK, ::SetErrorFileOn(n, 0));
3892
+ ASSERT_EQ(IPQ_OK, ::SetLogFileOn(n, 0));
3893
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(n, 0));
3894
+ ASSERT_EQ(IPQ_OK, ::SetDumpStringOn(n, 0));
3895
+ ASSERT_EQ(IPQ_OK, ::SetDumpFileOn(n, 0));
3896
+
3897
+
3898
+ ASSERT_EQ(0, ::RunAccumulated(n));
3899
+
3900
+ ASSERT_EQ(13, ::GetSelectedOutputColumnCount(n));
3901
+ ASSERT_EQ(3, ::GetSelectedOutputRowCount(n));
3902
+
3903
+ VAR v;
3904
+ VarInit(&v);
3905
+
3906
+ const int offset = 8;
3907
+
3908
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, offset + 0, &v));
3909
+ ASSERT_EQ(TT_STRING, v.type);
3910
+ ASSERT_EQ(std::string("Hfo-Zn"), std::string(v.sVal));
3911
+
3912
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, offset + 1, &v));
3913
+ ASSERT_EQ(TT_STRING, v.type);
3914
+ ASSERT_EQ(std::string("Surfa-Zn"), std::string(v.sVal));
3915
+
3916
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, offset + 2, &v));
3917
+ ASSERT_EQ(TT_STRING, v.type);
3918
+ ASSERT_EQ(std::string("Surfb-Zn"), std::string(v.sVal));
3919
+
3920
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, offset + 3, &v));
3921
+ ASSERT_EQ(TT_STRING, v.type);
3922
+ ASSERT_EQ(std::string("Surfa-Cu"), std::string(v.sVal));
3923
+
3924
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 0, offset + 4, &v));
3925
+ ASSERT_EQ(TT_STRING, v.type);
3926
+ ASSERT_EQ(std::string("Surfb-Cu"), std::string(v.sVal));
3927
+
3928
+
3929
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, offset + 0, &v));
3930
+ ASSERT_EQ(TT_DOUBLE, v.type);
3931
+ ASSERT_NEAR(0.0, v.dVal, ::pow(10., -FLT_DIG));
3932
+
3933
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, offset + 1, &v));
3934
+ ASSERT_EQ(TT_DOUBLE, v.type);
3935
+ ASSERT_NEAR(0.0, v.dVal, ::pow(10., -FLT_DIG));
3936
+
3937
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, offset + 2, &v));
3938
+ ASSERT_EQ(TT_DOUBLE, v.type);
3939
+ ASSERT_NEAR(0.0, v.dVal, ::pow(10., -FLT_DIG));
3940
+
3941
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, offset + 3, &v));
3942
+ ASSERT_EQ(TT_DOUBLE, v.type);
3943
+ ASSERT_NEAR(0.0, v.dVal, ::pow(10., -FLT_DIG));
3944
+
3945
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 1, offset + 4, &v));
3946
+ ASSERT_EQ(TT_DOUBLE, v.type);
3947
+ ASSERT_NEAR(0.0, v.dVal, ::pow(10., -FLT_DIG));
3948
+
3949
+
3950
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, offset + 0, &v));
3951
+ ASSERT_EQ(TT_DOUBLE, v.type);
3952
+ ASSERT_NEAR(6.3861e-005, v.dVal, ::pow(10., -FLT_DIG));
3953
+
3954
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, offset + 1, &v));
3955
+ ASSERT_EQ(TT_DOUBLE, v.type);
3956
+ ASSERT_NEAR(1.7868e-005, v.dVal, ::pow(10., -FLT_DIG));
3957
+
3958
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, offset + 2, &v));
3959
+ ASSERT_EQ(TT_DOUBLE, v.type);
3960
+ ASSERT_NEAR(1.8248e-005, v.dVal, ::pow(10., -FLT_DIG));
3961
+
3962
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, offset + 3, &v));
3963
+ ASSERT_EQ(TT_DOUBLE, v.type);
3964
+ ASSERT_NEAR(4.6216e-009, v.dVal, ::pow(10., -FLT_DIG));
3965
+
3966
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(n, 2, offset + 4, &v));
3967
+ ASSERT_EQ(TT_DOUBLE, v.type);
3968
+ ASSERT_NEAR(4.7201e-008, v.dVal, ::pow(10., -FLT_DIG));
3969
+
3970
+ if (n >= 0)
3971
+ {
3972
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
3973
+ }
3974
+ }
3975
+
3976
+ TEST(TestIPhreeqcLib, TestIEEE)
3977
+ {
3978
+ // COMMENT: {1/18/2013 6:34:57 PM} int n = ::CreateIPhreeqc();
3979
+ // COMMENT: {1/18/2013 6:34:57 PM} ASSERT_TRUE(n >= 0);
3980
+ // COMMENT: {1/18/2013 6:34:57 PM}
3981
+ // COMMENT: {1/18/2013 6:34:57 PM} ASSERT_EQ( 0, ::LoadDatabase(n, "wateq4f.dat") );
3982
+ // COMMENT: {1/18/2013 6:34:57 PM} //ASSERT_EQ( 0, ::LoadDatabase(n, "cdmusic_hiemstra.dat") );
3983
+ // COMMENT: {1/18/2013 6:34:57 PM} //::LoadDatabase(n, "cdmusic_hiemstra.dat");
3984
+ // COMMENT: {1/18/2013 6:34:57 PM} //const char* errdb = ::GetErrorString(n);
3985
+ // COMMENT: {1/18/2013 6:34:57 PM} //fprintf(stderr, "%s\n", errdb);
3986
+ // COMMENT: {1/18/2013 6:34:57 PM}
3987
+ // COMMENT: {1/18/2013 6:34:57 PM} ASSERT_EQ( IPQ_OK, ::SetOutputFileOn(n, 0) );
3988
+ // COMMENT: {1/18/2013 6:34:57 PM} ASSERT_EQ( IPQ_OK, ::SetOutputStringOn(n, 0) );
3989
+ // COMMENT: {1/18/2013 6:34:57 PM} ASSERT_EQ( IPQ_OK, ::SetErrorFileOn(n, 0) );
3990
+ // COMMENT: {1/18/2013 6:34:57 PM} ASSERT_EQ( IPQ_OK, ::SetLogFileOn(n, 0) );
3991
+ // COMMENT: {1/18/2013 6:34:57 PM} ASSERT_EQ( IPQ_OK, ::SetSelectedOutputFileOn(n, 0) );
3992
+ // COMMENT: {1/18/2013 6:34:57 PM} ASSERT_EQ( IPQ_OK, ::SetDumpStringOn(n, 0) );
3993
+ // COMMENT: {1/18/2013 6:34:57 PM} ASSERT_EQ( IPQ_OK, ::SetDumpFileOn(n, 0) );
3994
+ // COMMENT: {1/18/2013 6:34:57 PM}
3995
+ // COMMENT: {1/18/2013 6:34:57 PM} ::RunFile(n, "IEEE");
3996
+ // COMMENT: {1/18/2013 6:34:57 PM} const char* err = ::GetErrorString(n);
3997
+ // COMMENT: {1/18/2013 6:34:57 PM} fprintf(stderr, "%s\n", err);
3998
+ // COMMENT: {1/18/2013 6:34:57 PM}
3999
+ // COMMENT: {1/18/2013 6:34:57 PM} if (n >= 0)
4000
+ // COMMENT: {1/18/2013 6:34:57 PM} {
4001
+ // COMMENT: {1/18/2013 6:34:57 PM} ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
4002
+ // COMMENT: {1/18/2013 6:34:57 PM} }
4003
+ }
4004
+
4005
+ TEST(TestIPhreeqcLib, TestDelete)
4006
+ {
4007
+ const char input[] =
4008
+ "SOLUTION 1 # definition of initial condition 1\n"
4009
+ "COPY cell 1 7405 # copy cell 1 to placeholder cell with index larger than the number of cells in the model domain\n"
4010
+ "END\n"
4011
+ "DELETE # delete initial condition 1 to allow for a redefinition of all reactions\n"
4012
+ "-cell 1\n"
4013
+ "END\n"
4014
+ "# define other initial conditions and copy to another placeholder cell\n"
4015
+ "\n"
4016
+ "COPY cell 7405 1 # copy back from placeholder cell to domain cell 1\n"
4017
+ "END\n"
4018
+ "MIX 1 # mix according to initial moisture content\n"
4019
+ " 1 0.25\n"
4020
+ "END\n"
4021
+ "RUN_CELLS\n"
4022
+ "-cells 1\n"
4023
+ "-start_time 0\n"
4024
+ "-time_step 0\n"
4025
+ "DELETE # remove mix reaction in subsequent runs\n"
4026
+ "-mix 1\n"
4027
+ "END\n"
4028
+ "RUN_CELLS\n"
4029
+ "-cells 1\n";
4030
+
4031
+ int n = ::CreateIPhreeqc();
4032
+ ASSERT_TRUE(n >= 0);
4033
+
4034
+ char OUTPUT_FILE[80];
4035
+ snprintf(OUTPUT_FILE, sizeof(OUTPUT_FILE), "phreeqc.%d.out", n);
4036
+
4037
+ if (::FileExists(OUTPUT_FILE))
4038
+ {
4039
+ ASSERT_TRUE(::DeleteFile(OUTPUT_FILE));
4040
+ }
4041
+ ASSERT_EQ(false, ::FileExists(OUTPUT_FILE));
4042
+
4043
+ ASSERT_EQ(0, ::LoadDatabase(n, "phreeqc.dat"));
4044
+ ::SetOutputFileOn(n, 0);
4045
+ ::SetErrorFileOn(n, 0);
4046
+ ::SetLogFileOn(n, 0);
4047
+ ::SetSelectedOutputFileOn(n, 0);
4048
+ ::SetDumpFileOn(n, 0);
4049
+ ASSERT_EQ(false, ::FileExists(OUTPUT_FILE));
4050
+ ASSERT_EQ(0, ::RunString(n, input));
4051
+ ASSERT_EQ(false, ::FileExists(OUTPUT_FILE));
4052
+ if (n >= 0)
4053
+ {
4054
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(n));
4055
+ }
4056
+ if (::FileExists(OUTPUT_FILE))
4057
+ {
4058
+ ASSERT_TRUE(::DeleteFile(OUTPUT_FILE));
4059
+ }
4060
+ }
4061
+
4062
+ TEST(TestIPhreeqcLib, TestMultiPunchCSelectedOutput)
4063
+ {
4064
+ VAR var;
4065
+ ::VarInit(&var);
4066
+
4067
+ int id = ::CreateIPhreeqc();
4068
+ ASSERT_TRUE(id >= 0);
4069
+
4070
+ ASSERT_EQ(0, ::LoadDatabase(id, "phreeqc.dat.90a6449"));
4071
+ ASSERT_EQ(0, ::RunFile(id, "multi_punch"));
4072
+
4073
+ ASSERT_EQ(6, ::GetSelectedOutputRowCount(id));
4074
+ ASSERT_EQ(35, ::GetSelectedOutputColumnCount(id));
4075
+
4076
+ // headings
4077
+ int ncol = 0;
4078
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("sim"), std::string(var.sVal));
4079
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("state"), std::string(var.sVal));
4080
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("soln"), std::string(var.sVal));
4081
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("dist_x"), std::string(var.sVal));
4082
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("time"), std::string(var.sVal));
4083
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("step"), std::string(var.sVal));
4084
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("pH"), std::string(var.sVal));
4085
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("pe"), std::string(var.sVal));
4086
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("reaction"), std::string(var.sVal));
4087
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("temp(C)"), std::string(var.sVal));
4088
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Alk(eq/kgw)"), std::string(var.sVal));
4089
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("mu"), std::string(var.sVal));
4090
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("mass_H2O"), std::string(var.sVal));
4091
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("charge(eq)"), std::string(var.sVal));
4092
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("pct_err"), std::string(var.sVal));
4093
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Na(mol/kgw)"), std::string(var.sVal));
4094
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Ca(mol/kgw)"), std::string(var.sVal));
4095
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("m_Na+(mol/kgw)"), std::string(var.sVal));
4096
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("m_HCO3-(mol/kgw)"), std::string(var.sVal));
4097
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("la_Ca+2"), std::string(var.sVal));
4098
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("la_CO3-2"), std::string(var.sVal));
4099
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("CO2(g)"), std::string(var.sVal));
4100
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("d_CO2(g)"), std::string(var.sVal));
4101
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("dolomite"), std::string(var.sVal));
4102
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("d_dolomite"), std::string(var.sVal));
4103
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("si_Halite"), std::string(var.sVal));
4104
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("pressure"), std::string(var.sVal));
4105
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("total mol"), std::string(var.sVal));
4106
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("volume"), std::string(var.sVal));
4107
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("g_N2(g)"), std::string(var.sVal));
4108
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("k_Calcite"), std::string(var.sVal));
4109
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("dk_Calcite"), std::string(var.sVal));
4110
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("s_Anhydrite"), std::string(var.sVal));
4111
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("s_Barite"), std::string(var.sVal));
4112
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("V_TOTAL_C"), std::string(var.sVal));
4113
+
4114
+ // sim
4115
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 0, &var)); ASSERT_EQ((long)8, var.lVal);
4116
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 0, &var)); ASSERT_EQ((long)10, var.lVal);
4117
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 0, &var)); ASSERT_EQ((long)11, var.lVal);
4118
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 0, &var)); ASSERT_EQ((long)12, var.lVal);
4119
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 0, &var)); ASSERT_EQ((long)14, var.lVal);
4120
+
4121
+ // state
4122
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 1, &var)); ASSERT_EQ(std::string("react"), std::string(var.sVal));
4123
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 1, &var)); ASSERT_EQ(std::string("react"), std::string(var.sVal));
4124
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 1, &var)); ASSERT_EQ(std::string("i_soln"), std::string(var.sVal));
4125
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 1, &var)); ASSERT_EQ(std::string("i_soln"), std::string(var.sVal));
4126
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 1, &var)); ASSERT_EQ(std::string("react"), std::string(var.sVal));
4127
+
4128
+ // pH
4129
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 6, &var)); ASSERT_NEAR(7.30475, var.dVal, ::pow(10., -2));
4130
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 6, &var)); ASSERT_NEAR(7.29765, var.dVal, ::pow(10., -2));
4131
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 6, &var)); ASSERT_NEAR(6.99738, var.dVal, ::pow(10., -2));
4132
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 6, &var)); ASSERT_NEAR(6.99698, var.dVal, ::pow(10., -2));
4133
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 6, &var)); ASSERT_NEAR(7.2942, var.dVal, ::pow(10., -2));
4134
+
4135
+ // V_TOTAL_C
4136
+ #ifdef SKIP_TEST
4137
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 34, &var)); ASSERT_NEAR(4.3729e-003, var.dVal, ::pow(10., -6));
4138
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 34, &var)); ASSERT_NEAR(4.3090e-003, var.dVal, ::pow(10., -6));
4139
+ #endif
4140
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 34, &var)); ASSERT_NEAR(0.0000e+000, var.dVal, ::pow(10., -6));
4141
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 34, &var)); ASSERT_NEAR(0.0000e+000, var.dVal, ::pow(10., -6));
4142
+ #ifdef SKIP_TEST
4143
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 34, &var)); ASSERT_NEAR(4.2784e-003, var.dVal, ::pow(10., -6));
4144
+ #endif
4145
+
4146
+ // edge cases
4147
+ int r = ::GetSelectedOutputRowCount(id);
4148
+ int c = ::GetSelectedOutputColumnCount(id);
4149
+ ASSERT_EQ(IPQ_INVALIDROW, ::GetSelectedOutputValue(id, -1, 0, &var));
4150
+ ASSERT_EQ(TT_ERROR, var.type);
4151
+ ASSERT_EQ(VR_INVALIDROW, var.vresult);
4152
+
4153
+ ASSERT_EQ(IPQ_INVALIDROW, ::GetSelectedOutputValue(id, r, 0, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDROW, var.vresult);
4154
+ ASSERT_EQ(IPQ_INVALIDCOL, ::GetSelectedOutputValue(id, 0, -1, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDCOL, var.vresult);
4155
+ ASSERT_EQ(IPQ_INVALIDCOL, ::GetSelectedOutputValue(id, 0, c, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDCOL, var.vresult);
4156
+
4157
+ ::SetCurrentSelectedOutputUserNumber(id, 2);
4158
+ ASSERT_EQ(7, ::GetSelectedOutputRowCount(id));
4159
+ ASSERT_EQ(16, ::GetSelectedOutputColumnCount(id));
4160
+
4161
+ // headings
4162
+ ncol = 0;
4163
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("si_Halite"), std::string(var.sVal));
4164
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("si_Calcite"), std::string(var.sVal));
4165
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("DUMMY_1"), std::string(var.sVal));
4166
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("DUMMY_2"), std::string(var.sVal));
4167
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Sum_resid"), std::string(var.sVal));
4168
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Sum_Delta/U"), std::string(var.sVal));
4169
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("MaxFracErr"), std::string(var.sVal));
4170
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Soln_2"), std::string(var.sVal));
4171
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Soln_2_min"), std::string(var.sVal));
4172
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Soln_2_max"), std::string(var.sVal));
4173
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Soln_3"), std::string(var.sVal));
4174
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Soln_3_min"), std::string(var.sVal));
4175
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Soln_3_max"), std::string(var.sVal));
4176
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Halite"), std::string(var.sVal));
4177
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Halite_min"), std::string(var.sVal));
4178
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Halite_max"), std::string(var.sVal));
4179
+
4180
+ // si_Halite
4181
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 0, &var)); ASSERT_NEAR(-7.70857, var.dVal, ::pow(10., -2));
4182
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 0, &var)); ASSERT_NEAR(-7.67087, var.dVal, ::pow(10., -2));
4183
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 0, &var)); ASSERT_NEAR(-7.6362, var.dVal, ::pow(10., -2));
4184
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 0, &var)); ASSERT_NEAR(-999.999, var.dVal, ::pow(10., -2));
4185
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 0, &var)); ASSERT_NEAR(-7.60092, var.dVal, ::pow(10., -2));
4186
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 0, &var)); ASSERT_NEAR(-7.60411, var.dVal, ::pow(10., -2));
4187
+
4188
+ // si_Calcite
4189
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 1, &var)); ASSERT_NEAR(0.702316, var.dVal, ::pow(10., -2));
4190
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 1, &var)); ASSERT_NEAR(0.695856, var.dVal, ::pow(10., -2));
4191
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 1, &var)); ASSERT_NEAR(0.689518, var.dVal, ::pow(10., -2));
4192
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 1, &var)); ASSERT_NEAR(-999.999, var.dVal, ::pow(10., -2));
4193
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 1, &var)); ASSERT_NEAR(-999.999, var.dVal, ::pow(10., -2));
4194
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 1, &var)); ASSERT_NEAR(0.683300, var.dVal, ::pow(10., -2));
4195
+
4196
+ // DUMMY_1
4197
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 2, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4198
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 2, &var)); ASSERT_EQ(std::string("Dummy1"), std::string(var.sVal));
4199
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 2, &var)); ASSERT_EQ(std::string("Dummy1"), std::string(var.sVal));
4200
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 2, &var)); ASSERT_EQ(std::string("Dummy1"), std::string(var.sVal));
4201
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 2, &var)); ASSERT_EQ(std::string("Dummy1"), std::string(var.sVal));
4202
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 2, &var)); ASSERT_EQ(std::string("Dummy1"), std::string(var.sVal));
4203
+
4204
+ // DUMMY_2
4205
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 3, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4206
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 3, &var)); ASSERT_EQ(std::string("Dummy2"), std::string(var.sVal));
4207
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 3, &var)); ASSERT_EQ(std::string("Dummy2"), std::string(var.sVal));
4208
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 3, &var)); ASSERT_EQ(std::string("Dummy2"), std::string(var.sVal));
4209
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 3, &var)); ASSERT_EQ(std::string("Dummy2"), std::string(var.sVal));
4210
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 3, &var)); ASSERT_EQ(std::string("Dummy2"), std::string(var.sVal));
4211
+
4212
+ // Sum_resid
4213
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 4, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4214
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 4, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4215
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 4, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4216
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 4, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4217
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 4, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4218
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 4, &var)); ASSERT_NEAR(4.12e-13, var.dVal, ::pow(10., log10(4.12e-13) - 2));
4219
+
4220
+ // Sum_Delta/U
4221
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 5, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4222
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 5, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4223
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 5, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4224
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 5, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4225
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 5, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4226
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 5, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4227
+
4228
+ // MaxFracErr
4229
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 6, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4230
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 6, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4231
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 6, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4232
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 6, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4233
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 6, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4234
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 6, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4235
+
4236
+ // Soln_2
4237
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 7, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4238
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 7, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4239
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 7, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4240
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 7, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4241
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 7, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4242
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 7, &var)); ASSERT_NEAR(1, var.dVal, ::pow(10., -3));
4243
+
4244
+ // Soln_2_min
4245
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 8, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4246
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 8, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4247
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 8, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4248
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 8, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4249
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 8, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4250
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 8, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4251
+
4252
+ // Soln_2_max
4253
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 9, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4254
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 9, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4255
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 9, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4256
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 9, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4257
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 9, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4258
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 9, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4259
+
4260
+ // Soln_3
4261
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 10, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4262
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 10, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4263
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 10, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4264
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 10, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4265
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 10, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4266
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 10, &var)); ASSERT_NEAR(1, var.dVal, ::pow(10., -3));
4267
+
4268
+ // Soln_3_min
4269
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 11, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4270
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 11, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4271
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 11, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4272
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 11, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4273
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 11, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4274
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 11, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4275
+
4276
+ // Soln_3_max
4277
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 12, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4278
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 12, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4279
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 12, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4280
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 12, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4281
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 12, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4282
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 12, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4283
+
4284
+ // Halite
4285
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 13, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4286
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 13, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4287
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 13, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4288
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 13, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4289
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 13, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4290
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 13, &var)); ASSERT_NEAR(0.001, var.dVal, ::pow(10., -3));
4291
+
4292
+ // Halite_min
4293
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 14, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4294
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 14, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4295
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 14, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4296
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 14, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4297
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 14, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4298
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 14, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4299
+
4300
+ // Halite_max
4301
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 15, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4302
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 2, 15, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4303
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 3, 15, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4304
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 4, 15, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4305
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 5, 15, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4306
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 6, 15, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4307
+
4308
+ // edge cases
4309
+ r = ::GetSelectedOutputRowCount(id);
4310
+ c = ::GetSelectedOutputColumnCount(id);
4311
+ ASSERT_EQ(IPQ_INVALIDROW, ::GetSelectedOutputValue(id, -1, 0, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDROW, var.vresult);
4312
+ ASSERT_EQ(IPQ_INVALIDROW, ::GetSelectedOutputValue(id, r, 0, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDROW, var.vresult);
4313
+ ASSERT_EQ(IPQ_INVALIDCOL, ::GetSelectedOutputValue(id, 0, -1, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDCOL, var.vresult);
4314
+ ASSERT_EQ(IPQ_INVALIDCOL, ::GetSelectedOutputValue(id, 0, c, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDCOL, var.vresult);
4315
+
4316
+ ::SetCurrentSelectedOutputUserNumber(id, 3);
4317
+ ASSERT_EQ(2, ::GetSelectedOutputRowCount(id));
4318
+ ASSERT_EQ(12, ::GetSelectedOutputColumnCount(id));
4319
+
4320
+ // headings
4321
+ ncol = 0;
4322
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Sum_resid"), std::string(var.sVal));
4323
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Sum_Delta/U"), std::string(var.sVal));
4324
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("MaxFracErr"), std::string(var.sVal));
4325
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Soln_2"), std::string(var.sVal));
4326
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Soln_2_min"), std::string(var.sVal));
4327
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Soln_2_max"), std::string(var.sVal));
4328
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Soln_3"), std::string(var.sVal));
4329
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Soln_3_min"), std::string(var.sVal));
4330
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Soln_3_max"), std::string(var.sVal));
4331
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Halite"), std::string(var.sVal));
4332
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Halite_min"), std::string(var.sVal));
4333
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 0, ncol++, &var)); ASSERT_EQ(std::string("Halite_max"), std::string(var.sVal));
4334
+
4335
+ // Sum_resid
4336
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 0, &var)); ASSERT_NEAR(4.12E-13, var.dVal, ::pow(10., log10(4.12E-13) - 2));
4337
+
4338
+ // Sum_Delta/U
4339
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 1, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4340
+
4341
+ // MaxFracErr
4342
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 2, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4343
+
4344
+ // Soln_2
4345
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 3, &var)); ASSERT_NEAR(1, var.dVal, ::pow(10., -3));
4346
+
4347
+ // Soln_2_min
4348
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 4, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4349
+
4350
+ // Soln_2_max
4351
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 5, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4352
+
4353
+ // Soln_3
4354
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 6, &var)); ASSERT_NEAR(1, var.dVal, ::pow(10., -3));
4355
+
4356
+ // Soln_3_min
4357
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 7, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4358
+
4359
+ // Soln_3_max
4360
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 8, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4361
+
4362
+ // Halite
4363
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 9, &var)); ASSERT_NEAR(0.001, var.dVal, ::pow(10., -3));
4364
+
4365
+ // Halite_min
4366
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 10, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4367
+
4368
+ // Halite_max
4369
+ ASSERT_EQ(IPQ_OK, ::GetSelectedOutputValue(id, 1, 11, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4370
+
4371
+
4372
+ // edge cases
4373
+ r = ::GetSelectedOutputRowCount(id);
4374
+ c = ::GetSelectedOutputColumnCount(id);
4375
+ ASSERT_EQ(IPQ_INVALIDROW, ::GetSelectedOutputValue(id, -1, 0, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDROW, var.vresult);
4376
+ ASSERT_EQ(IPQ_INVALIDROW, ::GetSelectedOutputValue(id, r, 0, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDROW, var.vresult);
4377
+ ASSERT_EQ(IPQ_INVALIDCOL, ::GetSelectedOutputValue(id, 0, -1, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDCOL, var.vresult);
4378
+ ASSERT_EQ(IPQ_INVALIDCOL, ::GetSelectedOutputValue(id, 0, c, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDCOL, var.vresult);
4379
+
4380
+ ASSERT_EQ(IPQ_INVALIDARG, ::SetCurrentSelectedOutputUserNumber(id, -1));
4381
+ ASSERT_EQ(IPQ_OK, ::SetCurrentSelectedOutputUserNumber(id, 0));
4382
+ ASSERT_EQ(0, ::GetCurrentSelectedOutputUserNumber(id));
4383
+
4384
+ if (id >= 0)
4385
+ {
4386
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(id));
4387
+ }
4388
+ }
4389
+
4390
+ TEST(TestIPhreeqcLib, TestGetSelectedOutputCount)
4391
+ {
4392
+ int id = ::CreateIPhreeqc();
4393
+ ASSERT_TRUE(id >= 0);
4394
+
4395
+ ASSERT_EQ(0, ::GetSelectedOutputCount(id));
4396
+ ASSERT_EQ(0, ::LoadDatabase(id, "phreeqc.dat"));
4397
+ ASSERT_EQ(0, ::GetSelectedOutputCount(id));
4398
+ ASSERT_EQ(0, ::RunFile(id, "multi_punch"));
4399
+ ASSERT_EQ(3, ::GetSelectedOutputCount(id));
4400
+
4401
+ if (id >= 0)
4402
+ {
4403
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(id));
4404
+ }
4405
+ }
4406
+
4407
+ TEST(TestIPhreeqcLib, TestGetNthSelectedOutputUserNumber)
4408
+ {
4409
+ int id = ::CreateIPhreeqc();
4410
+ ASSERT_TRUE(id >= 0);
4411
+
4412
+ ASSERT_EQ(0, ::LoadDatabase(id, "phreeqc.dat"));
4413
+ ASSERT_EQ(0, ::RunFile(id, "multi_punch"));
4414
+
4415
+ ASSERT_EQ(3, ::GetSelectedOutputCount(id));
4416
+
4417
+ ASSERT_EQ(1, ::GetNthSelectedOutputUserNumber(id, 0));
4418
+ ASSERT_EQ(2, ::GetNthSelectedOutputUserNumber(id, 1));
4419
+ ASSERT_EQ(3, ::GetNthSelectedOutputUserNumber(id, 2));
4420
+
4421
+ // edge cases
4422
+ ASSERT_EQ((int)IPQ_INVALIDARG, ::GetNthSelectedOutputUserNumber(id, -1));
4423
+ ASSERT_EQ((int)IPQ_INVALIDARG, ::GetNthSelectedOutputUserNumber(id, 4));
4424
+
4425
+ if (id >= 0)
4426
+ {
4427
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(id));
4428
+ }
4429
+ }
4430
+
4431
+ TEST(TestIPhreeqcLib, TestGetCurrentSelectedOutputUserNumber)
4432
+ {
4433
+ int id = ::CreateIPhreeqc();
4434
+ ASSERT_TRUE(id >= 0);
4435
+ ASSERT_EQ(1, ::GetCurrentSelectedOutputUserNumber(id));
4436
+
4437
+ ASSERT_EQ(0, ::LoadDatabase(id, "phreeqc.dat"));
4438
+ ASSERT_EQ(1, ::GetCurrentSelectedOutputUserNumber(id));
4439
+ ASSERT_EQ(0, ::RunFile(id, "multi_punch"));
4440
+
4441
+ ASSERT_EQ(1, ::GetCurrentSelectedOutputUserNumber(id));
4442
+ ASSERT_EQ(6, ::GetSelectedOutputRowCount(id));
4443
+ ASSERT_EQ(35, ::GetSelectedOutputColumnCount(id));
4444
+
4445
+ ::SetCurrentSelectedOutputUserNumber(id, 2);
4446
+ ASSERT_EQ(2, ::GetCurrentSelectedOutputUserNumber(id));
4447
+ ASSERT_EQ(7, ::GetSelectedOutputRowCount(id));
4448
+ ASSERT_EQ(16, ::GetSelectedOutputColumnCount(id));
4449
+
4450
+ ::SetCurrentSelectedOutputUserNumber(id, 3);
4451
+ ASSERT_EQ(3, ::GetCurrentSelectedOutputUserNumber(id));
4452
+ ASSERT_EQ(2, ::GetSelectedOutputRowCount(id));
4453
+ ASSERT_EQ(12, ::GetSelectedOutputColumnCount(id));
4454
+
4455
+ // edge cases
4456
+ ASSERT_EQ(IPQ_INVALIDARG, ::SetCurrentSelectedOutputUserNumber(id, -1));
4457
+ ASSERT_EQ(3, ::GetCurrentSelectedOutputUserNumber(id));
4458
+ ASSERT_EQ(IPQ_OK, ::SetCurrentSelectedOutputUserNumber(id, 0));
4459
+ ASSERT_EQ(0, ::GetCurrentSelectedOutputUserNumber(id));
4460
+
4461
+ // unload database
4462
+ ASSERT_EQ(0, ::LoadDatabase(id, "phreeqc.dat"));
4463
+ ASSERT_EQ(1, ::GetCurrentSelectedOutputUserNumber(id));
4464
+
4465
+ if (id >= 0)
4466
+ {
4467
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(id));
4468
+ }
4469
+ }
4470
+
4471
+ TEST(TestIPhreeqcLib, TestMultiSetSelectedOutputFileName)
4472
+ {
4473
+ FileTest set1("state.sel");
4474
+ ASSERT_TRUE(set1.RemoveExisting());
4475
+
4476
+ FileTest set2("si.sel");
4477
+ ASSERT_TRUE(set2.RemoveExisting());
4478
+
4479
+ int id = ::CreateIPhreeqc();
4480
+ ASSERT_TRUE(id >= 0);
4481
+
4482
+ ASSERT_EQ(0, ::LoadDatabase(id, "phreeqc.dat"));
4483
+
4484
+ ASSERT_EQ(IPQ_OK, ::SetCurrentSelectedOutputUserNumber(id, 1));
4485
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputStringOn(id, true));
4486
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(id, true));
4487
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileName(id, set1.GetName().c_str()));
4488
+
4489
+ ASSERT_EQ(IPQ_OK, ::SetCurrentSelectedOutputUserNumber(id, 2));
4490
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputStringOn(id, true));
4491
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileOn(id, true));
4492
+ ASSERT_EQ(IPQ_OK, ::SetSelectedOutputFileName(id, set2.GetName().c_str()));
4493
+
4494
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "TITLE Temperature dependence of solubility"));
4495
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, " of gypsum and anhydrite "));
4496
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "SOLUTION 1 Pure water "));
4497
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, " pH 7.0 "));
4498
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, " temp 25.0 "));
4499
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "EQUILIBRIUM_PHASES 1 "));
4500
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, " Gypsum 0.0 1.0 "));
4501
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, " Anhydrite 0.0 1.0 "));
4502
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "REACTION_TEMPERATURE 1 "));
4503
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, " 25.0 75.0 in 51 steps "));
4504
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "SELECTED_OUTPUT 1 "));
4505
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, " -temperature "));
4506
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "SELECTED_OUTPUT 2 "));
4507
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, " -si anhydrite gypsum "));
4508
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "END "));
4509
+
4510
+ ASSERT_EQ(0, ::RunAccumulated(id));
4511
+
4512
+ ASSERT_TRUE(set1.VerifyExists());
4513
+ ASSERT_TRUE(set2.VerifyExists());
4514
+
4515
+ if (id >= 0)
4516
+ {
4517
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(id));
4518
+ }
4519
+ }
4520
+
4521
+ TEST(TestIPhreeqcLib, TestWissmeier20131203)
4522
+ {
4523
+ int id = ::CreateIPhreeqc();
4524
+ ASSERT_TRUE(id >= 0);
4525
+
4526
+ ASSERT_EQ(0, ::LoadDatabase(id, "phreeqc.dat"));
4527
+
4528
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "selected_output 1"));
4529
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "-totals O"));
4530
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, ""));
4531
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "END"));
4532
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "selected_output 1"));
4533
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "-totals H"));
4534
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, ""));
4535
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "solution"));
4536
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "END"));
4537
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "selected_output"));
4538
+
4539
+ // original asserts here
4540
+ ASSERT_EQ(0, ::RunAccumulated(id));
4541
+
4542
+ ASSERT_EQ(1, ::GetSelectedOutputCount(id));
4543
+
4544
+ ASSERT_EQ(9, ::GetSelectedOutputColumnCount(id));
4545
+ ASSERT_EQ(2, ::GetSelectedOutputRowCount(id));
4546
+
4547
+ if (id >= 0)
4548
+ {
4549
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(id));
4550
+ }
4551
+ }
4552
+
4553
+ TEST(TestIPhreeqcLib, TestWissmeier20131203_2)
4554
+ {
4555
+ int id = ::CreateIPhreeqc();
4556
+ ASSERT_TRUE(id >= 0);
4557
+
4558
+ ASSERT_EQ(0, ::LoadDatabase(id, "phreeqc.dat"));
4559
+
4560
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "selected_output 22"));
4561
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "-totals O"));
4562
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, ""));
4563
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "END"));
4564
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "selected_output 22"));
4565
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "-totals H"));
4566
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, ""));
4567
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "solution"));
4568
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "END"));
4569
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "selected_output 22"));
4570
+
4571
+ // original asserts here
4572
+ ASSERT_EQ(0, ::RunAccumulated(id));
4573
+
4574
+ ASSERT_EQ(1, ::GetSelectedOutputCount(id));
4575
+
4576
+ ASSERT_EQ(IPQ_OK, ::SetCurrentSelectedOutputUserNumber(id, 22));
4577
+ ASSERT_EQ(1, ::GetSelectedOutputColumnCount(id));
4578
+ ASSERT_EQ(2, ::GetSelectedOutputRowCount(id));
4579
+
4580
+ if (id >= 0)
4581
+ {
4582
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(id));
4583
+ }
4584
+ }
4585
+
4586
+ TEST(TestIPhreeqcLib, TestWissmeier20131203_3)
4587
+ {
4588
+ int id = ::CreateIPhreeqc();
4589
+ ASSERT_TRUE(id >= 0);
4590
+
4591
+ ASSERT_EQ(0, ::LoadDatabase(id, "phreeqc.dat"));
4592
+
4593
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "selected_output 1"));
4594
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "-reset false"));
4595
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "-totals O"));
4596
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, ""));
4597
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "END"));
4598
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "selected_output 1"));
4599
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "-reset false"));
4600
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "-totals H"));
4601
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, ""));
4602
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "solution"));
4603
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "END"));
4604
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "selected_output"));
4605
+ ASSERT_EQ(IPQ_OK, ::AccumulateLine(id, "-reset false"));
4606
+
4607
+ // original asserts here
4608
+ ASSERT_EQ(0, ::RunAccumulated(id));
4609
+
4610
+ ASSERT_EQ(1, ::GetSelectedOutputCount(id));
4611
+
4612
+ ASSERT_EQ(1, ::GetSelectedOutputColumnCount(id));
4613
+ ASSERT_EQ(2, ::GetSelectedOutputRowCount(id));
4614
+
4615
+ if (id >= 0)
4616
+ {
4617
+ ASSERT_EQ(IPQ_OK, ::DestroyIPhreeqc(id));
4618
+ }
4619
+ }
4620
+
4621
+ TEST(TestIPhreeqcLib, TestIsZeroInitialized)
4622
+ {
4623
+ std::map<void*, void*> test_map;
4624
+ ASSERT_TRUE(test_map.find((void*)0) == test_map.end());
4625
+ ASSERT_TRUE(test_map[(void*)0] == (void*)0);
4626
+
4627
+ int i = int();
4628
+ long l = long();
4629
+ float f = float();
4630
+ double d = double();
4631
+
4632
+ // these would fail
4633
+ /**
4634
+ int i;
4635
+ long l;
4636
+ float f;
4637
+ double d;
4638
+ **/
4639
+
4640
+ ASSERT_EQ((int)0, i);
4641
+ ASSERT_EQ((long)0, l);
4642
+ ASSERT_EQ((float)0, f);
4643
+ ASSERT_EQ((double)0, d);
4644
+ }