From 298f83151167174730455e7bbf2a6b5ffcd871e0 Mon Sep 17 00:00:00 2001 From: Muhamed <Muhamedalici@hotmail.de> Date: Sun, 6 Apr 2025 12:40:46 +0200 Subject: [PATCH] Orlando commit --- "Test_Converter_R\303\266mische_Zahlen.py" | 40 ++----- .../other/orlando/RomanConverter.py | 55 +++++++++ .../RomanConverter.cpython-311.pyc | Bin 0 -> 911 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 220 bytes muhamed_directory/other/orlando/interfaces.py | 30 +++++ .../other/orlando/test_string_calculator.py | 113 ++++++++++++++++++ report.md | 3 +- 7 files changed, 210 insertions(+), 31 deletions(-) create mode 100644 muhamed_directory/other/orlando/RomanConverter.py create mode 100644 muhamed_directory/other/orlando/__pycache__/RomanConverter.cpython-311.pyc create mode 100644 muhamed_directory/other/orlando/__pycache__/__init__.cpython-311.pyc create mode 100644 muhamed_directory/other/orlando/interfaces.py create mode 100644 muhamed_directory/other/orlando/test_string_calculator.py diff --git "a/Test_Converter_R\303\266mische_Zahlen.py" "b/Test_Converter_R\303\266mische_Zahlen.py" index c8c4a5e..61622f8 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 0000000..0af044b --- /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 GIT binary patch literal 911 zcmZuu&1(}u6o0e32~C?Qp{80dMzqvDSg?u*DMHy?f~`_NYAGwrc6Zt=&F<FOO`u@| zIrNZ<hZKb7(1Y}#h!;=(1O5XRJcI#HUd(N=p6bOn8(S*+V1Dn-`}oa!Z{Fr|!+`Sm z>5sKv1mK&v9E<YDI2=P`7i^$l6G~PUTiQ~VC0l+3s={Tj=JGV7VU2kfQk+N%Eg8?@ zKEf`nVevj`64VlEEN{xT(o`a_mG$H)HWQwzk02tEGJZnWkO1Cb{QXHz37%bOrXo3# z{>sY%H06J)&!ZP!jz@}}YKV+e?|ztx#3<?7Eqv^r@6{;_9Xv(qc(hoe4aYUB4YN`$ zI^Mv?K7DkZz^c&VGP<YKobw$gb+!cj#QvNPLf=NZ{<45+0oMeGZTB+*#CrN-?!FjE z&2ci%C2gLQ5~>m>8kd$dPUcX}ak9jv@)9SDs1`XXbLe9cFq{Nb!c)xj)~K3hxFg_l z-K=ss*j(Wm=DVh6h#w*jCq|IQcrlTqnsrBi5>OWCZmnXv`U8)am{X^Ei3aPTzoFaI zTBocytv?hb*O6p}GTrrU$~?oSb;C6WrPMZThfyo^*{1G?70mKk)%0wCP^t}9O4-!L zCeJ!vXoS9zbjGe?KVk>L4nhlJB{h<c;TT$4oISP^uW&$qv{mj6Wm>bn;arEjm~2me z&5w10uJ!uz-s(>CAV2XXKM{kJxtKtEwwEn*N4pDqV+Yww?Q$=BwsW)d{MGI4`L@>9 zkg2_}oo<sj10!b!eDN@33!jy9hu9R{S7k0^)40))B@Mp=Hh}?l1>tCD1~*cx(z{H> dtN6;`20|<oLgJwUDRitDP<00?vHu4N<!^g#?#loG literal 0 HcmV?d00001 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 GIT binary patch literal 220 zcmXv|F$%&!5WF)eA_Tu+YoUduh*fF@#ctt<xy6L!?!sOY$V+^J_%1&XNf#S0Xr`E* z-JN0g;rlb@@DcA@Utc{9;D6ChoVYW|&TPpKPevoxxBap+(H1Ti$$~25P{C1SKuLuV zpiK*tgTyFBT5RBCRH#?FR97TWMj~k;u@Wl$MNtZw5JrWe8cY#8m!T}w(tr?&P6{E` ddEHHSE?Z`}r?I==e`x298jo|{uz|>PvoEObKF9z7 literal 0 HcmV?d00001 diff --git a/muhamed_directory/other/orlando/interfaces.py b/muhamed_directory/other/orlando/interfaces.py new file mode 100644 index 0000000..be069d6 --- /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 0000000..b9420c0 --- /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 d5b3e4b..fe36cee 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 -- GitLab