File size: 5,316 Bytes
405b09e |
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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
"""
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'])
|