From 012b2f6c36bea415abda988ac24bafc02dbc1da2 Mon Sep 17 00:00:00 2001 From: Hatice Yildirim <Hatice.Yildirim@student.reutlingen-university.de> Date: Sun, 6 Apr 2025 03:56:06 +0200 Subject: [PATCH] Alle getestetten Datein stringCalculator --- Other/GotsisWasili_2/TDD_StringCalculator.py | 110 ++++++++++++++++++ .../__pycache__/TDD_StringCalculator.py | Bin 6235 -> 0 bytes .../stringCalculator.cpython-312.pyc | Bin 6649 -> 0 bytes Other/GotsisWasili_2/my_calculator.py | 58 +++++++++ Other/GotsisWasili_2/stringCalculator.py | 88 ++++++++++++++ Other/GotsisWasili_2/your_calculator.py | 61 ++++++++++ 6 files changed, 317 insertions(+) create mode 100644 Other/GotsisWasili_2/TDD_StringCalculator.py delete mode 100644 Other/GotsisWasili_2/__pycache__/TDD_StringCalculator.py delete mode 100644 Other/GotsisWasili_2/__pycache__/stringCalculator.cpython-312.pyc create mode 100644 Other/GotsisWasili_2/my_calculator.py create mode 100644 Other/GotsisWasili_2/stringCalculator.py create mode 100644 Other/GotsisWasili_2/your_calculator.py diff --git a/Other/GotsisWasili_2/TDD_StringCalculator.py b/Other/GotsisWasili_2/TDD_StringCalculator.py new file mode 100644 index 0000000..ab815fa --- /dev/null +++ b/Other/GotsisWasili_2/TDD_StringCalculator.py @@ -0,0 +1,110 @@ +#Bei Eingabe des Strings "" liefert die Funktion 0 +#Bei Eingabe des Strings "1" liefert die Funktion 1 +#Bei Eingabe des Strings "1,2" liefert die Funktion 3 +#Bei Eingabe des Strings "1,2,3,4,5,6,7" liefert die Funkktion 28 +#Bei Eingabe des Strings "1\n2,3,4" liefert die Funkktion 10 +#Bei Eingabe des Strings "-5" liefert die Funkktion eine exception mit [“negatives not allowed†-5] +#Bei Eingabe des Strings "-5,-2,-2" liefert die Funkktion eine exception mit [“negatives not allowed†-5,-2,-2] +#Bei Eingabe des Strings "//;\n1;2" liefert die Funktion 3 wobei das Standard-Trennzeichen';' ist. +#Bei Eingabe des Strings "2,1001" liefert die Funktion 2 +#Bei Eingabe des Strings "2,10022\n6" liefert die Funktion 8 +#Bei Eingabe des Strings "//[***]\n1***2***3" mit dem Trennzeichen '***' liefert die Funktion 6 +#Bei Eingabe des Strings "//[*+*+*]\n1*+*+*2*+*+*3*+*+*220" mit dem Trennzeichen '***' liefert die Funktion 226 + +import unittest +from abc import ABC, abstractmethod + +#Interface für StringCalculator +class IStringCalculator(ABC): + @abstractmethod + def add(self, numbers:str) -> int: + pass + +#Implementierung der Calculator Klasse +class StringCalculator(IStringCalculator): + def add(self, numbers:str) -> int: + if numbers == "": + return 0 + + #Prüfen, ob ein benutzerdefiniertes Trennzeichen definiert wurde + + if numbers.startswith("//"): + delimiter_end_index = numbers.index("\n") #Zeilenumbruchs Position finden + delimiter = numbers[2:delimiter_end_index] # Trennzeichen, also alles zwischen "//" und "\n" extrahieren + + if delimiter.startswith("[") and delimiter.endswith("]"): + delimiter = delimiter[1:-1] # "[" und "]" entfernen + + numbers = numbers[delimiter_end_index + 1:] #Zahlen nach "\n" extrahieren + numbers = numbers.replace(delimiter,",") #Benutzerdefiniertes Trennzeichen durch "," ersetzen + + #Zeilenumbrüche ebenfals durch "," ersetzen + numbers = numbers.replace("\n",",") + + # String anhand von Kommas splitten, eine Liste der einzelnen Zahlen(in str) erzeugen und in Int umwandeln -> Ergebnis wäre z.B. bei add("1\n2,3,4") -> [1,2,3,4] + num_list = list(map(int, numbers.split(",",))) + + #Prüfung auf negative Zahlen + negatives = [n for n in num_list if n<0] + if negatives: + raise ValueError(f"negatives not allowed: {','.join(map(str, negatives))}") #Alle negativen Zahlen durch Kommas in getrennte Strings darstellen + + #Zahlen größer als 1000 aus Liste entfernen + num_list = [n for n in num_list if n <= 1000] + + return sum(num_list) #Summe berechnen (bei einer Zahln wird immernoch dieselbe Zahl ausgegeben) + + +#mplementierung der Testklasse für StringCalculator +class TestStringCalculator(unittest.TestCase): + def test_add_empty(self): + c = StringCalculator() + self.assertEqual(c.add(""), 0) + + def test_add_one_string(self): + c = StringCalculator() + self.assertEqual(c.add("1"), 1) + + def test_add_two_string(self): + c = StringCalculator() + self.assertEqual(c.add("1,2"), 3) + + def test_add_multiple_string(self): + c = StringCalculator() + self.assertEqual(c.add("1,2,3,4,5,6,7"), 28) + + def test_add_new_lines(self): + c = StringCalculator() + self.assertEqual(c.add("1\n2,3,4"), 10) + + def test_add_exception(self): + c = StringCalculator() + with self.assertRaises(ValueError) as context: + c.add("-5") + self.assertEqual(str(context.exception), "negatives not allowed: -5") + + def test_add_negative_numbers(self): + c = StringCalculator() + with self.assertRaises(ValueError) as context: + c.add("-5,-2,-2") + self.assertEqual(str(context.exception), "negatives not allowed: -5,-2,-2") + + def test_add_different_delimiters(self): + c = StringCalculator() + self.assertEqual(c.add("//;\n1;2"), 3) + + def test_add_numbers_greater_than_1000(self): + c = StringCalculator() + self.assertEqual(c.add("2,1001"),2) + self.assertEqual(c.add("2,10022\n6"),8) + + def test_delimiters_of_any_length(self): + c = StringCalculator() + self.assertEqual(c.add("//[***]\n1***2***3"), 6) + + def test_delimiters_of_any_length2(self): + c = StringCalculator() + self.assertEqual(c.add("//[*+*+*]\n1*+*+*2*+*+*3*+*+*220"), 226) + +if __name__ == "__main__": + unittest.main() diff --git a/Other/GotsisWasili_2/__pycache__/TDD_StringCalculator.py b/Other/GotsisWasili_2/__pycache__/TDD_StringCalculator.py deleted file mode 100644 index 30cde4b9279a6ce277f38bbb9f1eb96fa171b33b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6235 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 diff --git a/Other/GotsisWasili_2/__pycache__/stringCalculator.cpython-312.pyc b/Other/GotsisWasili_2/__pycache__/stringCalculator.cpython-312.pyc deleted file mode 100644 index 58a2ceb3da7d4787f3cae3a243acdaccab98a25d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6649 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 Xm)NTN=YMeVdl%oow89X!UKi%S#xa0x diff --git a/Other/GotsisWasili_2/my_calculator.py b/Other/GotsisWasili_2/my_calculator.py new file mode 100644 index 0000000..ab49b59 --- /dev/null +++ b/Other/GotsisWasili_2/my_calculator.py @@ -0,0 +1,58 @@ +#Implementierung von PikkemaatLasse auf meinen Testfälle: StringCalculator +import unittest + +from TDD_StringCalculator import StringCalculator + +class TestStringCalculator(unittest.TestCase): + def setUp(self): + self.calculator = StringCalculator() + + def test_implements_interface(self): + self.assertIsInstance(self.calculator, StringCalculator) + + def test_empty_string(self): + self.assertEqual(self.calculator.add(""), 0) + + def test_single_number(self): + self.assertEqual(self.calculator.add("1"), 1) + + def test_two_numbers(self): + self.assertEqual(self.calculator.add("1,2"), 3) + + def test_multiple_numbers(self): + self.assertEqual(self.calculator.add("1,2,3,4,5"), 15) + + def test_numbers_with_newline(self): + self.assertEqual(self.calculator.add("1\n2,3"), 6) + + def test_numbers_with_multiple_newlines(self): + self.assertEqual(self.calculator.add("1\n2\n3\n4\n5"), 15) + + def test_negative_number(self): + with self.assertRaises(ValueError) as context: + self.calculator.add("1,-2,3") + self.assertEqual(str(context.exception), "Negatives not allowed: -2") + + def test_multiple_negative_numbers(self): + with self.assertRaises(ValueError) as context: + self.calculator.add("1,-2,-3,4") + self.assertEqual(str(context.exception), "Negatives not allowed: -2, -3") + + def test_custom_delimiter(self): + self.assertEqual(self.calculator.add("//;\n1;2"), 3) + + def test_custom_delimiter_with_newline(self): + self.assertEqual(self.calculator.add("//;\n1;2\n3"), 6) + + def test_custom_delimiter_with_multiple_numbers(self): + self.assertEqual(self.calculator.add("//|\n1|2|3|4"), 10) + + def test_numbers_greater_than_1000(self): + self.assertEqual(self.calculator.add("2,1001"), 2) + + def test_numbers_greater_than_1000_with_custom_delimiter(self): + self.assertEqual(self.calculator.add("//;\n2;1001"), 2) + + +if __name__ == "__main__": + unittest.main() diff --git a/Other/GotsisWasili_2/stringCalculator.py b/Other/GotsisWasili_2/stringCalculator.py new file mode 100644 index 0000000..bd21dc8 --- /dev/null +++ b/Other/GotsisWasili_2/stringCalculator.py @@ -0,0 +1,88 @@ +from abc import ABC, abstractmethod +import unittest + +class IStringCalculator(ABC): + @abstractmethod + def add(self, numbers: str) -> int: + pass + +class StringCalculator(IStringCalculator): + def add(self, numbers: str) -> int: + if not numbers: + return 0 + + # Überprüfe, ob ein benutzerdefiniertes Trennzeichen angegeben ist + if numbers.startswith("//"): + delimiter_line_end = numbers.find("\n") + delimiter = numbers[2:delimiter_line_end] # Extrahiere das Trennzeichen + numbers = numbers[delimiter_line_end + 1:] # Entferne die erste Zeile mit dem Trennzeichen + else: + delimiter = ',' # Standard-Trennzeichen ist Komma + + # Ersetze alle Vorkommen des Trennzeichens und teile die Eingabe + numbers = numbers.replace("\n", delimiter) + nums = numbers.split(delimiter) + + # Filtere alle Zahlen, die größer als 1000 sind + nums = [int(num) for num in nums if int(num) <= 1000] + + # Prüfe auf negative Zahlen + negatives = [num for num in nums if num < 0] + + if negatives: + # Wenn negative Zahlen vorhanden sind, werfe eine Ausnahme + raise ValueError(f"Negatives not allowed: {', '.join(map(str, negatives))}") + + # Berechne die Summe der Zahlen, die <= 1000 sind + return sum(nums) + +class TestStringCalculator(unittest.TestCase): + def setUp(self): + self.calculator = StringCalculator() + + def test_empty_string(self): + self.assertEqual(self.calculator.add(""), 0) + + def test_single_number(self): + self.assertEqual(self.calculator.add("1"), 1) + + def test_two_numbers(self): + self.assertEqual(self.calculator.add("1,2"), 3) + + def test_multiple_numbers(self): + self.assertEqual(self.calculator.add("1,2,3,4,5"), 15) + + def test_numbers_with_newline(self): + self.assertEqual(self.calculator.add("1\n2,3"), 6) + + def test_numbers_with_multiple_newlines(self): + self.assertEqual(self.calculator.add("1\n2\n3\n4\n5"), 15) + + def test_negative_number(self): + with self.assertRaises(ValueError) as context: + self.calculator.add("1,-2,3") + self.assertEqual(str(context.exception), "Negatives not allowed: -2") + + def test_multiple_negative_numbers(self): + with self.assertRaises(ValueError) as context: + self.calculator.add("1,-2,-3,4") + self.assertEqual(str(context.exception), "Negatives not allowed: -2, -3") + + def test_custom_delimiter(self): + self.assertEqual(self.calculator.add("//;\n1;2"), 3) + + def test_custom_delimiter_with_newline(self): + self.assertEqual(self.calculator.add("//;\n1;2\n3"), 6) + + def test_custom_delimiter_with_multiple_numbers(self): + self.assertEqual(self.calculator.add("//|\n1|2|3|4"), 10) + + def test_numbers_greater_than_1000(self): + self.assertEqual(self.calculator.add("2,1001"), 2) + + def test_numbers_greater_than_1000_with_custom_delimiter(self): + self.assertEqual(self.calculator.add("//;\n2;1001"), 2) + + +if __name__ == "__main__": + unittest.main() diff --git a/Other/GotsisWasili_2/your_calculator.py b/Other/GotsisWasili_2/your_calculator.py new file mode 100644 index 0000000..9742055 --- /dev/null +++ b/Other/GotsisWasili_2/your_calculator.py @@ -0,0 +1,61 @@ +import unittest +from stringCalculator import StringCalculator + +#mplementierung der Testklasse für StringCalculator +class TestStringCalculator(unittest.TestCase): + + def test_implements_interface(self): + c = StringCalculator() + self.assertIsInstance(self.c, StringCalculator) + + def test_add_empty(self): + c = StringCalculator() + self.assertEqual(c.add(""), 0) + + def test_add_one_string(self): + c = StringCalculator() + self.assertEqual(c.add("1"), 1) + + def test_add_two_string(self): + c = StringCalculator() + self.assertEqual(c.add("1,2"), 3) + + def test_add_multiple_string(self): + c = StringCalculator() + self.assertEqual(c.add("1,2,3,4,5,6,7"), 28) + + def test_add_new_lines(self): + c = StringCalculator() + self.assertEqual(c.add("1\n2,3,4"), 10) + + def test_add_exception(self): + c = StringCalculator() + with self.assertRaises(ValueError) as context: + c.add("-5") + self.assertEqual(str(context.exception), "negatives not allowed: -5") + + def test_add_negative_numbers(self): + c = StringCalculator() + with self.assertRaises(ValueError) as context: + c.add("-5,-2,-2") + self.assertEqual(str(context.exception), "negatives not allowed: -5,-2,-2") + + def test_add_different_delimiters(self): + c = StringCalculator() + self.assertEqual(c.add("//;\n1;2"), 3) + + def test_add_numbers_greater_than_1000(self): + c = StringCalculator() + self.assertEqual(c.add("2,1001"),2) + self.assertEqual(c.add("2,10022\n6"),8) + + def test_delimiters_of_any_length(self): + c = StringCalculator() + self.assertEqual(c.add("//[***]\n1***2***3"), 6) + + def test_delimiters_of_any_length2(self): + c = StringCalculator() + self.assertEqual(c.add("//[*+*+*]\n1*+*+*2*+*+*3*+*+*220"), 226) + +if __name__ == "__main__": + unittest.main() -- GitLab