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