|
|
""" |
|
|
Unit tests for HeightConverter |
|
|
""" |
|
|
|
|
|
import pytest |
|
|
from height_converter import HeightConverter |
|
|
|
|
|
|
|
|
class TestHeightConverter: |
|
|
"""Test suite for HeightConverter class.""" |
|
|
|
|
|
@pytest.fixture |
|
|
def converter(self): |
|
|
"""Create a HeightConverter instance for testing.""" |
|
|
return HeightConverter() |
|
|
|
|
|
|
|
|
def test_feet_to_cm_basic(self, converter): |
|
|
"""Test basic feet to cm conversion.""" |
|
|
result = converter.feet_to_cm(5, 10) |
|
|
assert result == 177.8 |
|
|
|
|
|
def test_feet_to_cm_no_inches(self, converter): |
|
|
"""Test feet to cm with no inches.""" |
|
|
result = converter.feet_to_cm(6) |
|
|
assert result == 182.88 |
|
|
|
|
|
def test_feet_to_cm_negative(self, converter): |
|
|
"""Test that negative values raise ValueError.""" |
|
|
with pytest.raises(ValueError): |
|
|
converter.feet_to_cm(-5, 10) |
|
|
|
|
|
|
|
|
def test_cm_to_feet_basic(self, converter): |
|
|
"""Test basic cm to feet conversion.""" |
|
|
feet, inches = converter.cm_to_feet(180) |
|
|
assert feet == 5 |
|
|
assert inches == pytest.approx(10.9, rel=0.1) |
|
|
|
|
|
def test_cm_to_feet_short(self, converter): |
|
|
"""Test cm to feet for shorter height.""" |
|
|
feet, inches = converter.cm_to_feet(150) |
|
|
assert feet == 4 |
|
|
assert inches == pytest.approx(11.1, rel=0.1) |
|
|
|
|
|
def test_cm_to_feet_negative(self, converter): |
|
|
"""Test that negative cm raises ValueError.""" |
|
|
with pytest.raises(ValueError): |
|
|
converter.cm_to_feet(-180) |
|
|
|
|
|
|
|
|
def test_meters_to_feet(self, converter): |
|
|
"""Test meters to feet conversion.""" |
|
|
feet, inches = converter.meters_to_feet(1.75) |
|
|
assert feet == 5 |
|
|
assert inches == pytest.approx(8.9, rel=0.1) |
|
|
|
|
|
def test_feet_to_meters(self, converter): |
|
|
"""Test feet to meters conversion.""" |
|
|
result = converter.feet_to_meters(6, 0) |
|
|
assert result == 1.83 |
|
|
|
|
|
def test_cm_to_meters(self, converter): |
|
|
"""Test cm to meters conversion.""" |
|
|
result = converter.cm_to_meters(175) |
|
|
assert result == 1.75 |
|
|
|
|
|
def test_meters_to_cm(self, converter): |
|
|
"""Test meters to cm conversion.""" |
|
|
result = converter.meters_to_cm(1.8) |
|
|
assert result == 180.0 |
|
|
|
|
|
|
|
|
def test_parse_feet_inches_standard(self, converter): |
|
|
"""Test parsing standard feet/inches format.""" |
|
|
result = converter.parse_height_string("5'10\"") |
|
|
assert result == {'feet': 5, 'inches': 10, 'unit': 'feet'} |
|
|
|
|
|
def test_parse_feet_inches_no_quotes(self, converter): |
|
|
"""Test parsing feet/inches without quotes.""" |
|
|
result = converter.parse_height_string("5'10") |
|
|
assert result == {'feet': 5, 'inches': 10, 'unit': 'feet'} |
|
|
|
|
|
def test_parse_cm(self, converter): |
|
|
"""Test parsing centimeters.""" |
|
|
result = converter.parse_height_string("180cm") |
|
|
assert result == {'cm': 180.0, 'unit': 'cm'} |
|
|
|
|
|
def test_parse_cm_with_space(self, converter): |
|
|
"""Test parsing cm with space.""" |
|
|
result = converter.parse_height_string("180 cm") |
|
|
assert result == {'cm': 180.0, 'unit': 'cm'} |
|
|
|
|
|
def test_parse_meters(self, converter): |
|
|
"""Test parsing meters.""" |
|
|
result = converter.parse_height_string("1.8m") |
|
|
assert result == {'meters': 1.8, 'unit': 'meters'} |
|
|
|
|
|
def test_parse_invalid_format(self, converter): |
|
|
"""Test that invalid format raises ValueError.""" |
|
|
with pytest.raises(ValueError): |
|
|
converter.parse_height_string("invalid") |
|
|
|
|
|
|
|
|
def test_convert_feet_to_cm(self, converter): |
|
|
"""Test convert from feet to cm.""" |
|
|
result = converter.convert("5'10\"", "cm") |
|
|
assert result == "177.8 cm" |
|
|
|
|
|
def test_convert_cm_to_feet(self, converter): |
|
|
"""Test convert from cm to feet.""" |
|
|
result = converter.convert("180cm", "feet") |
|
|
assert "5'" in result |
|
|
assert "10.9\"" in result |
|
|
|
|
|
def test_convert_meters_to_cm(self, converter): |
|
|
"""Test convert from meters to cm.""" |
|
|
result = converter.convert("1.75m", "cm") |
|
|
assert result == "175.0 cm" |
|
|
|
|
|
def test_convert_cm_to_meters(self, converter): |
|
|
"""Test convert from cm to meters.""" |
|
|
result = converter.convert("180cm", "meters") |
|
|
assert result == "1.8 m" |
|
|
|
|
|
def test_convert_invalid_unit(self, converter): |
|
|
"""Test that invalid target unit raises ValueError.""" |
|
|
with pytest.raises(ValueError): |
|
|
converter.convert("180cm", "invalid") |
|
|
|
|
|
|
|
|
def test_zero_height(self, converter): |
|
|
"""Test handling of zero height.""" |
|
|
result = converter.feet_to_cm(0, 0) |
|
|
assert result == 0.0 |
|
|
|
|
|
def test_very_tall_height(self, converter): |
|
|
"""Test handling of very tall height.""" |
|
|
result = converter.feet_to_cm(8, 0) |
|
|
assert result == 243.84 |
|
|
|
|
|
def test_decimal_inches(self, converter): |
|
|
"""Test handling of decimal inches.""" |
|
|
result = converter.feet_to_cm(5, 10.5) |
|
|
assert result == pytest.approx(179.07, rel=0.01) |
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
pytest.main([__file__, '-v']) |
|
|
|