diff --git a/feature7 b/feature7 index 7f7c29379e8f663c058c278eb8bfeba8506903bc..be466e14abec6d38287a09a85180a2a6b32b5983 100644 --- a/feature7 +++ b/feature7 @@ -1,6 +1,6 @@ import re import unittest -from other.BerishaAlma.Feature6 import StringCalculator as Alma +from other.RafehDaniel.stringCalculator import StringCalculator as Dani #class StringCalculator: # def add(self, numbers: str) -> int: # Feature 1: Leerer String ergibt 0 @@ -53,7 +53,7 @@ class TestStringCalculator(unittest.TestCase): def setUp(self): """neue Instanz des StringCalculators vor jedem Test""" - self.calculator = Alma() + self.calculator = Dani() def test_empty_string_returns_zero(self): """Feature 1: Leerer String soll 0 ergeben""" diff --git a/other/RafehDaniel/__pycache__/stringCalculator.cpython-313.pyc b/other/RafehDaniel/__pycache__/stringCalculator.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31887633cb86edf4eaa8102512a8528082b39374 Binary files /dev/null and b/other/RafehDaniel/__pycache__/stringCalculator.cpython-313.pyc differ diff --git a/other/RafehDaniel/stringCalculator.py b/other/RafehDaniel/stringCalculator.py new file mode 100644 index 0000000000000000000000000000000000000000..232cb01f86f1783dee257ad584d3ff6cf2848a2a --- /dev/null +++ b/other/RafehDaniel/stringCalculator.py @@ -0,0 +1,171 @@ +# Bei einer leeren Eingabe "" soll die Zahl 0 ausgegeben werden. +# Bei der Eingabe "1" soll die 1 ausgegeben werden. +# Bei der Eingabe von 2 Zahlen als Strings separiert durch "," (z.B. "1, 2") soll die Zahl 3 ausgegeben werden +# Bei der Eingabe "0, 5" soll die Zahl 5 ausgegeben werden. +# Bei der Eingabe von Float-Werten z.B. 3.5 soll "only integers allowed" ausgegeben werden. +# Bei der Eingabe von Buchstaben z.B. 1, z soll "only integers allowed" ausgegeben werden. +# Bei der Eingabe von 2 Zahlen als Strings separiert durch "\n" (z.B. "1\n2,3") soll 6 ausgegeben werden +# Bei der Eingabe von negativen Zahlen (z.B. -3) soll "negatives not allowed" ausgegeben werden +# Bei der Eingabe von Zahlen mit einem benutzerdefinierten Trennzeichen soll die Summe der Zahlen berechnet werden (z.B. //;\n1;2 = 3) +# Bei Eingabe von Zahlen >1000 sollen diese ignoriert werden (z.B. 2 + 1001 = 2) +# Bei der Eingabe von Zahlen mit einem benutzerdefinierten Trennzeichen soll die Summe der Zahlen berechnet werden. Trennzeichen können unbegrenzt lang sein (z.B. “//[***]\n1***2***3†= 6). +# Bei der Eingabe mehrerer negativen Zahlen (z.B. -3, -4) sollen die Zahlen in der exception ausgegeben werden +# Bei der Eingabe von Zahlen mit Leerzeichen soll dennoch die Summe ausgegeben werden (z.B." 4 , 5" = 9) +# Bei der Eingabe "2, 1001, 5" soll die Zahl 7 ausgegeben werden +# Bei der Eingabe von Texten mit leeren Trennzeichen (z.B. "//;\n") soll die Zahl 0 ausgegeben werden +# Bei der Eingabe von "1, " soll die Zahl 1 ausgegeben werden +# Bei der Eingabe von "-2, 5" soll "negatives not allowed" ausgegeben werden +# Bei der Eingabe von "//;\n-1;2;1001;-3" soll "negatives not allowed [-1, -3]" ausgegeben werden + +import unittest +from abc import ABC, abstractmethod + + +class IStringCalculator(ABC): + @abstractmethod + def add(self, numbers: str) -> int: + pass + +class StringCalculator(IStringCalculator): + def add(self, numbers: str) -> int: + + '''Leere Eingabe soll 0 ausgeben''' + if numbers == "": + return 0 + + '''Standard-Trennzeichen''' + delimiter = ";" + + '''Es wird geprüft ob ein benutzerdefiniertes Trennzeichen vorhanden ist.''' + if numbers.startswith("//"): + sep = numbers.split("\n", 1) + delimiter_sep = sep[0][2:] + + '''Für den Fall, dass das Trennzeichen in eckigen Klammern steht werden die Klammern entfernt und das Trennzeichen gespeichert''' + if delimiter_sep.startswith("[") and delimiter_sep.endswith("]"): + delimiter = delimiter_sep[1:-1] + + else: + delimiter = delimiter_sep[0] + + '''Entfernen der ersten Zeile, damit nur noch Zahlen übrig bleiben''' + numbers = sep[1] + + '''Ersetzen von Zeilenumbrüchen mit Delimiter und ersetzen von Delimiter durch ",", um splitten zu können''' + numbers = numbers.replace("\n", delimiter).replace(delimiter, ",") + + list = numbers.split(",") + result = 0 + + negative_numbers = [] + + for num in list: + num = num.strip() + if num == "": + continue + + '''Sicherstellen dass Floats nicht berücksichtigt werden''' + if "." in num: + return "only integers allowed" + + '''Sicherstellen, dass keine Buchstaben verwendet werden dürfen''' + try: + number = int(num) + except ValueError: + return "only integers allowed" + + '''Konvertirung von Strings zu Integer''' + if number < 0: + negative_numbers.append(number) + + if number > 1000: + continue + + result += number + + if len(negative_numbers) > 1: + return "negatives not allowed " + str(negative_numbers) + elif negative_numbers: + return "negatives not allowed" + + return result + + +class TestStringCalculator(unittest.TestCase): + def setUp(self): + self.c = StringCalculator() + + def test_empty(self): + res = self.c.add("") + self.assertEqual(res, 0) + + def test_oneNumber(self): + res = self.c.add("1") + self.assertEqual(res, 1) + + def test_addingTwoNumbers(self): + res = self.c.add("1,2") + self.assertEqual(res, 3) + + def test_addingTwoNumbersWithZero(self): + res = self.c.add("0,5") + self.assertEqual(res, 5) + + def test_handleFloat(self): + res = self.c.add("3.5") + self.assertEqual(res, "only integers allowed") + + def test_handleLetter(self): + res = self.c.add("1, z") + self.assertEqual(res, "only integers allowed") + + def test_addWithBackslashN(self): + res = self.c.add("1\n2,3") + self.assertEqual(res, 6) + + def test_negativeValues(self): + res = self.c.add("-3") + self.assertEqual(res, "negatives not allowed") + + def test_delimiter(self): + res = self.c.add("//;\n1;2") + self.assertEqual(res, 3) + + def test_thousandone(self): + res = self.c.add("2, 1001") + self.assertEqual(res, 2) + + def test_multidelimiter(self): + res = self.c.add("//[***]\n1***2***3") + self.assertEqual(res, 6) + + def test_multi_negative(self): + res = self.c.add("-3, -4") + self.assertEqual(res, "negatives not allowed " + str([-3, -4])) + + def test_space_between_numbers(self): + res = self.c.add(" 4 , 5") + self.assertEqual(res, 9) + + def test_multiple_num_with_thousandone(self): + res = self.c.add(" 2, 1001, 5") + self.assertEqual(res, 7) + + def test_empty_text(self): + res = self.c.add("//;\n") + self.assertEqual(res, 0) + + def test_one_number_with_empty_string(self): + res = self.c.add("1,") + self.assertEqual(res, 1) + + def test_negative_with_positive(self): + res = self.c.add("-2, 5") + self.assertEqual(res, "negatives not allowed") + + def test_mixture(self): + res = self.c.add("//;\n-1;2;1001;-3") + self.assertEqual(res, "negatives not allowed " + str([-1, -3])) + +if __name__ == "__main__": + unittest.main() \ No newline at end of file diff --git a/report.md b/report.md index 58bf7176de296fadee10caa6dbcf96a940e48811..8284d84f9a7cc6d7e21e47e70848caa8cc5cba59 100644 --- a/report.md +++ b/report.md @@ -6,6 +6,6 @@ | BerishaAlma | no | 4 | | GotsisWasilios | no | 0 | | PikkemaatLasse | – | – | -| RafehDaniel | – | – | +| RafehDaniel | no | 2 | | WeishauptOrlando | – | – | | YildirimHatice | – | – |