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'])