diff --git a/others/Wasili/WasiliStringCalculator.py b/others/Wasili/WasiliStringCalculator.py new file mode 100644 index 0000000000000000000000000000000000000000..cdc403a21db8e5bbc676e516a255248ad6bceacf --- /dev/null +++ b/others/Wasili/WasiliStringCalculator.py @@ -0,0 +1,113 @@ +#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 +from src.stringcalculator import StringCalculator #Auskommentieren, falls andere Implementierung genutzt wird +''' +#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() + +# python -m unittest others.Wasili.WasiliStringCalculator -v \ No newline at end of file diff --git a/others/Wasili/reportWasiliImp.md b/others/Wasili/reportWasiliImp.md new file mode 100644 index 0000000000000000000000000000000000000000..de90e5366d3a7149eabf655983d6b5d2b4ea6e18 --- /dev/null +++ b/others/Wasili/reportWasiliImp.md @@ -0,0 +1,4 @@ +| Name | Interface break | Failed Testcases | +|--------|-----------------|----------------------------------------------------------------------------------------------------------------------------------| +| Wasili | no | test_add_multiple_negative_numbers (tests.testStringcalculator.TestStringCalculator) ... negatives not allowed: -10,-20,-30 FAIL | +| Wasili | no | test_add_single_negative_number (tests.testStringcalculator.TestStringCalculator) ... negatives not allowed: -2 FAIL | \ No newline at end of file diff --git a/others/Wasili/reportWasiliTests.md b/others/Wasili/reportWasiliTests.md new file mode 100644 index 0000000000000000000000000000000000000000..263b6e23bc3a053e44757b5f222165a01e752db3 --- /dev/null +++ b/others/Wasili/reportWasiliTests.md @@ -0,0 +1,4 @@ +| Name | Interface break | Failed Testcases | +|--------|-----------------|------------------------------------------------------------------------------------------------| +| Wasili | no | test_add_exception (others.Wasili.WasiliStringCalculator.TestStringCalculator) ... FAIL | +| Wasili | no | test_add_negative_numbers (others.Wasili.WasiliStringCalculator.TestStringCalculator) ... FAIL | \ No newline at end of file diff --git a/tests/testStringcalculator.py b/tests/testStringcalculator.py index 75214d70193b2ecf8962e85e7313e6d2c55d2fcb..110ba77b00900b4f0d77757cc8c5694b784aa66c 100644 --- a/tests/testStringcalculator.py +++ b/tests/testStringcalculator.py @@ -33,9 +33,12 @@ Orlandos Code: import unittest from others.Orlando.OrlandoInterfaces import IStringCalculator from others.Orlando.OrlandoStringCalculator import StringCalculator -''' + import unittest from others.Dani.DaniStringCalculator import IStringCalculator, StringCalculator +''' +import unittest +from others.Wasili.WasiliStringCalculator import IStringCalculator, StringCalculator class TestStringCalculator(unittest.TestCase): def setUp(self):