diff --git a/others/Orlando/OrlandoInterfaces.py b/others/Orlando/OrlandoInterfaces.py new file mode 100644 index 0000000000000000000000000000000000000000..8a6149aeacc1ef08a4eb883ffc4b0df2324d37a8 --- /dev/null +++ b/others/Orlando/OrlandoInterfaces.py @@ -0,0 +1,7 @@ +from abc import ABC, abstractmethod + +class IRomanConverter(ABC): + @abstractmethod + def roman_to_int(self, s: str) -> int: + """Konvertiert eine römische Zahl (String) in eine Dezimalzahl.""" + pass diff --git a/others/Orlando/OrlandoRomanConverter.py b/others/Orlando/OrlandoRomanConverter.py new file mode 100644 index 0000000000000000000000000000000000000000..fd7ab771b39488210639140350c2a5d69613b1cd --- /dev/null +++ b/others/Orlando/OrlandoRomanConverter.py @@ -0,0 +1,50 @@ +from others.Orlando.OrlandoInterfaces import IRomanConverter + + +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 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/others/Orlando/reportOrlandoImp.md b/others/Orlando/reportOrlandoImp.md new file mode 100644 index 0000000000000000000000000000000000000000..c56e64c59252b509fd636823f2a4f760f345089f --- /dev/null +++ b/others/Orlando/reportOrlandoImp.md @@ -0,0 +1,7 @@ +| Name | Interface break | Failed Testcases | | +|---------|-----------------|---------------------------------------------------------------------------------|------------------------------------------------------------------------------------------| +| Orlando | no | test_convert_addition (tests.test_romannumerals.TestRomanNumber) ... ERROR | Eingabe muss eine ganze Römische Zahl sein. Testet von Dezimalzahlen auf Römische Zahlen | +| Orlando | no | test_convert_invalid (tests.test_romannumerals.TestRomanNumber) ... ERROR | Eingabe muss eine ganze Römische Zahl sein. Testet von Dezimalzahlen auf Römische Zahlen | +| Orlando | no | test_convert_large_numbers (tests.test_romannumerals.TestRomanNumber) ... ERROR | Eingabe muss eine ganze Römische Zahl sein. Testet von Dezimalzahlen auf Römische Zahlen | +| Orlando | no | test_convert_mixed (tests.test_romannumerals.TestRomanNumber) ... ERROR | Eingabe muss eine ganze Römische Zahl sein. Testet von Dezimalzahlen auf Römische Zahlen | +| Orlando | no | test_convert_subtraction (tests.test_romannumerals.TestRomanNumber) ... ERROR | Eingabe muss eine ganze Römische Zahl sein. Testet von Dezimalzahlen auf Römische Zahlen | \ No newline at end of file diff --git a/tests/test_romannumerals.py b/tests/test_romannumerals.py index 35e2af35f754d89a2da55ab9537741a29fd40960..01d0efc3212d4e5598483eb98a33230569bcfc28 100644 --- a/tests/test_romannumerals.py +++ b/tests/test_romannumerals.py @@ -40,22 +40,26 @@ # Bei Eingabe der Zeichenfolge "ABC" erhalte ich eine Fehlermeldung # Bei Eingabe von None erhalte ich eine Fehlermeldung # Bei Eingabe der Zahl 3.14 erhalte ich eine Fehlermeldung - +''' import unittest from src.romannumerals import RomanNumber from src.interfaces import IRomanNumber +''' +import unittest +from others.Orlando.OrlandoRomanConverter import RomanConverter +from others.Orlando.OrlandoInterfaces import IRomanConverter class TestRomanNumber(unittest.TestCase): def setUp(self): - self.converter: IRomanNumber = RomanNumber() + self.converter: IRomanConverter = RomanConverter def test_convert_subtraction(self): - self.assertEqual(self.converter.convert(4), "IV") - self.assertEqual(self.converter.convert(9), "IX") - self.assertEqual(self.converter.convert(40), "XL") - self.assertEqual(self.converter.convert(90), "XC") - self.assertEqual(self.converter.convert(400), "CD") - self.assertEqual(self.converter.convert(900), "CM") + self.assertEqual(self.converter.roman_to_int(4), "IV") + self.assertEqual(self.converter.roman_to_int(9), "IX") + self.assertEqual(self.converter.roman_to_int(40), "XL") + self.assertEqual(self.converter.roman_to_int(90), "XC") + self.assertEqual(self.converter.roman_to_int(400), "CD") + self.assertEqual(self.converter.roman_to_int(900), "CM") def test_convert_addition(self): self.assertEqual(self.converter.convert(2), "II") @@ -97,5 +101,5 @@ class TestRomanNumber(unittest.TestCase): if __name__ == "__main__": unittest.main() -# python -m unittest tests.test_romannumerals +# python -m unittest tests.test_romannumerals -v # python -m unittest discover -s tests \ No newline at end of file diff --git a/tests/test_stringcalculator.py b/tests/test_stringcalculator.py deleted file mode 100644 index f7c4c1221c4d42297357b1fccd3569a34afc3a21..0000000000000000000000000000000000000000 --- a/tests/test_stringcalculator.py +++ /dev/null @@ -1,28 +0,0 @@ -# Basis -# Bei Eingabe keiner Zahl soll eine 0 ausgegeben werden -# Bei Eingabe einer 1 soll 1 ausgegeben werden -# Bei Eingabe einer 3,4 soll 7 ausgegeben werden -# Bei Eingabe einer 10,20 soll 30 ausgegeben werden - -import unittest -from src.interfaces import IStringCalculator -from src.stringcalculator import StringCalculator - -class TestStringCalculator(unittest.TestCase): - def setUp(self): - self.calculator: IStringCalculator = StringCalculator() # Zugriff über das Interface - - def test_add_empty_string(self): - self.assertEqual(self.calculator.add(""), 0) - - def test_add_single_number(self): - self.assertEqual(self.calculator.add("1"), 1) - - def test_add_two_numbers(self): - self.assertEqual(self.calculator.add("10,20"), 30) - -if __name__ == "__main__": - unittest.main() - -# python -m unittest tests.test_stringcalculator -# python -m unittest discover -s tests \ No newline at end of file diff --git a/testsothers/OrlandoTestRoman.py b/testsothers/OrlandoTestRoman.py new file mode 100644 index 0000000000000000000000000000000000000000..ce7b888f746f3f3bd98eaca7945119c794bba2c3 --- /dev/null +++ b/testsothers/OrlandoTestRoman.py @@ -0,0 +1,68 @@ +# Testfälle roman_to_int, str -> int + +# 1. Einzelne römische Ziffern +# Eingabe: "I" → Erwartete Ausgabe: 1 +# Eingabe: "V" → Erwartete Ausgabe: 5 +# Eingabe: "X" → Erwartete Ausgabe: 10 +# Eingabe: "L" → Erwartete Ausgabe: 50 +# Eingabe: "C" → Erwartete Ausgabe: 100 +# Eingabe: "D" → Erwartete Ausgabe: 500 +# Eingabe: "M" → Erwartete Ausgabe: 1000 + +#2. Mehrere gleiche Ziffern hintereinander (einfache Addition) +# Eingabe: "II" → Erwartete Ausgabe: 2 +# Eingabe: "XX" → Erwartete Ausgabe: 20 +# Eingabe: "CC" → Erwartete Ausgabe: 200 +# Eingabe: "MM" → Erwartete Ausgabe: 2000 + +#3. Subtraktive Notation +# Eingabe: "IV" → Erwartete Ausgabe: 4 +# Eingabe: "IX" → Erwartete Ausgabe: 9 +# Eingabe: "XL" → Erwartete Ausgabe: 40 +# Eingabe: "XC" → Erwartete Ausgabe: 90 +# Eingabe: "CD" → Erwartete Ausgabe: 400 +# Eingabe: "CM" → Erwartete Ausgabe: 900 + +#4. Komplexe Zahlen +# Eingabe: "MCMXCIV" → Erwartete Ausgabe: 1994 +#Eingabe: "XIV" → Erwartete Ausgabe: 14 +#Eingabe: "CDXLIV" → Erwartete Ausgabe: 444 + + +import sys +import os +import unittest + +# Füge das src-Verzeichnis zum Python-Pfad hinzu +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../src'))) + +from src.romannumerals import RomanNumber # Importiere die zu testende Klasse + +class TestRomanConverter(unittest.TestCase): + def setUp(self): + self.converter = RomanNumber() + + def test_single_digits(self): + self.assertEqual(self.converter.convert("I"), 1) + self.assertEqual(self.converter.convert("V"), 5) + self.assertEqual(self.converter.convert("X"), 10) + + def test_multiple_digits(self): + self.assertEqual(self.converter.convert("II"), 2) + self.assertEqual(self.converter.convert("XX"), 20) + self.assertEqual(self.converter.convert("VI"), 6) + + def test_subtractive_notation(self): + self.assertEqual(self.converter.convert("IV"), 4) + self.assertEqual(self.converter.convert("IX"), 9) + self.assertEqual(self.converter.convert("XL"), 40) + self.assertEqual(self.converter.convert("XC"), 90) + + def test_complex_numbers(self): + self.assertEqual(self.converter.convert("MCMXCIV"), 1994) + self.assertEqual(self.converter.convert("CDXLIV"), 444) + +if __name__ == "__main__": + unittest.main() + +# python -m unittest testsothers.OrlandoTestRoman -v \ No newline at end of file diff --git a/testsothers/reportOrlandoTests.md b/testsothers/reportOrlandoTests.md new file mode 100644 index 0000000000000000000000000000000000000000..cea7a636bfd3b750a46b53281db395224ef02f51 --- /dev/null +++ b/testsothers/reportOrlandoTests.md @@ -0,0 +1,6 @@ +| Name | Interface break | Failed Testcases | | +|---------|-----------------|---------------------------------------------------------------------------------------|----------------------------------------------------------------------------------| +| Orlando | no | test_complex_numbers (testsothers.OrlandoTestRoman.TestRomanConverter) ... ERROR | Eingabe muss eine ganze Zahl sein. Testet von Römischen Zahlen auf Dezimalzahlen | +| Orlando | no | test_multiple_digits (testsothers.OrlandoTestRoman.TestRomanConverter) ... ERROR | Eingabe muss eine ganze Zahl sein. Testet von Römischen Zahlen auf Dezimalzahlen | +| Orlando | no | test_single_digits (testsothers.OrlandoTestRoman.TestRomanConverter) ... ERROR | Eingabe muss eine ganze Zahl sein. Testet von Römischen Zahlen auf Dezimalzahlen | +| Orlando | no | test_subtractive_notation (testsothers.OrlandoTestRoman.TestRomanConverter) ... ERROR | Eingabe muss eine ganze Zahl sein. Testet von Römischen Zahlen auf Dezimalzahlen | \ No newline at end of file