From e457ce18406872a8a400fcd6e39f65b5686bed88 Mon Sep 17 00:00:00 2001 From: Splines Date: Sat, 16 Mar 2024 00:47:03 +0100 Subject: [PATCH] Add "number to word" tests & forbid too small/big numbers --- src/api/parsers.py | 2 +- src/application/helpers.py | 17 ----------------- tests/number_word_test.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 tests/number_word_test.py diff --git a/src/api/parsers.py b/src/api/parsers.py index b387c8ad..2db11141 100644 --- a/src/api/parsers.py +++ b/src/api/parsers.py @@ -47,7 +47,7 @@ def parse_name(name: str) -> str: parsed_name += char elif char.isdigit(): num_digits = len([c for c in name if c.isdigit()]) # greedily get digits - word = Helpers.digit_str_to_word(name[:num_digits]) + word = Helpers.number_to_word(int(name[:num_digits])) if parsed_name != "": word = Helpers.capitalize(word) parsed_name += word diff --git a/src/application/helpers.py b/src/application/helpers.py index 36e5e9b3..6c072fb4 100644 --- a/src/application/helpers.py +++ b/src/application/helpers.py @@ -68,20 +68,3 @@ def number_to_word(cls, number: int) -> str: @classmethod def capitalize(cls, s: str) -> str: return s[0].upper() + s[1:] - - @classmethod - def digit_str_to_word(cls, digits_str: str) -> str: - """Converts a string of digits to a word. - - For example, "123" -> "oneHundredTwentyThree", - "911" -> "nineHundredEleven". - """ - num_digits = len(digits_str) - if num_digits <= 3: - return cls.number_to_word(int(digits_str)) - - word = cls.number_to_word(int(digits_str[0])) - for i in range(1, num_digits): - tmp = Helpers.number_to_word(int(digits_str[i])) - word += Helpers.capitalize(tmp) - return word diff --git a/tests/number_word_test.py b/tests/number_word_test.py new file mode 100644 index 00000000..7664b28e --- /dev/null +++ b/tests/number_word_test.py @@ -0,0 +1,30 @@ +from application.helpers import Helpers + +import pytest + + +class TestNumberWord: + @pytest.mark.parametrize( + "input, expected", + [ + (1, "one"), + (2, "two"), + (3, "three"), + (10, "ten"), + (18, "eighteen"), + (76, "seventySix"), + (100, "oneHundred"), + (101, "oneHundredOne"), + (123, "oneHundredTwentyThree"), + (305, "threeHundredFive"), + (911, "nineHundredEleven"), + (999, "nineHundredNinetyNine"), + ], + ) + def test_number_to_word(self, input, expected): + assert Helpers.number_to_word(input) == expected + + @pytest.mark.parametrize("input", [1000, 1001, -1, -500]) + def test_number_to_word_raises(self, input): + with pytest.raises(ValueError, match="numbers between 0 and 999"): + Helpers.number_to_word(input)