From 69ce89092b7e0d7b00e3b54fd8cce92f83729c5d Mon Sep 17 00:00:00 2001
From: Hatice Yildirim <Hatice.Yildirim@student.reutlingen-university.de>
Date: Sun, 6 Apr 2025 02:42:11 +0200
Subject: [PATCH] Implemetierung stringCalculator von AliciMuhamed testen

---
 .../__pycache__/Feature1.cpython-312.pyc      | Bin 0 -> 2726 bytes
 .../stringCalculator.cpython-312.pyc          | Bin 0 -> 2448 bytes
 .../stringCalculatorr.cpython-312.pyc         | Bin 0 -> 6649 bytes
 BerishaAlma_2/my_calculator.py                |  58 +++++++++++
 BerishaAlma_2/stringCalculatorr.py            |  90 ++++++++++++++++++
 BerishaAlma_2/your_calculator.py              |   0
 6 files changed, 148 insertions(+)
 create mode 100644 BerishaAlma_2/__pycache__/Feature1.cpython-312.pyc
 create mode 100644 BerishaAlma_2/__pycache__/stringCalculator.cpython-312.pyc
 create mode 100644 BerishaAlma_2/__pycache__/stringCalculatorr.cpython-312.pyc
 create mode 100644 BerishaAlma_2/my_calculator.py
 create mode 100644 BerishaAlma_2/stringCalculatorr.py
 create mode 100644 BerishaAlma_2/your_calculator.py

diff --git a/BerishaAlma_2/__pycache__/Feature1.cpython-312.pyc b/BerishaAlma_2/__pycache__/Feature1.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3270fcd902f81a4cc08bb171eabee1cce9c36aa1
GIT binary patch
literal 2726
zcmc&$%}*Og6rb5$o5k3e50k_YHKZsXrY^-eG-*{OBG4v1;Isv#*0r=+yc;lhjXSee
zWs3uqsG3V}kszmV4C2DE|3faJ7J_agwNg*qT+E46-y46#IM5s!$-kL-^JZp$?`!<h
z=kpL~Qd?;*BNOruPHN3n9h5g<utp4G&@{1VoLW*`qBxh*a$J_k17gUl#86DS1!rK3
zD?;i5soPZQQkRgnfK)Z*1#d;S5$l>QrfRe<-Xw%|Nd$De8nr6pt*VHUyp)$ho&%hR
zBu5^*Kkl^av)pES(zZ-{e#wX>tIDFQ6T1%6HDZ!DHAq}CWrLcEA(^hn3J_9i7sTCp
zCFF8CznrpJDl<2(r<1v~ZZ9#XC6lveO~xHJGwmG9B&Eh{V2tJ{E8><s*`%>evMD(V
zH`9+<3rIQY_xB$!CO=Kga5yOOP`6V_Q~NHJHc~8QB_>S1XfI_G!z0@C#Dq4+d1@|W
znHigF!y}35=|+)>!f4`=J#VtaeUqj5ygrt;bZsQ@g{i~$nUSGv-jQ{~DD=EVW(dS+
z7>=+){#LzZ7?4<~#Zfgaqg$q?IUY^3mW*5)$6ihQA*ZJ+D-20GGT7XaQyH82VanPN
zIuP0s+%-U5{yxAe*>`o9B<k|5M@s~{jp!kEWtq4G|DwFI9e1AaAfAA&d>P=42f=?b
z_)n?$FYXe4>u7eHFg;UY=LvtIK=|uhapp4RG*4{`6VYs3tBh*5lV!SqZft6Xv{l`;
zRgH(*e2RqR7(?MP4Tlu4SI%-|OV6?%kU1`%O{Z*zc~Omwis8_hg+Mb6bQmTt9{^Y(
zfA}x#cL!ekyPig$^7RMLC!bBe7${yIDt3QV^bfyMhlMF)Avfy;eTE6ex)A~hc>k$R
zyNC-2t?=Whwn|Ep?24erpxcNZVOQ}J>YeaY&3ffQSZVarDv5)q05Q`@++`?$ZUYKN
zye033m<vps+-|0vtepp^5j3Ol7e>+=dE=>C-YyfZuAe6iZ55IP7sr#VC-Ej_K3L(X
z+Ar)4elYEsY@zqGPZ$zw7}Om7v_f9@4i<aEPn2K%!UiWk5mQNgVjKo*WSK0~KL`ZX
z2GVMn)Fjw1)QVJt(4e(If)K0jf$E1r<q#28o3hiUbEqWt=a`$UA9h#VdKE^E96N2W
zuVz|VJFh|3LR~9dKb7xWdKfeuk6R)8s&`Mlw4+{H4?Mr}?8;s+yb}z+_@)>f-oCo4
z-a1!<(8vKAn_WX_X5S@PabOLltWv}aH_oPiLh-`8_)issk?qK?I(nY`3vwhpa)7~i
zx&=Cf1?(S}s`Po`+S&XY)PnC~KT`}wx4+(1Z=WmsR$w2FhHr&O55!Y+Y83Pc8(6ut
zoyykZfENbOHbk>7K0p7P3*Q%mpZqqmtKJpXh=tVV>WjsT-9Y#NVF)3D(DZn|hcX1D
z!}|bM$sxRuA0E1?YZT#Qgga$`d*U*ojc>Q5r!txr^1#bKn`9y+@C9?!Tqb3s2`Vo$
z7H>yI?&CUC5OE<s6^?=jG=0yp`dQ_Vz+HA5bTHHSR{$lMQu-Ge_>=gL6q)+gWq2N_
z@5rOj$g7Jtj|lWf-gbI#{mx!rc&9IXL|{_tCyMt;;deQ>uXL_F{AKc|$)6vUWTNy6
GCjSAC5hwuw

literal 0
HcmV?d00001

diff --git a/BerishaAlma_2/__pycache__/stringCalculator.cpython-312.pyc b/BerishaAlma_2/__pycache__/stringCalculator.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5f1c175d3824110b577dc877f78e2021bcf81f11
GIT binary patch
literal 2448
zcmc&#%}*Og6rb4-voUtehx1_)HKa5jZe5CT(xR%WL`aqN0BH+I?aI<>@ovDxYuuT&
zDq9?=MAck+iv&4^V-Oeqk6uD81l>kzrJlIC*e6bXZ`O8fhbYI4v~OnKyqVeG`@Q$(
z_i#8!ph>;eMMWm$Uz{|X+8ETfV6Z_fV$mFNs7@V8mnhDqoUF?dxkoH{omh%Zci;?c
zx+1hHXaly=(yBt+16s|NmqWg7yKGtZ*qU|b(M>|wfJDG{pxw$J?=)1Dl%$dr4<6w>
zE_w3gohk3Exxig!W?aX1msYHqOv6}oEnwGSx<PEBQ;X=5EnC!9EXh_MDga1nUZ4j`
zN?i5&zn*njHorJ!<}$^c>8>!ZCtq|HY{tC+v)v-gXQcLPV2tjlDdLtA*`_nwWLxqS
zZs#7d9?){MA09s8na|Vn91cp~H{EQ;Hh#$FtSrkq>AN<6<gOIbW8=o$-Mhvl=h?-)
zW9MCNjE$$~=Gs*@DpTnP?vl;YcWjpBOXg(GF^%yw_@d*_M++rSHZ7}s?ln-OphgFA
z6l>%kEmVU6nThv!nqlNk$2JTvXc*3lRm|ZyWEejd&78l&5UeM|eV&}nyDS1z){CMK
z#aR@Ara)W%K8SU4s18;os)jdHRRY~s>KMD4OajsWQ15TYogGZ#3D|0vLA+uTc$9%h
z#ph911%G|r^a%=>20J@=Lxte&dvWF}<+May3KP*>T=PfG+sP_jMmoEiCG9kJ?KI+|
zIiDqQd4{3#geKw&_^ar6vSSw5Ina43FXXZ=!~AGOi0?RbW;xmo0|~<<<|821$e)q(
zhlA0Vk%1?vCw%kXv+1YP&qpekM=OJ$R3c+9v@zkznRtNpgFVB<VuL86DDeJMNxOgx
zD9*sg(QKVmC0R`(W6*7->e%@_p<M@0P4Cq{fR%Qh)`<>Gfy9g>x@svP10^*c@S<}z
zce}x6nkT_I1RW@t!Wh~huQ+OE?kX`__9ep5OL0k{@Pe6E8gEk;h82#c!@|?RfbGr~
z%0s99!l+ooaOTL+8hJVNVPz=sSotj?(0BYICXx6>9R?d@l`OY@2o#M5+D3phHP|mV
z%T$}vqRkM3;A-rF`iJ4<5fM<^ve#>Js3q=Kn3Zf8cKd{0g;6`kei!^}*iOMM8IZ3~
zAIjHH#rv8ah6~5z*2tk2I?yieX%{!6&#pYZau7@G#S+iItHj23ukLHN-l;=q@(7*H
zuA%5gKOj(XKn+FAFXQDKZ-(Dtc>ZnpXDhMfZgO9{{VwsB<z!;~2!ro*5A+ESxIe8l
z;PdjeH{)+Ji@go~d?l9J{dQmbOrVE{qr1{zy0RN6K0+~yqU()#4|OQ8=5ciRIyr`i
z;N#-}Rd1vCv<6~ATp<kcb#lyX-Z0`pc-s~-Oh8v)tEUz7Sr_5@Zx5CyPeZU%CS;1Z
z3yYzr-~nB~a-x0VKXqTSTVR6`#lHbjl_{lvlaaqjq^`&`yeUHgq~Ur{p~)8)Zq^C(
u^-wRJ*qk`Hl-RqJs1uk}hlmn-T>e9j9V-26_kW%KdHR<JRhcM50?Gg6yYd(S

literal 0
HcmV?d00001

diff --git a/BerishaAlma_2/__pycache__/stringCalculatorr.cpython-312.pyc b/BerishaAlma_2/__pycache__/stringCalculatorr.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5047f7559a0813d308e85fae57458ace61d9a67f
GIT binary patch
literal 6649
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
Yxx`l8KmUV^-@Ew!r4@#-^|~<s1(#ERHUIzs

literal 0
HcmV?d00001

diff --git a/BerishaAlma_2/my_calculator.py b/BerishaAlma_2/my_calculator.py
new file mode 100644
index 0000000..8ac359b
--- /dev/null
+++ b/BerishaAlma_2/my_calculator.py
@@ -0,0 +1,58 @@
+#Implementierung von BerishaAlma auf meinen Testfälle: StringCalculator
+import unittest
+
+from stringCalculatorr 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/BerishaAlma_2/stringCalculatorr.py b/BerishaAlma_2/stringCalculatorr.py
new file mode 100644
index 0000000..02d9bb4
--- /dev/null
+++ b/BerishaAlma_2/stringCalculatorr.py
@@ -0,0 +1,90 @@
+#Implementierung Aufgabe 02 von BerishaAlma und YildirimHatice
+
+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/BerishaAlma_2/your_calculator.py b/BerishaAlma_2/your_calculator.py
new file mode 100644
index 0000000..e69de29
-- 
GitLab