diff --git a/Project_tests/converter.py b/Project_tests/converter.py index da0273dab8700836ea0784ec6a639a0410102f62..3700d4c8468db70c045161577b768cda96b0a380 100644 --- a/Project_tests/converter.py +++ b/Project_tests/converter.py @@ -31,7 +31,8 @@ from abc import ABC, abstractmethod #from other.BerishaAlma.test2converter import RomanNumber as AlmaCalc #from other.GotsisWasilios.TDD_Converter import WasiliRomanNumber as WasiliCalc #from other.PikkemaatLasse.romannumerals import RomanNumerals as LasseCalc -from other.YildirimHatice.converter import RomanNumber as HaticeCalc +#from other.YildirimHatice.converter import RomanNumber as HaticeCalc +from other.WeishauptOrlando.RomanConverter import RomanConverter_v1 as OrlandoCalc class IConverter(ABC): @abstractmethod @@ -74,7 +75,8 @@ class DanisConverter(IConverter): class TestConverter(unittest.TestCase): def setUp(self): - self.c = HaticeCalc() + self.c = OrlandoCalc() + self.c.convert = self.c.int_to_roman def test_convertOne(self): diff --git a/Project_tests/other/WeishauptOrlando/tests/test_roman.py b/Project_tests/other/WeishauptOrlando/RomanConverter.py similarity index 57% rename from Project_tests/other/WeishauptOrlando/tests/test_roman.py rename to Project_tests/other/WeishauptOrlando/RomanConverter.py index 30cbabf8e6517f5fdcb4741df4389df09b0d3817..4bb414abcc747293194a6a97373b2d77d9f743b3 100644 --- a/Project_tests/other/WeishauptOrlando/tests/test_roman.py +++ b/Project_tests/other/WeishauptOrlando/RomanConverter.py @@ -1,3 +1,62 @@ +import sys +import os +import unittest +from abc import ABC, abstractmethod + +class IRomanConverter(ABC): + @abstractmethod + def int_to_roman(self, num: int) -> str: + pass + +class RomanConverter_v1(IRomanConverter): + def int_to_roman(self, 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""" + # Testfälle roman_to_int, str -> int # 1. Einzelne römische Ziffern @@ -33,11 +92,6 @@ 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.RomanConverter import RomanConverter # Importiere die zu testende Klasse - class TestRomanConverter(unittest.TestCase): def setUp(self): self.converter = RomanConverter() diff --git a/Project_tests/other/WeishauptOrlando/__pycache__/RomanConverter.cpython-312.pyc b/Project_tests/other/WeishauptOrlando/__pycache__/RomanConverter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d3d28d2916e32b38f3d3155a2711b2c79ccbe5d Binary files /dev/null and b/Project_tests/other/WeishauptOrlando/__pycache__/RomanConverter.cpython-312.pyc differ diff --git a/Project_tests/other/WeishauptOrlando/src/Count_ED.py b/Project_tests/other/WeishauptOrlando/src/Count_ED.py deleted file mode 100644 index 3b6973ac45bfddec3ddb0d1e95f281e494809eca..0000000000000000000000000000000000000000 --- a/Project_tests/other/WeishauptOrlando/src/Count_ED.py +++ /dev/null @@ -1,8 +0,0 @@ -from src.interfaces import ICounter - - -class Counter(ICounter): - def count_ed(self, s: str) -> int: - """Zählt die Anzahl der Buchstaben 'E' und 'D' in einem String (Case-Insensitive).""" - s = s.upper() - return s.count("D") + s.count("E") diff --git a/Project_tests/other/WeishauptOrlando/src/RomanConverter.py b/Project_tests/other/WeishauptOrlando/src/RomanConverter.py deleted file mode 100644 index e45a5e2e995d29ad5f6296ecbaaf09f86fd4eed2..0000000000000000000000000000000000000000 --- a/Project_tests/other/WeishauptOrlando/src/RomanConverter.py +++ /dev/null @@ -1,50 +0,0 @@ -from src.interfaces 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/Project_tests/other/WeishauptOrlando/src/__init__.py b/Project_tests/other/WeishauptOrlando/src/__init__.py deleted file mode 100644 index 1b733abe8858fb6a04665bbb645814ee7457e95a..0000000000000000000000000000000000000000 --- a/Project_tests/other/WeishauptOrlando/src/__init__.py +++ /dev/null @@ -1,53 +0,0 @@ -from src.calculator import Calculator -from src.Count_ED import Counter -from src.RomanConverter import RomanConverter, int_to_roman - -if __name__ == "__main__": - # Erstelle eine Instanz der Calculator-Klasse - calc = Calculator() - - # Eine Liste von Test-Ausdrücken, die überprüft werden sollen - test_expressions = [ - "2+3", # Einfacher Additionstest - "10-4/2", # Test mit Division und Subtraktion - "(3+5)*2", # Komplexerer Ausdruck mit Klammern - "3++5", # Ungültiger Ausdruck (doppelte Operatoren) - "3--5", # Ungültiger Ausdruck (doppelte Operatoren) - "10*/2", # Ungültiger Ausdruck (Operatorenkombinationen) - "5/0", # Division durch Null (Fehler) - "(3+5))", # Ungültiger Ausdruck (zu viele Klammern) - "abc", # Ungültiger Ausdruck (nur Buchstaben) - "-3*-3" # Gültiger Ausdruck mit Vorzeichen - ] - - # Schleife, um alle Test-Ausdrücke zu durchlaufen - for expr in test_expressions: - try: - # Versuche, den Ausdruck zu berechnen und gebe das Ergebnis aus - print(f"Eingabe: '{expr}' → Ausgabe: {calc.calculate(expr)}") - except Exception as e: - # Wenn ein Fehler auftritt, gebe die Fehlermeldung aus - print(f"Eingabe: '{expr}' → Fehler: {e}") -print("______________________________________________________________") -if __name__ == "__main__": - counter = Counter() - test_strings = ["Decker", "", "Hallo", "Der Esel", "D", "E", "d", "e"] - - for string in test_strings: - print(f"Eingabe: '{string}' → Ausgabe: {counter.count_ed(string)}") - -print("______________________________________________________________") - -if __name__ == "__main__": - converter = RomanConverter() - # Test römische Zahl in Dezimalzahl umwandeln - print("Test römische Zahl in Dezimalzahl umwandeln") - print(converter.roman_to_int("MCMXCIV")) # Ausgabe: 1994 - print(converter.roman_to_int("XIV")) # Ausgabe: 14 - print(converter.roman_to_int("CDXLIV")) # Ausgabe: 444 - - # Test Dezimalzahl in römische Zahl umwandeln - print("Test Dezimalzahl in römische Zahl umwand") - print(int_to_roman(1994)) # Ausgabe: MCMXCIV - print(int_to_roman(14)) # Ausgabe: XIV - print(int_to_roman(444)) # Ausgabe: CDXLIV \ No newline at end of file diff --git a/Project_tests/other/WeishauptOrlando/src/calculator.py b/Project_tests/other/WeishauptOrlando/src/calculator.py deleted file mode 100644 index f4b478561c819a9985b2e7466e9a3ad0cc363e1c..0000000000000000000000000000000000000000 --- a/Project_tests/other/WeishauptOrlando/src/calculator.py +++ /dev/null @@ -1,44 +0,0 @@ -import re -from src.interfaces import ICalculator - - -class Calculator(ICalculator): - """Ein Taschenrechner, der mathematische Ausdrücke berechnet.""" - - def calculate(self, expression: str) -> float: - """Berechnet einen mathematischen Ausdruck als String und überprüft auf ungültige Eingaben.""" - try: - # Entfernt überflüssige Leerzeichen - expression = expression.replace(" ", "") - - # Nur erlaubte Zeichen (Zahlen, Operatoren, Klammern) und Zahlen mit Vorzeichen - if not re.match(r'^[0-9+\-*/().]+$', expression): - raise ValueError("Ungültige Zeichen im Ausdruck.") - - # Überprüfung auf doppelte Operatoren, aber keine Vorzeichen wie -* oder -+ - # Hier wird jetzt auch sichergestellt, dass -3*-3 gültig bleibt - if re.search(r'(?<!\d)[+\-*/]{2,}', expression): # Erfasst auch doppelte Operatoren wie ++, --, **, etc. - raise SyntaxError("Ungültige doppelte Operatoren im Ausdruck.") - - # Sicherstellen, dass Klammern ausgeglichen sind - if expression.count("(") != expression.count(")"): - raise ValueError("Fehlende oder zu viele Klammern.") - - # Sicherstellen, dass der Ausdruck nicht mit einem Operator beginnt oder endet, - # aber das Minuszeichen als Teil der Zahl akzeptiert wird - if re.match(r'^[*/]', expression) or re.match(r'[*/]$', expression): # Weitere Kontrolle - raise ValueError("Der Ausdruck darf nicht mit einem Operator beginnen oder enden.") - - # Evaluierung des mathematischen Ausdrucks mit eval() - result = eval(expression, {"__builtins__": None}, {}) - - # Sicherstellen, dass das Ergebnis numerisch ist - if isinstance(result, (int, float)): - return float(result) - else: - raise ValueError("Ungültiger Ausdruck.") - - except ZeroDivisionError: - raise ZeroDivisionError("Division durch Null ist nicht erlaubt.") - except (SyntaxError, TypeError, NameError) as e: - raise ValueError(f"Ungültiger mathematischer Ausdruck: {str(e)}") diff --git a/Project_tests/other/WeishauptOrlando/src/interfaces.py b/Project_tests/other/WeishauptOrlando/src/interfaces.py deleted file mode 100644 index e9c300fa4c5fe3a1808a70b66a310f34ebd431ee..0000000000000000000000000000000000000000 --- a/Project_tests/other/WeishauptOrlando/src/interfaces.py +++ /dev/null @@ -1,17 +0,0 @@ -from abc import ABC, abstractmethod - -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/Project_tests/other/WeishauptOrlando/tests/TestCount_ED.py b/Project_tests/other/WeishauptOrlando/tests/TestCount_ED.py deleted file mode 100644 index 152bccd1cb4dff5df43c1c368fea2de123bfc632..0000000000000000000000000000000000000000 --- a/Project_tests/other/WeishauptOrlando/tests/TestCount_ED.py +++ /dev/null @@ -1,34 +0,0 @@ -import unittest -import sys -import os - -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../src'))) -from src.Count_ED import Counter - -class TestCounter(unittest.TestCase): - def setUp(self): - self.c = Counter() - - def test_count_ed_regular(self): - self.assertEqual(self.c.count_ed("Decker"), 3) - - def test_count_ed_empty(self): - self.assertEqual(self.c.count_ed(""), 0) - - def test_count_ed_wo(self): - """Testet einen String ohne E und D""" - self.assertEqual(self.c.count_ed("Hallo"), 0) - - def test_count_ed_case_insensitive(self): - """Testet verschiedene Groß- und Kleinschreibungen""" - self.assertEqual(self.c.count_ed("Der Esel"), 4) - - def test_count_ED_single_letter(self): - """Testet Eingaben mit nur einem Buchstaben""" - self.assertEqual(self.c.count_ed('D'), 1) - self.assertEqual(self.c.count_ed('E'), 1) - self.assertEqual(self.c.count_ed('d'), 1) - self.assertEqual(self.c.count_ed('e'), 1) - -if __name__ == "__main__": - unittest.main() \ No newline at end of file diff --git a/Project_tests/other/WeishauptOrlando/tests/__init__.py b/Project_tests/other/WeishauptOrlando/tests/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/Project_tests/other/WeishauptOrlando/tests/test_calculator.py b/Project_tests/other/WeishauptOrlando/tests/test_calculator.py deleted file mode 100644 index a0c79315eb48c048e5a191db3037f095771d70a9..0000000000000000000000000000000000000000 --- a/Project_tests/other/WeishauptOrlando/tests/test_calculator.py +++ /dev/null @@ -1,103 +0,0 @@ -# Testfälle für calculate(), Eingabe: str, Ausgabe: float/int - -# 1ï¸âƒ£ Additionstests -# Eingabe: "1+1" → Erwartete Ausgabe: 2 -# Eingabe: "10+20" → Erwartete Ausgabe: 30 -# Eingabe: "0+5" → Erwartete Ausgabe: 5 -# Eingabe: "-3+7" → Erwartete Ausgabe: 4 -# Eingabe: "2.5+2.5" → Erwartete Ausgabe: 5.0 - -# 2ï¸âƒ£ Subtraktionstests -# Eingabe: "5-3" → Erwartete Ausgabe: 2 -# Eingabe: "10-20" → Erwartete Ausgabe: -10 -# Eingabe: "0-5" → Erwartete Ausgabe: -5 -# Eingabe: "-3-7" → Erwartete Ausgabe: -10 -# Eingabe: "2.5-1.5" → Erwartete Ausgabe: 1.0 - -# 3ï¸âƒ£ Multiplikationstests -# Eingabe: "2*3" → Erwartete Ausgabe: 6 -# Eingabe: "10*0" → Erwartete Ausgabe: 0 -# Eingabe: "-2*5" → Erwartete Ausgabe: -10 -# Eingabe: "3.5*2" → Erwartete Ausgabe: 7.0 -# Eingabe: "-3*-3" → Erwartete Ausgabe: 9 - -# 4ï¸âƒ£ Divisionstests -# Eingabe: "10/2" → Erwartete Ausgabe: 5 -# Eingabe: "5/2" → Erwartete Ausgabe: 2.5 -# Eingabe: "-6/3" → Erwartete Ausgabe: -2 -# Eingabe: "7.5/2.5" → Erwartete Ausgabe: 3.0 -# Eingabe: "5/0" → Erwartete Ausgabe: ZeroDivisionError (Fehlermeldung) - -# 5ï¸âƒ£ Komplexe Berechnungen -# Eingabe: "3+5*2" → Erwartete Ausgabe: 13 (Multiplikation vor Addition) -# Eingabe: "(3+5)*2" → Erwartete Ausgabe: 16 (Klammer zuerst) -# Eingabe: "10-4/2" → Erwartete Ausgabe: 8 (Division vor Subtraktion) -# Eingabe: "3+(2*5)-8/4" → Erwartete Ausgabe: 10 (Mehrere Operatoren) - -# 6ï¸âƒ£ Ungültige Eingaben -# Eingabe: "3++5" → Erwartete Ausgabe: SyntaxError (Fehlermeldung) -# Eingabe: "10*/2" → Erwartete Ausgabe: SyntaxError (Fehlermeldung) -# Eingabe: "abc" → Erwartete Ausgabe: ValueError (Fehlermeldung) - - -import unittest -from src.calculator import Calculator - -class TestCalculator(unittest.TestCase): - def setUp(self): - self.calc = Calculator() - - # Addition - def test_addition(self): - self.assertEqual(self.calc.calculate("1+1"), 2) - self.assertEqual(self.calc.calculate("10+20"), 30) - self.assertEqual(self.calc.calculate("0+5"), 5) - self.assertEqual(self.calc.calculate("-3+7"), 4) - self.assertEqual(self.calc.calculate("2.5+2.5"), 5.0) - - # Subtraktion - def test_subtraction(self): - self.assertEqual(self.calc.calculate("5-3"), 2) - self.assertEqual(self.calc.calculate("10-20"), -10) - self.assertEqual(self.calc.calculate("0-5"), -5) - self.assertEqual(self.calc.calculate("-3-7"), -10) - self.assertEqual(self.calc.calculate("2.5-1.5"), 1.0) - - # Multiplikation - def test_multiplication(self): - self.assertEqual(self.calc.calculate("2*3"), 6) - self.assertEqual(self.calc.calculate("10*0"), 0) - self.assertEqual(self.calc.calculate("-2*5"), -10) - self.assertEqual(self.calc.calculate("3.5*2"), 7.0) - self.assertEqual(self.calc.calculate("-3*-3"), 9) - - # Division - def test_division(self): - self.assertEqual(self.calc.calculate("10/2"), 5) - self.assertEqual(self.calc.calculate("5/2"), 2.5) - self.assertEqual(self.calc.calculate("-6/3"), -2) - self.assertEqual(self.calc.calculate("7.5/2.5"), 3.0) - - # Division durch Null - def test_division_by_zero(self): - with self.assertRaises(ZeroDivisionError): - self.calc.calculate("5/0") - - # Komplexe Berechnungen - def test_complex_expressions(self): - self.assertEqual(self.calc.calculate("3+5*2"), 13) # Punkt-vor-Strich beachten - self.assertEqual(self.calc.calculate("(3+5)*2"), 16) # Klammer zuerst - self.assertEqual(self.calc.calculate("10-4/2"), 8) # Division vor Subtraktion - self.assertEqual(self.calc.calculate("3+(2*5)-8/4"), 11.0) # 11 - - # Ungültige Eingaben - def test_invalid_expressions(self): - with self.assertRaises(ValueError): - self.calc.calculate("3++5") - with self.assertRaises(ValueError): - self.calc.calculate("10*/2") - with self.assertRaises(ValueError): - self.calc.calculate("abc") - -if __name__ == "__main__": - unittest.main() \ No newline at end of file diff --git a/Project_tests/report.md b/Project_tests/report.md index 38a751c692824d6e22fd0a100760f804d5659fda..8197e73404bb16d6e72e7970a3bd0712ca8b89d5 100644 --- a/Project_tests/report.md +++ b/Project_tests/report.md @@ -1,9 +1,11 @@ -| Name | Interface break | Failed Testcases | -|----------------|-----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| AliciMuhamed | yes (4) | test_convertFloat test_convertNegative test_convertZero | -| BerishaAlma | no | all except one (test_convertThree) | -| GotsisWasilios | no | 23/26 failed (test_convertTwenty, test_convertSixty, test_convertSeventy successful) | -| PikkemaatLasse | yes (8) | none | -| YildirimHatice | no | 15/26 failed (test_convertZero, test_convertYear, test_convertThirty, test_convertTen, test_convertString, test_convertSign, test_convertNintyNine, test_convertNinety, test_convertNegative, test_convertMultipleNum, test_convertHighNum, test_convertFourty, test_convertFourDigit,test_convertFloat,test_convertEmpty) | -| | | | -| | | | \ No newline at end of file +Roman Numbers - Codes of Group members tested with my testcases: + +| Name | Interface break | Failed Testcases | +|------------------|-----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| AliciMuhamed | yes (4) | 3/26 failed (test_convertFloat, test_convertNegative, test_convertZero) | +| BerishaAlma | no | 25/26 failed (test_convertThree was the only one that was successful) | +| GotsisWasilios | no | 23/26 failed (test_convertTwenty, test_convertSixty, test_convertSeventy successful) | +| PikkemaatLasse | yes (8) | none | +| YildirimHatice | no | 15/26 failed (test_convertZero, test_convertYear, test_convertThirty, test_convertTen, test_convertString, test_convertSign, test_convertNintyNine, test_convertNinety, test_convertNegative, test_convertMultipleNum, test_convertHighNum, test_convertFourty, test_convertFourDigit,test_convertFloat,test_convertEmpty) | +| WeishauptOrlando | yes (5) | 2/26 failed (test_convertZero, test_convertNegative) | +| | | | \ No newline at end of file