floodmodeller-api 0.4.2__py3-none-any.whl → 0.4.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. floodmodeller_api/__init__.py +8 -9
  2. floodmodeller_api/_base.py +184 -176
  3. floodmodeller_api/backup.py +273 -273
  4. floodmodeller_api/dat.py +909 -838
  5. floodmodeller_api/diff.py +136 -119
  6. floodmodeller_api/ied.py +307 -311
  7. floodmodeller_api/ief.py +647 -646
  8. floodmodeller_api/ief_flags.py +253 -253
  9. floodmodeller_api/inp.py +266 -268
  10. floodmodeller_api/libs/libifcoremd.dll +0 -0
  11. floodmodeller_api/libs/libifcoremt.so.5 +0 -0
  12. floodmodeller_api/libs/libifport.so.5 +0 -0
  13. floodmodeller_api/{libmmd.dll → libs/libimf.so} +0 -0
  14. floodmodeller_api/libs/libintlc.so.5 +0 -0
  15. floodmodeller_api/libs/libmmd.dll +0 -0
  16. floodmodeller_api/libs/libsvml.so +0 -0
  17. floodmodeller_api/libs/libzzn_read.so +0 -0
  18. floodmodeller_api/libs/zzn_read.dll +0 -0
  19. floodmodeller_api/logs/__init__.py +2 -2
  20. floodmodeller_api/logs/lf.py +320 -314
  21. floodmodeller_api/logs/lf_helpers.py +354 -346
  22. floodmodeller_api/logs/lf_params.py +643 -529
  23. floodmodeller_api/mapping.py +84 -0
  24. floodmodeller_api/test/__init__.py +4 -4
  25. floodmodeller_api/test/conftest.py +9 -8
  26. floodmodeller_api/test/test_backup.py +117 -117
  27. floodmodeller_api/test/test_dat.py +221 -92
  28. floodmodeller_api/test/test_data/All Units 4_6.DAT +1081 -1081
  29. floodmodeller_api/test/test_data/All Units 4_6.feb +1081 -1081
  30. floodmodeller_api/test/test_data/BRIDGE.DAT +926 -926
  31. floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.dat +36 -36
  32. floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.feb +36 -36
  33. floodmodeller_api/test/test_data/DamBreakADI.xml +52 -52
  34. floodmodeller_api/test/test_data/DamBreakFAST.xml +58 -58
  35. floodmodeller_api/test/test_data/DamBreakFAST_dy.xml +53 -53
  36. floodmodeller_api/test/test_data/DamBreakTVD.xml +55 -55
  37. floodmodeller_api/test/test_data/DefenceBreach.xml +53 -53
  38. floodmodeller_api/test/test_data/DefenceBreachFAST.xml +60 -60
  39. floodmodeller_api/test/test_data/DefenceBreachFAST_dy.xml +55 -55
  40. floodmodeller_api/test/test_data/Domain1+2_QH.xml +76 -76
  41. floodmodeller_api/test/test_data/Domain1_H.xml +41 -41
  42. floodmodeller_api/test/test_data/Domain1_Q.xml +41 -41
  43. floodmodeller_api/test/test_data/Domain1_Q_FAST.xml +48 -48
  44. floodmodeller_api/test/test_data/Domain1_Q_FAST_dy.xml +48 -48
  45. floodmodeller_api/test/test_data/Domain1_Q_xml_expected.json +263 -0
  46. floodmodeller_api/test/test_data/Domain1_W.xml +41 -41
  47. floodmodeller_api/test/test_data/EX1.DAT +321 -321
  48. floodmodeller_api/test/test_data/EX1.ext +107 -107
  49. floodmodeller_api/test/test_data/EX1.feb +320 -320
  50. floodmodeller_api/test/test_data/EX1.gxy +107 -107
  51. floodmodeller_api/test/test_data/EX17.DAT +421 -422
  52. floodmodeller_api/test/test_data/EX17.ext +213 -213
  53. floodmodeller_api/test/test_data/EX17.feb +422 -422
  54. floodmodeller_api/test/test_data/EX18.DAT +375 -375
  55. floodmodeller_api/test/test_data/EX18_DAT_expected.json +3876 -0
  56. floodmodeller_api/test/test_data/EX2.DAT +302 -302
  57. floodmodeller_api/test/test_data/EX3.DAT +926 -926
  58. floodmodeller_api/test/test_data/EX3_DAT_expected.json +16235 -0
  59. floodmodeller_api/test/test_data/EX3_IEF_expected.json +61 -0
  60. floodmodeller_api/test/test_data/EX6.DAT +2084 -2084
  61. floodmodeller_api/test/test_data/EX6.ext +532 -532
  62. floodmodeller_api/test/test_data/EX6.feb +2084 -2084
  63. floodmodeller_api/test/test_data/EX6_DAT_expected.json +31647 -0
  64. floodmodeller_api/test/test_data/Event Data Example.DAT +336 -336
  65. floodmodeller_api/test/test_data/Event Data Example.ext +107 -107
  66. floodmodeller_api/test/test_data/Event Data Example.feb +336 -336
  67. floodmodeller_api/test/test_data/Linked1D2D.xml +52 -52
  68. floodmodeller_api/test/test_data/Linked1D2DFAST.xml +53 -53
  69. floodmodeller_api/test/test_data/Linked1D2DFAST_dy.xml +48 -48
  70. floodmodeller_api/test/test_data/Linked1D2D_xml_expected.json +313 -0
  71. floodmodeller_api/test/test_data/blockage.dat +50 -50
  72. floodmodeller_api/test/test_data/blockage.ext +45 -45
  73. floodmodeller_api/test/test_data/blockage.feb +9 -9
  74. floodmodeller_api/test/test_data/blockage.gxy +71 -71
  75. floodmodeller_api/test/test_data/defaultUnits.dat +127 -127
  76. floodmodeller_api/test/test_data/defaultUnits.ext +45 -45
  77. floodmodeller_api/test/test_data/defaultUnits.feb +9 -9
  78. floodmodeller_api/test/test_data/defaultUnits.fmpx +58 -58
  79. floodmodeller_api/test/test_data/defaultUnits.gxy +85 -85
  80. floodmodeller_api/test/test_data/ex3.ief +20 -20
  81. floodmodeller_api/test/test_data/ex3.lf1 +2800 -2800
  82. floodmodeller_api/test/test_data/ex4.DAT +1374 -1374
  83. floodmodeller_api/test/test_data/ex4_changed.DAT +1374 -1374
  84. floodmodeller_api/test/test_data/example1.inp +329 -329
  85. floodmodeller_api/test/test_data/example2.inp +158 -158
  86. floodmodeller_api/test/test_data/example3.inp +297 -297
  87. floodmodeller_api/test/test_data/example4.inp +388 -388
  88. floodmodeller_api/test/test_data/example5.inp +147 -147
  89. floodmodeller_api/test/test_data/example6.inp +154 -154
  90. floodmodeller_api/test/test_data/jump.dat +176 -176
  91. floodmodeller_api/test/test_data/network.dat +1374 -1374
  92. floodmodeller_api/test/test_data/network.ext +45 -45
  93. floodmodeller_api/test/test_data/network.exy +1 -1
  94. floodmodeller_api/test/test_data/network.feb +45 -45
  95. floodmodeller_api/test/test_data/network.ied +45 -45
  96. floodmodeller_api/test/test_data/network.ief +20 -20
  97. floodmodeller_api/test/test_data/network.inp +147 -147
  98. floodmodeller_api/test/test_data/network.pxy +57 -57
  99. floodmodeller_api/test/test_data/network.zzd +122 -122
  100. floodmodeller_api/test/test_data/network_dat_expected.json +21837 -0
  101. floodmodeller_api/test/test_data/network_from_tabularCSV.csv +87 -87
  102. floodmodeller_api/test/test_data/network_ied_expected.json +287 -0
  103. floodmodeller_api/test/test_data/rnweir.dat +9 -9
  104. floodmodeller_api/test/test_data/rnweir.ext +45 -45
  105. floodmodeller_api/test/test_data/rnweir.feb +9 -9
  106. floodmodeller_api/test/test_data/rnweir.gxy +45 -45
  107. floodmodeller_api/test/test_data/rnweir_default.dat +74 -74
  108. floodmodeller_api/test/test_data/rnweir_default.ext +45 -45
  109. floodmodeller_api/test/test_data/rnweir_default.feb +9 -9
  110. floodmodeller_api/test/test_data/rnweir_default.fmpx +58 -58
  111. floodmodeller_api/test/test_data/rnweir_default.gxy +53 -53
  112. floodmodeller_api/test/test_data/unit checks.dat +16 -16
  113. floodmodeller_api/test/test_ied.py +29 -29
  114. floodmodeller_api/test/test_ief.py +125 -24
  115. floodmodeller_api/test/test_inp.py +47 -48
  116. floodmodeller_api/test/test_json.py +114 -0
  117. floodmodeller_api/test/test_logs_lf.py +48 -51
  118. floodmodeller_api/test/test_tool.py +165 -154
  119. floodmodeller_api/test/test_toolbox_structure_log.py +234 -239
  120. floodmodeller_api/test/test_xml2d.py +151 -156
  121. floodmodeller_api/test/test_zzn.py +36 -34
  122. floodmodeller_api/to_from_json.py +218 -0
  123. floodmodeller_api/tool.py +332 -330
  124. floodmodeller_api/toolbox/__init__.py +5 -5
  125. floodmodeller_api/toolbox/example_tool.py +45 -45
  126. floodmodeller_api/toolbox/model_build/__init__.py +2 -2
  127. floodmodeller_api/toolbox/model_build/add_siltation_definition.py +100 -94
  128. floodmodeller_api/toolbox/model_build/structure_log/__init__.py +1 -1
  129. floodmodeller_api/toolbox/model_build/structure_log/structure_log.py +287 -289
  130. floodmodeller_api/toolbox/model_build/structure_log_definition.py +76 -72
  131. floodmodeller_api/units/__init__.py +10 -10
  132. floodmodeller_api/units/_base.py +214 -209
  133. floodmodeller_api/units/boundaries.py +467 -469
  134. floodmodeller_api/units/comment.py +52 -55
  135. floodmodeller_api/units/conduits.py +382 -403
  136. floodmodeller_api/units/helpers.py +123 -132
  137. floodmodeller_api/units/iic.py +107 -101
  138. floodmodeller_api/units/losses.py +305 -308
  139. floodmodeller_api/units/sections.py +444 -445
  140. floodmodeller_api/units/structures.py +1690 -1684
  141. floodmodeller_api/units/units.py +93 -102
  142. floodmodeller_api/units/unsupported.py +44 -44
  143. floodmodeller_api/units/variables.py +87 -89
  144. floodmodeller_api/urban1d/__init__.py +11 -11
  145. floodmodeller_api/urban1d/_base.py +188 -177
  146. floodmodeller_api/urban1d/conduits.py +93 -85
  147. floodmodeller_api/urban1d/general_parameters.py +58 -58
  148. floodmodeller_api/urban1d/junctions.py +81 -79
  149. floodmodeller_api/urban1d/losses.py +81 -74
  150. floodmodeller_api/urban1d/outfalls.py +114 -107
  151. floodmodeller_api/urban1d/raingauges.py +111 -108
  152. floodmodeller_api/urban1d/subsections.py +92 -93
  153. floodmodeller_api/urban1d/xsections.py +147 -141
  154. floodmodeller_api/util.py +77 -21
  155. floodmodeller_api/validation/parameters.py +660 -660
  156. floodmodeller_api/validation/urban_parameters.py +388 -404
  157. floodmodeller_api/validation/validation.py +110 -112
  158. floodmodeller_api/version.py +1 -1
  159. floodmodeller_api/xml2d.py +688 -684
  160. floodmodeller_api/xml2d_template.py +37 -37
  161. floodmodeller_api/zzn.py +387 -365
  162. {floodmodeller_api-0.4.2.dist-info → floodmodeller_api-0.4.3.dist-info}/LICENSE.txt +13 -13
  163. {floodmodeller_api-0.4.2.dist-info → floodmodeller_api-0.4.3.dist-info}/METADATA +82 -82
  164. floodmodeller_api-0.4.3.dist-info/RECORD +179 -0
  165. {floodmodeller_api-0.4.2.dist-info → floodmodeller_api-0.4.3.dist-info}/WHEEL +1 -1
  166. floodmodeller_api-0.4.3.dist-info/entry_points.txt +3 -0
  167. floodmodeller_api/libifcoremd.dll +0 -0
  168. floodmodeller_api/test/test_data/EX3.bmp +0 -0
  169. floodmodeller_api/test/test_data/test_output.csv +0 -87
  170. floodmodeller_api/zzn_read.dll +0 -0
  171. floodmodeller_api-0.4.2.data/scripts/fmapi-add_siltation.bat +0 -2
  172. floodmodeller_api-0.4.2.data/scripts/fmapi-add_siltation.py +0 -3
  173. floodmodeller_api-0.4.2.data/scripts/fmapi-structure_log.bat +0 -2
  174. floodmodeller_api-0.4.2.data/scripts/fmapi-structure_log.py +0 -3
  175. floodmodeller_api-0.4.2.data/scripts/fmapi-toolbox.bat +0 -2
  176. floodmodeller_api-0.4.2.data/scripts/fmapi-toolbox.py +0 -41
  177. floodmodeller_api-0.4.2.dist-info/RECORD +0 -169
  178. {floodmodeller_api-0.4.2.dist-info → floodmodeller_api-0.4.3.dist-info}/top_level.txt +0 -0
@@ -1,239 +1,234 @@
1
- import copy
2
- import csv
3
- import os
4
- from tempfile import NamedTemporaryFile
5
-
6
- import pandas as pd
7
- import pytest
8
-
9
- from floodmodeller_api import DAT
10
- from floodmodeller_api.toolbox.model_build.structure_log import StructureLogBuilder
11
- from floodmodeller_api.units.conduits import CONDUIT
12
- from floodmodeller_api.units.structures import ORIFICE
13
-
14
-
15
- @pytest.fixture
16
- def slb():
17
- return StructureLogBuilder("", "")
18
-
19
-
20
- @pytest.fixture
21
- def conduit_empty():
22
- c = CONDUIT()
23
- c.dist_to_next = 0
24
- c.friction_above_axis = 0
25
- c.friction_below_axis = 0
26
- c.height_crown = 0
27
- c.height_springing = 0
28
- c.height = 0
29
- c.width = 0
30
- c.diameter = 0
31
- c.friction_on_invert = 0
32
- c.friction_on_soffit = 0
33
- c.friction_on_walls = 0
34
- c.coords = pd.DataFrame(
35
- data={
36
- "x": [0, 0],
37
- "y": [0, 0],
38
- "cw_friction": [0, 0],
39
- }
40
- )
41
- return c
42
-
43
-
44
- @pytest.fixture
45
- def conduit_filled():
46
- c = CONDUIT()
47
- c.dist_to_next = 0
48
- c.friction_above_axis = 1.453345
49
- c.friction_below_axis = 3.435
50
- c.height_crown = 23.1
51
- c.height_springing = 5.4
52
- c.height = 25.45
53
- c.width = 3
54
- c.diameter = 6
55
- c.friction_on_invert = 1.876
56
- c.friction_on_soffit = 1.34
57
- c.friction_on_walls = 1.8
58
- c.coords = pd.DataFrame(
59
- data={
60
- "x": [34, 43, 45, 3, 12, 7, 78],
61
- "y": [0, 0, 4, 5, 10, 65, 32],
62
- "cw_friction": [0, 0, 0, 3, 4, 3.5, 2],
63
- }
64
- )
65
- return c
66
-
67
-
68
- @pytest.fixture
69
- def no_length():
70
- return 0
71
-
72
-
73
- @pytest.fixture
74
- def with_length():
75
- return 4.973
76
-
77
-
78
- @pytest.fixture
79
- def structure():
80
- return ORIFICE()
81
-
82
-
83
- def test_conduit_data(slb, conduit_empty):
84
- slb._dat = DAT()
85
- output = slb._conduit_data(conduit_empty)
86
- assert output == [0.0, "", ""]
87
-
88
-
89
- def test_culvert_loss_data(slb):
90
- output = slb._culvert_loss_data("", "")
91
- assert output == ""
92
- output = slb._culvert_loss_data("TEST1", "TEST2")
93
- assert output == "Ki: TEST1, Ko: TEST2"
94
-
95
-
96
- def test_circular_data(slb, conduit_empty, conduit_filled, no_length, with_length):
97
- slb._dat = DAT()
98
- output = slb._circular_data(conduit_empty, no_length)
99
- assert output == ["Mannings: 0", "dia: 0.00 x l: 0.00"]
100
- output = slb._circular_data(conduit_filled, with_length)
101
- assert output == [
102
- "Mannings: [min: 1.453345, max: 3.435]",
103
- "dia: 6.00 x l: 4.97",
104
- ]
105
-
106
-
107
- def test_sprungarch_data(slb, conduit_empty, conduit_filled, no_length, with_length):
108
- output = slb._sprungarch_data(conduit_empty, no_length)
109
- assert output == [
110
- "Mannings: 0",
111
- "(Springing: 0.00, Crown: 0.00) x w: 0.00 x l: 0.00",
112
- ]
113
- output = slb._sprungarch_data(conduit_filled, with_length)
114
- assert output == [
115
- "Mannings: [min: 1.34, max: 1.876]",
116
- "(Springing: 23.10, Crown: 5.40) x w: 3.00 x l: 4.97",
117
- ]
118
-
119
-
120
- def test_rectangular_data(slb, conduit_empty, conduit_filled, no_length, with_length):
121
- output = slb._rectangular_data(conduit_empty, no_length)
122
- assert output == ["Mannings: 0", "h: 0.00 x w: 0.00 x l: 0.00"]
123
- output = slb._rectangular_data(conduit_filled, with_length)
124
- assert output == [
125
- "Mannings: [min: 1.34, max: 1.876]",
126
- "h: 25.45 x w: 3.00 x l: 4.97",
127
- ]
128
-
129
-
130
- def test_section_data(slb, conduit_empty, conduit_filled, no_length, with_length):
131
- output = slb._section_data(conduit_empty, no_length)
132
- assert output == ["Colebrook-White: 0", "h: 0.00 x w: 0.00 x l: 0.00"]
133
- output = slb._section_data(conduit_filled, with_length)
134
- assert output == [
135
- "Colebrook-White: [min: 0.0, max: 4.0]",
136
- "h: 65.00 x w: 150.00 x l: 4.97",
137
- ]
138
-
139
-
140
- def test_sprung_data(slb, conduit_empty, conduit_filled, no_length, with_length):
141
- output = slb._sprung_data(conduit_empty, no_length)
142
- assert output == [
143
- "Mannings: 0",
144
- "(Springing: 0.00, Crown: 0.00) x w: 0.00 x l: 0.00",
145
- ]
146
- output = slb._sprung_data(conduit_filled, with_length)
147
- assert output == [
148
- "Mannings: [min: 1.34, max: 1.876]",
149
- "(Springing: 23.10, Crown: 5.40) x w: 3.00 x l: 4.97",
150
- ]
151
-
152
-
153
- def test_orifice_dimensions(slb, structure):
154
- structure.invert = 1
155
- output = slb._orifice_dimensions(structure)
156
- assert output == "h: -1.00 x w: -1.00"
157
-
158
-
159
- def test_spill_data(slb, structure):
160
- structure.data = pd.DataFrame(data={"X": [0, 0], "Y": [0, 0]})
161
- structure.weir_coefficient = 0
162
- output = slb._spill_data(structure)
163
- assert output == ["Elevation: 0.00 x w: 0.00", 0]
164
-
165
-
166
- def test_bridge_data(slb, structure):
167
- structure.section_data = pd.DataFrame(data={"X": [0, 0], "Y": [0, 0], "Mannings n": [0, 0]})
168
- structure.opening_data = pd.DataFrame(
169
- data={"Start": 0, "Finish": 0, "Springing Level": 0, "Soffit Level": 0},
170
- index=[0],
171
- )
172
- output = slb._bridge_data(structure)
173
- assert output == ["Mannings: 0", "h: 0.00 x w: 0.00"]
174
-
175
-
176
- def test_add_conduits(slb, conduit_filled):
177
- slb._dat = DAT()
178
- prev_c = copy.deepcopy(conduit_filled)
179
- prev_c.dist_to_next = 0
180
- prev_c.name = "prev"
181
- slb._dat.conduits["prev"] = prev_c
182
- conduit_filled.dist_to_next = 5
183
- slb._dat.conduits["test_conduit"] = conduit_filled
184
- next_c = copy.deepcopy(conduit_filled)
185
- next_c.dist_to_next = 0
186
- slb._dat.conduits["next"] = next_c
187
- slb._dat._all_units = [prev_c, conduit_filled, next_c]
188
- conduit_non_subtype = copy.deepcopy(conduit_filled)
189
- conduit_non_subtype._subtype = "NON_SUBTYPE"
190
- slb._dat.conduits["test_conduit_NON_SUBTYPE"] = conduit_non_subtype
191
- tmp = NamedTemporaryFile(suffix=".csv", delete=False)
192
- with open(tmp.name, "w") as temp:
193
- slb._writer = csv.writer(temp)
194
- slb._add_conduits()
195
- tmp.close()
196
- os.unlink(tmp.name)
197
-
198
-
199
- def test_add_structures(slb, structure):
200
- slb._dat = DAT()
201
- structure.soffit = 3
202
- structure.weir_coefficient = 1
203
- structure.data = pd.DataFrame(data={"X": [0, 0], "Y": [0, 0]})
204
- structure.section_data = pd.DataFrame(data={"X": [0, 0], "Y": [0, 0], "Mannings n": [0, 0]})
205
- structure.opening_data = pd.DataFrame(
206
- data={"Start": 0, "Finish": 0, "Springing Level": 0, "Soffit Level": 0},
207
- index=[0],
208
- )
209
- structure.crest_elevation = 1
210
- structure.weir_breadth = 1
211
- structure.weir_length = 1
212
- structure.weir_elevation = 1
213
- slb._dat.structures["test_structure_orifice"] = structure
214
- struc_spill = copy.deepcopy(structure)
215
- struc_spill._unit = "SPILL"
216
- slb._dat.structures["test_structure_spill"] = struc_spill
217
- struc_sluice = copy.deepcopy(structure)
218
- struc_sluice._unit = "SLUICE"
219
- slb._dat.structures["test_structure_sluice"] = struc_sluice
220
- struc_rnweir = copy.deepcopy(structure)
221
- struc_rnweir._unit = "RNWEIR"
222
- slb._dat.structures["test_structure_rnweir"] = struc_rnweir
223
- struc_weir = copy.deepcopy(structure)
224
- struc_weir._unit = "WEIR"
225
- slb._dat.structures["test_structure_weir"] = struc_weir
226
- struc_bridge = copy.deepcopy(structure)
227
- struc_bridge._unit = "BRIDGE"
228
- slb._dat.structures["test_structure_bridge"] = struc_bridge
229
- struc_none = copy.deepcopy(structure)
230
- struc_none._unit = "NONE"
231
- slb._dat.structures["test_structure_none"] = struc_none
232
-
233
- with open((NamedTemporaryFile(suffix=".csv", delete=True)).name, "w") as tmp:
234
- slb._writer = csv.writer(tmp)
235
- slb._add_structures()
236
- # with open(tmp.name, "w") as temp:
237
- #
238
- # tmp.close()
239
- # os.unlink(tmp.name)
1
+ import copy
2
+ import csv
3
+ from pathlib import Path
4
+
5
+ import pandas as pd
6
+ import pytest
7
+
8
+ from floodmodeller_api import DAT
9
+ from floodmodeller_api.toolbox.model_build.structure_log import StructureLogBuilder
10
+ from floodmodeller_api.units.conduits import CONDUIT
11
+ from floodmodeller_api.units.structures import ORIFICE
12
+
13
+
14
+ @pytest.fixture
15
+ def slb():
16
+ return StructureLogBuilder("", "")
17
+
18
+
19
+ @pytest.fixture
20
+ def conduit_empty():
21
+ c = CONDUIT()
22
+ c.dist_to_next = 0
23
+ c.friction_above_axis = 0
24
+ c.friction_below_axis = 0
25
+ c.height_crown = 0
26
+ c.height_springing = 0
27
+ c.height = 0
28
+ c.width = 0
29
+ c.diameter = 0
30
+ c.friction_on_invert = 0
31
+ c.friction_on_soffit = 0
32
+ c.friction_on_walls = 0
33
+ c.coords = pd.DataFrame(
34
+ data={
35
+ "x": [0, 0],
36
+ "y": [0, 0],
37
+ "cw_friction": [0, 0],
38
+ },
39
+ )
40
+ return c
41
+
42
+
43
+ @pytest.fixture
44
+ def conduit_filled():
45
+ c = CONDUIT()
46
+ c.dist_to_next = 0
47
+ c.friction_above_axis = 1.453345
48
+ c.friction_below_axis = 3.435
49
+ c.height_crown = 23.1
50
+ c.height_springing = 5.4
51
+ c.height = 25.45
52
+ c.width = 3
53
+ c.diameter = 6
54
+ c.friction_on_invert = 1.876
55
+ c.friction_on_soffit = 1.34
56
+ c.friction_on_walls = 1.8
57
+ c.coords = pd.DataFrame(
58
+ data={
59
+ "x": [34, 43, 45, 3, 12, 7, 78],
60
+ "y": [0, 0, 4, 5, 10, 65, 32],
61
+ "cw_friction": [0, 0, 0, 3, 4, 3.5, 2],
62
+ },
63
+ )
64
+ return c
65
+
66
+
67
+ @pytest.fixture
68
+ def no_length():
69
+ return 0
70
+
71
+
72
+ @pytest.fixture
73
+ def with_length():
74
+ return 4.973
75
+
76
+
77
+ @pytest.fixture
78
+ def structure():
79
+ return ORIFICE()
80
+
81
+
82
+ def test_conduit_data(slb, conduit_empty):
83
+ slb._dat = DAT()
84
+ output = slb._conduit_data(conduit_empty)
85
+ assert output == [0.0, "", ""]
86
+
87
+
88
+ def test_culvert_loss_data(slb):
89
+ output = slb._culvert_loss_data("", "")
90
+ assert output == ""
91
+ output = slb._culvert_loss_data("TEST1", "TEST2")
92
+ assert output == "Ki: TEST1, Ko: TEST2"
93
+
94
+
95
+ def test_circular_data(slb, conduit_empty, conduit_filled, no_length, with_length):
96
+ slb._dat = DAT()
97
+ output = slb._circular_data(conduit_empty, no_length)
98
+ assert output == ["Mannings: 0", "dia: 0.00 x l: 0.00"]
99
+ output = slb._circular_data(conduit_filled, with_length)
100
+ assert output == [
101
+ "Mannings: [min: 1.453345, max: 3.435]",
102
+ "dia: 6.00 x l: 4.97",
103
+ ]
104
+
105
+
106
+ def test_sprungarch_data(slb, conduit_empty, conduit_filled, no_length, with_length):
107
+ output = slb._sprungarch_data(conduit_empty, no_length)
108
+ assert output == [
109
+ "Mannings: 0",
110
+ "(Springing: 0.00, Crown: 0.00) x w: 0.00 x l: 0.00",
111
+ ]
112
+ output = slb._sprungarch_data(conduit_filled, with_length)
113
+ assert output == [
114
+ "Mannings: [min: 1.34, max: 1.876]",
115
+ "(Springing: 23.10, Crown: 5.40) x w: 3.00 x l: 4.97",
116
+ ]
117
+
118
+
119
+ def test_rectangular_data(slb, conduit_empty, conduit_filled, no_length, with_length):
120
+ output = slb._rectangular_data(conduit_empty, no_length)
121
+ assert output == ["Mannings: 0", "h: 0.00 x w: 0.00 x l: 0.00"]
122
+ output = slb._rectangular_data(conduit_filled, with_length)
123
+ assert output == [
124
+ "Mannings: [min: 1.34, max: 1.876]",
125
+ "h: 25.45 x w: 3.00 x l: 4.97",
126
+ ]
127
+
128
+
129
+ def test_section_data(slb, conduit_empty, conduit_filled, no_length, with_length):
130
+ output = slb._section_data(conduit_empty, no_length)
131
+ assert output == ["Colebrook-White: 0", "h: 0.00 x w: 0.00 x l: 0.00"]
132
+ output = slb._section_data(conduit_filled, with_length)
133
+ assert output == [
134
+ "Colebrook-White: [min: 0.0, max: 4.0]",
135
+ "h: 65.00 x w: 150.00 x l: 4.97",
136
+ ]
137
+
138
+
139
+ def test_sprung_data(slb, conduit_empty, conduit_filled, no_length, with_length):
140
+ output = slb._sprung_data(conduit_empty, no_length)
141
+ assert output == [
142
+ "Mannings: 0",
143
+ "(Springing: 0.00, Crown: 0.00) x w: 0.00 x l: 0.00",
144
+ ]
145
+ output = slb._sprung_data(conduit_filled, with_length)
146
+ assert output == [
147
+ "Mannings: [min: 1.34, max: 1.876]",
148
+ "(Springing: 23.10, Crown: 5.40) x w: 3.00 x l: 4.97",
149
+ ]
150
+
151
+
152
+ def test_orifice_dimensions(slb, structure):
153
+ structure.invert = 1
154
+ output = slb._orifice_dimensions(structure)
155
+ assert output == "h: -1.00 x w: -1.00"
156
+
157
+
158
+ def test_spill_data(slb, structure):
159
+ structure.data = pd.DataFrame(data={"X": [0, 0], "Y": [0, 0]})
160
+ structure.weir_coefficient = 0
161
+ output = slb._spill_data(structure)
162
+ assert output == ["Elevation: 0.00 x w: 0.00", 0]
163
+
164
+
165
+ def test_bridge_data(slb, structure):
166
+ structure.section_data = pd.DataFrame(data={"X": [0, 0], "Y": [0, 0], "Mannings n": [0, 0]})
167
+ structure.opening_data = pd.DataFrame(
168
+ data={"Start": 0, "Finish": 0, "Springing Level": 0, "Soffit Level": 0},
169
+ index=[0],
170
+ )
171
+ output = slb._bridge_data(structure)
172
+ assert output == ["Mannings: 0", "h: 0.00 x w: 0.00"]
173
+
174
+
175
+ def test_add_conduits(slb, conduit_filled, tmpdir):
176
+ slb._dat = DAT()
177
+ prev_c = copy.deepcopy(conduit_filled)
178
+ prev_c.dist_to_next = 0
179
+ prev_c.name = "prev"
180
+ slb._dat.conduits["prev"] = prev_c
181
+ conduit_filled.dist_to_next = 5
182
+ slb._dat.conduits["test_conduit"] = conduit_filled
183
+ next_c = copy.deepcopy(conduit_filled)
184
+ next_c.dist_to_next = 0
185
+ slb._dat.conduits["next"] = next_c
186
+ slb._dat._all_units = [prev_c, conduit_filled, next_c]
187
+ conduit_non_subtype = copy.deepcopy(conduit_filled)
188
+ conduit_non_subtype._subtype = "NON_SUBTYPE"
189
+ slb._dat.conduits["test_conduit_NON_SUBTYPE"] = conduit_non_subtype
190
+
191
+ tmp_csv = Path(tmpdir) / "temp_structure_data.csv"
192
+ with tmp_csv.open("w") as file:
193
+ slb._writer = csv.writer(file)
194
+ slb._add_conduits()
195
+
196
+
197
+ def test_add_structures(slb, structure, tmpdir):
198
+ slb._dat = DAT()
199
+ structure.soffit = 3
200
+ structure.weir_coefficient = 1
201
+ structure.data = pd.DataFrame(data={"X": [0, 0], "Y": [0, 0]})
202
+ structure.section_data = pd.DataFrame(data={"X": [0, 0], "Y": [0, 0], "Mannings n": [0, 0]})
203
+ structure.opening_data = pd.DataFrame(
204
+ data={"Start": 0, "Finish": 0, "Springing Level": 0, "Soffit Level": 0},
205
+ index=[0],
206
+ )
207
+ structure.crest_elevation = 1
208
+ structure.weir_breadth = 1
209
+ structure.weir_length = 1
210
+ structure.weir_elevation = 1
211
+ slb._dat.structures["test_structure_orifice"] = structure
212
+ struc_spill = copy.deepcopy(structure)
213
+ struc_spill._unit = "SPILL"
214
+ slb._dat.structures["test_structure_spill"] = struc_spill
215
+ struc_sluice = copy.deepcopy(structure)
216
+ struc_sluice._unit = "SLUICE"
217
+ slb._dat.structures["test_structure_sluice"] = struc_sluice
218
+ struc_rnweir = copy.deepcopy(structure)
219
+ struc_rnweir._unit = "RNWEIR"
220
+ slb._dat.structures["test_structure_rnweir"] = struc_rnweir
221
+ struc_weir = copy.deepcopy(structure)
222
+ struc_weir._unit = "WEIR"
223
+ slb._dat.structures["test_structure_weir"] = struc_weir
224
+ struc_bridge = copy.deepcopy(structure)
225
+ struc_bridge._unit = "BRIDGE"
226
+ slb._dat.structures["test_structure_bridge"] = struc_bridge
227
+ struc_none = copy.deepcopy(structure)
228
+ struc_none._unit = "NONE"
229
+ slb._dat.structures["test_structure_none"] = struc_none
230
+
231
+ tmp_csv = Path(tmpdir) / "temp_structure_data.csv"
232
+ with tmp_csv.open("w") as file:
233
+ slb._writer = csv.writer(file)
234
+ slb._add_structures()