From 92b07da49175a00d4650d93b5223c4130b95bc71 Mon Sep 17 00:00:00 2001 From: Giuseppe Superbo Date: Sun, 30 Sep 2018 10:35:56 +0300 Subject: [PATCH] Assignment finished --- bin/StringCalculator.class | Bin 405 -> 2470 bytes bin/StringCalculatorException.class | Bin 303 -> 557 bytes bin/StringCalculatorTest.class | Bin 505 -> 4901 bytes src/StringCalculator.java | 112 ++++++++++++++++- src/StringCalculatorException.java | 4 + tests/StringCalculatorTest.java | 182 +++++++++++++++++++++++++++- 6 files changed, 291 insertions(+), 7 deletions(-) diff --git a/bin/StringCalculator.class b/bin/StringCalculator.class index a937b0c43633d36f133837cd90ddd10fb14ac782..f9fbf38cd77486b23b306ab8e9bb3bbbf4645ce6 100644 GIT binary patch literal 2470 zcmZ`)TW=Fb7(HX}W^HFf;*dDx3MNfSoP;!7O9CzsNJ)u9$W_oAi?ak1XBVw)K<#6B ztW;H%DmALqKGhOMNc15oMQY#sWBO3_sRGh7vx{vYwY0bSzWL^y^PL(0`Qo?V0UW`y zfsjDce9_A}s}oi}TgqES*E67T^pd2+*x9n_DpzdVO$raNA;r@Xo0d2xv zv114$YC=byK;v}Iv1dx_*KKdXx}LWMny1~Ym0z;Focs<3wc^cOLB?KRcbt{2l@)>3 z{^{!Ke%AQFltAqKy{vt^m~)+ifo6gB*DF-wF$lDnXhkDuW!;ifl-M|{jk8qkQZbhw z@#inNYqpd7%=RK^7Z9-+66lnix&#jF0A&YoOL9(+iM`k-5OwT(MOBm_`Ul=jm+1DJ z=#}W26*`q&n6*6#Q-=FYyp01A{7pN%b}qM?V*?U9fSDSYieUhQ22uj?s%%qE(O$JZ z6GL*9$Zg9j*c^)?j;LH<#Kb!?(oiU^FWhzgwiRULkcq=G5@%%5S##XGP9+-0Q4_~- zoWN#jn&NrSb3J7U*&avrzCcxFd#hN27SchUT`1+rL@>Qxa-ER9v6-*QFM&>f+D_e} zJ?bY)o@e{bWD%ABzaC(I!+g=ou4Sy-%6bOQz2a+srtI9LiT81V`8TaX#`SE!9g5dg zflxsr&P6cI$B=;;fxT67zBZGtw{8_H{-X)}8jO`TNv=uolq8Yd^2k_d_USg?XItmi8ldb+zliqW{{dGG?A4eq{^8e=y22 zGTPXsDjt;Kk(#i-&MP^iGN=A!&i(Lq_r`X51sfN-S`6g@C|kUfqS`(19-ss zkGLCuK?-D{q`jbe@Fb9y^5I>aP)N2ghH1|2%+7O={WcKSxe8A}-lYqEW>t;P;cDA5 z;q=fZ&VPqJlXi@+PjEA!i zPs9mNCxJOF-6dVWpO*-(_#l0~EN|cAu*7_@%0cd#Cbef&SP!S=2c`e33}Z|SOYx;& zr!b97(1bDi61d3G3>$EXZk(lvm$~K~`mlgeEb?!CiOyLj^F_|RiWz*!tdAAvwA#RP z70z=3XQF2{>BSIpXH`>1sg`V%#tI=i@G{?Iqmrn5h8EHE47(_XxlLbaf$Nm*GGW5z zUyCmfWcTE$(N|@jkv=2oW7^9Xy;W<~ulaWK52u9E)FSFEnXYiJ*|fxs8Ww#O7JZe@ zbp)O3CE_{7qJ=wno^Ki}M5xd>>k9e*7Qp+85xFaRYv9R7HFO8quBk1uvHf?Ay*d=5 vTLiO4d*x}bb?$>arEwKN-}}84fV~xfzNFIoi2$IKv}&y=VJ&hbgr)xgf$qh_ delta 110 zcmZ1`Je8U2)W2Q(7#J8#7(^y=ZI~R%q&RsCvmPVU}(DdYF5M&T$XAoj!5Xed_ zOVrOv%uCk~t}HG|&E;VbVGsqX$}cTpWDxZMOK0ZmgG~r7DN0SuwdPmKgv7QnNHDJf@|YO7 iKw?0efq{jAgMpQS8_42;s07lyKprE59FSyUkOu%bUq284 delta 34 qcmZ3>vYv_S)W2Q(7#J8#7z8GAEuWmpXvWAmc>$vnD+2=)13v)7WeD^D diff --git a/bin/StringCalculatorTest.class b/bin/StringCalculatorTest.class index d44b83f48579a95c814a0008fdfcca590443d2de..08011ec239ab2aa2613731674c7dae7582e76293 100644 GIT binary patch literal 4901 zcmbW5=~ok17{;F=i3wql5Rt{Db!$rm#RO`#xPTB88<4VDx5govg99PKWTJKHV%65Q zTH9*%oGu^Q`lZXUJqK+)r~TePs;AGL$tDaq2q$D_?tP!%bKiUKd*|@)e}DZApbhuj zD3ee#q^Gsyc$bohWfO{?N)M|U-3_M%--L2XX-O!_@sYi zT1FX5sBsC>VF{icv4ob?^j#7hje$`K&aPBk^`ZimZpadRh?Z3Qvr}VgdRSm3_#>&9k{DIenz+wBtYmy_vQL@L z-7nc;nDWAbIvLC1p)vi0MnG-EYT)e>R>e};q&}RQRFjzjH7&T&Em0HAxQ0QtYE$Z{ zmeI)VOeRybEE2+uMN;YUmWeF$&?3^W=4#x(U(AXl6AOye&9=mGJ9Rqd zWcEr}IoC-vm`i~NA$Fq3I*U%Be4e61(@ISB;B_K{%^?>TocQ5-vkGgQ9rmUKH^Z7+ zo7?iCT##mh#Drv`p{Vig!EQnDhD0JeW$Y1&^cv2LcFuG0CK{fa*3Xzj=gKN+2pVc0 z^l)e#o*X-&#wNS9aZQf~g>tWq{dh|#7aFK+F*Usbrmr+y@t~igif~_ujRuDXI=jLo z&3(v#K_h9iLKGt;=)nkEm1Z%EC4y!vW8X1a8C#vnP7R+<<<>2y&q&b`8AnBmDxYc1 z=hz{kjtwKp$zH#%f#+-r&$JD2;l<@5R(Efdb%jtHI|uWfE9iA@XETa1A4#Yv#CQu)taeL9R4^~k|Jy+U~CQM5!h%}x5Hky$TsL#b>!ruJx}zRsB? zQPDOFG}f{(JGh-CU%jZ#yjlSd-25<$yxYNV@l)-WX5f7QxAP&Kjz8dg#D@;}`FDxY z#f4?OF5{<$9~a8x4%!!Wntz2-3%`YyYvW_ois-UA(X!bA^=M$bWLPP~N?r@bDt-&0 z<8T_5YoB8Ep~rYR(&S$=gLOO0S6zOBSBuJi_7i2f5pJgzaLa}*CxuV!qb zeietknKsLKy@gS>$U#B&T9T`&;iu{{l51>}TP?|BxiQxl$J{2!HP~v&uBS=^*(*@T z{E3+{M_peSwXZPh^1`UM*=27x+3l9>HB?zk_ByiH+h*^y%icAEj(Nx3NRfTd%W@d1kwX8e2#Xa<)SyaqIbX{T4Rk>y6E7@ETyXZaxZN0C<6zL&)FVXvKqYv0c zx4GsYwea6ZbU)DtY@-M4qTe>q)}tP#$OzG+L?5(`9bQ4XA7&3E!7)9jp|JjEvG+2UuZc8(s-v%0)r;$h*smVAx}i&;ns5A&U8 z7pV6!U0h@)E|s`gcot4B-bLDUVLcyLsCShvuF=JH+b;CQyU3a@PFt>uThzNv7oXF` z9osI>EZ)Ug)5Up97k8<5k1oEZi~F`+e6V;IADS*MSi1Ozdf(E;cXaW+Z5J08@8Z%z z>*5FM{YV!-(ZxgCEg6qVdAPfudG1msp|t v%h|^&Ujl1P9jq@~EqVnSGO2E4d*cnAf0AMsXp*H!3;uAD*k2r1tnB^(EDJ5m diff --git a/src/StringCalculator.java b/src/StringCalculator.java index 487916b..59f5912 100644 --- a/src/StringCalculator.java +++ b/src/StringCalculator.java @@ -1,9 +1,113 @@ +import java.util.StringTokenizer; + public class StringCalculator { - public int add(String numbersStr) { - // Returns the sum of the numbers given in numbersStr + + public int add(String numbersStr) throws StringCalculatorException { + int result= 0; + try { + int LineCounter = countLines(numbersStr); + StringTokenizer Line = new StringTokenizer(numbersStr, "\n"); + while(LineCounter != 0) + { + String CurrentLine = Line.nextToken(); + switch(countTokensPerLine(CurrentLine)) { + case(0): + result = result + 0; + break; + case(1): + if(checkDigit(CurrentLine,1) == 1) + result = result + Integer.parseInt(CurrentLine); + else + throw new StringCalculatorException(); + break; + case(2): + if(checkDigit(CurrentLine,2) == 1) { + result = result + sumTwoNumbers(CurrentLine); + } + else + throw new StringCalculatorException(); + break; + default: + if(checkDigit(CurrentLine,countTokensPerLine(CurrentLine))==1) + result = result + sumUnknownNumbers(CurrentLine); + else + throw new StringCalculatorException(); + break; + } + + LineCounter--; + } + }catch(StringCalculatorException e) { + e.PrintError(); + } - // not yet implemented - return 0; + return result; + } + + public int countLines(String numbersStr) { + StringTokenizer st = new StringTokenizer(numbersStr, "\n"); + int i=0; + if(st.hasMoreTokens()) + { + while(st.hasMoreTokens()) { + i++; + st.nextToken(); + } + } + else + i = 1; + return i; + } + + public int countTokensPerLine(String numbersStr) { + StringTokenizer st = new StringTokenizer(numbersStr, ","); + int i=0; + while(st.hasMoreTokens()) { + i++; + st.nextToken(); + } + return i; + } + + //If the tokens are all digits then the method will return 1 otherwise 0 + public int checkDigit(String numbersStr, int TokensNum) { + int flag = 1; //Default value + try { + switch(TokensNum) { + case(1): + Integer.parseInt(numbersStr); + if(Integer.parseInt(numbersStr) < 0) + flag = 0; + break; + default: + StringTokenizer st = new StringTokenizer(numbersStr, ","); + while(st.hasMoreTokens()) { + if(Integer.parseInt(st.nextToken()) < 0) + flag = 0; + } + } + }catch(NumberFormatException e) { + flag = 0; + } + return flag; + } + + public int sumTwoNumbers(String numbersStr) { + StringTokenizer st = new StringTokenizer(numbersStr, ","); + int sum; + int value1 = Integer.parseInt(st.nextToken()); + int value2 = Integer.parseInt(st.nextToken()); + sum = value1 + value2; + return sum; + } + + public int sumUnknownNumbers(String numbersStr) { + StringTokenizer st = new StringTokenizer(numbersStr, ","); + int sum = 0; + while(st.hasMoreTokens()) { + sum = sum + Integer.parseInt(st.nextToken()); + } + return sum; } } diff --git a/src/StringCalculatorException.java b/src/StringCalculatorException.java index da71147..f27d719 100644 --- a/src/StringCalculatorException.java +++ b/src/StringCalculatorException.java @@ -1,4 +1,8 @@ public class StringCalculatorException extends Exception { + public int PrintError() { + System.out.println("Error: Wrong format input!!!"); + return 0; + } } diff --git a/tests/StringCalculatorTest.java b/tests/StringCalculatorTest.java index 4ec9afe..9b598fd 100644 --- a/tests/StringCalculatorTest.java +++ b/tests/StringCalculatorTest.java @@ -3,10 +3,186 @@ import org.junit.Test; public class StringCalculatorTest { - + + //Tests for countTokens method + @Test + public void countTokensPerLine_0_Numbers() { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.countTokensPerLine(""); + assertEquals(0, test); + } + + @Test + public void countTokensPerLine_1_Number() { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.countTokensPerLine("1"); + assertEquals(1, test); + } + + @Test + public void countTokensPerLine_2_Numbers_Space() { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.countTokensPerLine("1,2"); + assertEquals(2, test); + } + + + @Test + public void countTokensPerLine_4_Numbers_Space() { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.countTokensPerLine("1,2,3,4"); + assertEquals(4, test); + } + + //Tests for countLines + @Test + public void countLines_2_Lines() { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.countLines("1\n2"); + assertEquals(2, test); + } + + @Test + public void countLines_EmptyString() { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.countLines(""); + assertEquals(1, test); + } + + @Test + public void countLines_1_Line() { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.countLines("2"); + assertEquals(1, test); + } + + //Tests for checkDigit method + @Test + public void checkDigit_1() { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.checkDigit("1", 1); + assertEquals(1, test); + } + + @Test + public void checkDigit_a() { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.checkDigit("a", 1); + assertEquals(0, test); + } + + @Test + public void checkDigit_1SPACE2() { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.checkDigit("1,2", 2); + assertEquals(1, test); + } + + @Test - public void test() { - fail("Not yet implemented"); + public void checkDigit_1SPACEa() { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.checkDigit("1,a", 2); + assertEquals(0, test); + } + + @Test + public void checkDigit_aSPACE1() { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.checkDigit("a,1", 2); + assertEquals(0, test); + } + + @Test + public void checkDigit_aSPACEa() { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.checkDigit("a,a", 2); + assertEquals(0, test); + } + + //Test for sumTwoNumbers method + @Test + public void sumTwoNumbers_1_2() { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.sumTwoNumbers("1,2"); + assertEquals(3, test); + } + + //Test for sumUnknownNumbers method + @Test + public void sumUnknownNumbers_1_2_3() { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.sumUnknownNumbers("1,2,3"); + assertEquals(6, test); + } + + //Test for add method + @Test + public void add_1() throws StringCalculatorException { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.add("1"); + assertEquals(1, test); + } + + @Test + public void add_1_1() throws StringCalculatorException { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.add("1,1"); + assertEquals(2, test); + } + + @Test + public void add_2_2_2() throws StringCalculatorException { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.add("2,2,2"); + assertEquals(6, test); + } + + @Test + public void add_2_2_HEAD_2_2() throws StringCalculatorException { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.add("2,2\n2,2"); + assertEquals(8, test); } + @Test + public void add_2_2_4_HEAD_2_1() throws StringCalculatorException { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.add("2,2,4\n2,1"); + assertEquals(11, test); + } + + @Test + public void add_2_2_4_HEAD_2_1_HEAD_1() throws StringCalculatorException { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.add("2,2,4\n2,1\n1"); + assertEquals(12, test); + } + + @Test + public void add_1_HEAD_2_3() throws StringCalculatorException { + StringCalculator sc1 = new StringCalculator(); + int test = sc1.add("1\n2,3"); + assertEquals(6, test); + } + + @Test + public void add_NEGATIVE_NUMBER() throws StringCalculatorException { + try { + StringCalculator sc1 = new StringCalculator(); + sc1.add("-1,2,3"); + }catch(StringCalculatorException e) { + assert(e.PrintError() == 0); + } + } + + @Test + public void add_Failure() throws StringCalculatorException { + try { + StringCalculator sc1 = new StringCalculator(); + sc1.add("1,\n"); + }catch(StringCalculatorException e) { + assert(e.PrintError() == 0); + } + } }