diff --git a/src/__pycache__/string_utils.cpython-310.pyc b/src/__pycache__/string_utils.cpython-310.pyc new file mode 100644 index 00000000..c1b5dd98 Binary files /dev/null and b/src/__pycache__/string_utils.cpython-310.pyc differ diff --git a/src/string_utils.py b/src/string_utils.py new file mode 100644 index 00000000..da4b4dc6 --- /dev/null +++ b/src/string_utils.py @@ -0,0 +1,33 @@ +def reverse_string(input_string: str) -> str: + """ + Reverses the given input string using a manual character-by-character approach. + + Args: + input_string (str): The string to be reversed. + + Returns: + str: The reversed string. + + Raises: + TypeError: If the input is not a string. + """ + # Check if input is a string + if not isinstance(input_string, str): + raise TypeError("Input must be a string") + + # Handle empty string case + if len(input_string) <= 1: + return input_string + + # Convert string to list for manipulation + chars = list(input_string) + + # Use two-pointer technique to swap characters + left, right = 0, len(chars) - 1 + while left < right: + chars[left], chars[right] = chars[right], chars[left] + left += 1 + right -= 1 + + # Convert back to string + return ''.join(chars) \ No newline at end of file diff --git a/tests/__pycache__/test_string_utils.cpython-310-pytest-8.3.5.pyc b/tests/__pycache__/test_string_utils.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 00000000..10cbcf9a Binary files /dev/null and b/tests/__pycache__/test_string_utils.cpython-310-pytest-8.3.5.pyc differ diff --git a/tests/test_string_utils.py b/tests/test_string_utils.py new file mode 100644 index 00000000..f5bf4f56 --- /dev/null +++ b/tests/test_string_utils.py @@ -0,0 +1,42 @@ +import pytest +from src.string_utils import reverse_string + +def test_reverse_string_basic(): + """Test basic string reversal.""" + assert reverse_string("hello") == "olleh" + assert reverse_string("world") == "dlrow" + +def test_reverse_string_empty(): + """Test reversal of an empty string.""" + assert reverse_string("") == "" + +def test_reverse_string_single_char(): + """Test reversal of a single character.""" + assert reverse_string("a") == "a" + +def test_reverse_string_with_spaces(): + """Test reversal of string with spaces.""" + assert reverse_string("hello world") == "dlrow olleh" + +def test_reverse_string_with_special_chars(): + """Test reversal of string with special characters.""" + assert reverse_string("Hello, World!") == "!dlroW ,olleH" + +def test_reverse_string_with_unicode(): + """Test reversal of string with unicode characters.""" + assert reverse_string("こんにちは") == "はちにんこ" + +def test_reverse_string_with_numbers(): + """Test reversal of string with numbers.""" + assert reverse_string("123 abc") == "cba 321" + +def test_reverse_string_invalid_input(): + """Test that TypeError is raised for non-string inputs.""" + with pytest.raises(TypeError, match="Input must be a string"): + reverse_string(12345) + + with pytest.raises(TypeError, match="Input must be a string"): + reverse_string(None) + + with pytest.raises(TypeError, match="Input must be a string"): + reverse_string(["hello"]) \ No newline at end of file