|
1 | 1 | """Tests for calibration module""" |
2 | 2 |
|
3 | 3 | import unittest |
4 | | -from unittest.mock import create_autospec |
| 4 | +from unittest.mock import patch, create_autospec, MagicMock |
5 | 5 |
|
6 | 6 | import numpy as np |
7 | 7 | import numpy.testing as npt |
|
10 | 10 |
|
11 | 11 | from climada.entity import Exposures, ImpactFunc, ImpactFuncSet |
12 | 12 | from climada.hazard import Hazard, Centroids |
| 13 | +from climada.engine import ImpactCalc |
13 | 14 |
|
14 | | -from climada.util.calibrate import Input |
15 | | -from climada.util.calibrate.base import Optimizer |
| 15 | +from climada.util.calibrate import Input, OutputEvaluator |
| 16 | +from climada.util.calibrate.base import Optimizer, Output |
16 | 17 |
|
17 | 18 |
|
18 | 19 | class ConcreteOptimizer(Optimizer): |
@@ -138,14 +139,11 @@ def test_align_impact(self): |
138 | 139 | ) |
139 | 140 | pd.testing.assert_frame_equal(data_aligned, data_aligned_test) |
140 | 141 | impact_df_aligned_test = pd.DataFrame( |
141 | | - data={"col1": [0, 0, 0], "col2": [0, 1, 0], "col3": [0, 0, 0]}, |
142 | | - index=[0, 1, 2], |
143 | | - dtype="float", |
144 | | - ) |
145 | | - pd.testing.assert_frame_equal( |
146 | | - impact_df_aligned, |
147 | | - impact_df_aligned_test |
| 142 | + data={"col1": [0, 0, 0], "col2": [0, 1, 0], "col3": [0, 0, 0]}, |
| 143 | + index=[0, 1, 2], |
| 144 | + dtype="float", |
148 | 145 | ) |
| 146 | + pd.testing.assert_frame_equal(impact_df_aligned, impact_df_aligned_test) |
149 | 147 |
|
150 | 148 | # Check fillna |
151 | 149 | data_aligned, impact_df_aligned = input.impact_to_aligned_df(None, fillna=0) |
@@ -189,8 +187,46 @@ def setUp(self): |
189 | 187 | self.optimizer = ConcreteOptimizer(self.input) |
190 | 188 |
|
191 | 189 |
|
| 190 | +class TestOutputEvaluator(unittest.TestCase): |
| 191 | + """Test the output evaluator""" |
| 192 | + |
| 193 | + def setUp(self): |
| 194 | + """Create Input and Output""" |
| 195 | + self.input = Input( |
| 196 | + hazard=hazard(), |
| 197 | + exposure=exposure(), |
| 198 | + data=pd.DataFrame(), |
| 199 | + impact_func_creator=MagicMock(), |
| 200 | + # Should not be called |
| 201 | + impact_to_dataframe=lambda _: None, |
| 202 | + cost_func=lambda _: None, |
| 203 | + ) |
| 204 | + self.output = Output(params={"p1": 1, "p2": 2.0}, target=0.0) |
| 205 | + |
| 206 | + @patch("climada.util.calibrate.base.ImpactCalc", autospec=True) |
| 207 | + def test_init(self, mock): |
| 208 | + """Test initialization""" |
| 209 | + self.input.exposure.value_unit = "my_unit" |
| 210 | + self.input.impact_func_creator.return_value = "impact_func" |
| 211 | + impact_calc_mock = MagicMock(ImpactCalc) |
| 212 | + mock.return_value = impact_calc_mock |
| 213 | + impact_calc_mock.impact = MagicMock() |
| 214 | + impact_calc_mock.impact.return_value = "impact" |
| 215 | + |
| 216 | + out_eval = OutputEvaluator(self.input, self.output) |
| 217 | + self.assertEqual(out_eval.impf_set, "impact_func") |
| 218 | + self.assertEqual(out_eval.impact, "impact") |
| 219 | + self.assertEqual(out_eval._impact_label, "Impact [my_unit]") |
| 220 | + |
| 221 | + self.input.impact_func_creator.assert_called_with(p1=1, p2=2.0) |
| 222 | + mock.assert_called_with( |
| 223 | + self.input.exposure, "impact_func", self.input.hazard |
| 224 | + ) |
| 225 | + |
| 226 | + |
192 | 227 | # Execute Tests |
193 | 228 | if __name__ == "__main__": |
194 | 229 | TESTS = unittest.TestLoader().loadTestsFromTestCase(TestInputPostInit) |
195 | 230 | TESTS.addTests(unittest.TestLoader().loadTestsFromTestCase(TestOptimizer)) |
| 231 | + TESTS.addTests(unittest.TestLoader().loadTestsFromTestCase(TestOutputEvaluator)) |
196 | 232 | unittest.TextTestRunner(verbosity=2).run(TESTS) |
0 commit comments