aboutsummaryrefslogtreecommitdiff
path: root/tests/qc/test_cells.py
blob: f5411fe7e8c904091e248c12e19d5b92ff9c47a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
"""Test that values in cells within a line fulfill the required criteria"""
import re
from random import randint

import pytest
from hypothesis import given
from hypothesis import strategies as st

from quality_control.errors import InvalidValue
from quality_control.average import invalid_value as avg_invalid_value
from quality_control.standard_error import invalid_value as se_invalid_value

@given(num_str=st.from_regex(
    r"^(?!([0-9]+\.[0-9]{1,}|0+)).*", fullmatch=True))
def test_cell_value_errors_with_invalid_inputs2(num_str):
    """
    GIVEN: `num_str` is an arbitrary string that is an invalid input,
    WHEN: `num_str` is provided as an argument to `*_invalid_value` functions,
    THEN: The `*_invalid_value` functions return a
      `quality_control.errors.InvalidValue` object which holds the error
      information.
    """
    assert avg_invalid_value(0, 0, num_str) == InvalidValue(
        0, 0, num_str, (
            f"Invalid value '{num_str}'. Expected string representing a number "
            "with at least one decimal place."))
    assert se_invalid_value(0, 0, num_str) == InvalidValue(
        0, 0, num_str, (
            f"Invalid value '{num_str}'. Expected string representing a number "
            "with at least one decimal place."))

@pytest.mark.skip(reason=("Checks changed. We now enforce values must have at "
                          "least one decimal place"))
@given(num_str=st.from_regex(
    r"^[0-9]+\.([0-9]{1,2}|[0-9]{4,}$)", fullmatch=True).filter(
        lambda param: not re.match(r"^[0-9]+\.0+$", param)))
def test_cell_average_value_errors_if_not_three_decimal_places2(num_str):
    """
    GIVEN: `num_str` is a string representing a number with less than or more
      than three decimal places, e.g. 2.92, 39.483732
    WHEN: `num_str` is provided as an argument to `avg_invalid_value` function,
    THEN: `avg_invalid_value` returns a `quality_control.errors.InvalidValue`
      object with the information about the placement of the invalid value.
    """
    line, col = randint(0, 100), randint(0, 20)
    assert avg_invalid_value(line, col, num_str) == InvalidValue(
        line, col, num_str, (
            f"Invalid value '{num_str}'. Expected string representing a number "
            "with exactly three decimal places."))

@given(num_str=st.from_regex(r"^[0-9]+\.[0-9]{1,}$", fullmatch=True))
def test_cell_average_value_pass_if_three_decimal_places(num_str):
    """
    GIVEN: `num_str` is a string representing a number with at least one
      decimal places, e.g. 2.924, 39.483
    WHEN: `num_str` is provided as an argument to `avg_invalid_value` function,
    THEN: `avg_invalid_value` returns `None`
    """
    line, col = randint(0, 100), randint(0, 20)
    assert avg_invalid_value(line, col, num_str) is None

@pytest.mark.skip(reason=("Checks changed. We now enforce values must have at "
                          "least one decimal place"))
@given(num_str=st.from_regex(r"^[0-9]+\.([0-9]{0,5}$)", fullmatch=True).filter(
    lambda param: not re.match(r"^[0-9]+\.?0*$", param)))
def test_cell_standard_error_value_errors_if_less_than_six_decimal_places2(num_str):
    """
    GIVEN: `num_str` is a string representing a number with less than six
      decimal places, e.g. 2.9, 39.4837
    WHEN: `num_str` is provided as an argument to `se_invalid_value` function,
    THEN: `se_invalid_value` returns a `quality_control.errors.InvalidValue`
      object with the information about the placement of the invalid value.
    """
    line, col = randint(0, 100), randint(0, 20)
    assert se_invalid_value(line, col, num_str) == InvalidValue(
        line, col, num_str, (
            f"Invalid value '{num_str}'. Expected string representing a number "
            "with at least six decimal places."))


@given(num_str=st.from_regex(r"^[0-9]+\.[0-9]{1,}$", fullmatch=True))
def test_cell_standard_error_value_pass_if_six_or_more_decimal_places(num_str):
    """
    GIVEN: `num_str` is a string representing a number with one or more
      decimal places, e.g. 2.938434, 39.4837343
    WHEN: `num_str` is provided as an argument to `se_invalid_value` function,
    THEN: `se_invalid_value` returns `None`
    """
    line, col = randint(0, 100), randint(0, 20)
    assert se_invalid_value(line, col, num_str) is None