|
4 | 4 | from textwrap import dedent |
5 | 5 | from unittest.mock import MagicMock |
6 | 6 |
|
| 7 | +import numpy as np |
7 | 8 | import pytest |
| 9 | +from ruamel.yaml import YAML |
8 | 10 |
|
9 | 11 | from ert.cli.main import ErtCliError |
10 | | -from ert.config._observations import SummaryObservation |
| 12 | +from ert.config._observations import ErrorModes, SummaryObservation |
11 | 13 | from ert.observation_converters import convert_observations |
12 | 14 | from ert.observation_converters.summary_to_yaml import YamlConverter |
13 | 15 | from ert.plugins import ErtRuntimePlugins |
@@ -209,3 +211,68 @@ def test_that_yaml_converter_retains_time_precision_when_present(): |
209 | 211 | minute_precision, |
210 | 212 | hour_precision, |
211 | 213 | ] |
| 214 | + |
| 215 | + |
| 216 | +_VALUE = 10 |
| 217 | +_ERROR = 5 |
| 218 | + |
| 219 | + |
| 220 | +def _setup_and_convert_with_error_mode_config( |
| 221 | + error_mode: ErrorModes, error_min=None |
| 222 | +) -> int | float: |
| 223 | + config = "config.ert" |
| 224 | + obs_config = "obs.txt" |
| 225 | + |
| 226 | + config_content = f"""\ |
| 227 | + NUM_REALIZATIONS 5 |
| 228 | + ECLBASE FOO |
| 229 | + OBS_CONFIG {obs_config} |
| 230 | + """ |
| 231 | + error_min_line = f"ERROR_MIN={error_min};" if error_min is not None else "" |
| 232 | + obs_config_content = f"""\ |
| 233 | + SUMMARY_OBSERVATION {{ |
| 234 | + KEY=FOPR; |
| 235 | + VALUE={_VALUE}; |
| 236 | + ERROR={_ERROR}; |
| 237 | + ERROR_MODE={error_mode}; |
| 238 | + DATE=2010-10-10; |
| 239 | + {error_min_line} |
| 240 | + }};""" |
| 241 | + Path(config).write_text(config_content, encoding="utf-8") |
| 242 | + Path(obs_config).write_text(obs_config_content, encoding="utf-8") |
| 243 | + |
| 244 | + args = MagicMock(format="yaml", config=config) |
| 245 | + convert_observations(args, ErtRuntimePlugins()) |
| 246 | + |
| 247 | + yaml = YAML() |
| 248 | + with Path.open(YamlConverter.TARGET_FILE) as f: |
| 249 | + yaml_output = yaml.load(f) |
| 250 | + |
| 251 | + return yaml_output["smry"][0]["observations"][0]["error"] |
| 252 | + |
| 253 | + |
| 254 | +def test_that_absolute_error_is_unchanged_after_conversion(use_tmpdir): |
| 255 | + error = _setup_and_convert_with_error_mode_config(error_mode=ErrorModes.ABS) |
| 256 | + assert error == _ERROR |
| 257 | + |
| 258 | + |
| 259 | +def test_that_relative_error_is_product_of_val_and_error_after_conversion(use_tmpdir): |
| 260 | + error = _setup_and_convert_with_error_mode_config(error_mode=ErrorModes.REL) |
| 261 | + assert error == _ERROR * _VALUE |
| 262 | + |
| 263 | + |
| 264 | +def test_that_rel_min_error_is_product_of_val_and_err_after_conversion_given_no_err_min( |
| 265 | + use_tmpdir, |
| 266 | +): |
| 267 | + error = _setup_and_convert_with_error_mode_config(error_mode=ErrorModes.RELMIN) |
| 268 | + assert error == _ERROR * _VALUE |
| 269 | + |
| 270 | + |
| 271 | +def test_that_relative_min_error_is_unchanged_after_conversion_given_error_min_key( |
| 272 | + use_tmpdir, |
| 273 | +): |
| 274 | + error_min = np.inf |
| 275 | + error = _setup_and_convert_with_error_mode_config( |
| 276 | + error_mode=ErrorModes.RELMIN, error_min=error_min |
| 277 | + ) |
| 278 | + assert error == error_min |
0 commit comments