Skip to content

CS50P Problem Set 5 - test_fuel - check50 may incorrectly fail solution if solution tests for positive result in convert() #264

Open
@kguryanov

Description

@kguryanov

Preconditions

  1. Have a test_fuel.py, which passes the check50 validation:
    import pytest
    from fuel import convert, gauge
    
    
    @pytest.mark.parametrize(
        "input, expected",
        [
            ("3/4", 75),
        ],
    )
    def test_convert(input, expected):
        assert convert(input) == expected
    
    
    @pytest.mark.parametrize(
        "input",
        [
            "10/3",
        ],
    )
    def test_convert_value_error(input):
        with pytest.raises(ValueError):
            assert convert(input)
    
    
    @pytest.mark.parametrize(
        "input",
        [
            "0/0"
        ],
    )
    def test_convert_zero_division(input):
        with pytest.raises(ZeroDivisionError):
            convert(input)
    
    
    @pytest.mark.parametrize(
     "input,expected",
        [
            (75, "75%"), (33, "33%"), (67, "67%"), (0, "E"), (1, "E"), (100, "F"), (99, "F"), (101, "F"), (-1, "E"),
        ],
    )
    def test_gauge(input, expected):
        assert gauge(input) == expected

Steps to reproduce:

  1. Add following test to your test_fuel.py:
    @pytest.mark.parametrize(
        "input",
        [
            "10/3",
            "-1/100"
        ],
    )
    def test_convert_value_error(input):
        with pytest.raises(ValueError):
            assert convert(input)
  2. Run check50 cs50/problems/2022/python/tests/fuel

Expected result

  1. The check50 validation should pass

Actual result

  1. The problem description for PSET 5 Refueling has the following description:
    image

  2. The check50 validation fails at step 2 :( correct fuel.py passes all test_fuel checks If user attempts to add a test for the requirement the nearest int between 0 and 100, inclusive. :

    def convert(input: str) -> int:
        # Will raise ValueError if int() conversion fails
        # Will raise ValueError if too many values to unpack
        dividend, divisor = (int(value) for value in input.split("/"))
    
        if dividend > divisor:
            raise ValueError("Dividend can not be larger than divisor.")
    
        result = round((dividend / divisor) * 100)
    
        if result not in range(0, 101):
            raise ValueError("Result must be an int between 0 and 100, inclusive.")
    
        return result

    When the test is enabled:
    image

    When skipping the test:
    image

Metadata

Metadata

Assignees

Labels

CS50PCS50 Python

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions