From ac0c8c18c01461c876a7b4a41317ac55e7074ffe Mon Sep 17 00:00:00 2001 From: Hatice Yildirim <Hatice.Yildirim@student.reutlingen-university.de> Date: Sun, 6 Apr 2025 03:12:00 +0200 Subject: [PATCH] Implementierung SerchimoMarvin getestet stringCalculator --- .../__pycache__/feature7.cpython-312.pyc | Bin 0 -> 8641 bytes .../stringCalculator.cpython-312.pyc | Bin 0 -> 6651 bytes Other/SerchimoMarvin_2/my_calculator.py | 58 ++++++++++++ Other/SerchimoMarvin_2/stringCalculator.py | 88 ++++++++++++++++++ Other/SerchimoMarvin_2/your_calculator.py | 87 +++++++++++++++++ 5 files changed, 233 insertions(+) create mode 100644 Other/SerchimoMarvin_2/__pycache__/feature7.cpython-312.pyc create mode 100644 Other/SerchimoMarvin_2/__pycache__/stringCalculator.cpython-312.pyc create mode 100644 Other/SerchimoMarvin_2/my_calculator.py create mode 100644 Other/SerchimoMarvin_2/stringCalculator.py create mode 100644 Other/SerchimoMarvin_2/your_calculator.py diff --git a/Other/SerchimoMarvin_2/__pycache__/feature7.cpython-312.pyc b/Other/SerchimoMarvin_2/__pycache__/feature7.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea83a5be0e909a6cffbfa593c6fd9bece8c0ed38 GIT binary patch literal 8641 zcmd^ETWl2989uWYdw0EyuYhf^84Lo}_w|*m!NC|CNWhTThGI;n>z(8EnB7_D%q+&! zwMrwZI%=vAwF*W_1(hlliYig%p*-Y)h)S*0s#<4l*`4r^s(Faj7Y8Gy^-KGo*_rii z*MKV34;{<@oO9+sx9|Mdvww2A90;CL=R)8wc?kWTR*c807Z$HU;U?k{&je9l;?49i zCUhL}rt63|-!~;V`%GG!1=_5b8P3rAuXx=z>zo#B<ufiHK#1g-5b!!zFzLnn`kO&x z%oyX&oTv3Jzuv07EP7>eClqcXjQSWJ^_h4En|Twq3|e^ebxWUh%;L7HIo&c5#6Y_* z=#K<_a+s)@Vk9(xiKJ!_EJujw*SDb!Y6nUeyQo0xO%!D$SOjn4%>mQ6Das5p8rLeq zTkh+v<om#(Z*?ULK&5kxo1+YGjhc(mxFyO&&3uLej68xm6SbrqJ=5q*%7Mc;oE5|K zwj@W9oN0U*wi%`6chtgX@b+S4@Q+)?t<USR%o{ZgXDyFql%iIHgF(Dw*k!aYzoRCD zV?1NUY+IH&j8Zfs${0d5o*6*nwrJ)tbm<^M<Myb1IM?7?ejCEVXI*YaNMhdGF6SFx zqxR&yj;MoYF2jie$APFV<vtt+H-p~uT2RzRD&(!kSiF;WrP`ak-QbW5jZ)NR?7<lE zBlPnm2JbNP4ug~5avjkf8oMy~yOBG)i%_v#Vk(yyhhnO!nWxoxDn?7p#U<v_{J-H@ zVxlTi%DQmCCkt0Ft4lWPBTx>@tS=Z0k7C}-DyB--zfyLo3f05^;#DB8BZkU4x>N^9 zGpVKASR;>;NGBy7PE8*hP%hR`-Y2K{`XO_Z0dyNIXw38*^C;sslN^{{_!@Y-+$Pm3 zfv%3IW<ivpW~#1L8BwD9X4xgt@9poEKyCX^z+U~ByC4L4fe4}gV_3Q@he!Hr>$sj{ z$GA305&~ifi?YPk*7f)FtZc%xvA+L|JcLPqHzxieArwCCBUc2GtLq=cJ}?Nlxq4)5 z$$lt+MSOLHv?}}8nviNA&sQG`hW);v)LNZntbvtE6+pg5|Gb7i&+DD^J=p!b{lDG+ ziTfe>q~`bjKkj}!7(3hZSo~T2jkj+$P386eOQII=okB13(H1ZB>l`oR-l94r*+*n) zRFH>Mt040Ds%pa`pJ*@<tY%=z?;C-)Z)5~MsFvZdAOd<LK|v;9&Jm$XpgPX^f)U(7 z2pBzc$OpgzzCa=&cb00AaBz@NbD}zU927!=Ol@L*vdqEATw?az<wgnnWg#r8_GFXl z(&ptxd@_t6s#ysk<br}Et9DTrO-VIFyK22cmn3DuwCwUjw$Wvn0ac|S71nf>Qagy) zHT1XaZFBhr3l6lsc(UQf#R<n;R^Dt@$y8R!BtM<CXRgfstEyjAJ+Q>f8e`5~bL{@R zOsxEHjBSlMOXjwf#7aF6+NMeyW2H^8ZOs$M7cx-J?%C{$sqBio?bF${vBu8X#xqlm zXJTi&ryF~o>@2-~^47`NzUGI_!?M`E!||Q1AK1T2w#IiJykY;+xoy^2GUY6p6sDaA zV8o)Gw{5p<cZ%bMl@qQf+X`<EeK0gRem4-`)-;i|;6z)uPuS=3OP?Z(y>g;`E<5l2 zv3JLQ{JqJ6csBc_aK~i(N46W*x%|RO&re^OD=3*Q*gI9Q_fGFjLB)a{x_q+*Ik!H^ z+Zo%{_Gs@P+@HDs+&+D_JJ$PF{1g{I`rTNYFIF-T&-2He{%5egd=RrcEz^0u@$BB1 zt#=Wy1ZB%mZ5${1LYU)J2gilNd?ZNAPL6v!;tM9ekTT%aWQkNm=^i3f#I@5R)PQJ& z79?u?uA>E0x%C_~S-*hj`%e8c?VadE+5GUId<<)}I1EiIop>KO@$0CMI&suz<sq!- z%iyg*Gx-dlHa-)mowosX@OGeCyaT9{&jRY=oj|wnE}+@ezV_wt*+6so9H4n)x$Zo* zpa)CxS~*k7X)7y5Ko8i#Fk!(&uxpuEf6ymM)vGKiwNKR6EmE*<BH7qi(yB)hmu!Q8 z#-w;e9Kq~K5!75%SRPC3=8@Pdu!3RC;}A=i1;$asT6KWQ(c_qV4A~1aN_1>Cp+Qy& z%e^B?ajN}QYu}n^4{CC*p|6U|<HeN|mY-y62efKWRN=He^+ADphE$OWw9>t=c~V9w z%l^S+_(llt%x;UazcXQTS&x@Jg)zZI2ZNQu!5~}9ViLduSkxSa<`TQ^nbj;f1x(}) zDyjq=KhorrK%lS+k5U=1<8Ww19^=6DK^Vv-LOzL8FbOO5DS_I!lb6o18^|^ErOi2O zE1a?wP8QtWb!*pbQRP%o<=r>qMYRuh&)6C^5!Of*EU-fmSuBVO4vK*4dB7`ysS+WN zKlNV@U=3Jy6cZkcD&ry4DtD0<pzDxiHBcl#5Uhl5;0-7>ldd$T$8v*ituWb!Xm-bo zJP$lGw#H3FQz`2k#RA*s8wz4k!;rorp^!i^P2i`PJ(YFyRA<s4xI;rw9u4d8NxCR< zFpyH49=y~&jy?~!-gr^{gEwYu&6|na9z(h7yzFT_1j>z*C??>;qGAW&D(fp7DjVms z)5BM!!3Pln7m5UBVI(Prl2V->yj1+1&x7t_yy%sObu+fsO@uB&!$<?YdN13D1&}?+ zTdC@TV}ihw?IBnM?G~UeDprr9&QU*4bMG_)m@tMEk%azA91Soz5swB15lb5x!?c}V zdmfe-;zi95b7yQV>#?Lu)qKnx6w>(^Iq6}H45N`|C}^056KkH~WbV8CflqoK$WBf4 zZ`uFAC^Xw&^T^Z+YR~smUr*@1eEIqVJeg?^@_^?VH8JP{<Wi91)Lb=RK#<{Blp5n0 z8@y~XQCn?GIx$!lLM_Q49A#z|)rhM4F6BUyUq7<-i5>8=RrU8WRcFE_zUdPrED;uV zu);AOqE#B7sCInSk4I<-f6t`F4=RK86e|%!EGwE3x*PKHJVjf}-v#qY-9W%ox^ib- zrBklbkCnKqd;u}`io3o!XU_X)-aRwx+%@Igb;myKEdSOFACg}6<NV1tZeP3w>gbMD z^v>AMeQSl!TIZ!jdP*PeY-7!zvDP+s<|aii6~@^%dfB6(pE86MJRTH8>KP!eTcx7* znwl1er=_l?o}7Tyr%}^=Nkg|vP5lu`4u`m8)}^#;Z1pzm+ym1uZWP1x$BVoV+cwt( zDy=U8E(_@^>w{F8K*ZcV78(c#6~KFsqhU|uo+i?f9`EKC!<*xU!9f^ZlsPFe{Hg!q z0M?E69a!LoagcT*M`vuWt~aFrvtT{)5LW3h()QQGp#fdciI$|WgO5KY-sJZ|J+N<N zBO=clwYuc@4l)Y292f#9f$%IZVD@sD5PTWZuQr|+sEL9s2m&qaACg!;0(UhuoMj;y zSf^*;9;p{(16Za`QHEl|!d54zQ?hGnybh1I&Rg$o@HTpz=IP~L8YQgIgkr7EB^>6u z_~S@=L3ptd`sv~C1#%6+?SS32KB<URy&5k%@~CXa*0G7_uefxLY|_#J#o?*+)YfX@ z+eQ|xY@LP$2*?H|oIK<cIT)f=X-<#f%HU&NM;=fk)SPW5ES-j-s@Ft4fzFDMEdr8D z12#=IF{#vLvz6|gg}cfy0e1n8-$i3M+DM5<_y<HsY2>qE9i*#bISwo#rwxob-$3{Z zPJn#!#Xx?6p@yi$(s&|G60FPX-Wl8R%{-Xu^*(u(O9opK6!3r$V1qs}z$&>lH5bdv z%P%=RK<nUtLr-0o`ViLXd@v064iLQu<RRtwOB}&Q0|lRZ0B!N2qmRIacW&YVL@vTI zJ3F*Xb+$=Uj%LktqzIPSW5y*kd+PBo#Q@gW709{S$DhK_b*!c>ny)ZaMpg<|9vD>` zdTxX!#~Uh+j;wYt$%rap-Ge^3Z!&H;5-P+i8z|084mI-Jb2}C<>Ui|_jP2z5bNfHZ zm?CddsnMf{hJ@6l3a`lukuek*<V2UA3f9O+baSh0UnwkAntFq{R5iR<o>d2VRs(q* zmPWM1h9;)0e(zeVS%M8j!B|Q%mFh@u2VP<rnMxD&eyK97!;oRQa^L6P<z`*%l#7k+ zZkcu+qAAwljZ>_{G{ri+MBadbyWIJt7T&}|3H&^W)J%@!!+wq<uh6E$lpLX?of3Mv zLQYb0mJ*u%k#m$>poE$Oa)}a-5+5agO6n<D{%xU=Rw<$F(s>})(O)eMPc0^E)l-|v z+DJ(gB?l>am6AhGZ5Hc!=BZP!A7P%_GOV4<(;U6w1T>he$2IyIv#4<==A<*xpF=`E z_!W?IXA=4Yt!j&i0{o%{_r?~jN>8la2iMNp>L@6xh4xsp_$Aw+#E&VhL;xOoTOd(D z7R(I8e1Ys=pzLog70fy28${`|x0nuwInPWUoZV45wWIPG(y9yROvvJ#P(C*o%~^7< Uo%qq|ADsT-nFTYl6l-h#53EBK3IG5A literal 0 HcmV?d00001 diff --git a/Other/SerchimoMarvin_2/__pycache__/stringCalculator.cpython-312.pyc b/Other/SerchimoMarvin_2/__pycache__/stringCalculator.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..481f23d725110b6364206a29d305bd4d7b6eaeed GIT binary patch literal 6651 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 b{+V$uu~qla|KQ?xFMj{h3Pad>U6}s@Pgj97 literal 0 HcmV?d00001 diff --git a/Other/SerchimoMarvin_2/my_calculator.py b/Other/SerchimoMarvin_2/my_calculator.py new file mode 100644 index 0000000..c086b23 --- /dev/null +++ b/Other/SerchimoMarvin_2/my_calculator.py @@ -0,0 +1,58 @@ +#Implementierung von SerchimoMarvin auf meinen Testfälle: StringCalculator +import unittest + +from feature7 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/SerchimoMarvin_2/stringCalculator.py b/Other/SerchimoMarvin_2/stringCalculator.py new file mode 100644 index 0000000..bd21dc8 --- /dev/null +++ b/Other/SerchimoMarvin_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/SerchimoMarvin_2/your_calculator.py b/Other/SerchimoMarvin_2/your_calculator.py new file mode 100644 index 0000000..7fcb668 --- /dev/null +++ b/Other/SerchimoMarvin_2/your_calculator.py @@ -0,0 +1,87 @@ +#Meine Implementierungen auf Testfälle anderer Studierenden testen: StringCalculator + +import re +import unittest +from stringCalculator import StringCalculator + + +class TestStringCalculator(unittest.TestCase): + """Test suite for the StringCalculator class.""" + + def setUp(self): + """neue Instanz des StringCalculators vor jedem Test""" + self.calculator = StringCalculator() + + def test_implements_interface(self): + self.assertIsInstance(self.calculator, StringCalculator) + + def test_empty_string_returns_zero(self): + """Feature 1: Leerer String soll 0 ergeben""" + self.assertEqual(self.calculator.add(""), 0) + + def test_single_number_returns_value(self): + """Ein einzelner Wert soll zurückgegeben werden""" + self.assertEqual(self.calculator.add("1"), 1) + + def test_two_numbers_return_sum(self): + """Zwei Zahlen sollen summiert werden""" + self.assertEqual(self.calculator.add("1,2"), 3) + + def test_add_multiple_numbers(self): + """Feature 2: Mehrere Zahlen summieren""" + self.assertEqual(self.calculator.add("1,2,3,4,5"), 15) + + def test_add_numbers_with_newlines(self): + """Feature 3: Zeilenumbrüche als Trennzeichen""" + self.assertEqual(self.calculator.add("1\n2\n3"), 6) + + def test_add_negative_numbers(self): + """Feature 4: Negative Zahlen sollen Fehler werfen""" + with self.assertRaises(ValueError) as e: + self.calculator.add("-1,2,-3") + self.assertEqual(str(e.exception), "Negative numbers are not allowed: -1, -3") + + def test_add_numbers_with_custom_delimiter(self): + """Feature 5: Benutzerdefiniertes Trennzeichen""" + self.assertEqual(self.calculator.add("//;\n1;2;3"), 6) + + def test_add_numbers_with_custom_delimiter_different_symbol(self): + """Feature 5: Benutzerdefiniertes Trennzeichen mit anderem Symbol""" + self.assertEqual(self.calculator.add("//#\n4#5#6"), 15) + + def test_custom_delimiter_with_multiple_numbers(self): + """ + Kombinierter Test für: + feature 5 und feature 2 + Erwartet wird die korrekte Addition von sechs durch ein benutzerdefiniertes Zeichen getrennten Zahlen. + """ + self.assertEqual(self.calculator.add("//:\n1:2:3:4:5:6"), 21) + + def test_add_numbers_greater_than_1000(self): + """Feature6 test""" + self.assertEqual(self.calculator.add("1,1001,2,3"), 6) + + def test_add_numbers_with_newlines_and_ignore_above_1000(self): + """Feature 3 und 6 test Zeilenumbruch als trenner, Zahlen>1000 ignorieren""" + self.assertEqual(self.calculator.add("1\n2\n1000\n1001"), 1003) + + def test_add_numbers_with_custom_delimiter_long_length(self): + """Benutzerdefinierte Trennzeichen beliebig lang """ + self.assertEqual(self.calculator.add("//[***]\n1***2***3"), 6) + + def test_custom_long_delimiter_with_large_number_ignored(self): + """FEature 6 und 7 test Benutzerdefinierte Delimiter Länge und zahl über 1000 wird ignoriert""" + self.assertEqual(self.calculator.add("//[***]\n1***1001***2"), 3) + + def test_custom_long_delimiter_with_negative_numbers(self): + """Feature 4 und 7: Benutzerdefinierter Delimiter beliebiger Länge + negative Zahlen""" + with self.assertRaises(ValueError) as e: + self.calculator.add("//[***]\n1***-2***3***-4") + self.assertEqual(str(e.exception), "Negative numbers are not allowed: -2, -4") + + + + + +if __name__ == '__main__': + unittest.main() -- GitLab