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