v2.2
* removing reference to strncpy * Fixing memory problems with test_toolkit Fixes memory leaks and some minor refactoring. * Update test_toolkit.hpp removing crtdbg.h from header * Update CMakeLists.txt Restoring test_net_builder to test_toolkit.exe * Cleaning up include statements adding crtdbg.h * Fixing index error in test * Add more analysis options to the API (issue #425) * Fixed epanet2_enums.h * Eliminates use of temporary linked lists to process Patterns & Curves (issue #449) * Update input2.c * Bug fix for 2Comp and LIFO tank mixing models (issue #448) * Triggering build to update benchmarks * Added new reg tests Updating reference build id * Initial commit list generic linked list * Update test_list.cpp Tests are passing * Update list.h Adding documentation * Fix typo * Fixing bug in head_list * Fixing indentation * Fixed memory leak Fixed memory leak in test_head_list * Clean up and inline comments * Updating file headers * Update list.c Updating in line comments. * Update test_list.cpp * Fixing indent Spaces not tabs * Update list.c Fixing indent * Update test_list.cpp Updating file header to reflect proper attribution * Expanding test Added test where data is a struct * Fixing indent * Work in progress * Reorganized to contain list abstraction * Update list.c * Refactoring head_list and tail_list Simplifying head and tail list. Adding delete_node() to list API. * Update test_list.cpp * Update test_list.cpp Fixing bug on gcc * Fixing bug * Fixing bug on gcc * Update CMakeLists.txt Adding test_list to ctest * Fixes memory leak in EN_addnode() (#455) * Fixing memory leak in EN_addnode() * Separating test_net_builder from test_toolkit Making test_net_builder a standalone test * Removing BOOST_TEST_MAIN * Work in progress * Updating unit tests * Fixing compilation bug on gcc * Work in progress compiles with warnings, definitely not working * Update demand.h * Work in progress Implementing demand_list * Work in progress Creating function for validateing element ID strings * Work in progress Refactoring cstr_copy and adding test * Update cstr_helper.c fixing indentation * Update cstr_helper.c Fixing indentation * Update test_cstrhelper.cpp Fixed mem leak * Adding element id validity checks * Adding element id validity check Adding checks for element set id functions * Fixing build warnings on gcc * Update errror code from 250 to 252 * Work in progress Implementing generic demand pattern lists. Compiles but does not run. * Update demand.c Work in progress * Return object index from EN_addnode and EN_addlink (issue #432) Adds an output argument to EN_addnode and EN_addlink that returns the index of the newly added object. Also refactors the validity check on object ID names. * Fixed compilation errors * Update test_node.cpp * Create test_demand_data.cpp * test demand data passing * Work in progress Fixing problems when demand lists are null * Passing open and close test * get/set demand name are passing * Updated criteria for valid object ID name * Work in progress * Work in progress Working on demand lists * Work in progress Fixing memory leaks Unit tests passing * Cleaning up build on gcc * Cleaning up gcc build * Fixing bug * Working on gcc bug Tests are passing on Appveyor * Update inpfile.c Trying to isolate bug * GCC Bug * Refactored xstrcpy function * Update inpfile.c Testing linux build * Update epanet.c Trying to isolate bug * updating get demand name and write demands Everything passing locally * Update test_project.cpp Isolating bug on gcc * Isolating bug Not writing demand section of input file should eliminate it * Update demand.c Fixing bug in get_category_name when category_name is NULL * Restoring write_demands section in saveinpfile * Update test_demand_data.cpp Adding index to addnode calls. Fixing indent * Update demand.c * Reverted handling of default pattern When creating demands, no pattern is marked with a zero. Then when data is adjusted it gets updated to default. * Update epanet.c Updating EN_getnodevalue() and EN_setnodevalue() to process the primary demand located at the head of the demand list * Update demand.c * Work in progress code cleanup, addressed issue raised in review, and implemented EN_adddemand() * Adding key and search to list * Adding remove node method to generic list * Adding remove demand method to toolkit * Fix bug and test remove demand * Fix problems with setting tank parameters (issue #464 ) * Fixed NULL pointer error, if no label is provided after the rule keyword. * Create Makefile2.bat Co-Authored-By: Demetrios G. Eliades <eldemet@users.noreply.github.com> Co-Authored-By: Elad Salomons <selad@optiwater.com> * Create LICENSE * Fixed NULL pointer error, if no label is provided after the rule keyword. Add NULL guard in freerules function. Use strncat and strncpy to ensure the buffer lengths are adhered to. * For "conditional" do delete a node connected to a link For "conditional" deletion the node is deleted only if all of its links have been explicitly deleted beforehand #473 Co-Authored-By: Lew Rossman <lrossman@outlook.com> * Create CODE_OF_CONDUCT.md * Refactors the API's demand editing functions * Update test_demand.cpp * Update CODE_OF_CONDUCT.md * Update rules.c Fix broken win build script * Updates to doc files * Documentation edits * Update Makefile.bat Updates on the Microsoft SDK 7.1 compilation script to generate runepanet.exe and to use the \include\epanet2.def * Update Makefile2.bat Modified epanet2.exe to runepanet.exe, for consistency. * Delete epanet2.def Deleted the redundant `epanet2.def` file in the WindSDK folder * Minor format change to status report * Removing status reports from CI testing * rm WinSDK folder and update Makefiles Co-Authored-By: Demetrios G. Eliades <eldemet@users.noreply.github.com> * Restored CI testing of status reports * Removes _DEBUG directives from all source files This commit removes the #ifdef _DEBUG statements at the top of all source code files per issue #482. It also updates the doc files to stress that the speedup observed for hydraulic analysis with the MMD node re-ordering method only applies to single period runs. * Fix refactor of types.h * updates authors * updates AUTHORS and generator script * Update run\CMakeLists.txt * add help file win_build.md Co-Authored-By: Elad Salomons <selad@optiwater.com> * move win_build.md to root dir and renaiming to BUILDING.md * Move BuildAndTest.md to the tools directory * Update BUILDING.md * Update BUILDING.md * Update BUILDING.md * Fixes problem with findpattern() function (issue #498) * Change default properties for new pipe created with EN_addlink (issue #500) * Numerous updates to project documentation * Adds tank overflow feature * Updating docs for tank overflow feature * Updating VB include files * Update input3.c * Identifies overflowing tank in Status Report * Update Makefile.bat * Update Makefile2.bat #508 * rethinking the python wrapper (#511) * renames certain function parameter declarations and removes double pointer call from the deleteproject function * deprecates conditonal compilation, removes python-specific headers and function renaming * fixes tests and docs * fixes test * PDA fixes * Minor update to force new CI test * Another minor change to force another CI test * Fixes Overflow and PDA tests not being run * Fix EN_getElseaction and EN_setelseaction Co-Authored-By: Andreas Ashikkis <andreasashikkis@users.noreply.github.com> * Add -MT switch for CMake Windows build * Updates to the docs * Update BUILDING.md * Build script updates * Fixes EN_setlinkvalue bug * fix in EN_deleteLink when pipes are deleted via deletelink it also deletes comment of last link Co-Authored-By: Pavlos Pavlou <pavlou.v.pavlos@ucy.ac.cy> * rm set to null in functions EN_deletenode, EN_deletelink * trial actions config * Update ccpp.yml * welcome to the Actions beta * fixes mkstemp file handle-leaking behavior (#529) * reverts posix include (#533) ... because it is not needed * Fixes bugs in pump and demand head loss gradients * Removed dependence on unistd.h in project.c Travis CI failed because system could not find unistd.h. * getTmpName() and xstrcpy() made safer * Fixed use of strncpy in xstrcpy() * Refactor of hydcoeffs.c Simplifies and unifies how limit on head gradient at low flow is handled. * Update ReleaseNotes2_2.md * Return error if node/link name is too long (#535) * co-authored with @ehsan-shafiee * removes errant slashes * Throws correct error for ID name too long * Revert "Throws correct error for ID name too long" This reverts commit 57b4873f5882cb9fd983f7e1e5a703b9e442cd74. * fixes #534 by bubbling error codes up from add node/link internal functions * fixes tests on Mac at least * fixes improper success code * Error 252 (not 250) returned for ID name too long. From errors.dat: DAT(252,"invalid ID name") * Fixes problems with EN_addnode() (#543) See issue #542 . Also modifies unit test test_node to check that fixup works. * Adds EN_getresultindex function to the API See issue #546 . Also fixes a small bug in project.c. * Adds link vertex get/set functions to the API * Fixes to EN_addlink and EN_deletelink * Updates the docs * Bug fix for EN_setcurve Adjusts params of any pump that uses the curve whose data is modified by EN_setcurve or EN_setcurvevalue (issue #550 ). * Bug fix for EN_getrule Fixes possible seg fault condition in EN_getrule. Also defines EN_MISSING as an API constant since it can be assigned internally to several variables that are retrievable by the API. * Updating the docs * Adds error check to EN_setheadcurveindex See issue #556 . * Update epanet2.pas * Incorrect characterd There was a character ’ instead of ' which created an error when compiling LaTeX. * fixes a crashing issue in freedata (#559) The freedata function used cached values for sizes of certain arrays found in the parser struct. However, now that the network is mutable, those values can become invalid. Relying instead on the actual array lengths prevents freeing unallocated memory, or ignoring cleanup on newly created elements. * Bug fix for valvecheck function See issue #561 * Restored prior update to project.c that got overwritten * Fixed editing errors made to project.c * PDF Guide PDF users' guide for EPANET, and some minor corrections to readme.md to fix some formatting issues. * HTML Users Guide * Fixes a "copy over" bug in input3.c The copying of one input line token over another was causing a compilation error under Clang. With v2.2 this copying is no longer needed so the line of code in question was simply deleted. This commit also deletes the HTML and Latex output generated by running Doxygen that got added from the previous update to dev since they don't really belong in a source code repo. * Correction made to doc files The output-format.dox file was deprecated and not included in the doxyfile so it was deleted. The description of the format of of the Energy Usage section of the binary output in toolkit-files.dox was corrected. * Update ReleaseNotes2_2.md I added the v2.2 contributing authors to the notes. I checked PR's from 2017 and beyond and these were the only names I could find. Please append any one I might have missed. * Fixes problem with re-opening const. HP pumps See latest comments in issue #528. Also, the setlinkflow() function was deleted as it was never called anywhere. * Update README.md (#539) * Update README.md * Update README.md Some section titles were re-named to conform to GitHub guidelines and the OWA info was moved to a CREDITS section. * Update README.md Added link to the Community Forum page. * Replaced OWA copyright with "(see AUTHORS)". * Update AUTHORS Copied format used by the OWA-SWMM project. * Update README.md The Disclaimer section was edited to reflect that there actually is a "collaborative" connection between USEPA and OWA. * updates CI badges * cleanup of readme links and unused files * possessive vs contraction * adding contributor to notes
This commit is contained in:
75
tests/CMakeLists.txt
Normal file
75
tests/CMakeLists.txt
Normal file
@@ -0,0 +1,75 @@
|
||||
#
|
||||
# CMakeLists.txt - CMake configuration file for epanet/tests
|
||||
#
|
||||
# Created: February 13, 2018
|
||||
#
|
||||
# Modified by: Michael E. Tryby
|
||||
# US EPA ORD/NRMRL
|
||||
#
|
||||
|
||||
|
||||
# Sets for output directory for executables and libraries.
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||
|
||||
if(UNIX)
|
||||
set(CMAKE_CXX_FLAGS "-std=c++11")
|
||||
endif(UNIX)
|
||||
|
||||
|
||||
add_executable(test_net_builder test_net_builder.cpp)
|
||||
target_link_libraries(test_net_builder ${Boost_LIBRARIES} epanet2)
|
||||
add_test(NAME test_net_builder
|
||||
COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test_net_builder
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data)
|
||||
|
||||
|
||||
set(toolkit_test_srcs
|
||||
test_toolkit.cpp
|
||||
test_project.cpp
|
||||
test_hydraulics.cpp
|
||||
test_quality.cpp
|
||||
test_report.cpp
|
||||
test_analysis.cpp
|
||||
test_node.cpp
|
||||
test_demand.cpp
|
||||
test_link.cpp
|
||||
# test_pump.cpp
|
||||
test_pattern.cpp
|
||||
test_curve.cpp
|
||||
test_control.cpp
|
||||
test_overflow.cpp
|
||||
test_pda.cpp
|
||||
)
|
||||
|
||||
add_executable(test_toolkit ${toolkit_test_srcs})
|
||||
target_link_libraries(test_toolkit ${Boost_LIBRARIES} epanet2)
|
||||
add_test(NAME test_toolkit
|
||||
COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test_toolkit
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data)
|
||||
|
||||
|
||||
|
||||
add_executable(test_reent test_reent.cpp)
|
||||
|
||||
IF(MSVC)
|
||||
target_link_libraries(test_reent ${Boost_LIBRARIES} epanet2)
|
||||
ELSE(TRUE)
|
||||
target_link_libraries(test_reent ${Boost_LIBRARIES} pthread epanet2)
|
||||
ENDIF(MSVC)
|
||||
|
||||
add_test(NAME test_reent
|
||||
COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test_reent
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data)
|
||||
|
||||
|
||||
# ctest doesn't like tests added in subdirectories so adding them here
|
||||
add_test(NAME test_errormanager
|
||||
COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test_errormanager)
|
||||
|
||||
add_test(NAME test_filemanager
|
||||
COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test_filemanager
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/outfile/data)
|
||||
|
||||
add_test(NAME test_output
|
||||
COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test_output
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/outfile/data)
|
||||
Binary file not shown.
481
tests/data/example_0.inp
Normal file
481
tests/data/example_0.inp
Normal file
@@ -0,0 +1,481 @@
|
||||
[TITLE]
|
||||
EPANET Example Network 3
|
||||
Example showing how the percent of Lake water in a dual-source
|
||||
system changes over time.
|
||||
|
||||
[JUNCTIONS]
|
||||
;ID Elev Demand Pattern
|
||||
10 147 0 ;
|
||||
15 32 1 3 ;
|
||||
20 129 0 ;
|
||||
35 12.5 1 4 ;
|
||||
40 131.9 0 ;
|
||||
50 116.5 0 ;
|
||||
60 0 0 ;
|
||||
601 0 0 ;
|
||||
61 0 0 ;
|
||||
101 42 189.95 ;
|
||||
103 43 133.2 ;
|
||||
105 28.5 135.37 ;
|
||||
107 22 54.64 ;
|
||||
109 20.3 231.4 ;
|
||||
111 10 141.94 ;
|
||||
113 2 20.01 ;
|
||||
115 14 52.1 ;
|
||||
117 13.6 117.71 ;
|
||||
119 2 176.13 ;
|
||||
120 0 0 ;
|
||||
121 -2 41.63 ;
|
||||
123 11 1 2 ;
|
||||
125 11 45.6 ;
|
||||
127 56 17.66 ;
|
||||
129 51 0 ;
|
||||
131 6 42.75 ;
|
||||
139 31 5.89 ;
|
||||
141 4 9.85 ;
|
||||
143 -4.5 6.2 ;
|
||||
145 1 27.63 ;
|
||||
147 18.5 8.55 ;
|
||||
149 16 27.07 ;
|
||||
151 33.5 144.48 ;
|
||||
153 66.2 44.17 ;
|
||||
157 13.1 51.79 ;
|
||||
159 6 41.32 ;
|
||||
161 4 15.8 ;
|
||||
163 5 9.42 ;
|
||||
164 5 0 ;
|
||||
166 -2 2.6 ;
|
||||
167 -5 14.56 ;
|
||||
169 -5 0 ;
|
||||
171 -4 39.34 ;
|
||||
173 -4 0 ;
|
||||
177 8 58.17 ;
|
||||
179 8 0 ;
|
||||
181 8 0 ;
|
||||
183 11 0 ;
|
||||
184 16 0 ;
|
||||
185 16 25.65 ;
|
||||
187 12.5 0 ;
|
||||
189 4 107.92 ;
|
||||
191 25 81.9 ;
|
||||
193 18 71.31 ;
|
||||
195 15.5 0 ;
|
||||
197 23 17.04 ;
|
||||
199 -2 119.32 ;
|
||||
201 0.1 44.61 ;
|
||||
203 2 1 5 ;
|
||||
204 21 0 ;
|
||||
205 21 65.36 ;
|
||||
206 1 0 ;
|
||||
207 9 69.39 ;
|
||||
208 16 0 ;
|
||||
209 -2 0.87 ;
|
||||
211 7 8.67 ;
|
||||
213 7 13.94 ;
|
||||
215 7 92.19 ;
|
||||
217 6 24.22 ;
|
||||
219 4 41.32 ;
|
||||
225 8 22.8 ;
|
||||
229 10.5 64.18 ;
|
||||
231 5 16.48 ;
|
||||
237 14 15.61 ;
|
||||
239 13 44.61 ;
|
||||
241 13 0 ;
|
||||
243 14 4.34 ;
|
||||
247 18 70.38 ;
|
||||
249 18 0 ;
|
||||
251 30 24.16 ;
|
||||
253 36 54.52 ;
|
||||
255 27 40.39 ;
|
||||
257 17 0 ;
|
||||
259 25 0 ;
|
||||
261 0 0 ;
|
||||
263 0 0 ;
|
||||
265 0 0 ;
|
||||
267 21 0 ;
|
||||
269 0 0 ;
|
||||
271 6 0 ;
|
||||
273 8 0 ;
|
||||
275 10 0 ;
|
||||
|
||||
[RESERVOIRS]
|
||||
;ID Head Pattern
|
||||
River 220.0 ;
|
||||
Lake 167.0 ;
|
||||
|
||||
[TANKS]
|
||||
;ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve
|
||||
1 131.9 13.1 .1 32.1 85 0 ;
|
||||
2 116.5 23.5 6.5 40.3 50 0 ;
|
||||
3 129.0 29.0 4.0 35.5 164 0 ;
|
||||
|
||||
[PIPES]
|
||||
;ID Node1 Node2 Length Diameter Roughness MinorLoss Status
|
||||
20 3 20 99 99 199 0 Open ;
|
||||
40 1 40 99 99 199 0 Open ;
|
||||
50 2 50 99 99 199 0 Open ;
|
||||
60 River 60 1231 24 140 0 Open ;
|
||||
101 10 101 14200 18 110 0 Open ;
|
||||
103 101 103 1350 16 130 0 Open ;
|
||||
105 101 105 2540 12 130 0 Open ;
|
||||
107 105 107 1470 12 130 0 Open ;
|
||||
109 103 109 3940 16 130 0 Open ;
|
||||
111 109 111 2000 12 130 0 Open ;
|
||||
112 115 111 1160 12 130 0 Open ;
|
||||
113 111 113 1680 12 130 0 Open ;
|
||||
114 115 113 2000 8 130 0 Open ;
|
||||
115 107 115 1950 8 130 0 Open ;
|
||||
116 113 193 1660 12 130 0 Open ;
|
||||
117 263 105 2725 12 130 0 Open ;
|
||||
119 115 117 2180 12 130 0 Open ;
|
||||
120 119 120 730 12 130 0 Open ;
|
||||
121 120 117 1870 12 130 0 Open ;
|
||||
122 121 120 2050 8 130 0 Open ;
|
||||
123 121 119 2000 30 141 0 Open ;
|
||||
125 123 121 1500 30 141 0 Open ;
|
||||
129 121 125 930 24 130 0 Open ;
|
||||
131 125 127 3240 24 130 0 Open ;
|
||||
133 20 127 785 20 130 0 Open ;
|
||||
135 127 129 900 24 130 0 Open ;
|
||||
137 129 131 6480 16 130 0 Open ;
|
||||
145 129 139 2750 8 130 0 Open ;
|
||||
147 139 141 2050 8 130 0 Open ;
|
||||
149 143 141 1400 8 130 0 Open ;
|
||||
151 15 143 1650 8 130 0 Open ;
|
||||
153 145 141 3510 12 130 0 Open ;
|
||||
155 147 145 2200 12 130 0 Open ;
|
||||
159 147 149 880 12 130 0 Open ;
|
||||
161 149 151 1020 8 130 0 Open ;
|
||||
163 151 153 1170 12 130 0 Open ;
|
||||
169 125 153 4560 8 130 0 Open ;
|
||||
171 119 151 3460 12 130 0 Open ;
|
||||
173 119 157 2080 30 141 0 Open ;
|
||||
175 157 159 2910 30 141 0 Open ;
|
||||
177 159 161 2000 30 141 0 Open ;
|
||||
179 161 163 430 30 141 0 Open ;
|
||||
180 163 164 150 14 130 0 Open ;
|
||||
181 164 166 490 14 130 0 Open ;
|
||||
183 265 169 590 30 141 0 Open ;
|
||||
185 167 169 60 8 130 0 Open ;
|
||||
186 187 204 99.9 8 130 0 Open ;
|
||||
187 169 171 1270 30 141 0 Open ;
|
||||
189 171 173 50 30 141 0 Open ;
|
||||
191 271 171 760 24 130 0 Open ;
|
||||
193 35 181 30 24 130 0 Open ;
|
||||
195 181 177 30 12 130 0 Open ;
|
||||
197 177 179 30 12 130 0 Open ;
|
||||
199 179 183 210 12 130 0 Open ;
|
||||
201 40 179 1190 12 130 0 Open ;
|
||||
202 185 184 99.9 8 130 0 Open ;
|
||||
203 183 185 510 8 130 0 Open ;
|
||||
204 184 205 4530. 12 130 0 Open ;
|
||||
205 204 185 1325. 12 130 0 Open ;
|
||||
207 189 183 1350 12 130 0 Open ;
|
||||
209 189 187 500 8 130 0 Open ;
|
||||
211 169 269 646 12 130 0 Open ;
|
||||
213 191 187 2560 12 130 0 Open ;
|
||||
215 267 189 1230 12 130 0 Open ;
|
||||
217 191 193 520 12 130 0 Open ;
|
||||
219 193 195 360 12 130 0 Open ;
|
||||
221 161 195 2300 8 130 0 Open ;
|
||||
223 197 191 1150 12 130 0 Open ;
|
||||
225 111 197 2790 12 130 0 Open ;
|
||||
229 173 199 4000 24 141 0 Open ;
|
||||
231 199 201 630 24 141 0 Open ;
|
||||
233 201 203 120 24 130 0 Open ;
|
||||
235 199 273 725 12 130 0 Open ;
|
||||
237 205 207 1200 12 130 0 Open ;
|
||||
238 207 206 450 12 130 0 Open ;
|
||||
239 275 207 1430 12 130 0 Open ;
|
||||
240 206 208 510 12 130 0 Open ;
|
||||
241 208 209 885 12 130 0 Open ;
|
||||
243 209 211 1210 16 130 0 Open ;
|
||||
245 211 213 990 16 130 0 Open ;
|
||||
247 213 215 4285 16 130 0 Open ;
|
||||
249 215 217 1660 16 130 0 Open ;
|
||||
251 217 219 2050 14 130 0 Open ;
|
||||
257 217 225 1560 12 130 0 Open ;
|
||||
261 213 229 2200 8 130 0 Open ;
|
||||
263 229 231 1960 12 130 0 Open ;
|
||||
269 211 237 2080 12 130 0 Open ;
|
||||
271 237 229 790 8 130 0 Open ;
|
||||
273 237 239 510 12 130 0 Open ;
|
||||
275 239 241 35 12 130 0 Open ;
|
||||
277 241 243 2200 12 130 0 Open ;
|
||||
281 241 247 445 10 130 0 Open ;
|
||||
283 239 249 430 12 130 0 Open ;
|
||||
285 247 249 10 12 130 0 Open ;
|
||||
287 247 255 1390 10 130 0 Open ;
|
||||
289 50 255 925 10 130 0 Open ;
|
||||
291 255 253 1100 10 130 0 Open ;
|
||||
293 255 251 1100 8 130 0 Open ;
|
||||
295 249 251 1450 12 130 0 Open ;
|
||||
297 120 257 645 8 130 0 Open ;
|
||||
299 257 259 350 8 130 0 Open ;
|
||||
301 259 263 1400 8 130 0 Open ;
|
||||
303 257 261 1400 8 130 0 Open ;
|
||||
305 117 261 645 12 130 0 Open ;
|
||||
307 261 263 350 12 130 0 Open ;
|
||||
309 265 267 1580 8 130 0 Open ;
|
||||
311 193 267 1170 12 130 0 Open ;
|
||||
313 269 189 646 12 130 0 Open ;
|
||||
315 181 271 260 24 130 0 Open ;
|
||||
317 273 275 2230 8 130 0 Open ;
|
||||
319 273 205 645 12 130 0 Open ;
|
||||
321 163 265 1200 30 141 0 Open ;
|
||||
323 201 275 300 12 130 0 Open ;
|
||||
325 269 271 1290 8 130 0 Open ;
|
||||
329 61 123 45500 30 140 0 Open ;
|
||||
330 60 601 1 30 140 0 Closed ;
|
||||
333 601 61 1 30 140 0 Open ;
|
||||
|
||||
[PUMPS]
|
||||
;ID Node1 Node2 Parameters
|
||||
10 Lake 10 HEAD 1 ;
|
||||
335 60 61 HEAD 2 ;
|
||||
|
||||
[VALVES]
|
||||
;ID Node1 Node2 Diameter Type Setting MinorLoss
|
||||
|
||||
[TAGS]
|
||||
|
||||
[DEMANDS]
|
||||
;Junction Demand Pattern Category
|
||||
|
||||
[STATUS]
|
||||
;ID Status/Setting
|
||||
10 Closed
|
||||
|
||||
[PATTERNS]
|
||||
;ID Multipliers
|
||||
;General Default Demand Pattern
|
||||
1 1.34 1.94 1.46 1.44 .76 .92
|
||||
1 .85 1.07 .96 1.1 1.08 1.19
|
||||
1 1.16 1.08 .96 .83 .79 .74
|
||||
1 .64 .64 .85 .96 1.24 1.67
|
||||
;Demand Pattern for Node 123
|
||||
2 0 0 0 0 0 1219
|
||||
2 0 0 0 1866 1836 1818
|
||||
2 1818 1822 1822 1817 1824 1816
|
||||
2 1833 1817 1830 1814 1840 1859
|
||||
;Demand Pattern for Node 15
|
||||
3 620 620 620 620 620 360
|
||||
3 360 0 0 0 0 360
|
||||
3 360 360 360 360 0 0
|
||||
3 0 0 0 0 360 360
|
||||
;Demand Pattern for Node 35
|
||||
4 1637 1706 1719 1719 1791 1819
|
||||
4 1777 1842 1815 1825 1856 1801
|
||||
4 1819 1733 1664 1620 1613 1620
|
||||
4 1616 1647 1627 1627 1671 1668
|
||||
;Demand Pattern for Node 203
|
||||
5 4439 4531 4511 4582 4531 4582
|
||||
5 4572 4613 4643 4643 4592 4613
|
||||
5 4531 4521 4449 4439 4449 4460
|
||||
5 4439 4419 4368 4399 4470 4480
|
||||
|
||||
[CURVES]
|
||||
;ID X-Value Y-Value
|
||||
;PUMP: Pump Curve for Pump 10 (Lake Source)
|
||||
1 0 104.
|
||||
1 2000. 92.
|
||||
1 4000. 63.
|
||||
;PUMP: Pump Curve for Pump 335 (River Source)
|
||||
2 0 200.
|
||||
2 8000. 138.
|
||||
2 14000. 86.
|
||||
|
||||
[CONTROLS]
|
||||
;Lake source operates only part of the day
|
||||
Link 10 OPEN AT TIME 1
|
||||
Link 10 CLOSED AT TIME 15
|
||||
|
||||
;Pump 335 controlled by level in Tank 1
|
||||
;When pump is closed, bypass pipe is opened
|
||||
Link 335 OPEN IF Node 1 BELOW 17.1
|
||||
Link 335 CLOSED IF Node 1 ABOVE 19.1
|
||||
Link 330 CLOSED IF Node 1 BELOW 17.1
|
||||
Link 330 OPEN IF Node 1 ABOVE 19.1
|
||||
|
||||
|
||||
[RULES]
|
||||
|
||||
[ENERGY]
|
||||
Global Efficiency 75
|
||||
Global Price 0.0
|
||||
Demand Charge 0.0
|
||||
|
||||
[EMITTERS]
|
||||
;Junction Coefficient
|
||||
|
||||
[QUALITY]
|
||||
;Node InitQual
|
||||
|
||||
[SOURCES]
|
||||
;Node Type Quality Pattern
|
||||
|
||||
[REACTIONS]
|
||||
;Type Pipe/Tank Coefficient
|
||||
|
||||
|
||||
[REACTIONS]
|
||||
Order Bulk 1
|
||||
Order Tank 1
|
||||
Order Wall 1
|
||||
Global Bulk 0.0
|
||||
Global Wall 0.0
|
||||
Limiting Potential 0.0
|
||||
Roughness Correlation 0.0
|
||||
|
||||
[MIXING]
|
||||
;Tank Model
|
||||
|
||||
[TIMES]
|
||||
Duration 24:00
|
||||
Hydraulic Timestep 1:00
|
||||
Quality Timestep 0:05
|
||||
Pattern Timestep 1:00
|
||||
Pattern Start 0:00
|
||||
Report Timestep 1:00
|
||||
Report Start 0:00
|
||||
Start ClockTime 12 am
|
||||
Statistic None
|
||||
|
||||
[REPORT]
|
||||
Status Yes
|
||||
Summary No
|
||||
Page 0
|
||||
|
||||
[OPTIONS]
|
||||
Units GPM
|
||||
Headloss H-W
|
||||
Specific Gravity 1.0
|
||||
Viscosity 1.0
|
||||
Trials 40
|
||||
Accuracy 0.001
|
||||
CHECKFREQ 2
|
||||
MAXCHECK 10
|
||||
DAMPLIMIT 0
|
||||
Unbalanced Continue 10
|
||||
Pattern 1
|
||||
Demand Multiplier 1.0
|
||||
Emitter Exponent 0.5
|
||||
Quality Trace Lake
|
||||
Diffusivity 1.0
|
||||
Tolerance 0.01
|
||||
|
||||
[COORDINATES]
|
||||
;Node X-Coord Y-Coord
|
||||
10 9.00 27.85
|
||||
15 38.68 23.76
|
||||
20 29.44 26.91
|
||||
35 25.46 10.52
|
||||
40 27.02 9.81
|
||||
50 33.01 3.01
|
||||
60 23.90 29.94
|
||||
601 23.00 29.49
|
||||
61 23.71 29.03
|
||||
101 13.81 22.94
|
||||
103 12.96 21.31
|
||||
105 16.97 21.28
|
||||
107 18.45 20.46
|
||||
109 17.64 18.92
|
||||
111 20.21 17.53
|
||||
113 22.04 16.61
|
||||
115 20.98 19.18
|
||||
117 21.69 21.28
|
||||
119 23.70 22.76
|
||||
120 22.08 23.10
|
||||
121 23.54 25.50
|
||||
123 23.37 27.31
|
||||
125 24.59 25.64
|
||||
127 29.29 26.40
|
||||
129 30.32 26.39
|
||||
131 37.89 29.55
|
||||
139 33.28 24.54
|
||||
141 35.68 23.08
|
||||
143 37.47 21.97
|
||||
145 33.02 19.29
|
||||
147 30.24 20.38
|
||||
149 29.62 20.74
|
||||
151 28.29 21.39
|
||||
153 28.13 22.63
|
||||
157 24.85 20.16
|
||||
159 23.12 17.50
|
||||
161 25.10 15.28
|
||||
163 25.39 14.98
|
||||
164 25.98 15.14
|
||||
166 26.48 15.13
|
||||
167 25.88 12.98
|
||||
169 25.68 12.74
|
||||
171 26.65 11.80
|
||||
173 26.87 11.59
|
||||
177 25.92 10.59
|
||||
179 25.71 10.40
|
||||
181 25.72 10.74
|
||||
183 25.45 10.18
|
||||
184 25.15 9.52
|
||||
185 25.01 9.67
|
||||
187 23.64 11.04
|
||||
189 24.15 11.37
|
||||
191 22.10 14.07
|
||||
193 22.88 14.35
|
||||
195 23.18 14.72
|
||||
197 20.97 15.18
|
||||
199 29.42 8.44
|
||||
201 30.89 8.57
|
||||
203 31.14 8.89
|
||||
204 23.80 10.90
|
||||
205 29.20 6.46
|
||||
206 31.66 6.64
|
||||
207 31.00 6.61
|
||||
208 32.54 6.81
|
||||
209 33.76 6.59
|
||||
211 34.20 5.54
|
||||
213 35.26 6.16
|
||||
215 39.95 8.73
|
||||
217 42.11 8.67
|
||||
219 44.86 9.32
|
||||
225 43.53 7.38
|
||||
229 36.16 3.49
|
||||
231 38.38 2.54
|
||||
237 35.37 3.08
|
||||
239 35.76 2.31
|
||||
241 35.87 2.11
|
||||
243 37.04 0.00
|
||||
247 35.02 2.05
|
||||
249 35.02 1.81
|
||||
251 34.15 1.10
|
||||
253 32.17 1.88
|
||||
255 33.51 2.45
|
||||
257 21.17 23.32
|
||||
259 20.80 23.40
|
||||
261 20.79 21.45
|
||||
263 20.32 21.57
|
||||
265 25.39 13.60
|
||||
267 23.38 12.95
|
||||
269 25.03 12.14
|
||||
271 25.97 11.00
|
||||
273 29.16 7.38
|
||||
275 31.07 8.29
|
||||
River 24.15 31.06
|
||||
Lake 8.00 27.53
|
||||
1 27.46 9.84
|
||||
2 32.99 3.45
|
||||
3 29.41 27.27
|
||||
|
||||
[VERTICES]
|
||||
;Link X-Coord Y-Coord
|
||||
|
||||
[LABELS]
|
||||
;X-Coord Y-Coord Label & Anchor Node
|
||||
8.00 29.42 "LAKE"
|
||||
25.00 31.10 "RIVER"
|
||||
|
||||
[BACKDROP]
|
||||
DIMENSIONS 6.16 -1.55 46.70 32.61
|
||||
UNITS None
|
||||
FILE
|
||||
OFFSET 0.00 0.00
|
||||
|
||||
[END]
|
||||
178
tests/data/net1.inp
Normal file
178
tests/data/net1.inp
Normal file
@@ -0,0 +1,178 @@
|
||||
[TITLE]
|
||||
EPANET Example Network 1
|
||||
A simple example of modeling chlorine decay. Both bulk and
|
||||
wall reactions are included.
|
||||
|
||||
[JUNCTIONS]
|
||||
;ID Elev Demand Pattern
|
||||
10 710 0 ;
|
||||
11 710 150 ;
|
||||
12 700 150 ;
|
||||
13 695 100 ;
|
||||
21 700 150 ;
|
||||
22 695 200 ;
|
||||
23 690 150 ;
|
||||
31 700 100 ;
|
||||
32 710 100 ;
|
||||
|
||||
[RESERVOIRS]
|
||||
;ID Head Pattern
|
||||
9 800 ;
|
||||
|
||||
[TANKS]
|
||||
;ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve
|
||||
2 850 120 100 150 50.5 0 ;
|
||||
|
||||
[PIPES]
|
||||
;ID Node1 Node2 Length Diameter Roughness MinorLoss Status
|
||||
10 10 11 10530 18 100 0 Open ;
|
||||
11 11 12 5280 14 100 0 Open ;
|
||||
12 12 13 5280 10 100 0 Open ;
|
||||
21 21 22 5280 10 100 0 Open ;
|
||||
22 22 23 5280 12 100 0 Open ;
|
||||
31 31 32 5280 6 100 0 Open ;
|
||||
110 2 12 200 18 100 0 Open ;
|
||||
111 11 21 5280 10 100 0 Open ;
|
||||
112 12 22 5280 12 100 0 Open ;
|
||||
113 13 23 5280 8 100 0 Open ;
|
||||
121 21 31 5280 8 100 0 Open ;
|
||||
122 22 32 5280 6 100 0 Open ;
|
||||
|
||||
[PUMPS]
|
||||
;ID Node1 Node2 Parameters
|
||||
9 9 10 HEAD 1 ;
|
||||
|
||||
[VALVES]
|
||||
;ID Node1 Node2 Diameter Type Setting MinorLoss
|
||||
|
||||
[TAGS]
|
||||
|
||||
[DEMANDS]
|
||||
;Junction Demand Pattern Category
|
||||
|
||||
[STATUS]
|
||||
;ID Status/Setting
|
||||
|
||||
[PATTERNS]
|
||||
;ID Multipliers
|
||||
;Demand Pattern
|
||||
1 1.0 1.2 1.4 1.6 1.4 1.2
|
||||
1 1.0 0.8 0.6 0.4 0.6 0.8
|
||||
|
||||
[CURVES]
|
||||
;ID X-Value Y-Value
|
||||
;PUMP: Pump Curve for Pump 9
|
||||
1 1500 250
|
||||
|
||||
[CONTROLS]
|
||||
LINK 9 OPEN IF NODE 2 BELOW 110
|
||||
LINK 9 CLOSED IF NODE 2 ABOVE 140
|
||||
|
||||
|
||||
[RULES]
|
||||
|
||||
[ENERGY]
|
||||
Global Efficiency 75
|
||||
Global Price 0.0
|
||||
Demand Charge 0.0
|
||||
|
||||
[EMITTERS]
|
||||
;Junction Coefficient
|
||||
|
||||
[QUALITY]
|
||||
;Node InitQual
|
||||
10 0.5
|
||||
11 0.5
|
||||
12 0.5
|
||||
13 0.5
|
||||
21 0.5
|
||||
22 0.5
|
||||
23 0.5
|
||||
31 0.5
|
||||
32 0.5
|
||||
9 1.0
|
||||
2 1.0
|
||||
|
||||
[SOURCES]
|
||||
;Node Type Quality Pattern
|
||||
|
||||
[REACTIONS]
|
||||
;Type Pipe/Tank Coefficient
|
||||
|
||||
|
||||
[REACTIONS]
|
||||
Order Bulk 1
|
||||
Order Tank 1
|
||||
Order Wall 1
|
||||
Global Bulk -.5
|
||||
Global Wall -1
|
||||
Limiting Potential 0.0
|
||||
Roughness Correlation 0.0
|
||||
|
||||
[MIXING]
|
||||
;Tank Model
|
||||
|
||||
[TIMES]
|
||||
Duration 24:00
|
||||
Hydraulic Timestep 1:00
|
||||
Quality Timestep 0:05
|
||||
Pattern Timestep 2:00
|
||||
Pattern Start 0:00
|
||||
Report Timestep 1:00
|
||||
Report Start 0:00
|
||||
Start ClockTime 12 am
|
||||
Statistic None
|
||||
|
||||
[REPORT]
|
||||
Status Yes
|
||||
Summary No
|
||||
Page 0
|
||||
|
||||
[OPTIONS]
|
||||
Units GPM
|
||||
Headloss H-W
|
||||
Specific Gravity 1.0
|
||||
Viscosity 1.0
|
||||
Trials 40
|
||||
Accuracy 0.001
|
||||
CHECKFREQ 2
|
||||
MAXCHECK 10
|
||||
DAMPLIMIT 0
|
||||
Unbalanced Continue 10
|
||||
Pattern 1
|
||||
Demand Multiplier 1.0
|
||||
Emitter Exponent 0.5
|
||||
Quality Chlorine mg/L
|
||||
Diffusivity 1.0
|
||||
Tolerance 0.01
|
||||
|
||||
[COORDINATES]
|
||||
;Node X-Coord Y-Coord
|
||||
10 20.00 70.00
|
||||
11 30.00 70.00
|
||||
12 50.00 70.00
|
||||
13 70.00 70.00
|
||||
21 30.00 40.00
|
||||
22 50.00 40.00
|
||||
23 70.00 40.00
|
||||
31 30.00 10.00
|
||||
32 50.00 10.00
|
||||
9 10.00 70.00
|
||||
2 50.00 90.00
|
||||
|
||||
[VERTICES]
|
||||
;Link X-Coord Y-Coord
|
||||
|
||||
[LABELS]
|
||||
;X-Coord Y-Coord Label & Anchor Node
|
||||
6.99 73.63 "Source"
|
||||
13.48 68.13 "Pump"
|
||||
43.85 91.21 "Tank"
|
||||
|
||||
[BACKDROP]
|
||||
DIMENSIONS 7.00 6.00 73.00 94.00
|
||||
UNITS None
|
||||
FILE
|
||||
OFFSET 0.00 0.00
|
||||
|
||||
[END]
|
||||
BIN
tests/data/net1.out
Normal file
BIN
tests/data/net1.out
Normal file
Binary file not shown.
14
tests/outfile/CMakeLists.txt
Normal file
14
tests/outfile/CMakeLists.txt
Normal file
@@ -0,0 +1,14 @@
|
||||
|
||||
if(UNIX)
|
||||
set(CMAKE_CXX_FLAGS "-std=c++11")
|
||||
endif(UNIX)
|
||||
|
||||
# Sets for output directory for executables and libraries
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
||||
|
||||
|
||||
add_executable(test_output test_output.cpp)
|
||||
target_include_directories(test_output PUBLIC ../../src/outfile/include)
|
||||
target_link_libraries(test_output ${Boost_LIBRARIES} epanet-output)
|
||||
0
tests/outfile/data/enP1kAlM
Normal file
0
tests/outfile/data/enP1kAlM
Normal file
BIN
tests/outfile/data/example1.out
Normal file
BIN
tests/outfile/data/example1.out
Normal file
Binary file not shown.
367
tests/outfile/test_output.cpp
Normal file
367
tests/outfile/test_output.cpp
Normal file
@@ -0,0 +1,367 @@
|
||||
/*
|
||||
* test_output.cpp
|
||||
*
|
||||
* Created: 8/4/2017
|
||||
* Author: Michael E. Tryby
|
||||
* US EPA - ORD/NRMRL
|
||||
*
|
||||
* Unit testing for EPANET Output API.
|
||||
*/
|
||||
|
||||
#define BOOST_TEST_MODULE "output"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string>
|
||||
#include <math.h>
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include "epanet_output.h"
|
||||
//#include "epanet2_2.h"
|
||||
|
||||
|
||||
boost::test_tools::predicate_result check_cdd_float(std::vector<float>& test,
|
||||
std::vector<float>& ref, long cdd_tol){
|
||||
float tmp, min_cdd = 10.0;
|
||||
|
||||
// TODO: What if the vectors aren't the same length?
|
||||
|
||||
std::vector<float>::iterator test_it;
|
||||
std::vector<float>::iterator ref_it;
|
||||
|
||||
for (test_it = test.begin(), ref_it = ref.begin();
|
||||
(test_it < test.end()) && (ref_it < ref.end());
|
||||
++test_it, ++ref_it)
|
||||
{
|
||||
if (*test_it != *ref_it) {
|
||||
// Compute log absolute error
|
||||
tmp = abs(*test_it - *ref_it);
|
||||
if (tmp < 1.0e-7f)
|
||||
tmp = 1.0e-7f;
|
||||
|
||||
else if (tmp > 2.0f)
|
||||
tmp = 1.0f;
|
||||
|
||||
tmp = -log10(tmp);
|
||||
if (tmp < 0.0f)
|
||||
tmp = 0.0f;
|
||||
|
||||
if (tmp < min_cdd)
|
||||
min_cdd = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
return floor(min_cdd) >= cdd_tol;
|
||||
}
|
||||
|
||||
boost::test_tools::predicate_result check_string(std::string test, std::string ref)
|
||||
{
|
||||
if (ref.compare(test) == 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
#define DATA_PATH_OUTPUT "./example1.out"
|
||||
|
||||
//#define DATA_PATH_INP "./net1.inp"
|
||||
//#define DATA_PATH_RPT "./test.rpt"
|
||||
//#define DATA_PATH_OUT "./test.out"
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (test_output_auto)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(OpenCloseTest) {
|
||||
std::string path = std::string(DATA_PATH_OUTPUT);
|
||||
|
||||
ENR_Handle p_handle = NULL;
|
||||
ENR_init(&p_handle);
|
||||
|
||||
int error = ENR_open(p_handle, path.c_str());
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = ENR_close(&p_handle);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(p_handle == NULL);
|
||||
}
|
||||
|
||||
|
||||
// // Test access to output file with the project open
|
||||
// BOOST_AUTO_TEST_CASE(AccessTest){
|
||||
//
|
||||
// std::string path_inp(DATA_PATH_NET1);
|
||||
// std::string path_rpt(DATA_PATH_RPT);
|
||||
// std::string path_out(DATA_PATH_OUT);
|
||||
//
|
||||
// EN_Project ph = NULL;
|
||||
// ENR_Handle p_handle = NULL;
|
||||
//
|
||||
// EN_createproject(&ph);
|
||||
//
|
||||
// int error = EN_open(ph, path_inp.c_str(), path_rpt.c_str(), path_out.c_str());
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
//
|
||||
// error = EN_solveH(ph);
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
//
|
||||
// error = EN_solveQ(ph);
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
//
|
||||
// error = EN_report(ph);
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
//
|
||||
//
|
||||
// // Access to output file prior to project close
|
||||
// error = ENR_init(&p_handle);
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
// error = ENR_open(p_handle, path_out.c_str());
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
// error = ENR_close(&p_handle);
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
//
|
||||
//
|
||||
// error = EN_close(ph);
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
//
|
||||
// EN_deleteproject(&ph);
|
||||
// }
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
|
||||
struct FixtureOutput{
|
||||
FixtureOutput() {
|
||||
path = std::string(DATA_PATH_OUTPUT);
|
||||
|
||||
error = ENR_init(&p_handle);
|
||||
ENR_clearError(p_handle);
|
||||
error = ENR_open(p_handle, path.c_str());
|
||||
|
||||
array = NULL;
|
||||
array_dim = 0;
|
||||
}
|
||||
~FixtureOutput() {
|
||||
free((void*)array);
|
||||
error = ENR_close(&p_handle);
|
||||
}
|
||||
|
||||
std::string path;
|
||||
int error;
|
||||
ENR_Handle p_handle;
|
||||
|
||||
float* array;
|
||||
int array_dim;
|
||||
};
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_output_fixture)
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_getNetSize, FixtureOutput)
|
||||
{
|
||||
int *i_array = NULL;
|
||||
|
||||
error = ENR_getNetSize(p_handle, &i_array, &array_dim);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// nodes, tanks, links, pumps, valves
|
||||
std::vector<int> test;
|
||||
test.assign(i_array, i_array + array_dim);
|
||||
|
||||
std::vector<int> ref = {11,2,13,1,0};
|
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(ref.begin(), ref.end(), test.begin(), test.end());
|
||||
|
||||
free((void*)i_array);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_getUnits, FixtureOutput) {
|
||||
int flag;
|
||||
|
||||
error = ENR_getUnits(p_handle, ENR_qualUnits, &flag);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
BOOST_CHECK_EQUAL(flag, ENR_MGL);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_getElementName, FixtureOutput) {
|
||||
char* name;
|
||||
int length, index = 1;
|
||||
|
||||
error = ENR_getElementName(p_handle, ENR_node, index, &name, &length);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
std::string test (name);
|
||||
std::string ref ("10");
|
||||
BOOST_CHECK(check_string(test, ref));
|
||||
|
||||
free((void *)name);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_getNodeAttribute, FixtureOutput) {
|
||||
|
||||
error = ENR_getNodeAttribute(p_handle, 1, ENR_quality, &array, &array_dim);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
std::vector<float> ref_vec = { 1.0f,
|
||||
0.44407997f,
|
||||
0.43766347f,
|
||||
0.42827705f,
|
||||
0.41342604f,
|
||||
0.42804748f,
|
||||
0.44152543f,
|
||||
0.40502965f,
|
||||
0.38635802f,
|
||||
1.0f,
|
||||
0.96745253f};
|
||||
|
||||
std::vector<float> test_vec;
|
||||
test_vec.assign(array, array + array_dim);
|
||||
|
||||
BOOST_CHECK(check_cdd_float(test_vec, ref_vec, 3));
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_getLinkAttribute, FixtureOutput) {
|
||||
|
||||
error = ENR_getLinkAttribute(p_handle, 1, ENR_flow, &array ,&array_dim);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
std::vector<float> ref_vec = { 1848.5812f,
|
||||
1220.4274f,
|
||||
130.11162f,
|
||||
187.6893f,
|
||||
119.8884f,
|
||||
40.464489f,
|
||||
-748.58112f,
|
||||
478.15378f,
|
||||
191.73459f,
|
||||
30.111609f,
|
||||
140.46449f,
|
||||
59.535515f,
|
||||
1848.5812f};
|
||||
|
||||
std::vector<float> test_vec;
|
||||
test_vec.assign(array, array + array_dim);
|
||||
|
||||
BOOST_CHECK(check_cdd_float(test_vec, ref_vec, 3));
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_getNodeResult, FixtureOutput) {
|
||||
|
||||
error = ENR_getNodeResult(p_handle, 1, 2, &array, &array_dim);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
std::vector<float> ref_vec = {0.041142918f,
|
||||
150.0f,
|
||||
987.98358f,
|
||||
120.45029f};
|
||||
|
||||
std::vector<float> test_vec;
|
||||
test_vec.assign(array, array + array_dim);
|
||||
|
||||
BOOST_CHECK(check_cdd_float(test_vec, ref_vec, 3));
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_getLinkResult, FixtureOutput) {
|
||||
|
||||
error = ENR_getLinkResult(p_handle, 24, 13, &array, &array_dim);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
std::vector<float> ref_vec = {0.58586824f,
|
||||
1892.2433f,
|
||||
0.0f,
|
||||
-200.71875f,
|
||||
1.0f,
|
||||
3.0f,
|
||||
1.0f,
|
||||
0.0f};
|
||||
|
||||
std::vector<float> test_vec;
|
||||
test_vec.assign(array, array + array_dim);
|
||||
|
||||
BOOST_CHECK(check_cdd_float(test_vec, ref_vec, 3));
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_getNodeSeries, FixtureOutput){
|
||||
|
||||
error = ENR_getNodeSeries(p_handle, 2, ENR_pressure, 0, 10, &array, &array_dim);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
std::vector<float> ref_vec = {119.25731f,
|
||||
120.45029f,
|
||||
121.19854f,
|
||||
122.00622f,
|
||||
122.37414f,
|
||||
122.8122f,
|
||||
122.82034f,
|
||||
122.90379f,
|
||||
123.40434f,
|
||||
123.81807f};
|
||||
|
||||
std::vector<float> test_vec;
|
||||
test_vec.assign(array, array + array_dim);
|
||||
|
||||
BOOST_CHECK(check_cdd_float(test_vec, ref_vec, 3));
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_getLinkSeries, FixtureOutput) {
|
||||
|
||||
error = ENR_getLinkSeries(p_handle, 2, ENR_flow, 0, 10, &array, &array_dim);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
std::vector<float> ref_vec = {1234.2072f,
|
||||
1220.4274f,
|
||||
1164.4f,
|
||||
1154.8175f,
|
||||
1100.0635f,
|
||||
1094.759f,
|
||||
1041.7854f,
|
||||
1040.7617f,
|
||||
1087.556f,
|
||||
1082.5011f};
|
||||
|
||||
std::vector<float> test_vec;
|
||||
test_vec.assign(array, array + array_dim);
|
||||
|
||||
BOOST_CHECK(check_cdd_float(test_vec, ref_vec, 3));
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_getNetReacts, FixtureOutput) {
|
||||
|
||||
error = ENR_getNetReacts(p_handle, &array, &array_dim);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
std::vector<float> ref_vec = {18806.59f,
|
||||
85424.438f,
|
||||
115174.05f,
|
||||
238972.66f};
|
||||
|
||||
std::vector<float> test_vec;
|
||||
test_vec.assign(array, array + array_dim);
|
||||
|
||||
BOOST_CHECK(check_cdd_float(test_vec, ref_vec, 2));
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_getEnergyUsage, FixtureOutput) {
|
||||
|
||||
int linkIdx;
|
||||
|
||||
error = ENR_getEnergyUsage(p_handle, 1, &linkIdx, &array, &array_dim);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
std::vector<float> ref_vec = {57.712959f,
|
||||
75.0f,
|
||||
880.41583f,
|
||||
96.254318f,
|
||||
96.707115f,
|
||||
0.0f};
|
||||
|
||||
std::vector<float> test_vec;
|
||||
test_vec.assign(array, array + array_dim);
|
||||
|
||||
BOOST_CHECK(check_cdd_float(test_vec, ref_vec, 3));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
@@ -1,35 +0,0 @@
|
||||
Type=Exe
|
||||
Form=frmMain.frm
|
||||
Module=basShellSync; ShellSync.bas
|
||||
Module=basNetRes; basNetRes.bas
|
||||
IconForm="frmMain"
|
||||
Startup="frmMain"
|
||||
HelpFile=""
|
||||
Title="Testing"
|
||||
ExeName32="BinaryCompare.exe"
|
||||
Command32=""
|
||||
Name="BinaryCompare"
|
||||
HelpContextID="0"
|
||||
CompatibleMode="0"
|
||||
MajorVer=1
|
||||
MinorVer=0
|
||||
RevisionVer=1
|
||||
AutoIncrementVer=1
|
||||
ServerSupportFiles=0
|
||||
VersionComments="by Elad Salomons"
|
||||
CompilationType=0
|
||||
OptimizationType=0
|
||||
FavorPentiumPro(tm)=0
|
||||
CodeViewDebugInfo=0
|
||||
NoAliasing=0
|
||||
BoundsCheck=0
|
||||
OverflowCheck=0
|
||||
FlPointCheck=0
|
||||
FDIVCheck=0
|
||||
UnroundedFP=0
|
||||
StartMode=0
|
||||
Unattended=0
|
||||
Retained=0
|
||||
ThreadPerObject=0
|
||||
MaxNumberOfThreads=1
|
||||
DebugStartupOption=0
|
||||
@@ -1,39 +0,0 @@
|
||||
Attribute VB_Name = "basShellSync"
|
||||
Option Explicit
|
||||
|
||||
Private Const INFINITE = &HFFFFFFFF
|
||||
Private Const SYNCHRONIZE = &H100000
|
||||
Private Const PROCESS_QUERY_INFORMATION = &H400&
|
||||
|
||||
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
|
||||
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
|
||||
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
|
||||
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
|
||||
Public Function ShellSync(ByVal PathName As String, ByVal WindowStyle As VbAppWinStyle) As Long
|
||||
'-----------------------------------------------------------------------------------------------
|
||||
'Shell and wait. Return exit code result, raise an
|
||||
'exception on any error.
|
||||
Dim lngPid As Long
|
||||
Dim lngHandle As Long
|
||||
Dim lngExitCode As Long
|
||||
|
||||
lngPid = Shell(PathName, WindowStyle)
|
||||
If lngPid <> 0 Then
|
||||
lngHandle = OpenProcess(SYNCHRONIZE Or PROCESS_QUERY_INFORMATION, 0, lngPid)
|
||||
If lngHandle <> 0 Then
|
||||
WaitForSingleObject lngHandle, INFINITE
|
||||
If GetExitCodeProcess(lngHandle, lngExitCode) <> 0 Then
|
||||
ShellSync = lngExitCode
|
||||
CloseHandle lngHandle
|
||||
Else
|
||||
CloseHandle lngHandle
|
||||
Err.Raise &H8004AA00, "ShellSync", "Failed to retrieve exit code, error " & CStr(Err.LastDllError)
|
||||
End If
|
||||
Else
|
||||
Err.Raise &H8004AA01, "ShellSync", "Failed to open child process"
|
||||
End If
|
||||
Else
|
||||
Err.Raise &H8004AA02, "ShellSync", "Failed to Shell child process"
|
||||
End If
|
||||
|
||||
End Function
|
||||
@@ -1,188 +0,0 @@
|
||||
Attribute VB_Name = "basNetRes"
|
||||
Public Type typNetRes
|
||||
nNodes As Long
|
||||
nLinks As Long
|
||||
|
||||
NodesID() As String
|
||||
LinksID() As String
|
||||
|
||||
NodesDemand() As Single
|
||||
NodesHead() As Single
|
||||
NodesPressure() As Single
|
||||
NodesQuality() As Single
|
||||
|
||||
LinksFlow() As Single
|
||||
LinksHeadloss() As Single
|
||||
LinksQuality() As Single
|
||||
LinksSetting() As Single
|
||||
LinksStatus() As Single
|
||||
LinksVelocity() As Single
|
||||
|
||||
End Type
|
||||
Public Function ReadOutputFile(OutFile As String, NetRes As typNetRes)
|
||||
'---------------------------------------------------------------------------------------
|
||||
Dim i As Long, F As Long, r As Long, nRep As Long, j As Long
|
||||
Dim tmpArr() As Single
|
||||
Dim pos As Long, N As Long
|
||||
Dim tmpLong As Long, tmpSingle As Single
|
||||
Dim ReportingTimeStep As Long, ReportingStartTime As Long
|
||||
Dim SimulationDuration As Long
|
||||
Dim ProblemTitletLine As String * 80
|
||||
Dim NumberOfNodes As Long
|
||||
Dim NumberOfLinks As Long
|
||||
Dim NumberOfReservoirsAndTanks As Long
|
||||
Dim NumberOfPumps As Long
|
||||
Dim NumberOfValves As Long
|
||||
Dim WaterQualityOption As Long
|
||||
Dim FlowUnitsOption As Long, PressureUnitsOption As Long
|
||||
Dim NameOfFile As String * 260, tmpString32 As String * 32
|
||||
Dim ii As Long
|
||||
Dim WarningFlag As Long
|
||||
|
||||
With NetRes
|
||||
pos = 1: N = 0
|
||||
F = FreeFile
|
||||
Open OutFile For Binary As #F
|
||||
Get #F, pos, tmpLong: pos = pos + 4
|
||||
Get #F, pos, tmpLong: pos = pos + 4
|
||||
Get #F, pos, NumberOfNodes: pos = pos + 4
|
||||
Get #F, pos, NumberOfReservoirsAndTanks: pos = pos + 4
|
||||
Get #F, pos, NumberOfLinks: pos = pos + 4
|
||||
Get #F, pos, NumberOfPumps: pos = pos + 4
|
||||
Get #F, pos, NumberOfValves: pos = pos + 4
|
||||
Get #F, pos, WaterQualityOption: pos = pos + 4
|
||||
Get #F, pos, tmpLong: pos = pos + 4
|
||||
Get #F, pos, FlowUnitsOption: pos = pos + 4
|
||||
Get #F, pos, PressureUnitsOption: pos = pos + 4
|
||||
Get #F, pos, tmpLong: pos = pos + 4
|
||||
Get #F, pos, ReportingStartTime: pos = pos + 4
|
||||
Get #F, pos, ReportingTimeStep: pos = pos + 4
|
||||
Get #F, pos, SimulationDuration: pos = pos + 4
|
||||
Get #F, pos, ProblemTitletLine: pos = pos + 80
|
||||
Get #F, pos, ProblemTitletLine: pos = pos + 80
|
||||
Get #F, pos, ProblemTitletLine: pos = pos + 80
|
||||
Get #F, pos, NameOfFile: pos = pos + 260
|
||||
Get #F, pos, NameOfFile: pos = pos + 260
|
||||
Get #F, pos, tmpString32: pos = pos + 32
|
||||
Get #F, pos, tmpString32: pos = pos + 32
|
||||
.nNodes = NumberOfNodes
|
||||
.nLinks = NumberOfLinks
|
||||
ReDim .NodesID(.nNodes)
|
||||
For j = 1 To NumberOfNodes
|
||||
Get #F, pos, tmpString32: pos = pos + 32
|
||||
i = InStr(1, tmpString32, Chr(0))
|
||||
.NodesID(j) = Mid(tmpString32, 1, i - 1)
|
||||
Next j
|
||||
ReDim .LinksID(.nLinks)
|
||||
For j = 1 To NumberOfLinks
|
||||
Get #F, pos, tmpString32: pos = pos + 32
|
||||
i = InStr(1, tmpString32, Chr(0))
|
||||
.LinksID(j) = Mid(tmpString32, 1, i - 1)
|
||||
Next j
|
||||
For j = 1 To NumberOfLinks * 3 'Index of Start Node of Each Link + Index of End Node of Each Link + Type Code of Each Link
|
||||
Get #F, pos, tmpLong: pos = pos + 4
|
||||
Next j
|
||||
For j = 1 To NumberOfReservoirsAndTanks 'Node Index of Each Tank
|
||||
Get #F, pos, tmpLong: pos = pos + 4
|
||||
Next j
|
||||
For j = 1 To NumberOfReservoirsAndTanks 'Cross-Sectional Area of Each Tank
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
Next j
|
||||
For j = 1 To NumberOfNodes 'Elevation of Each Node
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
Next j
|
||||
For j = 1 To NumberOfLinks 'Length of Each Link
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
Next j
|
||||
For j = 1 To NumberOfLinks 'Diameter of Each Link
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
Next j
|
||||
For j = 1 To NumberOfPumps 'Energy Use Section
|
||||
Get #F, pos, tmpLong: pos = pos + 4 'Pump Index in List of Links
|
||||
Get #F, pos, tmpSingle: pos = pos + 4 'Pump Utilization (%)
|
||||
Get #F, pos, tmpSingle: pos = pos + 4 'Average Efficiency (%)
|
||||
Get #F, pos, tmpSingle: pos = pos + 4 'Average Kwatts/Million Gallons (/Meter3)
|
||||
Get #F, pos, tmpSingle: pos = pos + 4 'Average Kwatts
|
||||
Get #F, pos, tmpSingle: pos = pos + 4 'Peak Kwatts
|
||||
Get #F, pos, tmpSingle: pos = pos + 4 'Average Cost Per Day
|
||||
Next j
|
||||
Get #F, pos, tmpSingle: pos = pos + 4 'Overall Peak Energy Usage
|
||||
|
||||
'reporting
|
||||
nRep = SimulationDuration / ReportingTimeStep + 1
|
||||
ReDim tmpArr(nRep)
|
||||
ReDim .NodesDemand(.nNodes, nRep)
|
||||
ReDim .NodesHead(.nNodes, nRep)
|
||||
ReDim .NodesPressure(.nNodes, nRep)
|
||||
ReDim .NodesQuality(.nNodes, nRep)
|
||||
|
||||
ReDim .LinksFlow(.nLinks, nRep)
|
||||
ReDim .LinksHeadloss(.nLinks, nRep)
|
||||
ReDim .LinksQuality(.nLinks, nRep)
|
||||
ReDim .LinksSetting(.nLinks, nRep)
|
||||
ReDim .LinksStatus(.nLinks, nRep)
|
||||
ReDim .LinksVelocity(.nLinks, nRep)
|
||||
|
||||
For r = 1 To nRep
|
||||
For j = 1 To NumberOfNodes 'Demand at Each Node
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
.NodesDemand(j, r) = tmpSingle
|
||||
Next j
|
||||
For j = 1 To NumberOfNodes 'Hydraulic Head at Each Node
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
.NodesHead(j, r) = tmpSingle
|
||||
Next j
|
||||
For j = 1 To NumberOfNodes 'Pressure at Each Node
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
.NodesPressure(j, r) = tmpSingle
|
||||
Next j
|
||||
For j = 1 To NumberOfNodes 'Water Quality at Each Node
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
.NodesPressure(j, r) = tmpSingle
|
||||
Next j
|
||||
For j = 1 To NumberOfLinks 'Flow in Each Link
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
.LinksFlow(j, r) = tmpSingle
|
||||
Next j
|
||||
For j = 1 To NumberOfLinks 'Velocity in Each Link
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
.LinksVelocity(j, r) = tmpSingle
|
||||
Next j
|
||||
For j = 1 To NumberOfLinks 'Headloss per 1000 Units of Length for Each Link
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
.LinksHeadloss(j, r) = tmpSingle
|
||||
Next j
|
||||
For j = 1 To NumberOfLinks 'Average Water Quality in Each Link
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
.LinksQuality(j, r) = tmpSingle
|
||||
Next j
|
||||
For j = 1 To NumberOfLinks 'Status Code for Each Link
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
.LinksStatus(j, r) = tmpSingle
|
||||
Next j
|
||||
For j = 1 To NumberOfLinks 'Setting for Each Link
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
.LinksSetting(j, r) = tmpSingle
|
||||
Next j
|
||||
For j = 1 To NumberOfLinks 'Reaction Rate for Each Link (mass/L/day)
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
Next j
|
||||
For j = 1 To NumberOfLinks 'Friction Factor for Each Link
|
||||
Get #F, pos, tmpSingle: pos = pos + 4
|
||||
Next j
|
||||
Next r
|
||||
|
||||
'Epilog Section
|
||||
Get #F, pos, tmpSingle: pos = pos + 4 'Average bulk reaction rate (mass/hr)
|
||||
Get #F, pos, tmpSingle: pos = pos + 4 'Average wall reaction rate (mass/hr)
|
||||
Get #F, pos, tmpSingle: pos = pos + 4 'Average tank reaction rate (mass/hr)
|
||||
Get #F, pos, tmpSingle: pos = pos + 4 'Average source inflow rate (mass/hr)
|
||||
Get #F, pos, tmpLong: pos = pos + 4 'Number of Reporting Periods
|
||||
Get #F, pos, WarningFlag: pos = pos + 4 'Warning Flag
|
||||
Get #F, pos, tmpLong: pos = pos + 4 'Magic Number ( = 516114521)
|
||||
|
||||
Close #F
|
||||
End With
|
||||
|
||||
End Function
|
||||
|
||||
@@ -1,179 +0,0 @@
|
||||
VERSION 5.00
|
||||
Begin VB.Form frmMain
|
||||
Caption = "Form1"
|
||||
ClientHeight = 5304
|
||||
ClientLeft = 48
|
||||
ClientTop = 396
|
||||
ClientWidth = 9648
|
||||
LinkTopic = "Form1"
|
||||
ScaleHeight = 5304
|
||||
ScaleWidth = 9648
|
||||
StartUpPosition = 3 'Windows Default
|
||||
Begin VB.ListBox List1
|
||||
Height = 4272
|
||||
Left = 1680
|
||||
TabIndex = 1
|
||||
Top = 360
|
||||
Width = 7092
|
||||
End
|
||||
Begin VB.CommandButton cmdRun
|
||||
Caption = "RUN"
|
||||
Height = 372
|
||||
Left = 360
|
||||
TabIndex = 0
|
||||
Top = 360
|
||||
Width = 972
|
||||
End
|
||||
End
|
||||
Attribute VB_Name = "frmMain"
|
||||
Attribute VB_GlobalNameSpace = False
|
||||
Attribute VB_Creatable = False
|
||||
Attribute VB_PredeclaredId = True
|
||||
Attribute VB_Exposed = False
|
||||
Option Explicit
|
||||
|
||||
Dim NetName As String
|
||||
|
||||
Dim net1 As typNetRes
|
||||
Dim net2 As typNetRes
|
||||
|
||||
Private Sub CompareVersions(NetName As String)
|
||||
'-----------------------------------------------
|
||||
Dim i As Long
|
||||
Dim v1 As Single, v2 As Single
|
||||
Dim T As Long
|
||||
Dim L As Long
|
||||
Dim maxDiff As Single
|
||||
Dim diff As Single
|
||||
Dim nRep As Long
|
||||
Dim F As Long
|
||||
|
||||
i = ShellSync("epanet2d.exe nets\" & NetName & ".inp nets\" & NetName & "_1.rep nets\" & NetName & "_1.out", vbNormalFocus)
|
||||
i = ReadOutputFile("nets\" & NetName & "_1.out", net1)
|
||||
|
||||
i = ShellSync("epanet2.exe nets\" & NetName & ".inp nets\" & NetName & "_2.rep nets\" & NetName & "_2.out", vbNormalFocus)
|
||||
i = ReadOutputFile("nets\" & NetName & "_2.out", net2)
|
||||
|
||||
F = FreeFile
|
||||
Open App.Path & "\Nets\" & NetName & ".dif" For Output As #F
|
||||
|
||||
nRep = UBound(net1.LinksFlow, 2)
|
||||
|
||||
maxDiff = 100: diff = 101
|
||||
For L = 1 To net1.nLinks
|
||||
For T = 1 To nRep
|
||||
v1 = net1.LinksFlow(L, T)
|
||||
v2 = net2.LinksFlow(L, T)
|
||||
If Abs(v1 - v2) > 0 Then diff = -Round(Log(Abs(v1 - v2)) / Log(10))
|
||||
If diff < maxDiff Then maxDiff = diff
|
||||
Next T
|
||||
Next L
|
||||
Print #F, "Links Flow max diff = " & Format(maxDiff, "0")
|
||||
|
||||
maxDiff = 100: diff = 101
|
||||
For L = 1 To net1.nLinks
|
||||
For T = 1 To nRep
|
||||
v1 = net1.LinksHeadloss(L, T)
|
||||
v2 = net2.LinksHeadloss(L, T)
|
||||
If Abs(v1 - v2) > 0 Then diff = -Round(Log(Abs(v1 - v2)) / Log(10))
|
||||
If diff < maxDiff Then maxDiff = diff
|
||||
Next T
|
||||
Next L
|
||||
Print #F, "Links Headloss max diff = " & Format(maxDiff, "0")
|
||||
|
||||
maxDiff = 100: diff = 101
|
||||
For L = 1 To net1.nLinks
|
||||
For T = 1 To nRep
|
||||
v1 = net1.LinksQuality(L, T)
|
||||
v2 = net2.LinksQuality(L, T)
|
||||
If Abs(v1 - v2) > 0 Then diff = -Round(Log(Abs(v1 - v2)) / Log(10))
|
||||
If diff < maxDiff Then maxDiff = diff
|
||||
Next T
|
||||
Next L
|
||||
Print #F, "Links Quality max diff = " & Format(maxDiff, "0")
|
||||
|
||||
maxDiff = 100: diff = 101
|
||||
For L = 1 To net1.nLinks
|
||||
For T = 1 To nRep
|
||||
v1 = net1.LinksVelocity(L, T)
|
||||
v2 = net2.LinksVelocity(L, T)
|
||||
If Abs(v1 - v2) > 0 Then diff = -Round(Log(Abs(v1 - v2)) / Log(10))
|
||||
If diff < maxDiff Then maxDiff = diff
|
||||
Next T
|
||||
Next L
|
||||
Print #F, "Links Velocity max diff = " & Format(maxDiff, "0")
|
||||
|
||||
maxDiff = 100: diff = 101
|
||||
For L = 1 To net1.nNodes
|
||||
For T = 1 To nRep
|
||||
v1 = net1.NodesDemand(L, T)
|
||||
v2 = net2.NodesDemand(L, T)
|
||||
If Abs(v1 - v2) > 0 Then diff = -Round(Log(Abs(v1 - v2)) / Log(10))
|
||||
If diff < maxDiff Then maxDiff = diff
|
||||
Next T
|
||||
Next L
|
||||
Print #F, "Nodes Demand max diff = " & Format(maxDiff, "0")
|
||||
|
||||
maxDiff = 100: diff = 101
|
||||
For L = 1 To net1.nNodes
|
||||
For T = 1 To nRep
|
||||
v1 = net1.NodesHead(L, T)
|
||||
v2 = net2.NodesHead(L, T)
|
||||
If Abs(v1 - v2) > 0 Then diff = -Round(Log(Abs(v1 - v2)) / Log(10))
|
||||
If diff < maxDiff Then maxDiff = diff
|
||||
Next T
|
||||
Next L
|
||||
Print #F, "Nodes Head max diff = " & Format(maxDiff, "0")
|
||||
|
||||
maxDiff = 100: diff = 101
|
||||
For L = 1 To net1.nNodes
|
||||
For T = 1 To nRep
|
||||
v1 = net1.NodesPressure(L, T)
|
||||
v2 = net2.NodesPressure(L, T)
|
||||
If Abs(v1 - v2) > 0 Then diff = -Round(Log(Abs(v1 - v2)) / Log(10))
|
||||
If diff < maxDiff Then maxDiff = diff
|
||||
Next T
|
||||
Next L
|
||||
Print #F, "Nodes Pressure max diff = " & Format(maxDiff, "0")
|
||||
|
||||
maxDiff = 100: diff = 101
|
||||
For L = 1 To net1.nNodes
|
||||
For T = 1 To nRep
|
||||
v1 = net1.NodesQuality(L, T)
|
||||
v2 = net2.NodesQuality(L, T)
|
||||
If Abs(v1 - v2) > 0 Then diff = -Round(Log(Abs(v1 - v2))) / Log(10)
|
||||
If diff < maxDiff Then maxDiff = diff
|
||||
Next T
|
||||
Next L
|
||||
Print #F, "Nodes Quality max diff = " & Format(maxDiff, "0")
|
||||
|
||||
Close #F
|
||||
|
||||
End Sub
|
||||
|
||||
Private Sub cmdRun_Click()
|
||||
'----------------------------------------------
|
||||
Dim fName As String
|
||||
|
||||
fName = Dir(App.Path & "\Nets\*.inp")
|
||||
If fName <> "" Then
|
||||
Do
|
||||
List1.AddItem fName: DoEvents
|
||||
fName = StrReverse(fName)
|
||||
fName = Mid(fName, 5)
|
||||
fName = StrReverse(fName)
|
||||
Call CompareVersions(fName)
|
||||
fName = Dir
|
||||
Loop Until fName = ""
|
||||
End If
|
||||
|
||||
End Sub
|
||||
|
||||
|
||||
Private Sub Form_Load()
|
||||
|
||||
List1.Clear
|
||||
|
||||
End Sub
|
||||
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
Links Flow max diff = 3
|
||||
Links Headloss max diff = 4
|
||||
Links Quality max diff = 3
|
||||
Links Velocity max diff = 6
|
||||
Nodes Demand max diff = 3
|
||||
Nodes Head max diff = 5
|
||||
Nodes Pressure max diff = 3
|
||||
Nodes Quality max diff = 100
|
||||
@@ -1,311 +0,0 @@
|
||||
[TITLE]
|
||||
EPANET Example Network 2
|
||||
Example of modeling a 55-hour fluoride tracer study.
|
||||
Measured fluoride data is contained in the file Net2-FL.dat
|
||||
and should be registered with the project to produce a
|
||||
Calibration Report (select Calibration Data from the Project
|
||||
menu).
|
||||
|
||||
[JUNCTIONS]
|
||||
;ID Elev Demand Pattern
|
||||
1 50 -694.4 2 ;
|
||||
2 100 8 ;
|
||||
3 60 14 ;
|
||||
4 60 8 ;
|
||||
5 100 8 ;
|
||||
6 125 5 ;
|
||||
7 160 4 ;
|
||||
8 110 9 ;
|
||||
9 180 14 ;
|
||||
10 130 5 ;
|
||||
11 185 34.78 ;
|
||||
12 2100 16 ;
|
||||
13 210 2 ;
|
||||
14 200 2 ;
|
||||
15 190 2 ;
|
||||
16 150 20 ;
|
||||
17 180 20 ;
|
||||
18 100 20 ;
|
||||
19 150 5 ;
|
||||
20 170 19 ;
|
||||
21 150 16 ;
|
||||
22 200 10 ;
|
||||
23 230 8 ;
|
||||
24 190 11 ;
|
||||
25 230 6 ;
|
||||
27 130 8 ;
|
||||
28 110 0 ;
|
||||
29 110 7 ;
|
||||
30 130 3 ;
|
||||
31 190 17 ;
|
||||
32 110 17 ;
|
||||
33 180 1.5 ;
|
||||
34 190 1.5 ;
|
||||
35 110 0 ;
|
||||
36 110 1 ;
|
||||
|
||||
[RESERVOIRS]
|
||||
;ID Head Pattern
|
||||
|
||||
[TANKS]
|
||||
;ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve
|
||||
26 235 56.7 50 70 50 0 ;
|
||||
|
||||
[PIPES]
|
||||
;ID Node1 Node2 Length Diameter Roughness MinorLoss Status
|
||||
1 1 2 2400 12 100 0 Open ;
|
||||
2 2 5 800 12 100 0 Open ;
|
||||
3 2 3 1300 8 100 0 Open ;
|
||||
4 3 4 1200 8 100 0 Open ;
|
||||
5 4 5 1000 12 100 0 Open ;
|
||||
6 5 6 1200 12 100 0 Open ;
|
||||
7 6 7 2700 12 100 0 Open ;
|
||||
8 7 8 1200 12 140 0 Open ;
|
||||
9 7 9 400 12 100 0 Open ;
|
||||
10 8 10 1000 8 140 0 Open ;
|
||||
11 9 11 700 12 100 0 Open ;
|
||||
12 11 12 1900 12 100 0 Open ;
|
||||
13 12 13 600 12 100 0 Open ;
|
||||
14 13 14 400 12 100 0 Open ;
|
||||
15 14 15 300 12 100 0 Open ;
|
||||
16 13 16 1500 8 100 0 Open ;
|
||||
17 15 17 1500 8 100 0 Open ;
|
||||
18 16 17 600 8 100 0 Open ;
|
||||
19 17 18 700 12 100 0 Open ;
|
||||
20 18 32 350 12 100 0 Open ;
|
||||
21 16 19 1400 8 100 0 Open ;
|
||||
22 14 20 1100 12 100 0 Open ;
|
||||
23 20 21 1300 8 100 0 Open ;
|
||||
24 21 22 1300 8 100 0 Open ;
|
||||
25 20 22 1300 8 100 0 Open ;
|
||||
26 24 23 600 12 100 0 Open ;
|
||||
27 15 24 250 12 100 0 Open ;
|
||||
28 23 25 300 12 100 0 Open ;
|
||||
29 25 26 200 12 100 0 Open ;
|
||||
30 25 31 600 12 100 0 Open ;
|
||||
31 31 27 400 8 100 0 Open ;
|
||||
32 27 29 400 8 100 0 Open ;
|
||||
34 29 28 700 8 100 0 Open ;
|
||||
35 22 33 1000 8 100 0 Open ;
|
||||
36 33 34 400 8 100 0 Open ;
|
||||
37 32 19 500 8 100 0 Open ;
|
||||
38 29 35 500 8 100 0 Open ;
|
||||
39 35 30 1000 8 100 0 Open ;
|
||||
40 28 35 700 8 100 0 Open ;
|
||||
41 28 36 300 8 100 0 Open ;
|
||||
|
||||
[PUMPS]
|
||||
;ID Node1 Node2 Parameters
|
||||
|
||||
[VALVES]
|
||||
;ID Node1 Node2 Diameter Type Setting MinorLoss
|
||||
|
||||
[TAGS]
|
||||
|
||||
[DEMANDS]
|
||||
;Junction Demand Pattern Category
|
||||
|
||||
[STATUS]
|
||||
;ID Status/Setting
|
||||
|
||||
[PATTERNS]
|
||||
;ID Multipliers
|
||||
;Demand Pattern
|
||||
1 1.26 1.04 .97 .97 .89 1.19
|
||||
1 1.28 .67 .67 1.34 2.46 .97
|
||||
1 .92 .68 1.43 .61 .31 .78
|
||||
1 .37 .67 1.26 1.56 1.19 1.26
|
||||
1 .6 1.1 1.03 .73 .88 1.06
|
||||
1 .99 1.72 1.12 1.34 1.12 .97
|
||||
1 1.04 1.15 .91 .61 .68 .46
|
||||
1 .51 .74 1.12 1.34 1.26 .97
|
||||
1 .82 1.37 1.03 .81 .88 .81
|
||||
1 .81
|
||||
;Pump Station Outflow Pattern
|
||||
2 .96 .96 .96 .96 .96 .96
|
||||
2 .62 0 0 0 0 0
|
||||
2 .8 1 1 1 1 .15
|
||||
2 0 0 0 0 0 0
|
||||
2 .55 .92 .92 .92 .92 .9
|
||||
2 .9 .45 0 0 0 0
|
||||
2 0 .7 1 1 1 1
|
||||
2 .2 0 0 0 0 0
|
||||
2 0 .74 .92 .92 .92 .92
|
||||
2 .92
|
||||
;Pump Station Fluoride Pattern
|
||||
3 .98 1.02 1.05 .99 .64 .46
|
||||
3 .35 .35 .35 .35 .35 .35
|
||||
3 .17 .17 .13 .13 .13 .15
|
||||
3 .15 .15 .15 .15 .15 .15
|
||||
3 .15 .12 .1 .08 .11 .09
|
||||
3 .09 .08 .08 .08 .08 .08
|
||||
3 .08 .09 .07 .07 .09 .09
|
||||
3 .09 .09 .09 .09 .09 .09
|
||||
3 .09 .08 .35 .72 .82 .92
|
||||
3 1
|
||||
|
||||
[CURVES]
|
||||
;ID X-Value Y-Value
|
||||
|
||||
[CONTROLS]
|
||||
|
||||
|
||||
[RULES]
|
||||
|
||||
|
||||
[ENERGY]
|
||||
Global Efficiency 75
|
||||
Global Price 0.0
|
||||
Demand Charge 0.0
|
||||
|
||||
[EMITTERS]
|
||||
;Junction Coefficient
|
||||
|
||||
[QUALITY]
|
||||
;Node InitQual
|
||||
1 1.0
|
||||
2 1.0
|
||||
3 1.0
|
||||
4 1.0
|
||||
5 1.0
|
||||
6 1.0
|
||||
7 1.0
|
||||
8 1.0
|
||||
9 1.0
|
||||
10 1.0
|
||||
11 1.0
|
||||
12 1.0
|
||||
13 1.0
|
||||
14 1.0
|
||||
15 1.0
|
||||
16 1.0
|
||||
17 1.0
|
||||
18 1.0
|
||||
19 1.0
|
||||
20 1.0
|
||||
21 1.0
|
||||
22 1.0
|
||||
23 1.0
|
||||
24 1.0
|
||||
25 1.0
|
||||
27 1.0
|
||||
28 1.0
|
||||
29 1.0
|
||||
30 1.0
|
||||
31 1.0
|
||||
32 1.0
|
||||
33 1.0
|
||||
34 1.0
|
||||
35 1.0
|
||||
36 1.0
|
||||
26 1.0
|
||||
|
||||
[SOURCES]
|
||||
;Node Type Quality Pattern
|
||||
1 CONCEN 1.0 3
|
||||
|
||||
[REACTIONS]
|
||||
;Type Pipe/Tank Coefficient
|
||||
|
||||
|
||||
[REACTIONS]
|
||||
Order Bulk 1
|
||||
Order Tank 1
|
||||
Order Wall 1
|
||||
Global Bulk 0.0
|
||||
Global Wall 0.0
|
||||
Limiting Potential 0.0
|
||||
Roughness Correlation 0.0
|
||||
|
||||
[MIXING]
|
||||
;Tank Model
|
||||
|
||||
[TIMES]
|
||||
Duration 55:00
|
||||
Hydraulic Timestep 1:00
|
||||
Quality Timestep 0:05
|
||||
Pattern Timestep 1:00
|
||||
Pattern Start 0:00
|
||||
Report Timestep 1:00
|
||||
Report Start 0:00
|
||||
Start ClockTime 8 am
|
||||
Statistic NONE
|
||||
|
||||
[REPORT]
|
||||
Status Full
|
||||
Summary No
|
||||
Page 0
|
||||
|
||||
[OPTIONS]
|
||||
Units GPM
|
||||
Headloss H-W
|
||||
Specific Gravity 1.0
|
||||
Viscosity 1.0
|
||||
Trials 40
|
||||
Accuracy 0.001
|
||||
CHECKFREQ 2
|
||||
MAXCHECK 10
|
||||
DAMPLIMIT 0
|
||||
Unbalanced Continue 10
|
||||
Pattern 1
|
||||
Demand Multiplier 1.0
|
||||
Emitter Exponent 0.5
|
||||
Quality Fluoride mg/L
|
||||
Diffusivity 1.0
|
||||
Tolerance 0.01
|
||||
|
||||
[COORDINATES]
|
||||
;Node X-Coord Y-Coord
|
||||
1 21.00 4.00
|
||||
2 19.00 20.00
|
||||
3 11.00 21.00
|
||||
4 14.00 28.00
|
||||
5 19.00 25.00
|
||||
6 28.00 23.00
|
||||
7 36.00 39.00
|
||||
8 38.00 30.00
|
||||
9 36.00 42.00
|
||||
10 37.00 23.00
|
||||
11 37.00 49.00
|
||||
12 39.00 60.00
|
||||
13 38.00 64.00
|
||||
14 38.00 66.00
|
||||
15 37.00 69.00
|
||||
16 27.00 65.00
|
||||
17 27.00 69.00
|
||||
18 23.00 68.00
|
||||
19 21.00 59.00
|
||||
20 45.00 68.00
|
||||
21 51.00 62.00
|
||||
22 54.00 69.00
|
||||
23 35.00 74.00
|
||||
24 37.00 71.00
|
||||
25 35.00 76.00
|
||||
27 39.00 87.00
|
||||
28 49.00 85.00
|
||||
29 42.00 86.00
|
||||
30 47.00 80.00
|
||||
31 37.00 80.00
|
||||
32 23.00 64.00
|
||||
33 56.00 73.00
|
||||
34 56.00 77.00
|
||||
35 43.00 81.00
|
||||
36 53.00 87.00
|
||||
26 33.00 76.00
|
||||
|
||||
[VERTICES]
|
||||
;Link X-Coord Y-Coord
|
||||
|
||||
[LABELS]
|
||||
;X-Coord Y-Coord Label & Anchor Node
|
||||
24.00 7.00 "Pump"
|
||||
24.00 4.00 "Station"
|
||||
26.76 77.42 "Tank"
|
||||
|
||||
[BACKDROP]
|
||||
DIMENSIONS 8.75 -0.15 58.25 91.15
|
||||
UNITS None
|
||||
FILE
|
||||
OFFSET 0.00 0.00
|
||||
|
||||
[END]
|
||||
@@ -1,12 +0,0 @@
|
||||
The program will run all INP files in the Nets sub-directory.
|
||||
A report, binary output files and a .dif file will be created for each INP file.
|
||||
The report is the min(—log10(abs(X1-X2))) where X1 and X2 are the results arrays obtains from the two binary files.
|
||||
|
||||
Files needed in the code directory:
|
||||
epanet2d.exe is the official EPANET standalone version.
|
||||
epanet2.exe is the current development version (the one being tested).
|
||||
|
||||
How to use: run the program and click the RUN button.
|
||||
|
||||
By Elad Salomons
|
||||
email: selad@optiwater.com
|
||||
79
tests/test_analysis.cpp
Normal file
79
tests/test_analysis.cpp
Normal file
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_analysis.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 03/21/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
//#define BOOST_ALL_DYN_LINK
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include "test_toolkit.hpp"
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (test_analysis)
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_anlys_getoption, FixtureOpenClose)
|
||||
{
|
||||
int i;
|
||||
|
||||
std::vector<double> test(23);
|
||||
double *array = test.data();
|
||||
|
||||
std::vector<double> ref = {40.0, 0.001, 0.01, 0.5, 1.0, 0.0, 0.0, 0.0, 75.0, 0.0, 0.0, 0.0,
|
||||
1.0, 1.0, 10.0, 2.0, 10.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0};
|
||||
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_solveQ(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
|
||||
for (i=EN_TRIALS; i<=EN_CONCENLIMIT; i++) {
|
||||
error = EN_getoption(ph, i, array++);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(ref.begin(), ref.end(), test.begin(), test.end());
|
||||
|
||||
double temp;
|
||||
error = EN_getoption(ph, 25, &temp);
|
||||
BOOST_CHECK(error == 251);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_anlys_gettimeparam, FixtureOpenClose)
|
||||
{
|
||||
int i;
|
||||
|
||||
std::vector<long> test(16);
|
||||
long *array = test.data();
|
||||
|
||||
std::vector<long> ref = {86400, 3600, 300, 7200, 0, 3600, 0, 360, 0, 25, 0, 86400, 86400, 0, 3600, 0};
|
||||
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_solveQ(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
|
||||
for (i=EN_DURATION; i<=EN_NEXTEVENTTANK; i++) {
|
||||
error = EN_gettimeparam(ph, i, array++);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(ref.begin(), ref.end(), test.begin(), test.end());
|
||||
|
||||
long temp;
|
||||
error = EN_gettimeparam(ph, 18, &temp);
|
||||
BOOST_CHECK(error == 251);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
85
tests/test_control.cpp
Normal file
85
tests/test_control.cpp
Normal file
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_control.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 03/21/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
This is a test for the API functions that adds rules and deletes
|
||||
nodes and links from a project. Deletion can be conditional on
|
||||
node or link appearing in any simple or rule-based controls.
|
||||
*/
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include "test_toolkit.hpp"
|
||||
|
||||
|
||||
char R1[] = "RULE 1 \n IF NODE 2 LEVEL < 100 \n THEN LINK 9 STATUS = OPEN";
|
||||
char R2[] = "RULE 2\nIF SYSTEM TIME = 4\nTHEN LINK 9 STATUS = CLOSED\nAND LINK 31 STATUS = CLOSED";
|
||||
char R3[] = "RULE 3\nIF NODE 23 PRESSURE ABOVE 140\nAND NODE 2 LEVEL > 120\n"
|
||||
"THEN LINK 113 STATUS = CLOSED\nELSE LINK 22 STATUS = CLOSED";
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (test_controls)
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_add_get_rule, FixtureOpenClose)
|
||||
{
|
||||
int ruleCount, nP, nTA, nEA;
|
||||
int link113, node23, link22, pump9_before, pump9_after;
|
||||
double priority;
|
||||
|
||||
|
||||
// Add the 3 rules to the project
|
||||
error = EN_addrule(ph, R1);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addrule(ph, R2);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addrule(ph, R3);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Check that rules were added
|
||||
error = EN_getcount(ph, EN_RULECOUNT, &ruleCount);
|
||||
BOOST_CHECK(ruleCount == 3);
|
||||
|
||||
// Check the number of clauses in rule 3
|
||||
error = EN_getrule(ph, 3, &nP, &nTA, &nEA, &priority);
|
||||
BOOST_CHECK(nP == 2);
|
||||
BOOST_CHECK(nTA == 1);
|
||||
BOOST_CHECK(nTA == 1);
|
||||
|
||||
// Try to delete link 113 conditionally which will fail
|
||||
// because it's in rule 3
|
||||
EN_getlinkindex(ph, (char *)"113", &link113);
|
||||
error = EN_deletelink(ph, link113, EN_CONDITIONAL);
|
||||
BOOST_REQUIRE(error == 261);
|
||||
|
||||
// Delete node 23 unconditionally which will result in the
|
||||
// deletion of rule 3 as well as links 22 and 113
|
||||
EN_getnodeindex(ph, (char *)"23", &node23);
|
||||
EN_getlinkindex(ph, (char *)"22", &link22);
|
||||
EN_getlinkindex(ph, (char *)"9", &pump9_before);
|
||||
error = EN_deletenode(ph, node23, EN_UNCONDITIONAL);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Check that there are now only 2 rules
|
||||
error = EN_getcount(ph, EN_RULECOUNT, &ruleCount);
|
||||
BOOST_CHECK(ruleCount == 2);
|
||||
|
||||
// Check that link 22 no longer exists
|
||||
error = EN_getlinkindex(ph, (char *)"22", &link22);
|
||||
BOOST_CHECK(error > 0);
|
||||
|
||||
// Check that the index of pump9 has been reduced by 2
|
||||
error = EN_getlinkindex(ph, (char *)"9", &pump9_after);
|
||||
BOOST_CHECK(pump9_before - pump9_after == 2);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
92
tests/test_curve.cpp
Normal file
92
tests/test_curve.cpp
Normal file
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_curve.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 03/21/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include "test_toolkit.hpp"
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (curve)
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_curve_comments, FixtureOpenClose)
|
||||
{
|
||||
int index;
|
||||
char comment[EN_MAXMSG + 1];
|
||||
|
||||
// Set curve comments
|
||||
error = EN_getcurveindex(ph, (char *)"1", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setcomment(ph, EN_CURVE, index, (char *)"Curve 1");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Check curve comments
|
||||
error = EN_getcurveindex(ph, (char *)"1", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getcomment(ph, EN_CURVE, index, comment);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(check_string(comment, (char *)"Curve 1"));
|
||||
|
||||
// Test of EN_setcurve and EN_getcurve
|
||||
int i;
|
||||
char id1[] = "NewCurve";
|
||||
int n1 = 5;
|
||||
double X1[] = {16.88889, 19.5, 22.13889, 25.94445, 33.33334};
|
||||
double Y1[] = {156.7, 146.5, 136.2, 117.9, 50.0};
|
||||
int n2;
|
||||
double X2[5], Y2[5];
|
||||
char id2[EN_MAXID+1];
|
||||
|
||||
// Add data to a new curve
|
||||
error = EN_addcurve(ph, id1);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getcurveindex(ph, id1, &i);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setcurve(ph, i, X1, Y1, n1);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Retrieve data from curve
|
||||
error = EN_getcurve(ph, i, id2, &n2, X2, Y2);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(check_string(id2, id1));
|
||||
BOOST_REQUIRE(n2 == n1);
|
||||
for (i = 0; i < n1; i++)
|
||||
{
|
||||
BOOST_CHECK(X1[i] == X2[i]);
|
||||
BOOST_CHECK(Y1[i] == Y2[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_curve_id_isvalid, FixtureInitClose)
|
||||
{
|
||||
int index;
|
||||
|
||||
error = EN_addcurve(ph, (char *)"C1");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_addcurve(ph, (char *)"C 2");
|
||||
BOOST_REQUIRE(error == 252);
|
||||
|
||||
error = EN_addcurve(ph, (char *)"\"C2");
|
||||
BOOST_REQUIRE(error == 252);
|
||||
|
||||
error = EN_addcurve(ph, (char *)"C;2");
|
||||
BOOST_REQUIRE(error == 252);
|
||||
|
||||
EN_getcurveindex(ph, (char *)"C1", &index);
|
||||
error = EN_setcurveid(ph, index, (char *)"C;2");
|
||||
BOOST_REQUIRE(error == 252);
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
126
tests/test_demand.cpp
Normal file
126
tests/test_demand.cpp
Normal file
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_demand.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 03/21/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include "test_toolkit.hpp"
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (test_demand)
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_categories_save)
|
||||
{
|
||||
int error = 0;
|
||||
int Nindex, ndem;
|
||||
|
||||
EN_Project ph = NULL;
|
||||
|
||||
error = EN_createproject(&ph);
|
||||
error = EN_open(ph, DATA_PATH_NET1, DATA_PATH_RPT, DATA_PATH_OUT);
|
||||
|
||||
error = EN_getnodeindex(ph, (char *)"12", &Nindex);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getnumdemands(ph, Nindex, &ndem);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(ndem == 1);
|
||||
|
||||
char demname[31];
|
||||
error = EN_getdemandname(ph, Nindex, ndem, demname);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_setdemandname(ph, Nindex, ndem, (char *)"CUB_SCOUT_MOTOR_POOL");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_saveinpfile(ph, "net1_dem_cat.inp");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_close(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_deleteproject(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_categories_reopen, * boost::unit_test::depends_on("test_demand/test_categories_save"))
|
||||
{
|
||||
int error = 0;
|
||||
int Nindex, ndem;
|
||||
|
||||
EN_Project ph = NULL;
|
||||
|
||||
BOOST_TEST_CHECKPOINT("Reopening saved input file");
|
||||
error = EN_createproject(&ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_open(ph, "net1_dem_cat.inp", DATA_PATH_RPT, DATA_PATH_OUT);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_getnodeindex(ph, (char *)"12", &Nindex);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getnumdemands(ph, Nindex, &ndem);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(ndem == 1);
|
||||
|
||||
char demname[31];
|
||||
error = EN_getdemandname(ph, Nindex, ndem, demname);
|
||||
BOOST_CHECK(error == 0);
|
||||
|
||||
BOOST_CHECK(check_string(demname, "CUB_SCOUT_MOTOR_POOL"));
|
||||
|
||||
error = EN_close(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_deleteproject(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_adddemand, FixtureSingleNode)
|
||||
{
|
||||
int Dindex, nD1, nD2;
|
||||
|
||||
error = EN_adddemand(ph, node_qhut, 100.0, "PrimaryPattern", "PrimaryDemand");
|
||||
BOOST_CHECK(error != 0);
|
||||
|
||||
error = EN_addpattern(ph, (char *)"PrimaryPattern");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_adddemand(ph, node_qhut, 100.0, "PrimaryPattern", "PrimaryDemand");
|
||||
BOOST_CHECK(error == 0);
|
||||
|
||||
error = EN_addpattern(ph, (char *)"SecondaryPattern");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_adddemand(ph, node_qhut, 10.0, "SecondaryPattern", "SecondaryDemand");
|
||||
BOOST_CHECK(error == 0);
|
||||
|
||||
error = EN_addpattern(ph, (char *)"TertiaryPattern");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_adddemand(ph, node_qhut, 1.0, "TertiaryPattern", "TertiaryDemand");
|
||||
BOOST_CHECK(error == 0);
|
||||
|
||||
error = EN_getnumdemands(ph, node_qhut, &nD1);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_getdemandindex(ph, node_qhut, "TertiaryDemand", &Dindex);
|
||||
BOOST_CHECK(error == 0);
|
||||
BOOST_CHECK(Dindex == nD1);
|
||||
|
||||
error = EN_deletedemand(ph, node_qhut, Dindex);
|
||||
BOOST_CHECK(error == 0);
|
||||
|
||||
error = EN_getnumdemands(ph, node_qhut, &nD2);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(nD1 - nD2 == 1);
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
84
tests/test_hydraulics.cpp
Normal file
84
tests/test_hydraulics.cpp
Normal file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_hydraulics.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 03/21/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
|
||||
#include "test_toolkit.hpp"
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (test_hydraulics)
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_solveH, FixtureOpenClose)
|
||||
{
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_hyd_step, FixtureOpenClose)
|
||||
{
|
||||
int flag = 00;
|
||||
long t, tstep;
|
||||
|
||||
error = EN_openH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_initH(ph, flag);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
do {
|
||||
error = EN_runH(ph, &t);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_nextH(ph, &tstep);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
} while (tstep > 0);
|
||||
|
||||
error = EN_closeH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_hydr_save, FixtureOpenClose)
|
||||
{
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_saveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_report(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_hydr_savefile, FixtureOpenClose)
|
||||
{
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_savehydfile(ph, "test_savefile.hyd");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
BOOST_CHECK(boost::filesystem::exists("test_savefile.hyd") == true);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_hydr_usefile, FixtureOpenClose, * boost::unit_test::depends_on("test_hydraulics/test_hydr_savefile"))
|
||||
{
|
||||
error = EN_usehydfile(ph, "test_savefile.hyd");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_solveQ(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
236
tests/test_link.cpp
Normal file
236
tests/test_link.cpp
Normal file
@@ -0,0 +1,236 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_link.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 03/21/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include "test_toolkit.hpp"
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (test_link)
|
||||
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_adddelete_link, FixtureInitClose)
|
||||
{
|
||||
int index;
|
||||
|
||||
// Build a network
|
||||
EN_addnode(ph, (char *)"N1", EN_JUNCTION, &index);
|
||||
EN_addnode(ph, (char *)"N2", EN_JUNCTION, &index);
|
||||
EN_addnode(ph, (char *)"N3", EN_RESERVOIR, &index);
|
||||
|
||||
error = EN_addlink(ph, (char *)"L1", EN_PUMP, (char *)"N3", (char *)"N1", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_addlink(ph, (char *)"L2", EN_PIPE, (char *)"N1", (char *)"N3", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_getlinkindex(ph, (char *)"L2", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_deletelink(ph, index, EN_UNCONDITIONAL);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_addlink(ph, (char *)"L3", EN_PIPE, (char *)"N1", (char *)"N2", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_getlinkindex(ph, (char *)"L1", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_deletelink(ph, index, EN_UNCONDITIONAL);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getlinkindex(ph, (char *)"L3", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_deletelink(ph, index, EN_UNCONDITIONAL);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_link_id_isvalid, FixtureInitClose)
|
||||
{
|
||||
int index;
|
||||
|
||||
// Build a network
|
||||
EN_addnode(ph, (char *)"N1", EN_JUNCTION, &index);
|
||||
EN_addnode(ph, (char *)"N2", EN_JUNCTION, &index);
|
||||
EN_addnode(ph, (char *)"N3", EN_RESERVOIR, &index);
|
||||
|
||||
error = EN_addlink(ph, (char *)"L1", EN_PUMP, (char *)"N1", (char *)"N2", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_addlink(ph, (char *)"L 2", EN_PIPE, (char *)"N1", (char *)"N2", &index);
|
||||
BOOST_REQUIRE(error == 252);
|
||||
|
||||
error = EN_addlink(ph, (char *)"\"L2", EN_PIPE, (char *)"N1", (char *)"N2", &index);
|
||||
BOOST_REQUIRE(error == 252);
|
||||
|
||||
error = EN_addlink(ph, (char *)"L;2", EN_PIPE, (char *)"N1", (char *)"N2", &index);
|
||||
BOOST_REQUIRE(error == 252);
|
||||
|
||||
EN_getlinkindex(ph, (char *)"L1", &index);
|
||||
error = EN_setlinkid(ph, index, (char *)"L;1");
|
||||
BOOST_REQUIRE(error == 252);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_setlinktype)
|
||||
{
|
||||
int error = 0;
|
||||
int p113, n31, p121, n113_1, n113_2;
|
||||
double q113 = 0.0, p31 = 0.0, diam;
|
||||
|
||||
EN_Project ph = NULL;
|
||||
EN_createproject(&ph);
|
||||
|
||||
error = EN_open(ph, DATA_PATH_NET1, DATA_PATH_RPT, "");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Change duration to 0
|
||||
error = EN_settimeparam(ph, EN_DURATION, 0);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Get indexes of pipe 113 and node 31
|
||||
error = EN_getlinkindex(ph, (char *)"113", &p113);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getnodeindex(ph, (char *)"31", &n31);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Reverse pipe 113 and give it a check valve
|
||||
error = EN_getlinknodes(ph, p113, &n113_1, &n113_2);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setlinknodes(ph, p113, n113_2, n113_1);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setlinktype(ph, &p113, EN_CVPIPE, 0);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Get index & diameter of pipe 121 connected to node 31
|
||||
error = EN_getlinkindex(ph, (char *)"121", &p121);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getlinkvalue(ph, p121, EN_DIAMETER, &diam);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Replace it with a PRV
|
||||
error = EN_setlinktype(ph, &p121, EN_PRV, 0);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Set diameter & setting of new PRV
|
||||
error = EN_setlinkvalue(ph, p121, EN_INITSETTING, 100);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setlinkvalue(ph, p121, EN_DIAMETER, diam);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Solve for hydraulics
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Get flow in link 113 and pressure at node 31
|
||||
error = EN_getlinkvalue(ph, p113, EN_FLOW, &q113);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getnodevalue(ph, n31, EN_PRESSURE, &p31);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Require that link 113 flow be 0
|
||||
q113 = fabs(q113);
|
||||
BOOST_REQUIRE(q113 < 0.001);
|
||||
|
||||
// Require that node 31 pressure be 100
|
||||
p31 = fabs(p31 - 100.0f);
|
||||
BOOST_REQUIRE(p31 < 0.001);
|
||||
|
||||
// Close and delete project
|
||||
error = EN_close(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
EN_deleteproject(ph);
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_link_setid_save)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
EN_Project ph = NULL;
|
||||
EN_createproject(&ph);
|
||||
|
||||
error = EN_open(ph, DATA_PATH_NET1, DATA_PATH_RPT, "");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Test of illegal link name change
|
||||
char newid_3[] = "Illegal; link name";
|
||||
error = EN_setlinkid(ph, 3, newid_3);
|
||||
BOOST_REQUIRE(error > 0);
|
||||
|
||||
// Test of legal link name change
|
||||
char newid_4[] = "Link3";
|
||||
error = EN_setlinkid(ph, 3, newid_4);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Save the project
|
||||
error = EN_saveinpfile(ph, "net1_setid.inp");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_close(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
EN_deleteproject(ph);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_link_setid_reopen, * boost::unit_test::depends_on("test_link/test_link_setid_save"))
|
||||
{
|
||||
int error = 0;
|
||||
int index;
|
||||
|
||||
EN_Project ph = NULL;
|
||||
|
||||
// Re-open the saved project
|
||||
EN_createproject(&ph);
|
||||
error = EN_open(ph, "net1_setid.inp", DATA_PATH_RPT, "");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Check that 3rd link has its new name
|
||||
error = EN_getlinkindex(ph, (char *)"Link3", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(index == 3);
|
||||
|
||||
error = EN_close(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
EN_deleteproject(ph);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_link_comments, FixtureOpenClose)
|
||||
{
|
||||
int index;
|
||||
char comment[EN_MAXMSG + 1];
|
||||
|
||||
// Set link comments
|
||||
error = EN_getlinkindex(ph, (char *)"11", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setcomment(ph, EN_LINK, index, (char *)"P11");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_getlinkindex(ph, (char *)"9", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setcomment(ph, EN_LINK, index, (char *)"Pump9");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Check link comments
|
||||
error = EN_getlinkindex(ph, (char *)"11", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getcomment(ph, EN_LINK, index, comment);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(check_string(comment, (char *)"P11"));
|
||||
|
||||
error = EN_getlinkindex(ph, (char *)"9", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getcomment(ph, EN_LINK, index, comment);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(check_string(comment, (char *)"Pump9"));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
414
tests/test_net_builder.cpp
Normal file
414
tests/test_net_builder.cpp
Normal file
@@ -0,0 +1,414 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_net_builder.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 04/12/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#define BOOST_TEST_MODULE net_builder
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define _CRTDBG_MAP_ALLOC
|
||||
#include <stdlib.h>
|
||||
#include <crtdbg.h>
|
||||
#else
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#include <boost/test/included/unit_test.hpp>
|
||||
|
||||
#include "epanet2_2.h"
|
||||
|
||||
|
||||
#define DATA_PATH_TMP "./tmp.inp"
|
||||
#define DATA_PATH_RPT "./test.rpt"
|
||||
#define DATA_PATH_OUT "./test.out"
|
||||
|
||||
|
||||
struct FixtureInitClose {
|
||||
FixtureInitClose() {
|
||||
error = 0;
|
||||
ph = NULL;
|
||||
|
||||
EN_createproject(&ph);
|
||||
EN_init(ph, DATA_PATH_RPT, DATA_PATH_OUT, EN_GPM, EN_HW);
|
||||
}
|
||||
|
||||
~FixtureInitClose() {
|
||||
EN_close(ph);
|
||||
EN_deleteproject(ph);
|
||||
}
|
||||
int error;
|
||||
EN_Project ph;
|
||||
};
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_net_builder)
|
||||
|
||||
|
||||
// BOOST_AUTO_TEST_CASE(net_builder_I)
|
||||
// {
|
||||
// int error = 0;
|
||||
// int flag = 00;
|
||||
// long t, tstep;
|
||||
// int i, ind, Lindex, Nindex, Cindex;
|
||||
// double h_orig, h_build, h_build_loaded;
|
||||
//
|
||||
// // first we load Net1.inp, run it and record the head in Tank 2 at the end of the simulation (h_orig)
|
||||
// EN_Project ph = NULL;
|
||||
// EN_createproject(&ph);
|
||||
//
|
||||
// std::string path_inp = std::string(DATA_PATH_NET1);
|
||||
// std::string path_rpt = std::string(DATA_PATH_RPT);
|
||||
// std::string path_out = std::string(DATA_PATH_OUT);
|
||||
//
|
||||
// error = EN_open(ph, path_inp.c_str(), path_rpt.c_str(), path_out.c_str());
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
//
|
||||
// error = EN_getnodeindex(ph, (char *)"2", &Nindex);
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
//
|
||||
// error = EN_openH(ph);
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
//
|
||||
// error = EN_initH(ph, flag);
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
//
|
||||
// do {
|
||||
// error = EN_runH(ph, &t);
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
//
|
||||
// // this is the head at the end of the simulation after loading the original Net1.inp
|
||||
// error = EN_getnodevalue(ph, Nindex, EN_HEAD, &h_orig);
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
//
|
||||
// error = EN_nextH(ph, &tstep);
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
//
|
||||
// } while (tstep > 0);
|
||||
//
|
||||
// error = EN_closeH(ph);
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
//
|
||||
// error = EN_close(ph);
|
||||
// BOOST_REQUIRE(error == 0);
|
||||
//
|
||||
// EN_deleteproject(&ph);
|
||||
// }
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_build_net1, FixtureInitClose)
|
||||
{
|
||||
int flag = 00;
|
||||
long t, tstep;
|
||||
int i, ind, Lindex, Nindex, Cindex;
|
||||
double h_build;
|
||||
|
||||
// now we build Net1 from scratch...
|
||||
char juncs[9][10] = { "10", "11", "12", "13", "21", "22", "23", "31", "32" };
|
||||
double e[9] = { 710, 710, 700, 695, 700, 695, 690, 700, 710 };
|
||||
double d[9] = { 0, 150, 150, 100, 150, 200, 150, 100, 100 };
|
||||
double X[9] = { 20, 30, 50, 70, 30, 50, 70, 30, 50 };
|
||||
double Y[9] = { 70, 70, 70, 70, 40, 40, 40, 10, 10 };
|
||||
double L[12] = { 10530, 5280, 5280, 5280, 5280, 5280, 200, 5280, 5280, 5280, 5280, 5280 };
|
||||
double dia[12] = { 18, 14, 10, 10, 12, 6, 18, 10, 12, 8, 8, 6 };
|
||||
double P[12] = { 1.0f, 1.2f, 1.4f, 1.6f, 1.4f, 1.2f, 1.0f, 0.8f, 0.6f, 0.4f, 0.6f, 0.8f };
|
||||
|
||||
error = EN_addpattern(ph, (char *)"pat1");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setpattern(ph, 1, P, 12);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
//error = EN_setoption(ph, EN_DEFDEMANDPAT, 1);
|
||||
//BOOST_REQUIRE(error == 0);
|
||||
for (i = 0; i < 9; i++)
|
||||
{
|
||||
error = EN_addnode(ph, juncs[i], EN_JUNCTION, &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setnodevalue(ph, i + 1, EN_ELEVATION, e[i]);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setnodevalue(ph, i + 1, EN_BASEDEMAND, d[i]);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setnodevalue(ph, i+1, EN_PATTERN, 1);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setcoord(ph, i + 1, X[i], Y[i]);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
//error = EN_setdemandpattern(ph, i + 1, 1, 1);
|
||||
//BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
error = EN_addnode(ph, (char *)"9", EN_RESERVOIR, &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setcoord(ph, 10, 10, 70);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setnodevalue(ph, 10, EN_ELEVATION, 800);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_addnode(ph, (char *)"2", EN_TANK, &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setcoord(ph, 11, 50, 90);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setnodevalue(ph, 11, EN_TANKDIAM, 50.5);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setnodevalue(ph, 11, EN_ELEVATION, 850);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setnodevalue(ph, 11, EN_MAXLEVEL, 150);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setnodevalue(ph, 11, EN_TANKLEVEL, 120);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setnodevalue(ph, 11, EN_MINLEVEL, 100);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setnodevalue(ph, 11, EN_MIXFRACTION, 1);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_addlink(ph, (char *)"10", EN_PIPE, (char *)"10", (char *)"11", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addlink(ph, (char *)"11", EN_PIPE, (char *)"11", (char *)"12", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addlink(ph, (char *)"12", EN_PIPE, (char *)"12", (char *)"13", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addlink(ph, (char *)"21", EN_PIPE, (char *)"21", (char *)"22", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addlink(ph, (char *)"22", EN_PIPE, (char *)"22", (char *)"23", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addlink(ph, (char *)"31", EN_PIPE, (char *)"31", (char *)"32", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addlink(ph, (char *)"110", EN_PIPE, (char *)"2", (char *)"12", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addlink(ph, (char *)"111", EN_PIPE, (char *)"11", (char *)"21", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addlink(ph, (char *)"112", EN_PIPE, (char *)"12", (char *)"22", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addlink(ph, (char *)"113", EN_PIPE, (char *)"13", (char *)"23", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addlink(ph, (char *)"121", EN_PIPE, (char *)"21", (char *)"31", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addlink(ph, (char *)"122", EN_PIPE, (char *)"22", (char *)"32", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
for (i = 0; i < 12; i++)
|
||||
{
|
||||
error = EN_setlinkvalue(ph, i + 1, EN_LENGTH, L[i]);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setlinkvalue(ph, i + 1, EN_DIAMETER, dia[i]);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
error = EN_addlink(ph, (char *)"9", EN_PUMP, (char *)"9", (char *)"10", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addcurve(ph, (char *)"1");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setcurvevalue(ph, 1, 1, 1500, 250);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getlinkindex(ph, (char *)"9", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setheadcurveindex(ph, ind, 1);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_settimeparam(ph, EN_DURATION, 24 * 3600);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_settimeparam(ph, EN_PATTERNSTEP, 2 * 3600);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_getlinkindex(ph, (char *)"9", &Lindex);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getnodeindex(ph, (char *)"2", &Nindex);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Add controls
|
||||
error = EN_addcontrol(ph, EN_LOWLEVEL, Lindex, 1, Nindex, 110, &Cindex);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addcontrol(ph, EN_HILEVEL, Lindex, 0, Nindex, 140, &Cindex);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_openH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_initH(ph, 0);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
do {
|
||||
error = EN_runH(ph, &t);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
// this is the head at the end of the simulation after building the network *without* saving it to file
|
||||
error = EN_getnodevalue(ph, Nindex, EN_HEAD, &h_build);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_nextH(ph, &tstep);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
} while (tstep > 0);
|
||||
error = EN_closeH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_saveinpfile(ph, "net_builder.inp");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_open_net1, * boost::unit_test::depends_on("test_net_builder/test_build_net1"))
|
||||
{
|
||||
int error = 0;
|
||||
int flag = 00;
|
||||
long t, tstep;
|
||||
int Nindex = -1;
|
||||
double h_orig = 0.0, h_build = 0.0, h_build_loaded = 0.0;
|
||||
|
||||
|
||||
EN_Project ph = NULL;
|
||||
|
||||
// now we load the netwok we just built and saved
|
||||
EN_createproject(&ph);
|
||||
error = EN_open(ph, "net_builder.inp", DATA_PATH_RPT, DATA_PATH_OUT);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_getnodeindex(ph, (char *)"2", &Nindex);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_openH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_initH(ph, flag);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
do {
|
||||
error = EN_runH(ph, &t);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
// this is the head at the end of the simulation after building the network and saving it to file
|
||||
error = EN_getnodevalue(ph, Nindex, EN_HEAD, &h_build_loaded);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_nextH(ph, &tstep);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
} while (tstep > 0);
|
||||
|
||||
error = EN_closeH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_close(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
EN_deleteproject(ph);
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// if we got this far we can compare results
|
||||
|
||||
// compare the original to the build & saved network
|
||||
// BOOST_CHECK(abs(h_orig - h_build_loaded) < 0.0001);
|
||||
|
||||
// compare the original to the build without saving
|
||||
// BOOST_CHECK(abs(h_orig - h_build) < 0.0001);
|
||||
}
|
||||
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_save_net2, FixtureInitClose)
|
||||
{
|
||||
//char id[EN_MAXID+1];
|
||||
double p1_1, p2_1; // p1_2, p2_2;
|
||||
double q1_1, q2_1; // q1_2, q2_2;
|
||||
int ind;
|
||||
|
||||
// Build a network
|
||||
error = EN_addnode(ph, (char *)"N1", EN_JUNCTION, &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addnode(ph, (char *)"N2", EN_JUNCTION, &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addnode(ph, (char *)"N3", EN_RESERVOIR, &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addnode(ph, (char *)"N4", EN_TANK, &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addlink(ph, (char *)"L1", EN_PUMP, (char *)"N3", (char *)"N1", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addlink(ph, (char *)"L2", EN_PIPE, (char *)"N1", (char *)"N3", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addlink(ph, (char *)"L3", EN_PIPE, (char *)"N1", (char *)"N2", &ind);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addcurve(ph, (char *)"C1");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Set network data using the new helper functions
|
||||
error = EN_setcurvevalue(ph, 1, 1, 1500, 250);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setjuncdata(ph, 1, 700, 500, (char *)"");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setjuncdata(ph, 2, 710, 500, (char *)"");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setnodevalue(ph, 3, EN_ELEVATION, 800);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_settankdata(ph, 4, 850, 120, 100, 150, 50.5, 0, (char *)"");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setlinkvalue(ph, 1, EN_PUMP_HCURVE, 1);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setpipedata(ph, 2, 10560, 12, 100, 0);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setpipedata(ph, 3, 5280, 14, 100, 0);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Run hydraulics
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Save results
|
||||
error = EN_getnodevalue(ph, 1, EN_PRESSURE, &p1_1);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getnodevalue(ph, 2, EN_PRESSURE, &p2_1);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getlinkvalue(ph, 1, EN_FLOW, &q1_1);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getlinkvalue(ph, 2, EN_FLOW, &q2_1);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Save project
|
||||
error = EN_saveinpfile(ph, "netbuilder_test2.inp");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_reopen_net2, *boost::unit_test::depends_on("test_net_builder/test_save_net2"))
|
||||
{
|
||||
int error, index;
|
||||
|
||||
double p1_2, p2_2;
|
||||
double q1_2, q2_2;
|
||||
|
||||
// Open the saved project file
|
||||
EN_Project ph = NULL;
|
||||
error = EN_createproject(&ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_open(ph, "netbuilder_test2.inp", DATA_PATH_RPT, DATA_PATH_OUT);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Run hydraulics
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Save these new results
|
||||
error = EN_getnodevalue(ph, 1, EN_PRESSURE, &p1_2);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getnodevalue(ph, 2, EN_PRESSURE, &p2_2);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getlinkindex(ph, (char *)"L1", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getlinkvalue(ph, index, EN_FLOW, &q1_2);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getlinkindex(ph, (char *)"L2", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getlinkvalue(ph, index, EN_FLOW, &q2_2);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Display old & new results
|
||||
//cout << "\n Node N1 Pressure: " << p1_1 << " " << p1_2;
|
||||
//cout << "\n Node N2 Pressure: " << p2_1 << " " << p2_2;
|
||||
//cout << "\n Link L1 Flow: " << q1_1 << " " << q1_2;
|
||||
//cout << "\n Link L2 Flow: " << q2_1 << " " << q2_2;
|
||||
|
||||
// Compare old & new results
|
||||
// BOOST_CHECK(abs(p1_1 - p1_2) < 1.e-5);
|
||||
// BOOST_CHECK(abs(q1_1 - q1_2) < 1.e-5);
|
||||
// BOOST_CHECK(abs(p2_1 - p2_2) < 1.e-5);
|
||||
// BOOST_CHECK(abs(q2_1 - q2_2) < 1.e-5);
|
||||
|
||||
// Close project
|
||||
EN_close(ph);
|
||||
EN_deleteproject(ph);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
@@ -1,35 +0,0 @@
|
||||
#! /bin/bash
|
||||
test_networks()
|
||||
{
|
||||
returnValue=0
|
||||
for d in network_tests/*/ ; do
|
||||
for netfile in `ls $d*.inp`; do
|
||||
officialBinFile=${netfile%.*}.enb
|
||||
candidateBinFile=${netfile%.*}-candidate.enb
|
||||
echo "testing $netfile with known good binary output $officialBinFile"
|
||||
if ../build/CMake/buildproducts/bin/runepanet $netfile ${netfile%.*}-candidate.rpt $candidateBinFile
|
||||
then
|
||||
echo "epanet run for $netfile SUCCESS"
|
||||
else
|
||||
echo "epanet run for $netfile FAILED"
|
||||
returnValue=1
|
||||
fi
|
||||
if python ENBinaryOutDiff.py $officialBinFile $candidateBinFile
|
||||
then
|
||||
echo "binary output for $netfile PASSED"
|
||||
else
|
||||
echo "binary output for $netfile FAILED"
|
||||
returnValue=1
|
||||
fi
|
||||
echo "+++++"
|
||||
done
|
||||
done
|
||||
return $returnValue
|
||||
}
|
||||
|
||||
cp ../build/CMake/buildproducts/bin/libENBinaryOut.* ./libENBinaryOut.so
|
||||
cp ../tools/outputapi/*.py ./
|
||||
|
||||
|
||||
|
||||
test_networks
|
||||
356
tests/test_node.cpp
Normal file
356
tests/test_node.cpp
Normal file
@@ -0,0 +1,356 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_node.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 03/21/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include "test_toolkit.hpp"
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (test_node)
|
||||
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_adddelete_node, FixtureInitClose)
|
||||
{
|
||||
int index;
|
||||
|
||||
error = EN_addnode(ph, (char *)"N2", EN_JUNCTION, &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addnode(ph, (char *)"N4", EN_TANK, &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addnode(ph, (char *)"N3", EN_RESERVOIR, &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addnode(ph, (char *)"N1", EN_JUNCTION, &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_getnodeindex(ph, (char *)"N1", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_REQUIRE(index == 2);
|
||||
error = EN_getnodeindex(ph, (char *)"N2", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_deletenode(ph, index, EN_UNCONDITIONAL);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_getnodeindex(ph, (char *)"N4", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_deletenode(ph, index, EN_UNCONDITIONAL);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getnodeindex(ph, (char *)"N3", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_deletenode(ph, index, EN_UNCONDITIONAL);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_node_validate_id, FixtureInitClose)
|
||||
{
|
||||
int index;
|
||||
|
||||
error = EN_addnode(ph, (char *)"N2", EN_JUNCTION, &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_addnode(ph, (char *)"N 3", EN_JUNCTION, &index);
|
||||
BOOST_REQUIRE(error == 252);
|
||||
|
||||
error = EN_addnode(ph, (char *)"\"N3", EN_JUNCTION, &index);
|
||||
BOOST_REQUIRE(error == 252);
|
||||
|
||||
error = EN_addnode(ph, (char *)"N;3", EN_JUNCTION, &index);
|
||||
BOOST_REQUIRE(error == 252);
|
||||
|
||||
EN_getnodeindex(ph, (char *)"N2", &index);
|
||||
error = EN_setnodeid(ph, index, (char *)"N;2");
|
||||
BOOST_REQUIRE(error = 252);
|
||||
}
|
||||
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_junc_props, FixtureOpenClose)
|
||||
{
|
||||
int index;
|
||||
const auto props = {
|
||||
EN_ELEVATION,
|
||||
EN_BASEDEMAND,
|
||||
EN_PATTERN,
|
||||
EN_EMITTER,
|
||||
EN_INITQUAL,
|
||||
};
|
||||
const size_t num_props = 5;
|
||||
|
||||
std::vector<double> test (num_props);
|
||||
double *value = test.data();
|
||||
|
||||
error = EN_getnodeindex(ph, (char *)"11", &index);
|
||||
std::vector<double> ref = {710.0, 150.0, 1.0, 0.0, 0.5};
|
||||
|
||||
|
||||
// Ranged for loop iterates over property set
|
||||
for (EN_NodeProperty p : props) {
|
||||
error = EN_getnodevalue(ph, index, p, value++);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_CHECK(check_cdd_double(test, ref, 3));
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_tank_props, FixtureOpenClose)
|
||||
{
|
||||
int index;
|
||||
const auto props = {
|
||||
EN_ELEVATION,
|
||||
EN_TANKLEVEL,
|
||||
EN_MINLEVEL,
|
||||
EN_MAXLEVEL,
|
||||
EN_TANKDIAM,
|
||||
EN_MINVOLUME
|
||||
};
|
||||
const size_t num_props = 6;
|
||||
|
||||
std::vector<double> test (num_props);
|
||||
double *value = test.data();
|
||||
|
||||
error = EN_getnodeindex(ph, (char *)"2", &index);
|
||||
std::vector<double> ref = {850.0, 120.0, 100.0, 150.0, 50.5, 200296.167};
|
||||
|
||||
// Ranged for loop iterates over property set
|
||||
for (EN_NodeProperty p : props) {
|
||||
error = EN_getnodevalue(ph, index, p, value++);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_CHECK(check_cdd_double(test, ref, 3));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(node_props_after_step)
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_junc_props, FixtureAfterStep)
|
||||
{
|
||||
int index;
|
||||
const auto props = {
|
||||
EN_DEMAND,
|
||||
EN_HEAD,
|
||||
EN_PRESSURE,
|
||||
EN_QUALITY
|
||||
};
|
||||
const size_t num_props = 4;
|
||||
|
||||
std::vector<double> test (num_props);
|
||||
double *value = test.data();
|
||||
|
||||
error = EN_getnodeindex(ph, (char *)"11", &index);
|
||||
std::vector<double> ref = {179.999, 991.574, 122.006, 0.857};
|
||||
|
||||
|
||||
// Ranged for loop iterates over property set
|
||||
for (EN_NodeProperty p : props) {
|
||||
error = EN_getnodevalue(ph, index, p, value++);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_CHECK(check_cdd_double(test, ref, 3));
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_tank_props, FixtureAfterStep)
|
||||
{
|
||||
int index;
|
||||
const auto props = {
|
||||
EN_DEMAND,
|
||||
EN_HEAD,
|
||||
EN_PRESSURE,
|
||||
EN_QUALITY
|
||||
};
|
||||
const size_t num_props = 4;
|
||||
|
||||
std::vector<double> test (num_props);
|
||||
double *value = test.data();
|
||||
|
||||
error = EN_getnodeindex(ph, (char *)"2", &index);
|
||||
std::vector<double> ref = {505.383, 978.138, 55.522, 0.911};
|
||||
|
||||
// Ranged for loop iterates over property set
|
||||
for (EN_NodeProperty p : props) {
|
||||
error = EN_getnodevalue(ph, index, p, value++);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_CHECK(check_cdd_double(test, ref, 3));
|
||||
}
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(setid_save_reopen)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_setid_save)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
EN_Project ph = NULL;
|
||||
EN_createproject(&ph);
|
||||
|
||||
error = EN_open(ph, DATA_PATH_NET1, DATA_PATH_RPT, "");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Test of illegal node name change
|
||||
char newid_1[] = "Illegal; node name";
|
||||
error = EN_setnodeid(ph, 3, newid_1);
|
||||
BOOST_REQUIRE(error > 0);
|
||||
|
||||
// Test of legal node name change
|
||||
char newid_2[] = "Node3";
|
||||
error = EN_setnodeid(ph, 3, newid_2);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Save the project
|
||||
error = EN_saveinpfile(ph, "net1_setid.inp");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_close(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
EN_deleteproject(ph);
|
||||
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_setid_reopen, * boost::unit_test::depends_on("setid_save_reopen/test_setid_save"))
|
||||
{
|
||||
int error = 0;
|
||||
int index;
|
||||
|
||||
EN_Project ph = NULL;
|
||||
|
||||
// Re-open the saved project
|
||||
EN_createproject(&ph);
|
||||
error = EN_open(ph, "net1_setid.inp", DATA_PATH_RPT, "");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Check that 3rd node has its new name
|
||||
error = EN_getnodeindex(ph, (char *)"Node3", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_REQUIRE(index == 3);
|
||||
|
||||
|
||||
error = EN_close(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
EN_deleteproject(ph);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(node_comments)
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_node_comments, FixtureOpenClose)
|
||||
{
|
||||
int index;
|
||||
char comment[EN_MAXMSG + 1];
|
||||
|
||||
// Add comments to selected objects
|
||||
error = EN_getnodeindex(ph, (char *)"11", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setcomment(ph, EN_NODE, index, (char *)"J11");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_getnodeindex(ph, (char *)"23", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setcomment(ph, EN_NODE, index, (char *)"Junc23");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Check comments
|
||||
error = EN_getnodeindex(ph, (char *)"11", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getcomment(ph, EN_NODE, index, comment);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(check_string(comment, (char *)"J11"));
|
||||
|
||||
error = EN_getnodeindex(ph, (char *)"23", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getcomment(ph, EN_NODE, index, comment);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(check_string(comment, (char *)"Junc23"));
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_replace_comment, FixtureOpenClose)
|
||||
{
|
||||
int index;
|
||||
char comment[EN_MAXMSG + 1];
|
||||
|
||||
// Replace short comment with longer one and vice versa
|
||||
error = EN_getnodeindex(ph, (char *)"11", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setcomment(ph, EN_NODE, index, (char *)"Junction11");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getcomment(ph, EN_NODE, index, comment);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(check_string(comment, (char *)"Junction11"));
|
||||
|
||||
error = EN_setcomment(ph, EN_NODE, index, (char *)"J11");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getcomment(ph, EN_NODE, index, comment);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(check_string(comment, (char *)"J11"));
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_save_comment, FixtureOpenClose)
|
||||
{
|
||||
int index;
|
||||
|
||||
// Add comments to selected objects
|
||||
error = EN_getnodeindex(ph, (char *)"11", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setcomment(ph, EN_NODE, index, (char *)"J11");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_getnodeindex(ph, (char *)"23", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setcomment(ph, EN_NODE, index, (char *)"Junc23");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_saveinpfile(ph, DATA_PATH_TMP);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_reopen_comment, * boost::unit_test::depends_on("node_comments/test_save_comment"))
|
||||
{
|
||||
int error, index;
|
||||
char comment[EN_MAXMSG + 1];
|
||||
|
||||
// Create & load a project
|
||||
EN_Project ph = NULL;
|
||||
EN_createproject(&ph);
|
||||
|
||||
error = EN_open(ph, DATA_PATH_TMP, DATA_PATH_RPT, "");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Check that comments were saved & read correctly
|
||||
// Check comments
|
||||
error = EN_getnodeindex(ph, (char *)"11", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getcomment(ph, EN_NODE, index, comment);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(check_string(comment, (char *)"J11"));
|
||||
|
||||
error = EN_getnodeindex(ph, (char *)"23", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getcomment(ph, EN_NODE, index, comment);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(check_string(comment, (char *)"Junc23"));
|
||||
|
||||
// Close project
|
||||
EN_close(ph);
|
||||
EN_deleteproject(ph);
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
119
tests/test_overflow.cpp
Normal file
119
tests/test_overflow.cpp
Normal file
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_overflow.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 06/16/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
Tests the EN_CANOVERFLOW option for Tank nodes
|
||||
*/
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include "test_toolkit.hpp"
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (test_overflow)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_tank_overflow)
|
||||
|
||||
{
|
||||
int error = 0;
|
||||
int Nindex, Lindex;
|
||||
double level, spillage, spillage2, inflow;
|
||||
char testFile[] = "test_overflow.inp";
|
||||
|
||||
EN_Project ph = NULL;
|
||||
|
||||
error = EN_createproject(&ph);
|
||||
error = EN_open(ph, DATA_PATH_NET1, DATA_PATH_RPT, "");
|
||||
|
||||
// Get index of the tank and its inlet/outlet pipe
|
||||
error = EN_getnodeindex(ph, (char *)"2", &Nindex);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getlinkindex(ph, (char *)"110", &Lindex);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Set initial & maximum level to 130
|
||||
error = EN_setnodevalue(ph, Nindex, EN_TANKLEVEL, 130);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setnodevalue(ph, Nindex, EN_MAXLEVEL, 130);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Set duration to 1 hr
|
||||
error = EN_settimeparam(ph, EN_DURATION, 3600);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Solve hydraulics with default of no tank spillage allowed
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Check that tank remains full
|
||||
error = EN_getnodevalue(ph, Nindex, EN_TANKLEVEL, &level);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_REQUIRE(abs(level - 130.0) < 0.0001);
|
||||
|
||||
// Check that there is no spillage
|
||||
error = EN_getnodevalue(ph, Nindex, EN_DEMAND, &spillage);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_REQUIRE(abs(spillage) < 0.0001);
|
||||
|
||||
// Check that inflow link is closed
|
||||
error = EN_getlinkvalue(ph, Lindex, EN_FLOW, &inflow);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_REQUIRE(abs(inflow) < 0.0001);
|
||||
|
||||
// Turn tank overflow option on
|
||||
error = EN_setnodevalue(ph, Nindex, EN_CANOVERFLOW, 1);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Solve hydraulics again
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Check that tank remains full
|
||||
error = EN_getnodevalue(ph, Nindex, EN_TANKLEVEL, &level);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_REQUIRE(abs(level - 130.0) < 0.0001);
|
||||
|
||||
// Check that there is spillage equal to tank inflow
|
||||
// (inflow has neg. sign since tank is start node of inflow pipe)
|
||||
error = EN_getnodevalue(ph, Nindex, EN_DEMAND, &spillage);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_REQUIRE(spillage > 0.0001);
|
||||
error = EN_getlinkvalue(ph, Lindex, EN_FLOW, &inflow);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_REQUIRE(abs(-inflow - spillage) < 0.0001);
|
||||
|
||||
// Save project to file and then close it
|
||||
error = EN_saveinpfile(ph, testFile);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_close(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Re-open saved file & run it
|
||||
error = EN_open(ph, testFile, DATA_PATH_RPT, "");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Check that tank spillage has same value as before
|
||||
error = EN_getnodevalue(ph, Nindex, EN_DEMAND, &spillage2);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_REQUIRE(abs(spillage - spillage2) < 0.0001);
|
||||
|
||||
// Clean up
|
||||
error = EN_close(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_deleteproject(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
216
tests/test_pattern.cpp
Normal file
216
tests/test_pattern.cpp
Normal file
@@ -0,0 +1,216 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_pattern.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 03/21/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include "test_toolkit.hpp"
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (pattern)
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_set_get_default_pattern, FixtureOpenClose)
|
||||
{
|
||||
// Assign the default pattern index
|
||||
int defPatIdx = 1;
|
||||
int patIdx;
|
||||
|
||||
// Rename the default pattern
|
||||
error = EN_setpatternid(ph, defPatIdx, (char *)"Pat1");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_getpatternindex(ph, (char *)"Pat1", &patIdx);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
BOOST_CHECK(defPatIdx == patIdx);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_add_delete, FixtureOpenClose)
|
||||
{
|
||||
double f2[] = { 2.1, 2.2 };
|
||||
double f3[] = { 3.1, 3.2, 3.3, 3.4 };
|
||||
|
||||
// Add 2 new patterns
|
||||
error = EN_addpattern(ph, (char *)"Pat2");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_addpattern(ph, (char *)"Pat3");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_setpattern(ph, 2, f2, 2);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setpattern(ph, 3, f3, 4);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Delete Pat2
|
||||
error = EN_deletepattern(ph, 2);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Check that there are now 2 patterns
|
||||
int n;
|
||||
error = EN_getcount(ph, EN_PATCOUNT, &n);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(n == 2);
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_add_set)
|
||||
{
|
||||
std::string path_inp(DATA_PATH_NET1);
|
||||
std::string path_rpt(DATA_PATH_RPT);
|
||||
std::string path_out(DATA_PATH_OUT);
|
||||
std::string inp_save("net1_setid.inp");
|
||||
|
||||
int error = 0;
|
||||
|
||||
EN_Project ph = NULL;
|
||||
EN_createproject(&ph);
|
||||
|
||||
error = EN_open(ph, path_inp.c_str(), path_rpt.c_str(), "");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Assign the default pattern index
|
||||
int n, defPatIdx = 1;
|
||||
int patIdx;
|
||||
|
||||
// Rename the default pattern
|
||||
EN_setpatternid(ph, defPatIdx, (char *)"Pat1");
|
||||
EN_getpatternindex(ph, (char *)"Pat1", &patIdx);
|
||||
BOOST_REQUIRE(defPatIdx == patIdx);
|
||||
|
||||
// Add 2 new patterns
|
||||
EN_addpattern(ph, (char *)"Pat2");
|
||||
EN_addpattern(ph, (char *)"Pat3");
|
||||
double f2[] = {2.1, 2.2};
|
||||
double f3[] = {3.1, 3.2, 3.3, 3.4};
|
||||
EN_setpattern(ph, 2, f2, 2);
|
||||
EN_setpattern(ph, 3, f3, 4);
|
||||
|
||||
// Assign Pat3 to 3rd junction
|
||||
EN_setdemandpattern(ph, 3, 1, 3);
|
||||
|
||||
// Delete Pat2
|
||||
EN_deletepattern(ph, 2);
|
||||
|
||||
//Check that there are now 2 patterns
|
||||
EN_getcount(ph, EN_PATCOUNT, &n);
|
||||
BOOST_REQUIRE(n == 2);
|
||||
|
||||
// Check that Pat3 with 4 factors is still assigned to 3rd junction
|
||||
EN_getdemandpattern(ph, 3, 1, &patIdx);
|
||||
EN_getpatternlen(ph, patIdx, &n);
|
||||
BOOST_REQUIRE(n == 4);
|
||||
|
||||
// Delete the default pattern
|
||||
EN_deletepattern(ph, defPatIdx);
|
||||
|
||||
// Check that junction 4 has no pattern
|
||||
EN_getdemandpattern(ph, 4, 1, &patIdx);
|
||||
BOOST_REQUIRE(patIdx == 0);
|
||||
|
||||
// And that junction 3 still uses Pat3
|
||||
EN_getdemandpattern(ph, 3, 1, &patIdx);
|
||||
char patID[EN_MAXID+1];
|
||||
EN_getpatternid(ph, patIdx, patID);
|
||||
BOOST_REQUIRE(strcmp(patID, "Pat3") == 0);
|
||||
|
||||
// Re-name the pump's (Link 9) head curve
|
||||
int pumpIdx;
|
||||
char pumpID[] = "9";
|
||||
int curveIdx;
|
||||
char newCurveID[] = "PumpHeadCurve";
|
||||
EN_getlinkindex(ph, pumpID, &pumpIdx);
|
||||
EN_getheadcurveindex(ph, pumpIdx, &curveIdx);
|
||||
EN_setcurveid(ph, curveIdx, newCurveID);
|
||||
|
||||
// Check that rename was successful
|
||||
char curveID[EN_MAXID + 1];
|
||||
EN_getcurveid(ph, curveIdx, curveID);
|
||||
BOOST_REQUIRE(strcmp(curveID, newCurveID) == 0);
|
||||
|
||||
// Add two new curves
|
||||
double x2[] = {0.0, 1.0, 2.0};
|
||||
double y2[] = {400.0, 60.0, 30.0};
|
||||
double x3[] = {2000.0};
|
||||
double y3[] = {100.0};
|
||||
char curve2[] = "Curve2";
|
||||
char curve3[] = "Curve3";
|
||||
EN_addcurve(ph, curve2);
|
||||
EN_setcurve(ph, 2, x2, y2, 3);
|
||||
EN_addcurve(ph, curve3);
|
||||
EN_setcurve(ph, 3, x3, y3, 1);
|
||||
|
||||
// Assign Curve3 to pump's head curve
|
||||
EN_getcurveindex(ph, curve3, &curveIdx);
|
||||
EN_setheadcurveindex(ph, pumpIdx, curveIdx);
|
||||
|
||||
// Delete Curve2
|
||||
EN_getcurveindex(ph, curve2, &curveIdx);
|
||||
EN_deletecurve(ph, curveIdx);
|
||||
|
||||
// Check that pump's head curve is still Curve3
|
||||
EN_getheadcurveindex(ph, pumpIdx, &curveIdx);
|
||||
EN_getcurveid(ph, curveIdx, curveID);
|
||||
BOOST_REQUIRE(strcmp(curveID, curve3) == 0);
|
||||
|
||||
// And that it contains the correct data
|
||||
double x, y;
|
||||
EN_getcurvevalue(ph, curveIdx, 1, &x, &y);
|
||||
BOOST_REQUIRE(x == x3[0]);
|
||||
BOOST_REQUIRE(y == y3[0]);
|
||||
|
||||
EN_close(ph);
|
||||
EN_deleteproject(ph);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_pattern_comments, FixtureOpenClose)
|
||||
{
|
||||
int index;
|
||||
char comment[EN_MAXMSG + 1];
|
||||
|
||||
// Set pattern comment
|
||||
error = EN_getpatternindex(ph, (char *)"1", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setcomment(ph, EN_TIMEPAT, index, (char *)"Time Pattern 1");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Check pattern comment
|
||||
error = EN_getpatternindex(ph, (char *)"1", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getcomment(ph, EN_TIMEPAT, index, comment);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(check_string(comment, (char *)"Time Pattern 1"));
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_pat_id_isvalid, FixtureInitClose)
|
||||
{
|
||||
int index;
|
||||
|
||||
error = EN_addpattern(ph, (char *)"P1");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_addpattern(ph, (char *)"P 2");
|
||||
BOOST_REQUIRE(error == 252);
|
||||
|
||||
error = EN_addpattern(ph, (char *)"\"P2");
|
||||
BOOST_REQUIRE(error == 252);
|
||||
|
||||
error = EN_addpattern(ph, (char *)"P;2");
|
||||
BOOST_REQUIRE(error == 252);
|
||||
|
||||
EN_getpatternindex(ph, (char *)"P1", &index);
|
||||
error = EN_setpatternid(ph, index, (char *)"P;1");
|
||||
BOOST_REQUIRE(error == 252);
|
||||
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
90
tests/test_pda.cpp
Normal file
90
tests/test_pda.cpp
Normal file
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_pda.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 07/20/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
Tests the Pressure Driven Analysis option
|
||||
*/
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include "test_toolkit.hpp"
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (test_pda)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_pda_model)
|
||||
|
||||
{
|
||||
int error = 0;
|
||||
int index;
|
||||
double count, reduction;
|
||||
|
||||
EN_Project ph = NULL;
|
||||
error = EN_createproject(&ph);
|
||||
error = EN_open(ph, DATA_PATH_NET1, DATA_PATH_RPT, "");
|
||||
|
||||
// Set Demand Multiplier to 10 to cause negative pressures
|
||||
error = EN_setoption(ph, EN_DEMANDMULT, 10);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Run single period analysis
|
||||
error = EN_settimeparam(ph, EN_DURATION, 0);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Solve hydraulics with default DDA option
|
||||
// which will return with neg. pressure warning code
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 6);
|
||||
|
||||
// Check that 4 demand nodes have negative pressures
|
||||
error = EN_getstatistic(ph, EN_DEFICIENTNODES, &count);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_REQUIRE(count == 4);
|
||||
|
||||
// Switch to PDA with pressure limits of 20 - 100 psi
|
||||
error = EN_setdemandmodel(ph, EN_PDA, 20, 100, 0.5);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Solve hydraulics again
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// Check that 6 nodes had demand reductions totaling 32.66%
|
||||
error = EN_getstatistic(ph, EN_DEFICIENTNODES, &count);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_REQUIRE(count == 6);
|
||||
error = EN_getstatistic(ph, EN_DEMANDREDUCTION, &reduction);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_REQUIRE(abs(reduction - 32.66) < 0.01);
|
||||
|
||||
// Check that Junction 12 had full demand
|
||||
error = EN_getnodeindex(ph, (char *)"12", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getnodevalue(ph, index, EN_DEMANDDEFICIT, &reduction);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_REQUIRE(abs(reduction) < 0.01);
|
||||
|
||||
// Check that Junction 21 had a demand deficit of 413.67
|
||||
error = EN_getnodeindex(ph, (char *)"21", &index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getnodevalue(ph, index, EN_DEMANDDEFICIT, &reduction);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_REQUIRE(abs(reduction - 413.67) < 0.01);
|
||||
|
||||
// Clean up
|
||||
error = EN_close(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_deleteproject(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
281
tests/test_project.cpp
Normal file
281
tests/test_project.cpp
Normal file
@@ -0,0 +1,281 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_project.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 03/21/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
|
||||
#include "test_toolkit.hpp"
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (test_project)
|
||||
|
||||
BOOST_AUTO_TEST_CASE (test_create_delete)
|
||||
{
|
||||
int error = 0;
|
||||
EN_Project ph = NULL;
|
||||
|
||||
error = EN_createproject(&ph);
|
||||
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(ph != NULL);
|
||||
|
||||
error = EN_deleteproject(ph);
|
||||
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE (test_open_close)
|
||||
{
|
||||
int error;
|
||||
|
||||
EN_Project ph = NULL;
|
||||
|
||||
EN_createproject(&ph);
|
||||
|
||||
error = EN_open(ph, DATA_PATH_NET1, DATA_PATH_RPT, DATA_PATH_OUT);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_close(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
EN_deleteproject(ph);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_init_close)
|
||||
{
|
||||
EN_Project ph = NULL;
|
||||
EN_createproject(&ph);
|
||||
|
||||
int error = EN_init(ph, DATA_PATH_RPT, DATA_PATH_OUT, EN_GPM, EN_HW);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_close(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
EN_deleteproject(ph);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_save)
|
||||
{
|
||||
int error;
|
||||
|
||||
EN_Project ph_save;
|
||||
|
||||
EN_createproject(&ph_save);
|
||||
error = EN_open(ph_save, DATA_PATH_NET1, DATA_PATH_RPT, DATA_PATH_OUT);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_saveinpfile(ph_save, "test_reopen.inp");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
BOOST_CHECK(boost::filesystem::exists("test_reopen.inp") == true);
|
||||
|
||||
error = EN_close(ph_save);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
EN_deleteproject(ph_save);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_reopen, * boost::unit_test::depends_on("test_project/test_save"))
|
||||
{
|
||||
int error;
|
||||
|
||||
EN_Project ph_reopen;
|
||||
|
||||
EN_createproject(&ph_reopen);
|
||||
error = EN_open(ph_reopen, "test_reopen.inp", DATA_PATH_RPT, DATA_PATH_OUT);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_close(ph_reopen);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
EN_deleteproject(ph_reopen);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_run)
|
||||
{
|
||||
int error;
|
||||
|
||||
EN_Project ph;
|
||||
|
||||
EN_createproject(&ph);
|
||||
|
||||
error = EN_runproject(ph, DATA_PATH_NET1, DATA_PATH_RPT, DATA_PATH_OUT, NULL);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
EN_deleteproject(ph);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_proj_fixture)
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_title, FixtureOpenClose)
|
||||
{
|
||||
// How is the API user supposed to know array size?
|
||||
char c_test[3][80];
|
||||
|
||||
// ref is an automatic variable and therefore doesn't need to be deleted
|
||||
std::string ref[3] = {
|
||||
" EPANET Example Network 1",
|
||||
"A simple example of modeling chlorine decay. Both bulk and",
|
||||
"wall reactions are included. "};
|
||||
|
||||
error = EN_gettitle(ph, c_test[0], c_test[1], c_test[2]);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
std::string test (c_test[i]);
|
||||
BOOST_CHECK(check_string(test, ref[i]));
|
||||
}
|
||||
|
||||
// Need a test for EN_settitle
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_getcount, FixtureOpenClose)
|
||||
{
|
||||
int i;
|
||||
|
||||
std::vector<int> test(7);
|
||||
int *array = test.data();
|
||||
|
||||
std::vector<int> ref = { 11, 2, 13, 1, 1, 2, 0 };
|
||||
|
||||
for (i=EN_NODECOUNT; i<=EN_RULECOUNT; i++) {
|
||||
error = EN_getcount(ph, i, array++);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(ref.begin(), ref.end(), test.begin(), test.end());
|
||||
|
||||
error = EN_getcount(ph, 7, &i);
|
||||
BOOST_CHECK(error == 251);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_setdemandpattern, FixtureOpenClose)
|
||||
{
|
||||
int i, j, pat_index, pat_index_2, numDemands, nnodes;
|
||||
char newpat[] = "new_pattern";
|
||||
|
||||
// get the number of nodes
|
||||
error = EN_getcount(ph, EN_NODECOUNT, &nnodes);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// add a new pattern
|
||||
error = EN_addpattern(ph, newpat);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// get the new patterns index, should be as the number of patterns
|
||||
error = EN_getpatternindex(ph, newpat, &pat_index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
for (i = 1; i <= nnodes; i++) {
|
||||
// get the number of demand categories
|
||||
error = EN_getnumdemands(ph, i, &numDemands);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
for (j = 1; j <= numDemands; j++) {
|
||||
// set demand patterns
|
||||
error = EN_setdemandpattern(ph, i, j, pat_index);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
// get demand patterns should be the same with set
|
||||
error = EN_getdemandpattern(ph, i, j, &pat_index_2);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(pat_index == pat_index_2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_addpattern, FixtureOpenClose)
|
||||
{
|
||||
int pat_index, n_patterns_1, n_patterns_2;
|
||||
char newpat[] = "new_pattern";
|
||||
|
||||
// get the number of current patterns
|
||||
error = EN_getcount(ph, EN_PATCOUNT, &n_patterns_1);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// add a new pattern
|
||||
error = EN_addpattern(ph, newpat);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// get the new patterns count, shoul dbe the old one + 1
|
||||
error = EN_getcount(ph, EN_PATCOUNT, &n_patterns_2);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(n_patterns_1 + 1 == n_patterns_2);
|
||||
|
||||
// gwt the new patterns index, should be as the number of patterns
|
||||
error = EN_getpatternindex(ph, newpat, &pat_index);
|
||||
BOOST_CHECK(pat_index == n_patterns_2);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_add_control, FixtureOpenClose)
|
||||
{
|
||||
int flag = 00;
|
||||
long t, tstep;
|
||||
double h1, h2;
|
||||
int Cindex;
|
||||
|
||||
// run with original controls
|
||||
error = EN_openH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_initH(ph, flag);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
do {
|
||||
error = EN_runH(ph, &t);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getnodevalue(ph, 11, EN_HEAD, &h1); // get the tank head
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_nextH(ph, &tstep);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
} while (tstep > 0);
|
||||
|
||||
error = EN_closeH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// disable current controls
|
||||
error = EN_setcontrol(ph, 1, 0, 0, 0, 0, 0);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_setcontrol(ph, 2, 1, 0, 0, 0, 0);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
// add new controls
|
||||
error = EN_addcontrol(ph, 0, 13, 1, 11, 110, &Cindex);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(Cindex == 3);
|
||||
error = EN_addcontrol(ph, 1, 13, 0, 11, 140, &Cindex);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(Cindex == 4);
|
||||
|
||||
// run with new controls
|
||||
error = EN_openH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_initH(ph, flag);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
do {
|
||||
error = EN_runH(ph, &t);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_getnodevalue(ph, 11, EN_HEAD, &h2); // get the tank head
|
||||
BOOST_REQUIRE(error == 0);
|
||||
error = EN_nextH(ph, &tstep);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
} while (tstep > 0);
|
||||
|
||||
error = EN_closeH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
BOOST_CHECK(abs(h1 - h2) < 1.e-5); // end head should be the same with new controls
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
100
tests/test_quality.cpp
Normal file
100
tests/test_quality.cpp
Normal file
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_quality.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 03/21/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include "test_toolkit.hpp"
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (test_quality)
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_solveQ, FixtureOpenClose)
|
||||
{
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_solveQ(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_report(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_qual_step, FixtureOpenClose)
|
||||
{
|
||||
int flag = 0;
|
||||
long t, tstep;
|
||||
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_openQ(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_initQ(ph, flag);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
do {
|
||||
error = EN_runQ(ph, &t);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_stepQ(ph, &tstep);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
} while (tstep > 0);
|
||||
|
||||
error = EN_closeQ(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_progressive_step, FixtureOpenClose)
|
||||
{
|
||||
int flag = EN_NOSAVE;
|
||||
long t, tstep_h, tstep_q;
|
||||
|
||||
error = EN_openH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_initH(ph, flag);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_openQ(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_initQ(ph, flag);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
do {
|
||||
error = EN_runH(ph, &t);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_runQ(ph, &t);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_nextH(ph, &tstep_h);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_nextQ(ph, &tstep_q);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
} while (tstep_h > 0);
|
||||
|
||||
error = EN_closeH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_closeQ(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
68
tests/test_reent.cpp
Normal file
68
tests/test_reent.cpp
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_reent.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 03/21/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <boost/thread.hpp>
|
||||
|
||||
#include <string>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "epanet2_2.h"
|
||||
|
||||
#define NUM_THREADS 2
|
||||
|
||||
using namespace std;
|
||||
|
||||
void epanet_thread(long i)
|
||||
{
|
||||
int errorcode = 0;
|
||||
EN_Project ph;
|
||||
|
||||
string prefix = "example_";
|
||||
string suffix = ".inp";
|
||||
string input = prefix + to_string(static_cast<long long>(i)) + suffix;
|
||||
|
||||
suffix = ".rpt";
|
||||
string report = prefix + to_string(static_cast<long long>(i)) + suffix;
|
||||
|
||||
suffix = ".out";
|
||||
string output = prefix + to_string(static_cast<long long>(i)) + suffix;
|
||||
|
||||
printf("Thread #%ld starting EPANET ...\n", i);
|
||||
|
||||
EN_createproject(&ph);
|
||||
errorcode = EN_runproject(ph, input.c_str(), report.c_str(), output.c_str(), NULL);
|
||||
EN_deleteproject(ph);
|
||||
|
||||
printf("Thread #%ld EPANET done. Status = %d\n", i, errorcode);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
long i;
|
||||
boost::thread *threads[NUM_THREADS];
|
||||
|
||||
for (i = 0; i < NUM_THREADS; i++) {
|
||||
threads[i] = new boost::thread(epanet_thread, i);
|
||||
printf("Main: creating thread %ld.\n", i);
|
||||
}
|
||||
|
||||
for (i = 0; i < NUM_THREADS; i++) {
|
||||
threads[i]->join();
|
||||
printf("Main: joining thread %ld.\n", i);
|
||||
delete threads[i];
|
||||
}
|
||||
|
||||
printf("Main: program completed. Exiting.\n");
|
||||
return(0);
|
||||
}
|
||||
49
tests/test_report.cpp
Normal file
49
tests/test_report.cpp
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_report.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 03/21/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include "test_toolkit.hpp"
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (test_report)
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_rprt_anlysstats, FixtureOpenClose)
|
||||
{
|
||||
int i;
|
||||
|
||||
std::vector<double> test(5);
|
||||
double *array = test.data();
|
||||
|
||||
std::vector<double> ref = {3.0, 7.0799498320679432e-06, 1.6680242187483429e-08,
|
||||
0.0089173150106518495, 0.99999998187144024};
|
||||
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_solveQ(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
|
||||
for (i=EN_ITERATIONS; i<=EN_MASSBALANCE; i++) {
|
||||
error = EN_getstatistic(ph, i, array++);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
}
|
||||
BOOST_CHECK(check_cdd_double(test, ref, 3));
|
||||
|
||||
double temp;
|
||||
error = EN_getstatistic(ph, 8, &temp);
|
||||
BOOST_CHECK(error == 251);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
65
tests/test_toolkit.cpp
Normal file
65
tests/test_toolkit.cpp
Normal file
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_toolkit.cpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 03/21/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define BOOST_TEST_MODULE toolkit
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include <boost/test/included/unit_test.hpp>
|
||||
|
||||
#include "test_toolkit.hpp"
|
||||
|
||||
|
||||
// Custom test to check the minimum number of correct decimal digits between
|
||||
// the test and the ref vectors.
|
||||
boost::test_tools::predicate_result check_cdd_double(std::vector<double>& test,
|
||||
std::vector<double>& ref, long cdd_tol){
|
||||
double tmp, min_cdd = 10.0;
|
||||
|
||||
// TODO: What if the vectors aren't the same length?
|
||||
|
||||
std::vector<double>::iterator test_it;
|
||||
std::vector<double>::iterator ref_it;
|
||||
|
||||
for (test_it = test.begin(), ref_it = ref.begin();
|
||||
(test_it < test.end()) && (ref_it < ref.end());
|
||||
++test_it, ++ref_it)
|
||||
{
|
||||
if (*test_it != *ref_it) {
|
||||
// Compute log absolute error
|
||||
tmp = abs(*test_it - *ref_it);
|
||||
if (tmp < 1.0e-7)
|
||||
tmp = 1.0e-7;
|
||||
|
||||
else if (tmp > 2.0)
|
||||
tmp = 1.0;
|
||||
|
||||
tmp = -log10(tmp);
|
||||
if (tmp < 0.0)
|
||||
tmp = 0.0;
|
||||
|
||||
if (tmp < min_cdd)
|
||||
min_cdd = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
return floor(min_cdd) >= cdd_tol;
|
||||
}
|
||||
|
||||
boost::test_tools::predicate_result check_string(std::string test, std::string ref)
|
||||
{
|
||||
if (ref.compare(test) == 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
130
tests/test_toolkit.hpp
Normal file
130
tests/test_toolkit.hpp
Normal file
@@ -0,0 +1,130 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_toolkit.hpp
|
||||
Description: Tests EPANET toolkit api functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 03/21/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef TEST_TOOLKIT_HPP
|
||||
#define TEST_TOOLKIT_HPP
|
||||
|
||||
#include "epanet2_2.h"
|
||||
|
||||
|
||||
#define DATA_PATH_NET1 "./net1.inp"
|
||||
#define DATA_PATH_TMP "./tmp.inp"
|
||||
#define DATA_PATH_RPT "./test.rpt"
|
||||
#define DATA_PATH_OUT "./test.out"
|
||||
|
||||
struct FixtureOpenClose{
|
||||
FixtureOpenClose() {
|
||||
error = 0;
|
||||
ph = NULL;
|
||||
|
||||
EN_createproject(&ph);
|
||||
error = EN_open(ph, DATA_PATH_NET1, DATA_PATH_RPT, DATA_PATH_OUT);
|
||||
}
|
||||
|
||||
~FixtureOpenClose() {
|
||||
error = EN_close(ph);
|
||||
EN_deleteproject(ph);
|
||||
}
|
||||
|
||||
int error;
|
||||
EN_Project ph;
|
||||
};
|
||||
|
||||
|
||||
struct FixtureInitClose {
|
||||
FixtureInitClose() {
|
||||
error = 0;
|
||||
ph = NULL;
|
||||
|
||||
EN_createproject(&ph);
|
||||
EN_init(ph, DATA_PATH_RPT, DATA_PATH_OUT, EN_GPM, EN_HW);
|
||||
}
|
||||
|
||||
~FixtureInitClose() {
|
||||
EN_close(ph);
|
||||
EN_deleteproject(ph);
|
||||
}
|
||||
int error;
|
||||
EN_Project ph;
|
||||
};
|
||||
|
||||
|
||||
struct FixtureAfterStep{
|
||||
FixtureAfterStep() {
|
||||
error = 0;
|
||||
ph = NULL;
|
||||
|
||||
flag = 0;
|
||||
tstop = 10800;
|
||||
|
||||
EN_createproject(&ph);
|
||||
error = EN_open(ph, DATA_PATH_NET1, DATA_PATH_RPT, DATA_PATH_OUT);
|
||||
|
||||
error = EN_solveH(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_openQ(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_initQ(ph, flag);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
do {
|
||||
error = EN_runQ(ph, &t);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_stepQ(ph, &tstep);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
} while (tstep > 0 && t < tstop);
|
||||
}
|
||||
|
||||
~FixtureAfterStep() {
|
||||
error = EN_closeQ(ph);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
error = EN_close(ph);
|
||||
EN_deleteproject(ph);
|
||||
}
|
||||
|
||||
int error, flag;
|
||||
long t, tstep, tstop;
|
||||
EN_Project ph;
|
||||
};
|
||||
|
||||
struct FixtureSingleNode {
|
||||
FixtureSingleNode() {
|
||||
error = 0;
|
||||
ph = NULL;
|
||||
|
||||
EN_createproject(&ph);
|
||||
EN_init(ph, DATA_PATH_RPT, DATA_PATH_OUT, EN_GPM, EN_HW);
|
||||
|
||||
EN_addnode(ph, (char *)"CUB_SCOUT_QUONSET_HUT", EN_JUNCTION, &node_qhut);
|
||||
}
|
||||
|
||||
~FixtureSingleNode() {
|
||||
EN_close(ph);
|
||||
EN_deleteproject(ph);
|
||||
}
|
||||
int error, index, node_qhut;
|
||||
EN_Project ph;
|
||||
};
|
||||
|
||||
|
||||
boost::test_tools::predicate_result check_cdd_double(std::vector<double>& test,
|
||||
std::vector<double>& ref, long cdd_tol);
|
||||
boost::test_tools::predicate_result check_string(std::string test, std::string ref);
|
||||
|
||||
|
||||
#endif //TEST_TOOLKIT_HPP
|
||||
28
tests/util/CMakeLists.txt
Normal file
28
tests/util/CMakeLists.txt
Normal file
@@ -0,0 +1,28 @@
|
||||
|
||||
if(UNIX)
|
||||
set(CMAKE_CXX_FLAGS "-std=c++11")
|
||||
endif(UNIX)
|
||||
|
||||
# Sets for output directory for executables and libraries
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
||||
|
||||
|
||||
add_executable(test_cstrhelper ./test_cstrhelper.cpp
|
||||
../../src/util/cstr_helper.c)
|
||||
target_include_directories(test_cstrhelper PUBLIC ../../src/)
|
||||
target_link_libraries(test_cstrhelper ${Boost_LIBRARIES})
|
||||
|
||||
|
||||
add_executable(test_errormanager ./test_errormanager.cpp
|
||||
../../src/util/errormanager.c)
|
||||
target_include_directories(test_errormanager PUBLIC ../../src/)
|
||||
target_link_libraries(test_errormanager ${Boost_LIBRARIES})
|
||||
|
||||
|
||||
add_executable(test_filemanager ./test_filemanager.cpp
|
||||
../../src/util/filemanager.c
|
||||
../../src/util/cstr_helper.c)
|
||||
target_include_directories(test_filemanager PUBLIC ../../src/)
|
||||
target_link_libraries(test_filemanager ${Boost_LIBRARIES})
|
||||
57
tests/util/test_cstrhelper.cpp
Normal file
57
tests/util/test_cstrhelper.cpp
Normal file
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: test_cstrhelper.cpp
|
||||
Description: tests for C string helper functions
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 04/16/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
|
||||
#define BOOST_TEST_MODULE cstr_helper
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include "util/cstr_helper.h"
|
||||
|
||||
|
||||
boost::test_tools::predicate_result check_string(std::string test, std::string ref)
|
||||
{
|
||||
if (ref.compare(test) == 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_cstrhelper)
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_duplicate) {
|
||||
|
||||
std::string source = "I will be rewarded for good behavior.";
|
||||
char *dest = NULL;
|
||||
|
||||
cstr_duplicate(&dest, source.c_str());
|
||||
BOOST_CHECK(check_string(dest, source));
|
||||
BOOST_CHECK(cstr_isnullterm(dest) == true);
|
||||
|
||||
free(dest);
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_isvalid) {
|
||||
|
||||
BOOST_CHECK(cstr_isvalid("big tank") == false);
|
||||
BOOST_CHECK(cstr_isvalid("big\"tank") == false);
|
||||
BOOST_CHECK(cstr_isvalid("big;tank") == false);
|
||||
|
||||
BOOST_CHECK(cstr_isvalid("big-tank") == true);
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
81
tests/util/test_errormanager.cpp
Normal file
81
tests/util/test_errormanager.cpp
Normal file
@@ -0,0 +1,81 @@
|
||||
|
||||
|
||||
#define BOOST_TEST_MODULE errormanager
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include "util/errormanager.h"
|
||||
|
||||
|
||||
#define MESSAGE_STRING "This is unit testing!"
|
||||
|
||||
|
||||
void mock_lookup(int errcode, char *errmsg, int len)
|
||||
{
|
||||
char *msg = NULL;
|
||||
|
||||
if (errcode == 100) {
|
||||
msg = (char *)MESSAGE_STRING;
|
||||
}
|
||||
else {
|
||||
msg = (char *)"";
|
||||
}
|
||||
strncpy(errmsg, msg, len);
|
||||
}
|
||||
|
||||
boost::test_tools::predicate_result check_string(std::string test, std::string ref)
|
||||
{
|
||||
if (ref.compare(test) == 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_errormanager)
|
||||
|
||||
BOOST_AUTO_TEST_CASE (test_create_destroy)
|
||||
{
|
||||
error_handle_t *error_handle = NULL;
|
||||
error_handle = create_error_manager(&mock_lookup);
|
||||
|
||||
delete_error_manager(error_handle);
|
||||
}
|
||||
|
||||
|
||||
struct Fixture{
|
||||
Fixture() {
|
||||
error_message = NULL;
|
||||
error_handle = create_error_manager(&mock_lookup);
|
||||
}
|
||||
~Fixture() {
|
||||
delete_error_manager(error_handle);
|
||||
free(error_message);
|
||||
}
|
||||
int error;
|
||||
error_handle_t *error_handle;
|
||||
char *error_message;
|
||||
};
|
||||
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE (test_set_clear, Fixture)
|
||||
{
|
||||
error = set_error(error_handle, 100);
|
||||
BOOST_CHECK(error == 100);
|
||||
|
||||
clear_error(error_handle);
|
||||
error = check_error(error_handle, &error_message);
|
||||
BOOST_CHECK(error == 0);
|
||||
BOOST_CHECK(error_message == NULL);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_set_check, Fixture)
|
||||
{
|
||||
error = set_error(error_handle, 100);
|
||||
BOOST_CHECK(error == 100);
|
||||
|
||||
error = check_error(error_handle, &error_message);
|
||||
BOOST_CHECK(check_string(error_message, MESSAGE_STRING));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
97
tests/util/test_filemanager.cpp
Normal file
97
tests/util/test_filemanager.cpp
Normal file
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
******************************************************************************
|
||||
Project: OWA EPANET
|
||||
Version: 2.2
|
||||
Module: util/test_filemanager.cpp
|
||||
Description: Tests for util/filemanager.c
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 04/01/2019
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define BOOST_TEST_MODULE filemanager
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
|
||||
#include "util/filemanager.h"
|
||||
|
||||
|
||||
#define DATA_PATH_OUTPUT "./example1.out"
|
||||
|
||||
|
||||
boost::test_tools::predicate_result check_string(std::string test, std::string ref)
|
||||
{
|
||||
if (ref.compare(test) == 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_filemanager)
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE (test_create_destroy)
|
||||
{
|
||||
file_handle_t *file_handle = NULL;
|
||||
|
||||
file_handle = create_file_manager();
|
||||
BOOST_CHECK(file_handle != NULL);
|
||||
BOOST_CHECK(is_valid(file_handle) == true);
|
||||
|
||||
delete_file_manager(file_handle);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_open_close)
|
||||
{
|
||||
int error = 0;
|
||||
file_handle_t *file_handle = NULL;
|
||||
|
||||
file_handle = create_file_manager();
|
||||
BOOST_CHECK(file_handle != NULL);
|
||||
|
||||
error = open_file(file_handle, DATA_PATH_OUTPUT, "rb");
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(is_valid(file_handle) == true);
|
||||
|
||||
error = close_file(file_handle);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
|
||||
delete_file_manager(file_handle);
|
||||
}
|
||||
|
||||
struct Fixture{
|
||||
Fixture() {
|
||||
error = 0;
|
||||
file_handle = NULL;
|
||||
|
||||
file_handle = create_file_manager();
|
||||
open_file(file_handle, NULL, "wt");
|
||||
}
|
||||
~Fixture() {
|
||||
close_file(file_handle);
|
||||
delete_file_manager(file_handle);
|
||||
}
|
||||
int error;
|
||||
file_handle_t *file_handle;
|
||||
};
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(test_temp_file, Fixture)
|
||||
{
|
||||
char *filename;
|
||||
|
||||
printf_file(file_handle, "%s", "This is a test.");
|
||||
|
||||
error = get_filename(file_handle, &filename);
|
||||
BOOST_REQUIRE(error == 0);
|
||||
BOOST_CHECK(is_valid(file_handle) == true);
|
||||
|
||||
BOOST_CHECK(boost::filesystem::exists(filename) == true);
|
||||
|
||||
free(filename);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
Reference in New Issue
Block a user