height-conversion-tool / test_height_converter.py
NuBest's picture
Upload 10 files
405b09e verified
"""
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()
# Test feet to cm conversions
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)
# Test cm to feet conversions
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)
# Test meters conversions
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
# Test string parsing
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")
# Test convert method
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")
# Edge cases
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'])