From ecc1640e2c4ca0214d6e49e7984e54bcae59c80c Mon Sep 17 00:00:00 2001
From: linopino <lasse.pikkemaat@web.de>
Date: Wed, 26 Mar 2025 20:32:47 +0100
Subject: [PATCH] StringCalculatorTestListBasic

+ Verbesserungen alter Code
---
 src/__pycache__/interfaces.cpython-310.pyc    | Bin 505 -> 530 bytes
 src/__pycache__/romannumerals.cpython-310.pyc | Bin 894 -> 917 bytes
 src/interfaces.py                             |   4 +-
 src/romannumerals.py                          |  15 ++-
 src/stringcalculator.py                       |   0
 .../test_romannumerals.cpython-310.pyc        | Bin 2632 -> 2458 bytes
 tests/test_romannumerals.py                   |  90 ++++++++----------
 tests/test_stringcalculator.py                |   5 +
 8 files changed, 55 insertions(+), 59 deletions(-)
 create mode 100644 src/stringcalculator.py
 create mode 100644 tests/test_stringcalculator.py

diff --git a/src/__pycache__/interfaces.cpython-310.pyc b/src/__pycache__/interfaces.cpython-310.pyc
index 95e7981751754055c5e10944cc00468b50941e10..9c2c27ce8dbc3a9cbbc432aef7c2022428ab19de 100644
GIT binary patch
delta 244
zcmey#Jc)%jpO=@50SF!iJW21I$XnvY3gkEdaj_DRNM(p(Oks#(N@Y%AOl3)7N@Y!B
zNnuW5X<=z*jABb+4Q9|}yT#)fl%JcJ=U1AWlv;F)G4B>zQEEwPQQpKI`aDG-<BHh9
z#Kg~*I_$~$d1a|ZB`hEtn1BQeQ<Vs^em$rHKTY<@F^rmKx0o~YN^UV1mlPF&+zB-b
m&f)~IK!z~`aWNZ^;9y{4l$gAcQBDA2D@XyD#X0#tqZ9zz1~<Y0

delta 242
zcmbQl@{^f2pO=@50SGFu-c4_s$XjC04CFWfaj^uDNM(p(Oks#(N@Y%AOkrwaXl9IJ
zNns9V&}6yA=NXiro0#WUnwwgbm{UCQv_8)*=DgC}B37WjBG$=ljFtu*CHe71AXO|N
z1DSvX3saRiszyDS8b3|e$=QsWIz^md15gPL5Eo<$$a%$VK!SsTiIH#eDMmRhh=m{p
bU=~Q}Ee@O9{FKt1R69nHdXPo|1`#Fz4%jl`

diff --git a/src/__pycache__/romannumerals.cpython-310.pyc b/src/__pycache__/romannumerals.cpython-310.pyc
index f6197cf9b2af49383222064fa3d7a160c943eea6..24f836671a9a8436497583973509848b92b6dc91 100644
GIT binary patch
delta 271
zcmeyzHkF+>pO=@50SHtBpQPWK$m`9=;~A8no0#WUnwykblsr*T(nby_oyri!n8Fan
zl){+GoWhjKlE#w4oWjz=62+Rr8qA={c8eQH*Dc1pTWm$CC8b4q8&~x+vKFxbO_*%Q
zq`;^$IiAUelRY^<uPn8wgk|zlCS`G9B%OLt89z<7$&Z*+Z9!JwVlFNzDpCWoid0Yu
xRS=gMNPuuL$Px|)F-EY6pC<FI$yUr#T3EE);;_lhPbtkwwPS?o<6#hC0sy-vKM4Q;

delta 249
zcmbQr{*R3}pO=@50SGFu-c5fzk=Hwj&od}LH!;tzG&i*<F{d~gB#8`|fE))PE*1e2
zsSHt!DGX6eDU2yhEeui2Da^qPnk=_?QH<EQyPuIYiaD<|cd|c|0;AI80wx<Sj*|TN
zB9KL_leaP{ONpWA(1S_(X|hay&!lRs0<^1036)R=ahZVx3lJBB2o44wMzDyVCUex}
QKxQccbS;ysnI##S0e)yVC;$Ke

diff --git a/src/interfaces.py b/src/interfaces.py
index fc64573..bc8c8c3 100644
--- a/src/interfaces.py
+++ b/src/interfaces.py
@@ -1,6 +1,6 @@
 from abc import ABC, abstractmethod
 
-class IRomanNumerals(ABC):
+class IRomanNumber(ABC):
     @abstractmethod
-    def to_roman(self, num):
+    def convert(self, n: int) -> str:
         pass
\ No newline at end of file
diff --git a/src/romannumerals.py b/src/romannumerals.py
index 3f3eaf1..2507532 100644
--- a/src/romannumerals.py
+++ b/src/romannumerals.py
@@ -1,11 +1,10 @@
-from src.interfaces import IRomanNumerals
+from src.interfaces import IRomanNumber
 
-
-class RomanNumerals(IRomanNumerals):
-    def to_roman(self, num):
-        if not isinstance(num, int):
+class RomanNumber(IRomanNumber):
+    def convert(self, n: int) -> str:
+        if not isinstance(n, int):
             raise ValueError("Eingabe muss eine ganze Zahl sein")
-        if num <= 0 or num >= 4000:
+        if n <= 0 or n >= 4000:
             raise ValueError("Zahl muss zwischen 1 und 3999 liegen")
 
         val = [
@@ -17,7 +16,7 @@ class RomanNumerals(IRomanNumerals):
 
         result = ""
         for (value, numeral) in val:
-            while num >= value:
+            while n >= value:
                 result += numeral
-                num -= value
+                n -= value
         return result
\ No newline at end of file
diff --git a/src/stringcalculator.py b/src/stringcalculator.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/__pycache__/test_romannumerals.cpython-310.pyc b/tests/__pycache__/test_romannumerals.cpython-310.pyc
index e14f2572a91805d1b33f9c03c0890bd6a036010c..2ef85d1aa0aaa5d708fc349e4ed24856b6f600f4 100644
GIT binary patch
delta 985
zcmaKryKfUQ9LMc@Bu;ZpOCC~r43H9$@Tfq_7!XoH6_rS(1{gAMT+b#txQFmvD%7O|
zh&{595K|dhSUT|^FtKwp3o`=?68wHgTAC`2PyYUF{~n(^+xMmVzEX<j=jRBtxy|o`
zc6n4fx4RBAPB`^RAFbxoK<jH1$GWcvM&F=hjc|jTuL(B=d1k)S`#F*4x#yZ(7G#fo
zAP`M^S#RZkVEJx~rp3)DaKi2|*b)+^*1aQh7lX2PYHT&Ix1q<K(caBkkF-kZ!UGW}
zN0LUr*C|tL^x<Odm`8o0=T%4ly!%m4i%uL1ncRIbbbM(-#We3m;WjME9Lyv;lma@J
z5`fs_2s<8bCDL&dFACe>{b_+z>A|x^cbdn@D--GJiP4}%^~P9zw1}8#z}iHH!?}mF
z4u)4jb{ew?YT2yQSbe4MRM*@XoCqmTKmzZj;CG;STmm`x8np05^;tYSOI26R)2fnt
z>z>FvGr{v6IS_W3oqT*Bxwz^7xInx-i@3j#-=}RnH(5rRwuRLRnip<6zQ=p&7rWNH
zIIFfj4(+xIYNOD2jDLcxpqxdyfKo@fg!2EQWFx#S(g3**J=;h|7-c%cR<LrJFJ-nJ
zI9_PmfcRFZ^L{Co?ur*CLOyj|5lbDiQ-*K3>cBn4g0hKg2IftJrmPc0eCUf?^pJeT
Oq82S{?1n{+KYszrRQN9d

literal 2632
zcmcguPjB2r6rZuZyWWjAX(_an{y|hAx+(;MfCJDf;8bW)yedsuj1|dpc1$$s{t07m
zXrr7+IMYu6$uZx612;Yc7fYNt6pI_-#3lTm-N5c<m%Sjynm2FW%zHEM_ukC7SFKhU
z%EO<2UjO|ZW4};muo&npqDHqs1QWc?JZiNz?`WRJ*@sN%!q{WN2-$|dt9wRR5QY1i
zx)QSe;sN8(S;=axn8F5Y)Ob?8+v^0~M!yrPpdGbHJXkbz7Ez-mkdS#?Fi#U)XnV}l
z^W{846hsmIf+z_SZBdj(1#L;p2n($#s$v#xS<J1l+L`3+y)cT0m*ud2Qi!KzZPdsD
ziP<jOVLq0II&ai8MZ-zC)$4ABDh|~lPmCyRe}2eR2_t{rwBK1>iTgtKJF9n8@IXeJ
zs<#o|kDZ<fRd*@eT8*)VD5Jh20J={AnBRPu6rwQxWOIR*r-dxOec{xO=d(Gj(R~*%
zpZ0z92xN!tqi*nh0CoV#4iKXOnGTsTA}c^v9FdhEGe=})$SNbU8OW>=SrxKbl4aP<
zHB#De!s{t*G~vyZQZC_c`bO3+ry^@@`3EK@d`bSQQ|lb+$xIMMK>PL={h+NV7ZWq?
z<=`o@mO-BrlSa=G#Qw<?e=Ue)>rD(C&4N75|M{Nf+b^BQcZ~LAw0B@~0NMW)?F`v!
zBPB>Yt=>$_Ipe0+Gsay`y_~V-BcSSO_LAHKtY92<0YhWqyEqI$)L)BL(28ZRdlM>0
zbS{P<yfF>J0Sgm>RF`4424^Vm;Y>ZnK5@|N;EI{3Sx+gtp3x-P)oj#t-Skc-Tn0PY
zrSros1wu&j=QdQ;HIVJ=(|kBlnd|`Na}9Y;N#^M;!hx$a<J|NLafa*G-Sm~5UB-AT
zXYINxf1vOb?Ijm-`Itgfv>g{ClYJV=@{W8E3I`U|C6MWPoz0)<O>_@N{_DKX^0nNM
z6k1Pn>hee2nO?=Q9f}^pDj$=e<TyYIz3=AGD?1J*{5uqvhQr$q)OzUSUR?`S)Py4u
zB~G5RIP$Mfi}jHHDTv6HO-4UL%m|_whyI&cx?nf7eVr~`&OXJpXW-k_IqRAWEIR)s
zr1X7;Iz~$ytF<si3m5sAwU(!78Dq89r)aUUT3?OTn)@3KJS)RHq$B_y-wx_!iBW7Q
z0Ls#16uFPkC;Iyz*z3=K{oBXiUo9`zjKs>{fxCf>!YHXUgLXf>tyE8CkAk`g?Xefy
zGsEd2yIVn9idBl?iy#)C<(H2wZ8E)fy#4aDq<LbsQL7}T?{|Yv==({<_d7k&Zxe6%
zK0RRhh@z`nJxAmPA~hnf5qX`+TSVxGVt`QIDV!WeGomvfCNsIIn`M(q*(zqEw0b9y
zUEi;jJhR`GF?sKujZ|xX=zk;sl`+XLJHY!&rq$aZi9z}UD`y*_<rDM0+?`t#sq7EQ
PykYUDbn{({8^?bEe*s~n

diff --git a/tests/test_romannumerals.py b/tests/test_romannumerals.py
index 5b273e6..abc5266 100644
--- a/tests/test_romannumerals.py
+++ b/tests/test_romannumerals.py
@@ -42,67 +42,59 @@
 # Bei Eingabe der Zahl 3.14 erhalte ich eine Fehlermeldung
 
 import unittest
-from src.romannumerals import RomanNumerals
+from src.romannumerals import RomanNumber
+from src.interfaces import IRomanNumber
 
-
-class TestRomanNumerals(unittest.TestCase):
+class TestRomanNumber(unittest.TestCase):
     def setUp(self):
-        self.converter = RomanNumerals()
-
-    def test_to_roman_basic(self):
-        self.assertEqual(self.converter.to_roman(1), "I")
-        self.assertEqual(self.converter.to_roman(5), "V")
-        self.assertEqual(self.converter.to_roman(10), "X")
-        self.assertEqual(self.converter.to_roman(50), "L")
-        self.assertEqual(self.converter.to_roman(100), "C")
-        self.assertEqual(self.converter.to_roman(500), "D")
-        self.assertEqual(self.converter.to_roman(1000), "M")
+        self.converter: IRomanNumber = RomanNumber()
 
-    def test_to_roman_subtraction(self):
-        self.assertEqual(self.converter.to_roman(4), "IV")
-        self.assertEqual(self.converter.to_roman(9), "IX")
-        self.assertEqual(self.converter.to_roman(40), "XL")
-        self.assertEqual(self.converter.to_roman(90), "XC")
-        self.assertEqual(self.converter.to_roman(400), "CD")
-        self.assertEqual(self.converter.to_roman(900), "CM")
+    def test_convert_subtraction(self):
+        self.assertEqual(self.converter.convert(4), "IV")
+        self.assertEqual(self.converter.convert(9), "IX")
+        self.assertEqual(self.converter.convert(40), "XL")
+        self.assertEqual(self.converter.convert(90), "XC")
+        self.assertEqual(self.converter.convert(400), "CD")
+        self.assertEqual(self.converter.convert(900), "CM")
 
-    def test_to_roman_addition(self):
-        self.assertEqual(self.converter.to_roman(2), "II")
-        self.assertEqual(self.converter.to_roman(3), "III")
-        self.assertEqual(self.converter.to_roman(6), "VI")
-        self.assertEqual(self.converter.to_roman(8), "VIII")
-        self.assertEqual(self.converter.to_roman(30), "XXX")
-        self.assertEqual(self.converter.to_roman(80), "LXXX")
+    def test_convert_addition(self):
+        self.assertEqual(self.converter.convert(2), "II")
+        self.assertEqual(self.converter.convert(3), "III")
+        self.assertEqual(self.converter.convert(6), "VI")
+        self.assertEqual(self.converter.convert(8), "VIII")
+        self.assertEqual(self.converter.convert(30), "XXX")
+        self.assertEqual(self.converter.convert(80), "LXXX")
 
-    def test_to_roman_mixed(self):
-        self.assertEqual(self.converter.to_roman(14), "XIV")
-        self.assertEqual(self.converter.to_roman(19), "XIX")
-        self.assertEqual(self.converter.to_roman(29), "XXIX")
-        self.assertEqual(self.converter.to_roman(44), "XLIV")
-        self.assertEqual(self.converter.to_roman(99), "XCIX")
-        self.assertEqual(self.converter.to_roman(444), "CDXLIV")
-        self.assertEqual(self.converter.to_roman(999), "CMXCIX")
+    def test_convert_mixed(self):
+        self.assertEqual(self.converter.convert(14), "XIV")
+        self.assertEqual(self.converter.convert(19), "XIX")
+        self.assertEqual(self.converter.convert(29), "XXIX")
+        self.assertEqual(self.converter.convert(44), "XLIV")
+        self.assertEqual(self.converter.convert(99), "XCIX")
+        self.assertEqual(self.converter.convert(444), "CDXLIV")
+        self.assertEqual(self.converter.convert(999), "CMXCIX")
 
-    def test_to_roman_large_numbers(self):
-        self.assertEqual(self.converter.to_roman(1001), "MI")
-        self.assertEqual(self.converter.to_roman(1987), "MCMLXXXVII")
-        self.assertEqual(self.converter.to_roman(2023), "MMXXIII")
-        self.assertEqual(self.converter.to_roman(3999), "MMMCMXCIX")
+    def test_convert_large_numbers(self):
+        self.assertEqual(self.converter.convert(1001), "MI")
+        self.assertEqual(self.converter.convert(1987), "MCMLXXXVII")
+        self.assertEqual(self.converter.convert(2023), "MMXXIII")
+        self.assertEqual(self.converter.convert(3999), "MMMCMXCIX")
 
-    def test_to_roman_invalid(self):
+    def test_convert_invalid(self):
         with self.assertRaises(ValueError):
-            self.converter.to_roman(0)
+            self.converter.convert(0)
         with self.assertRaises(ValueError):
-            self.converter.to_roman(-1)
+            self.converter.convert(-1)
         with self.assertRaises(ValueError):
-            self.converter.to_roman(4000)
+            self.converter.convert(4000)
         with self.assertRaises(ValueError):
-            self.converter.to_roman("ABC")
+            self.converter.convert("ABC")
         with self.assertRaises(ValueError):
-            self.converter.to_roman(None)
+            self.converter.convert(None)
         with self.assertRaises(ValueError):
-            self.converter.to_roman(3.14)
-
+            self.converter.convert(3.14)
 
 if __name__ == "__main__":
-    unittest.main()
\ No newline at end of file
+    unittest.main()
+
+#python -m unittest discover -s tests
\ No newline at end of file
diff --git a/tests/test_stringcalculator.py b/tests/test_stringcalculator.py
new file mode 100644
index 0000000..b8e4935
--- /dev/null
+++ b/tests/test_stringcalculator.py
@@ -0,0 +1,5 @@
+# Basis
+# Bei Eingabe keiner Zahl soll eine 0 ausgegeben werden
+# Bei Eingabe einer 1 soll 1 ausgegeben werden
+# Bei Eingabe einer 3,4 soll 7 ausgegeben werden
+# Bei Eingabe einer 10,20 soll 30 ausgegeben werden
\ No newline at end of file
-- 
GitLab