diff --git "a/Test_Converter_R\303\266mische_Zahlen.py" "b/Test_Converter_R\303\266mische_Zahlen.py" index c8c4a5ebea1d0ae5f375c35ea59986ff7f82cbf2..61622f8a9ab18de762b7adb4f9d89c2ded7425d4 100644 --- "a/Test_Converter_R\303\266mische_Zahlen.py" +++ "b/Test_Converter_R\303\266mische_Zahlen.py" @@ -6,6 +6,7 @@ from abc import ABC, abstractmethod #from muhamed_directory.other.daniel.converter import Converter as Dani #from muhamed_directory.other.hatice.converter import RomanNumber as Hati #from muhamed_directory.other.wasili.TDD_Converter import RomanNumber as was +from muhamed_directory.other.orlando.RomanConverter import int_to_roman as Lando class IStringCalculator(ABC): @abstractmethod @@ -27,53 +28,32 @@ class Converter(IStringCalculator): n -= value return result -class TestRomanNumber (unittest.TestCase): - def setUp(self): - self.r = Converter - - def test_convert_1(self): - self.assertEqual(self.r.convert(1), "I") - - def test_convert_21(self): - self.assertEqual(self.r.convert(21), "XXI") - - def test_convert_empty(self): - self.assertEqual(self.r.convert(None), "Fehler: Bitte Zahl eingeben") - - def test_convert_string(self): - self.assertEqual(self.r.convert("Hello"), "Fehler: Bitte Zahl eingeben") - - def test_convert_downzero(self): - self.assertEqual(self.r.convert(-5), "Integer muss größer als 0 sein") - - def test_convert_downzero(self): - self.assertEqual(self.r.convert(1000), "M") -'''class TestRomanConverter(unittest.TestCase): +class TestRomanConverter(unittest.TestCase): def setUp(self): - self.calculator = was + self.Converter = Lando def test_1(self): - self.assertEqual(self.calculator.convert_int_to_str(1), "I") + self.assertEqual(self.Converter.int_to_roman(1), "I") def test_10(self): - self.assertEqual(self.calculator.convert_int_to_str(10), "X") + self.assertEqual(self.calculator.roman_to_int(10), "X") def test_21(self): - self.assertEqual(self.calculator.convert_int_to_str(21), "XXI") + self.assertEqual(self.calculator.roman_to_int(21), "XXI") def test_50(self): - self.assertEqual(self.calculator.convert_int_to_str(50), "L") + self.assertEqual(self.calculator.roman_to_int(50), "L") def test_100(self): - self.assertEqual(self.calculator.convert_int_to_str(100), "C") + self.assertEqual(self.calculator.roman_to_int(100), "C") def test_1000(self): - self.assertEqual(self.calculator.convert_int_to_str(1000), "M") + self.assertEqual(self.calculator.roman_to_int(1000), "M") def test_1999(self): - self.assertEqual(self.calculator.convert_int_to_str(1999), "MCMXCIX")''' + self.assertEqual(self.calculator.roman_to_int(1999), "MCMXCIX") if __name__ == "__main__": unittest.main() \ No newline at end of file diff --git a/muhamed_directory/other/orlando/RomanConverter.py b/muhamed_directory/other/orlando/RomanConverter.py new file mode 100644 index 0000000000000000000000000000000000000000..0af044bf86763d59f9238708be92acaac2e092a8 --- /dev/null +++ b/muhamed_directory/other/orlando/RomanConverter.py @@ -0,0 +1,55 @@ + + + +def int_to_roman(num: int) -> str: + """Konvertiert eine Dezimalzahl in eine römische Zahl.""" + val = [ + 1000, 900, 500, 400, + 100, 90, 50, 40, + 10, 9, 5, 4, + 1 + ] + syb = [ + "M", "CM", "D", "CD", + "C", "XC", "L", "XL", + "X", "IX", "V", "IV", + "I" + ] + roman_num = '' + i = 0 + while num > 0: + for _ in range(num // val[i]): + roman_num += syb[i] + num -= val[i] + i += 1 + return roman_num + +class IRomanConverter(ABC): + @abstractmethod + def roman_to_int(self, s: str) -> int: + """Konvertiert eine römische Zahl (String) in eine Dezimalzahl.""" + pass + +class RomanConverter(IRomanConverter): + def roman_to_int(self, s: str) -> int: + """Konvertiert eine römische Zahl (String) in eine Dezimalzahl.""" + roman_values = { + 'I': 1, 'V': 5, 'X': 10, 'L': 50, + 'C': 100, 'D': 500, 'M': 1000 + } + + total = 0 + prev_value = 0 + + # Iteriere über die Zeichen der römischen Zahl von rechts nach links + for char in reversed(s.upper()): + value = roman_values.get(char) + if value is None: + raise ValueError(f"Ungültiges Zeichen '{char}' in der römischen Zahl.") + if value < prev_value: + total -= value + else: + total += value + prev_value = value + + return total diff --git a/muhamed_directory/other/orlando/__pycache__/RomanConverter.cpython-311.pyc b/muhamed_directory/other/orlando/__pycache__/RomanConverter.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78e04a25dbea7b2bc1b1abf5f51c568432e01f84 Binary files /dev/null and b/muhamed_directory/other/orlando/__pycache__/RomanConverter.cpython-311.pyc differ diff --git a/muhamed_directory/other/orlando/__pycache__/__init__.cpython-311.pyc b/muhamed_directory/other/orlando/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..456506eeb2e840d1aa8b7835d806ade181909483 Binary files /dev/null and b/muhamed_directory/other/orlando/__pycache__/__init__.cpython-311.pyc differ diff --git a/muhamed_directory/other/orlando/interfaces.py b/muhamed_directory/other/orlando/interfaces.py new file mode 100644 index 0000000000000000000000000000000000000000..be069d6d910a5d5c44d8c083ec4429cfaac516b6 --- /dev/null +++ b/muhamed_directory/other/orlando/interfaces.py @@ -0,0 +1,30 @@ +from abc import ABC, abstractmethod + +# Definition des Interfaces für den StringCalculator +class IStringCalculator(ABC): + @abstractmethod + def add(self, numbers: str) -> int: + """ + Addiert beliebig viele Zahlen, die durch Kommas getrennt sind. + Leere oder nur aus Leerzeichen bestehende Einträge werden ignoriert. + + :param numbers: String mit Zahlen (z.B. "1,2,3") + :return: Summe der Zahlen als int + """ + pass + +class ICounter(ABC): + @abstractmethod + def count_ed(self, s: str) -> int: + """Zählt die Buchstaben 'E' und 'D' in einem String (Case-Insensitive).""" + pass +class IRomanConverter(ABC): + @abstractmethod + def roman_to_int(self, s: str) -> int: + """Konvertiert eine römische Zahl (String) in eine Dezimalzahl.""" + pass + +class ICalculator(ABC): + @abstractmethod + def calculate(self, expression: str) -> float: + pass \ No newline at end of file diff --git a/muhamed_directory/other/orlando/test_string_calculator.py b/muhamed_directory/other/orlando/test_string_calculator.py new file mode 100644 index 0000000000000000000000000000000000000000..b9420c04783cbe6fe8d8c40d0caea43d541e054e --- /dev/null +++ b/muhamed_directory/other/orlando/test_string_calculator.py @@ -0,0 +1,113 @@ +# Testfälle add(numbers: str) -> int – StringCalculator + +# 1. Leerer String +# Eingabe: "" → Erwartete Ausgabe: 0 + +# 2. Einzelne Zahl +# Eingabe: "1" → Erwartete Ausgabe: 1 + +# 3. Zwei Zahlen, getrennt durch Komma +# Eingabe: "1,2" → Erwartete Ausgabe: 3 + +# 4. Mehr als zwei Zahlen (beliebig viele erlaubt) +# Eingabe: "1,2,3" → Erwartete Ausgabe: 6 +# Eingabe: "1,2,3,4,5" → Erwartete Ausgabe: 15 + +# 5. Leere Einträge ignorieren +# Eingabe: "1,,2" → Erwartete Ausgabe: 3 +# Eingabe: "1, ,2" → Erwartete Ausgabe: 3 +# Eingabe: ",,1,,2,,," → Erwartete Ausgabe: 3 + +# 6. Zeilenumbrüche als Trennzeichen erlauben +# Eingabe: "1\n2,3" → Erwartete Ausgabe: 6 +# Eingabe: "1,2\n3" → Erwartete Ausgabe: 6 +# Eingabe: "1\n2\n3" → Erwartete Ausgabe: 6 + +# 8. Negative Zahlen → Exception mit allen negativen Werten +# Eingabe: "1,-2" → Exception mit Message "negatives not allowed: -2" +# Eingabe: "-1,-2,3" → Exception mit Message "negatives not allowed: -1, -2" + +# 9. Benutzerdefinierter Delimiter über Präfix: "//<delimiter>\n" +# Eingabe: "//;\n1;2" → 3 +# Eingabe: "//|\n4|5|6" → 15 +# Eingabe: "//_\n7_8_9" → 24 + +# 10. Zahlen größer als 1000 ignorieren +# Eingabe: "2,1001" → 2 +# Eingabe: "1000,1" → 1001 (1000 zählt noch mit) +# Eingabe: "1234,1001,3" → 3 + +# 11. Delimiter mit beliebiger Länge (Format: //[delimiter]\n) +# Eingabe: "//[***]\n1***2***3" → 6 +# Eingabe: "//[abc]\n4abc5abc6" → 15 +# Eingabe: "//[+]\n1+2+3" → 6 + +import unittest +from src.string_calculator import StringCalculator + +class TestStringCalculator(unittest.TestCase): + def setUp(self): + # Vor jedem Test wird eine Instanz des Calculators erstellt + self.calc = StringCalculator() + + def test_add_empty_string(self): + # Leerer String → 0 + self.assertEqual(self.calc.add(""), 0) + + def test_add_single_number(self): + # Ein einzelner Wert → int + self.assertEqual(self.calc.add("1"), 1) + + def test_add_two_numbers(self): + # Zwei Zahlen → Summe + self.assertEqual(self.calc.add("1,2"), 3) + + def test_add_multiple_numbers(self): + # Mehr als zwei Zahlen → Summe + self.assertEqual(self.calc.add("1,2,3"), 6) + self.assertEqual(self.calc.add("1,2,3,4,5"), 15) + + def test_add_ignores_empty_entries(self): + # Leere Einträge ignorieren → Summe + self.assertEqual(self.calc.add("1,,2"), 3) + self.assertEqual(self.calc.add("1, ,2"), 3) + self.assertEqual(self.calc.add(",,1,,2,,,"), 3) + + def test_add_with_newlines_between_numbers(self): + # Zeilenumbrüche als Trennzeichen erlauben → Summe + self.assertEqual(self.calc.add("1\n2,3"), 6) + self.assertEqual(self.calc.add("1,2\n3"), 6) + self.assertEqual(self.calc.add("1\n2\n3"), 6) + + def test_add_raises_exception_on_negative_number(self): + # Negative Zahlen → Exception mit allen negativen Werten + with self.assertRaises(ValueError) as context: + self.calc.add("1,-2") + self.assertIn("negatives not allowed: -2", str(context.exception)) + + def test_add_raises_exception_on_multiple_negatives(self): + # Negative Zahlen → Exception mit allen negativen Werten + with self.assertRaises(ValueError) as context: + self.calc.add("-1,-2,3") + self.assertIn("negatives not allowed: -1, -2", str(context.exception)) + + def test_add_with_custom_delimiter(self): + # Benutzerdefinierter Delimiter über Präfix: "//<delimiter>\n" + self.assertEqual(self.calc.add("//;\n1;2"), 3) + self.assertEqual(self.calc.add("//|\n4|5|6"), 15) + self.assertEqual(self.calc.add("//_\n7_8_9"), 24) + + def test_add_ignores_numbers_greater_than_1000(self): + # Zahlen größer als 1000 ignorieren + self.assertEqual(self.calc.add("2,1001"), 2) + self.assertEqual(self.calc.add("1000,1"), 1001) + self.assertEqual(self.calc.add("1234,1001,3"), 3) + + def test_add_with_multi_char_delimiter(self): + # Delimiter mit beliebiger Länge (Format: //[delimiter]\n) + self.assertEqual(self.calc.add("//[***]\n1***2***3"), 6) + self.assertEqual(self.calc.add("//[abc]\n4abc5abc6"), 15) + self.assertEqual(self.calc.add("//[+]\n1+2+3"), 6) + +if __name__ == "__main__": + unittest.main() \ No newline at end of file diff --git a/report.md b/report.md index d5b3e4b3f76dae269fbe2b57b168de6ffb1a3338..fe36cee18fd4bf504a513b9034112db3bd9e8e5e 100644 --- a/report.md +++ b/report.md @@ -8,4 +8,5 @@ | ich vs Hatice Tests | no | 1 | FAIL: test_inivalid_numbers (__main__.TestRomanConverter.test_inivalid_numbers) | | Lasse | yes | all | TypeError: RomanNumerals.to_roman() missing 1 required positional argument: 'num' | | Wasili | yes | all | TypeError: RomanNumber.convert_int_to_str() missing 1 required positional argument: 'n' | -| ich vs wasili Tests | no | 2 | TypeError: '>=' not supported between instances of 'str' and 'int') | \ No newline at end of file +| ich vs wasili Tests | no | 2 | TypeError: '>=' not supported between instances of 'str' and 'int') | +| Orlando | yes | all | nicht umsätzbar | \ No newline at end of file