Skip to content

Commit

Permalink
559: Added tests for the parsing of scientific notation strings
Browse files Browse the repository at this point in the history
  • Loading branch information
tim-vd-aardweg committed Apr 18, 2024
1 parent 53486cb commit ec6150b
Showing 1 changed file with 75 additions and 2 deletions.
77 changes: 75 additions & 2 deletions tests/dflowfm/ini/test_models.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from math import nan
from typing import List

import pytest
from pydantic.v1.error_wrappers import ValidationError

from hydrolib.core.dflowfm.ini.models import DataBlockINIBasedModel

from hydrolib.core.dflowfm.ini.models import DataBlockINIBasedModel, INIBasedModel
from ...utils import error_occurs_only_once


Expand Down Expand Up @@ -39,3 +39,76 @@ def test_datablock_with_multiple_nans_should_only_give_error_once(self):

expected_message = "NaN is not supported in datablocks."
assert error_occurs_only_once(expected_message, str(error.value))


class TestINIBasedModel:
class INIBasedModelTest(INIBasedModel):
id: str
float_value: float
float_values: List[float]

_random_string: str = "randomString"
_random_float: float = 123.456
_random_list_of_floats: List[float] = [12.34, 56.78]

@pytest.mark.parametrize("string_value", ["1d0", "1d-2", "1d+2", "1.d+2", "-1.d-2"])
def test_scientific_notation_for_string_field_is_parsed_as_string(self, string_value: str):

test_model = self.INIBasedModelTest(id=string_value, float_value=self._random_float,
float_values=self._random_list_of_floats)

assert test_model.id == string_value
assert test_model.float_value == pytest.approx(self._random_float)
assert test_model.float_values == pytest.approx(self._random_list_of_floats)

@pytest.mark.parametrize("float_as_string, expected_value", [
("1d0", 1e0),
("1d-2", 1e-2),
("1d+2", 1e+2),
("1.d+2", 1.e+2),
("-1.d-2", -1.e-2)]
)
def test_scientific_notation_for_float_field_is_parsed_as_float(self, float_as_string: str, expected_value: float):
test_model = self.INIBasedModelTest(id=self._random_string, float_value=float_as_string,
float_values=self._random_list_of_floats)

assert test_model.id == self._random_string
assert test_model.float_value == pytest.approx(expected_value)
assert test_model.float_values == pytest.approx(self._random_list_of_floats)

@pytest.mark.parametrize("floats_as_strings, expected_values", [
(["1d0", "1d-2"], [1e0, 1e-2]),
(["1d+2", "1.d+2", "-1.d-2"], [1e+2, 1.e+2, -1.e-2]),
])
def test_scientific_notation_for_list_of_float_field_is_parsed_as_list_of_floats(self, floats_as_strings: List[str],
expected_values: List[float]):
test_model = self.INIBasedModelTest(id=self._random_string, float_value=self._random_float,
float_values=floats_as_strings)

assert test_model.id == self._random_string
assert test_model.float_value == pytest.approx(self._random_float)
assert test_model.float_values == pytest.approx(expected_values)

def test_setting_string_attribute_with_scientific_notation_correctly_parses_value(self):
test_model = self.INIBasedModelTest(id=self._random_string, float_value=self._random_float,
float_values=self._random_list_of_floats)

test_model.id = "1d1"

assert test_model.id == "1d1"

def test_setting_float_attribute_with_scientific_notation_correctly_parses_value(self):
test_model = self.INIBasedModelTest(id=self._random_string, float_value=self._random_float,
float_values=self._random_list_of_floats)

test_model.float_value = "1d1"

assert test_model.float_value == pytest.approx(1e1)

def test_setting_list_of_floats_attribute_with_scientific_notation_correctly_parses_values(self):
test_model = self.INIBasedModelTest(id=self._random_string, float_value=self._random_float,
float_values=self._random_list_of_floats)

test_model.float_values = ["1d1", "2d-1"]

assert test_model.float_values == pytest.approx([1e1, 2e-1])

0 comments on commit ec6150b

Please sign in to comment.