From 9059924f29780b4e86de4b014a302e4354930320 Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Fri, 10 Jan 2025 13:00:37 +0100 Subject: [PATCH 01/17] added modelling and files --- BasketClassDiagram.png | Bin 0 -> 41779 bytes InventoryClassDiagram.png | Bin 0 -> 29454 bytes ItemClassDiagram.png | Bin 0 -> 29160 bytes domain-model.md | 43 ++++++++++++++++++ src/main/java/com/booleanuk/core/Basket.java | 4 ++ .../java/com/booleanuk/core/Inventory.java | 4 ++ src/main/java/com/booleanuk/core/Item.java | 4 ++ .../java/com/booleanuk/core/BasketTest.java | 4 ++ .../com/booleanuk/core/InventoryTest.java | 4 ++ .../java/com/booleanuk/core/ItemTest.java | 4 ++ 10 files changed, 67 insertions(+) create mode 100644 BasketClassDiagram.png create mode 100644 InventoryClassDiagram.png create mode 100644 ItemClassDiagram.png create mode 100644 domain-model.md create mode 100644 src/main/java/com/booleanuk/core/Basket.java create mode 100644 src/main/java/com/booleanuk/core/Inventory.java create mode 100644 src/main/java/com/booleanuk/core/Item.java create mode 100644 src/test/java/com/booleanuk/core/BasketTest.java create mode 100644 src/test/java/com/booleanuk/core/InventoryTest.java create mode 100644 src/test/java/com/booleanuk/core/ItemTest.java diff --git a/BasketClassDiagram.png b/BasketClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..8304ae1f851bfe9a53702c760e18288ba6d69be1 GIT binary patch literal 41779 zcmeFZbx>7b|39iocZx`tG^i-u-5rNM2#B;2(jeVk(%s$C(%szxhc4-c-#*6Y`9Aml z^PAt?xp$tq&kT$s9M)cY?X}+T_bc8zKtWC%4f#3pqeqX>BqcZ>ge;(T?i3>d{86w(#^oZ<{q==x3gYI6k{TFT3#S8aJ?uN>yixhKu@`(``Bv_%i zk{*V%?he{?0>$>LcVx;8WBpfiNH_^{P_xe z1Q&z>gB1Sg&)1C17f&Nr1vc@2eFT@0@5w)(rvkG+Mvfg6m?iqx-zbz_qW&{L_?JOg zS`gb4Bb$HyjX>)v>)#6kKV`#71J9yH4@UgGXgDy5;eY)H>A#csyBPmniT|#|e^1BX zJ@EhCN=($&CEUy9AM8dy9v7#g;^ z{s=oWgUoJ(R5aDT{f6tx6`Hs|lyyVUa#8ZRYfCe=;wIlS- zzV{{Op|BEPU?sq}h%z?Wy^EsVy?ft^jv9LSre4GKcRlvg*7;^pj_N1^ZzR!SV6bK$ z`0L|eV7meYvN)(-w9!3quQSHuCBBkVpRG;E2G4RV(YRc-D2*#LXvy13%9`o zQuF1KJuquo1E;n)_c-Fa{iLT=0W^u^zeja|`B)TRPH=o&RVshmc~QZjRA&BcWanNk z{-P6yt*Yb2-%;(cFX@BNdhg>Tq_WKHKO2U%u)+2Fl54M*L|9om_WH)o!2U@xdu}lP z;Qekx`%I5CFu}^rPCElv;d)zf&}4?-H-3yiYdaH#)W~th6HgphN3+~!dB_bN4M;VQ zB4mH3CvP+$cU>tclnoHP_B47T%qI9N%VF{X8EeBpu=TaEL~DfydE)PkiAV~A%Xm_r z299UV0?&RA|2qfLhzY8NU5Goyr?WG~k@AS7K4CGV3r?`wZ zzPOBp&nl39&DG;4xj^e{QWWG^PGRI&G}PJOH!5(630y4<4z53m9IhYU*WB~h@{_qB z0$1zy^fVd@|Bsk9#Vyi;hC@qqUHTiVT+vs3f*wJJ=tO|EPbFe_rvm81A)oPK$#@=&jUqthtVwCxn4Y8JFbPa z57ArY+GMP*pGGUyaTvJM1@goM;S3bDVzfeFAT_rL@mo6r~0 z*4KV`c|Lf_lh!L!ovT<_-IqGPOi|x0sWF4W#4+J47f*>je&^(){8166Mf?{(1Uq8b0w=%FM~(MK9NiJ{^XZ!W)q( z+eyb^G%A4$Tw)gE92wP3Cd)-eemeL5oA~}p^w@`}=2VDir*syj&^3=25S3&}tS+_B zh!KuUKI%qOzI%3q!Bq%ZEoM2KI{MKm3Fbip_S`mbOoqa-pc@xheqg@Iacnx4ecYN! zp@@!YmNB>a_sVt#-7lW@?!%o>@pCCU@p>sOPSZ7|JnsG6B^}5rmV6>8o~>QJhV}{L z3+8X6rRU@a4;l3xhBVKGt+$3!C=b6A=RVMgN`f}ZvSNJeED zxXA0Y>)ovIYwnRFeZ>Nf{ZV@^-9N!&MV{=ds<-fJL>RXjB&Xn_QRxlk3mrEt7f)PK zn%)zpM2J{w4+doC-17>i)iKL0 z8s;U@FH@f<`|aw)^GqbnR8VPFpUcZ~N}mS}V!DsJ(4PI2=%u5#W{dpp^YEeEj|vPu zeO+O|p{sToTu*KHlcDiRD6UpKz9 z8jqtak(j_L%HHQT{A`}n_qd(DyT7)DuLwgezWsFFwVHH)tXljDaWX;9R#NJvs?dMuo(?FzM3YYgKEwZc^x{W^@L zKiO79cV$Tks$@vLBmIf$2!}Fer@rz@2{Sp5FU;`ryj53YdXmhl$|4S5iwzBjh6&`K zCc39>dTeALrLA$EBc(mvZKQ$FJ2`8k5(?7LYdCd=x8K&Y&XTsy#GbItVHR&y^c`3aRXT?GTE|D#7r_QG*u~6`_AMrtE!b z-?Z~{s{=+d&=yTAJt*tc*^DpJ_;bnmIE?r3N_{}YD1F`Cq3o`osxC$q{RpWmvf3qo z)ZWS^bYoQhTj&7;SNvo#wBjj&m4jR!`Lnm{?D%7E?`!sQ0bd>xxG^y3L=-GYB==aV%#o3KC_#eytCG%G(3A&O`X}YJrG5v&6`G`J#aQ|WeC*SEKHW<^ zNs8Jq%c`8)XK{5h(V|5O^6Fi-g4?*dJ{Ak^ZeUM0JV-WJR(<{ak%>OjZyXKV;`P7(Ga&3cJ=0{ z@|M0zPq2RF7Jqb77Mqn@zEP$2VWr~zTdMYKH~Ach+N>tSzou8rg4>gJ-Q}hlpYfeEg$B!5X{o z7q!n)7%k@0`7+H^laqKf3U0VmTp4z8$?404cRp@KqEMF@&Mu5I@-u2>NQr}d(0h+- z)te4u7|l;kk_ToRAXdB@PQFC(;VhtR|Cj(C39uCnw1Ck6r+^T-#6hf)d2*0dP%3O$ z*`HBPHLfLMe{NflNWE~cCfOedR|tjHL8Z*=yc=S%*Iz4XVxhI!nWO!{wI7dR{w6R&}MW~b7_%XfoJ zkznh35MeDMl+qz8;&?&k-E%A7zIm)Si%>YHtY^#K2dAZbY#C>;7=#(He}9fbBw0qL z945=BgB~&*G1a=HKRN4qLE#P2*TjJnJ1o6(n3*8Ib`?HQED)eOSE!omL4JrZz>p-f zg~2TviNA9D&nck(L+if(-Dy9o08?`%vuVftDXGH+e!_CW!+Y|@d*Zz*_(B6cZK0B7 z@2OwReKh)0qzk}g;(Q=|7S6)OCC2}0lK{6UO;NFIKoQPTU(~o-`V8T98P`^m zBDl(PDjr!2FDZ_3j4%Q5j`Vc1h-Sz5gS325QsWWnl6yVRE|`;xT(7xlKh?lAjue2c z&j5Vge~XmvJWa^TnN#8eP1#ze7__480H z#-3B43^B}Z&?G6+p{~9=2q5Os4S{{}1-NM<0Q>{6kinm>ZSp|#>^Rt3#9_E*WAaC~ zlj;!BEDM{kcBllwDQa)*lG>H>UGDL_{ugHiOdtHQn-&$BjdSH

qvN9eI?NrkSC5 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 literal 0 HcmV?d00001 diff --git a/InventoryClassDiagram.png b/InventoryClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..043179372940fe035df0d622cc902011f5725d92 GIT binary patch literal 29454 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 literal 0 HcmV?d00001 diff --git a/ItemClassDiagram.png b/ItemClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..58565e7ce4abaed676fbe04a677f984a3bd09763 GIT binary patch literal 29160 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 LePqcwd(3|UX`sg_ literal 0 HcmV?d00001 diff --git a/domain-model.md b/domain-model.md new file mode 100644 index 000000000..6c99b7983 --- /dev/null +++ b/domain-model.md @@ -0,0 +1,43 @@ + +## Item Class + +| Methods | Variables | Scenario | Output | +|------------------------|-------------------|------------------------------------|----------------| +| | `String sku ` | | | +| | `String name ` | | | +| | `String variant ` | | | +| | `float price ` | | | +| `String getSku() ` | | Want to get the id of an item | Return sku | +| `String getName() ` | | Want to get the name of an item | Return name | +| `String getVariant() ` | | Want to get the variant of an item | Return variant | +| `float getPrice() ` | | Want to get the price of an item | Return price | +| | | | | +| | | | | +| | | | | + + +## Basket Class + +| Methods | Variables | Scenario | Output | +|------------------------------------|--------------------------|--------------------------------------|--------------------------------| +| | `ArrayList items ` | | | +| | `boolean isFull ` | | | +| | `int capacity ` | | | +| `void addItem(String itemSku) ` | | Want to add item to basket with room | Adds item to basket | +| | | Want to add item to full basket | Informs about full basket | +| `void removeItem(String itemSku) ` | | Want to remove existing item | Removes item from basket | +| | | Want to remove non-existent item | Inform about non-existing item | +| `boolean checkCapacity() ` | | Want to check if basket is full | Return isFull | +| `void changeCapacity(int newCap) ` | | Want to change basket capacity | Change capacity to newCap | +| `float totalCost() ` | | Want to know cost of basket | Add together and return sum | +| | | | | + +## Inventory Class + +| Methods | Variables | Scenario | Output | +|---------------------------------------|----------------------------------------------|------------------------------------|---------------------------------| +| | `HashMap inventory ` | | | +| `boolean checkStock(String itemSku) ` | | Want to check if there is stock | Returns if item in stock or not | +| `void addItem(String itemSku) ` | | Want to add item to inventory | Updates inventory | +| `void removeItem(String itemSku) ` | | Want to remove item from inventory | Updates inventory | + diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java new file mode 100644 index 000000000..4aab45ed7 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class Basket { +} diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java new file mode 100644 index 000000000..375cdb479 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class Inventory { +} diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java new file mode 100644 index 000000000..b85344c21 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Item.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class Item { +} diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java new file mode 100644 index 000000000..39feb2af8 --- /dev/null +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class BasketTest { +} diff --git a/src/test/java/com/booleanuk/core/InventoryTest.java b/src/test/java/com/booleanuk/core/InventoryTest.java new file mode 100644 index 000000000..4b67d33d3 --- /dev/null +++ b/src/test/java/com/booleanuk/core/InventoryTest.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class InventoryTest { +} diff --git a/src/test/java/com/booleanuk/core/ItemTest.java b/src/test/java/com/booleanuk/core/ItemTest.java new file mode 100644 index 000000000..be04480f7 --- /dev/null +++ b/src/test/java/com/booleanuk/core/ItemTest.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class ItemTest { +} From 5e686ebe3392fed833c72e02a40b1ac0f52af3bd Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Fri, 10 Jan 2025 13:14:17 +0100 Subject: [PATCH 02/17] added tests for Item --- .../java/com/booleanuk/core/ItemTest.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/test/java/com/booleanuk/core/ItemTest.java b/src/test/java/com/booleanuk/core/ItemTest.java index be04480f7..23edec064 100644 --- a/src/test/java/com/booleanuk/core/ItemTest.java +++ b/src/test/java/com/booleanuk/core/ItemTest.java @@ -1,4 +1,47 @@ package com.booleanuk.core; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + public class ItemTest { + + @Test + public void testGetSku(){ + Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39); + Item item2 = new Item("COFB", "Coffee", "Black", 0.99); + Item item3 = new Item("FILE", "Filling", "Egg", 0.12); + Assertions.assertEquals("BGLP", item1.getSku()); + Assertions.assertEquals("COFB", item2.getSku()); + Assertions.assertEquals("FILE", item3.getSku()); + } + + @Test + public void testGetName(){ + Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39); + Item item2 = new Item("COFB", "Coffee", "Black", 0.99); + Item item3 = new Item("FILE", "Filling", "Egg", 0.12); + Assertions.assertEquals("Bagel", item1.getName()); + Assertions.assertEquals("Coffe", item2.getName()); + Assertions.assertEquals("Filling", item3.getName()); + } + + @Test + public void testGetVariant(){ + Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39); + Item item2 = new Item("COFB", "Coffee", "Black", 0.99); + Item item3 = new Item("FILE", "Filling", "Egg", 0.12); + Assertions.assertEquals("Plain", item1.getVariant()); + Assertions.assertEquals("Black", item2.getVariant()); + Assertions.assertEquals("Egg", item3.getVariant()); + } + + @Test + public void testGetPrice(){ + Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39); + Item item2 = new Item("COFB", "Coffee", "Black", 0.99); + Item item3 = new Item("FILE", "Filling", "Egg", 0.12); + Assertions.assertEquals(0.39, item1.getPrice()); + Assertions.assertEquals(0.99, item2.getPrice()); + Assertions.assertEquals(0.12, item3.getPrice()); + } } From b9d1c4836443abb9968631e4f48af7abfcba8d54 Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Fri, 10 Jan 2025 13:22:52 +0100 Subject: [PATCH 03/17] added methods for Item --- src/main/java/com/booleanuk/core/Item.java | 19 +++++++++++ .../java/com/booleanuk/core/ItemTest.java | 32 +++++++++---------- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java index b85344c21..76ddecd14 100644 --- a/src/main/java/com/booleanuk/core/Item.java +++ b/src/main/java/com/booleanuk/core/Item.java @@ -1,4 +1,23 @@ package com.booleanuk.core; public class Item { + private String sku; + private String name; + private String variant; + private float price; + + public Item(String sku, String name, String variant, float price){ + this.sku = sku; + this.name = name; + this.variant = variant; + this.price = price; + } + + public String getSku() {return sku;} + + public String getName() {return name;} + + public String getVariant() {return variant;} + + public float getPrice() {return price;} } diff --git a/src/test/java/com/booleanuk/core/ItemTest.java b/src/test/java/com/booleanuk/core/ItemTest.java index 23edec064..b98529c02 100644 --- a/src/test/java/com/booleanuk/core/ItemTest.java +++ b/src/test/java/com/booleanuk/core/ItemTest.java @@ -7,9 +7,9 @@ public class ItemTest { @Test public void testGetSku(){ - Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39); - Item item2 = new Item("COFB", "Coffee", "Black", 0.99); - Item item3 = new Item("FILE", "Filling", "Egg", 0.12); + Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39f); + Item item2 = new Item("COFB", "Coffee", "Black", 0.99f); + Item item3 = new Item("FILE", "Filling", "Egg", 0.12f); Assertions.assertEquals("BGLP", item1.getSku()); Assertions.assertEquals("COFB", item2.getSku()); Assertions.assertEquals("FILE", item3.getSku()); @@ -17,19 +17,19 @@ public void testGetSku(){ @Test public void testGetName(){ - Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39); - Item item2 = new Item("COFB", "Coffee", "Black", 0.99); - Item item3 = new Item("FILE", "Filling", "Egg", 0.12); + Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39f); + Item item2 = new Item("COFB", "Coffee", "Black", 0.99f); + Item item3 = new Item("FILE", "Filling", "Egg", 0.12f); Assertions.assertEquals("Bagel", item1.getName()); - Assertions.assertEquals("Coffe", item2.getName()); + Assertions.assertEquals("Coffee", item2.getName()); Assertions.assertEquals("Filling", item3.getName()); } @Test public void testGetVariant(){ - Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39); - Item item2 = new Item("COFB", "Coffee", "Black", 0.99); - Item item3 = new Item("FILE", "Filling", "Egg", 0.12); + Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39f); + Item item2 = new Item("COFB", "Coffee", "Black", 0.99f); + Item item3 = new Item("FILE", "Filling", "Egg", 0.12f); Assertions.assertEquals("Plain", item1.getVariant()); Assertions.assertEquals("Black", item2.getVariant()); Assertions.assertEquals("Egg", item3.getVariant()); @@ -37,11 +37,11 @@ public void testGetVariant(){ @Test public void testGetPrice(){ - Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39); - Item item2 = new Item("COFB", "Coffee", "Black", 0.99); - Item item3 = new Item("FILE", "Filling", "Egg", 0.12); - Assertions.assertEquals(0.39, item1.getPrice()); - Assertions.assertEquals(0.99, item2.getPrice()); - Assertions.assertEquals(0.12, item3.getPrice()); + Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39f); + Item item2 = new Item("COFB", "Coffee", "Black", 0.99f); + Item item3 = new Item("FILE", "Filling", "Egg", 0.12f); + Assertions.assertEquals(0.39f, item1.getPrice()); + Assertions.assertEquals(0.99f, item2.getPrice()); + Assertions.assertEquals(0.12f, item3.getPrice()); } } From 17a2481ee4292356081d65714619134362b39204 Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Fri, 10 Jan 2025 14:01:05 +0100 Subject: [PATCH 04/17] modified item class and tests --- domain-model.md | 1 + src/main/java/com/booleanuk/core/Item.java | 66 +++++++++++++++++-- .../java/com/booleanuk/core/BasketTest.java | 32 +++++++++ .../java/com/booleanuk/core/ItemTest.java | 24 +++---- 4 files changed, 107 insertions(+), 16 deletions(-) diff --git a/domain-model.md b/domain-model.md index 6c99b7983..1d8f291e2 100644 --- a/domain-model.md +++ b/domain-model.md @@ -23,6 +23,7 @@ | | `ArrayList items ` | | | | | `boolean isFull ` | | | | | `int capacity ` | | | +| | | | | | `void addItem(String itemSku) ` | | Want to add item to basket with room | Adds item to basket | | | | Want to add item to full basket | Informs about full basket | | `void removeItem(String itemSku) ` | | Want to remove existing item | Removes item from basket | diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java index 76ddecd14..4b50e83fa 100644 --- a/src/main/java/com/booleanuk/core/Item.java +++ b/src/main/java/com/booleanuk/core/Item.java @@ -6,13 +6,71 @@ public class Item { private String variant; private float price; - public Item(String sku, String name, String variant, float price){ + public Item(String sku) { this.sku = sku; - this.name = name; - this.variant = variant; - this.price = price; + + if (sku.equals("BGLO")) { + this.name = "Bagel"; + this.variant = "Onion"; + this.price = 0.49f; + } else if (sku.equals("BGLP")) { + this.name = "Bagel"; + this.variant = "Plain"; + this.price = 0.39f; + } else if (sku.equals("BGLE")) { + this.name = "Bagel"; + this.variant = "Everything"; + this.price = 0.49f; + } else if (sku.equals("BGLS")) { + this.name = "Bagel"; + this.variant = "Sesame"; + this.price = 0.49f; + } else if (sku.equals("COFB")) { + this.name = "Coffee"; + this.variant = "Black"; + this.price = 0.99f; + } else if (sku.equals("COFW")) { + this.name = "Coffee"; + this.variant = "White"; + this.price = 1.19f; + } else if (sku.equals("COFC")) { + this.name = "Coffee"; + this.variant = "Capuccino"; + this.price = 1.29f; + } else if (sku.equals("COFL")) { + this.name = "Coffee"; + this.variant = "Latte"; + this.price = 1.29f; + } else if (sku.equals("FILB")) { + this.name = "Filling"; + this.variant = "Bacon"; + this.price = 0.12f; + } else if (sku.equals("FILE")) { + this.name = "Filling"; + this.variant = "Egg"; + this.price = 0.12f; + } else if (sku.equals("FILC")) { + this.name = "Filling"; + this.variant = "Cheese"; + this.price = 0.12f; + } else if (sku.equals("FILX")) { + this.name = "Filling"; + this.variant = "Cream Cheese"; + this.price = 0.12f; + } else if (sku.equals("FILS")) { + this.name = "Filling"; + this.variant = "Smoked Salmon"; + this.price = 0.12f; + } else if (sku.equals("FILH")) { + this.name = "Filling"; + this.variant = "Ham"; + this.price = 0.12f; + } else { + throw new IllegalArgumentException("Invalid SKU: " + sku); + } } + public String getSku() {return sku;} public String getName() {return name;} diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 39feb2af8..01dfa23d1 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -1,4 +1,36 @@ package com.booleanuk.core; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + public class BasketTest { + + @Test + public void testAddItem(){ + Basket basket = new Basket(); + basket.addItem("BGLP"); + basket.addItem("FILE"); + Assertions.assertTrue(); + } + + @Test + public void testRemoveItem(){ + + } + + @Test + public void testCheckCapacity(){ + + } + + @Test + public void testChangeCapacity(){ + + } + + @Test + public void testTotalCost(){ + + } + } diff --git a/src/test/java/com/booleanuk/core/ItemTest.java b/src/test/java/com/booleanuk/core/ItemTest.java index b98529c02..447e7d3c3 100644 --- a/src/test/java/com/booleanuk/core/ItemTest.java +++ b/src/test/java/com/booleanuk/core/ItemTest.java @@ -7,9 +7,9 @@ public class ItemTest { @Test public void testGetSku(){ - Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39f); - Item item2 = new Item("COFB", "Coffee", "Black", 0.99f); - Item item3 = new Item("FILE", "Filling", "Egg", 0.12f); + Item item1 = new Item("BGLP"); + Item item2 = new Item("COFB"); + Item item3 = new Item("FILE"); Assertions.assertEquals("BGLP", item1.getSku()); Assertions.assertEquals("COFB", item2.getSku()); Assertions.assertEquals("FILE", item3.getSku()); @@ -17,9 +17,9 @@ public void testGetSku(){ @Test public void testGetName(){ - Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39f); - Item item2 = new Item("COFB", "Coffee", "Black", 0.99f); - Item item3 = new Item("FILE", "Filling", "Egg", 0.12f); + Item item1 = new Item("BGLP"); + Item item2 = new Item("COFB"); + Item item3 = new Item("FILE"); Assertions.assertEquals("Bagel", item1.getName()); Assertions.assertEquals("Coffee", item2.getName()); Assertions.assertEquals("Filling", item3.getName()); @@ -27,9 +27,9 @@ public void testGetName(){ @Test public void testGetVariant(){ - Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39f); - Item item2 = new Item("COFB", "Coffee", "Black", 0.99f); - Item item3 = new Item("FILE", "Filling", "Egg", 0.12f); + Item item1 = new Item("BGLP"); + Item item2 = new Item("COFB"); + Item item3 = new Item("FILE"); Assertions.assertEquals("Plain", item1.getVariant()); Assertions.assertEquals("Black", item2.getVariant()); Assertions.assertEquals("Egg", item3.getVariant()); @@ -37,9 +37,9 @@ public void testGetVariant(){ @Test public void testGetPrice(){ - Item item1 = new Item("BGLP", "Bagel", "Plain", 0.39f); - Item item2 = new Item("COFB", "Coffee", "Black", 0.99f); - Item item3 = new Item("FILE", "Filling", "Egg", 0.12f); + Item item1 = new Item("BGLP"); + Item item2 = new Item("COFB"); + Item item3 = new Item("FILE"); Assertions.assertEquals(0.39f, item1.getPrice()); Assertions.assertEquals(0.99f, item2.getPrice()); Assertions.assertEquals(0.12f, item3.getPrice()); From 0558b97c803fce5d50caf15368493a0b3844d9c9 Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Fri, 10 Jan 2025 15:43:59 +0100 Subject: [PATCH 05/17] added more tests and methods --- domain-model.md | 7 ++- src/main/java/com/booleanuk/core/Basket.java | 54 +++++++++++++++++++ src/main/java/com/booleanuk/core/Item.java | 1 - .../java/com/booleanuk/core/BasketTest.java | 18 ++++++- 4 files changed, 76 insertions(+), 4 deletions(-) diff --git a/domain-model.md b/domain-model.md index 1d8f291e2..65ef2d3e6 100644 --- a/domain-model.md +++ b/domain-model.md @@ -28,10 +28,13 @@ | | | Want to add item to full basket | Informs about full basket | | `void removeItem(String itemSku) ` | | Want to remove existing item | Removes item from basket | | | | Want to remove non-existent item | Inform about non-existing item | -| `boolean checkCapacity() ` | | Want to check if basket is full | Return isFull | +| `void checkCapacity() ` | | Want to check if basket is full | Updated isFull if needed | | `void changeCapacity(int newCap) ` | | Want to change basket capacity | Change capacity to newCap | | `float totalCost() ` | | Want to know cost of basket | Add together and return sum | -| | | | | +| `boolean containsItem() ` | | Item is in basket | True | +| | | Item is not in basket | False | +| `boolean containsItem() ` | | Item is in basket | True | + ## Inventory Class diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 4aab45ed7..37acf199d 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -1,4 +1,58 @@ package com.booleanuk.core; +import java.util.ArrayList; + public class Basket { + private ArrayList items = new ArrayList<>(); + private int capacity = 10; + private boolean isFull; + + public Basket(){ + this.isFull = false; + } + + public ArrayList getItems(){ + return items; + } + + public void checkCapacity(){ + if (items.size() == capacity){ + isFull = true; + return; + } + isFull = false; + } + + public boolean containsItem(String itemSku){ + for (Item item : items){ + if (item.getSku().equals(itemSku)){ + return true; + } + } + return false; + } + + public void addItem(String itemSku){ + checkCapacity(); + if (isFull){ + System.out.println("Your basket is full, cant add item!"); + return; + } + Item item = new Item(itemSku); + items.add(item); + } + + public void removeItem(String itemSku){ + for (Item item : items){ + if (item.getSku().equals(itemSku)){ + items.remove(item); + return; + } + } + System.out.println("This item does not exist in the basket!"); + } + + + + } diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java index 4b50e83fa..15bff5926 100644 --- a/src/main/java/com/booleanuk/core/Item.java +++ b/src/main/java/com/booleanuk/core/Item.java @@ -70,7 +70,6 @@ public Item(String sku) { } } - public String getSku() {return sku;} public String getName() {return name;} diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 01dfa23d1..9fa8c4054 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -5,16 +5,32 @@ public class BasketTest { + @Test + public void testContainsItem(){ + Basket basket = new Basket(); + basket.addItem("BGLP"); + basket.addItem("FILE"); + Assertions.assertTrue(basket.containsItem("BGLP")); + Assertions.assertTrue(basket.containsItem("FILE")); + } + @Test public void testAddItem(){ Basket basket = new Basket(); basket.addItem("BGLP"); basket.addItem("FILE"); - Assertions.assertTrue(); + Assertions.assertEquals(2, basket.getItems().size()); } @Test public void testRemoveItem(){ + Basket basket = new Basket(); + basket.addItem("BGLP"); + basket.addItem("FILE"); + Assertions.assertTrue(basket.containsItem("BGLP")); + Assertions.assertTrue(basket.containsItem("FILE")); + basket.removeItem("FILE"); + Assertions.assertFalse(basket.containsItem("FILE")); } From 3266731a5726f74c85abe0c1eaf4206b33014ce3 Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Fri, 10 Jan 2025 15:53:58 +0100 Subject: [PATCH 06/17] added tests for basket capacity --- src/main/java/com/booleanuk/core/Basket.java | 8 +++++++ .../java/com/booleanuk/core/BasketTest.java | 23 ++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 37acf199d..9cc30b4cb 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -15,6 +15,14 @@ public ArrayList getItems(){ return items; } + public boolean getIsFull(){ + return isFull; + } + + public int getCapacity(){ + return capacity; + } + public void checkCapacity(){ if (items.size() == capacity){ isFull = true; diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 9fa8c4054..00ab0fd20 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -35,13 +35,30 @@ public void testRemoveItem(){ } @Test - public void testCheckCapacity(){ - + public void testCheckCapacityFull(){ + Basket basket = new Basket(); + basket.checkCapacity(); + Assertions.assertFalse(basket.getIsFull()); + basket.addItem("BGLP"); + basket.addItem("FILE"); + basket.addItem("BGLP"); + basket.addItem("FILE"); + basket.addItem("BGLP"); + basket.addItem("FILE"); + basket.addItem("BGLP"); + basket.addItem("FILE"); + basket.addItem("BGLP"); + basket.addItem("FILE"); + basket.checkCapacity(); + Assertions.assertTrue(basket.getIsFull()); } @Test public void testChangeCapacity(){ - + Basket basket = new Basket(); + Assertions.assertEquals(10, basket.getCapacity()); + basket.changeCapacity(20); + Assertions.assertEquals(20, basket.getCapacity()); } @Test From 899cbe50290337c71d117560183e45a6c63094ed Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Fri, 10 Jan 2025 15:56:16 +0100 Subject: [PATCH 07/17] added test and method for change capacity --- src/main/java/com/booleanuk/core/Basket.java | 4 +++- src/test/java/com/booleanuk/core/BasketTest.java | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 9cc30b4cb..bf686ac96 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -60,7 +60,9 @@ public void removeItem(String itemSku){ System.out.println("This item does not exist in the basket!"); } - + public void changeCapacity(int newCap){ + this.capacity = newCap; + } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 00ab0fd20..e1c2db669 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -35,7 +35,7 @@ public void testRemoveItem(){ } @Test - public void testCheckCapacityFull(){ + public void testCheckCapacity(){ Basket basket = new Basket(); basket.checkCapacity(); Assertions.assertFalse(basket.getIsFull()); @@ -63,7 +63,6 @@ public void testChangeCapacity(){ @Test public void testTotalCost(){ - } } From 13de87ed02003ca314753abfc3cf639dbeedb1dc Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Fri, 10 Jan 2025 16:07:53 +0100 Subject: [PATCH 08/17] added totalcost test --- src/test/java/com/booleanuk/core/BasketTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index e1c2db669..48eee6765 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -63,6 +63,11 @@ public void testChangeCapacity(){ @Test public void testTotalCost(){ + Basket basket = new Basket(); + basket.addItem("BGLP"); + basket.addItem("FILE"); + basket.addItem("COFB"); + Assertions.assertEquals(1.5f, basket.totalCost()); } } From 421bc2dc547d2ba171354910fac64e46f3636c53 Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Fri, 10 Jan 2025 16:21:57 +0100 Subject: [PATCH 09/17] total cost test and method added --- src/main/java/com/booleanuk/core/Basket.java | 8 +++++++- src/test/java/com/booleanuk/core/BasketTest.java | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index bf686ac96..3e54ad932 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -64,5 +64,11 @@ public void changeCapacity(int newCap){ this.capacity = newCap; } - + public float totalCost(){ + float total = 0; + for (Item item : items){ + total += item.getPrice(); + } + return total; + } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 48eee6765..a33cce058 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -68,6 +68,12 @@ public void testTotalCost(){ basket.addItem("FILE"); basket.addItem("COFB"); Assertions.assertEquals(1.5f, basket.totalCost()); + + Basket basket2 = new Basket(); + basket2.addItem("COFB"); + basket2.addItem("COFB"); + basket2.addItem("COFB"); + Assertions.assertEquals(2.97f, basket2.totalCost()); } } From b6273832819b37a114eb6de7c355813a17e93139 Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Sun, 12 Jan 2025 17:04:57 +0100 Subject: [PATCH 10/17] modified tests and methods for adding item to display price and give customer the option --- src/main/java/com/booleanuk/core/Basket.java | 15 ++++++- .../java/com/booleanuk/core/BasketTest.java | 45 ++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 3e54ad932..6487ee79c 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -1,6 +1,7 @@ package com.booleanuk.core; import java.util.ArrayList; +import java.util.Scanner; public class Basket { private ArrayList items = new ArrayList<>(); @@ -47,7 +48,19 @@ public void addItem(String itemSku){ return; } Item item = new Item(itemSku); - items.add(item); + System.out.println(item.getVariant() + " " + item.getName() + " price: $" + item.getPrice()); + System.out.println("Do you want to " + item.getVariant() + + " " + item.getName() +" to the basket? (yes/no): "); + + Scanner scanner = new Scanner(System.in); + String userInput = scanner.nextLine().trim().toLowerCase(); + + if (userInput.equals("yes")) { + items.add(item); + System.out.println(item.getVariant() + " " + item.getName() + " added to the basket."); + } else { + System.out.println(item.getVariant() + " " + item.getName() + " not added to the basket."); + } } public void removeItem(String itemSku){ diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index a33cce058..2e16389e2 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -3,13 +3,22 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.io.ByteArrayInputStream; + public class BasketTest { @Test public void testContainsItem(){ Basket basket = new Basket(); + + // To simulate customer responses + String inputYes = "yes\n"; + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("BGLP"); + + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("FILE"); + Assertions.assertTrue(basket.containsItem("BGLP")); Assertions.assertTrue(basket.containsItem("FILE")); } @@ -17,16 +26,29 @@ public void testContainsItem(){ @Test public void testAddItem(){ Basket basket = new Basket(); + + String inputYes = "yes\n"; + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("BGLP"); + + String inputNo = "no\n"; + System.setIn(new ByteArrayInputStream(inputNo.getBytes())); basket.addItem("FILE"); - Assertions.assertEquals(2, basket.getItems().size()); + + Assertions.assertEquals(1, basket.getItems().size()); } @Test public void testRemoveItem(){ Basket basket = new Basket(); + + String inputYes = "yes\n"; + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("BGLP"); + + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("FILE"); + Assertions.assertTrue(basket.containsItem("BGLP")); Assertions.assertTrue(basket.containsItem("FILE")); basket.removeItem("FILE"); @@ -39,15 +61,27 @@ public void testCheckCapacity(){ Basket basket = new Basket(); basket.checkCapacity(); Assertions.assertFalse(basket.getIsFull()); + + String inputYes = "yes\n"; + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("BGLP"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("FILE"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("BGLP"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("FILE"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("BGLP"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("FILE"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("BGLP"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("FILE"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("BGLP"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("FILE"); basket.checkCapacity(); Assertions.assertTrue(basket.getIsFull()); @@ -64,14 +98,23 @@ public void testChangeCapacity(){ @Test public void testTotalCost(){ Basket basket = new Basket(); + + String inputYes = "yes\n"; + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("BGLP"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("FILE"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket.addItem("COFB"); Assertions.assertEquals(1.5f, basket.totalCost()); Basket basket2 = new Basket(); + + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket2.addItem("COFB"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket2.addItem("COFB"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket2.addItem("COFB"); Assertions.assertEquals(2.97f, basket2.totalCost()); } From 791de24fa6efec031ebc308760429ed10e8e25cc Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Mon, 13 Jan 2025 09:11:52 +0100 Subject: [PATCH 11/17] started on inventory tests --- src/main/java/com/booleanuk/core/Basket.java | 2 +- .../java/com/booleanuk/core/InventoryTest.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 6487ee79c..68f6ffc25 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -49,7 +49,7 @@ public void addItem(String itemSku){ } Item item = new Item(itemSku); System.out.println(item.getVariant() + " " + item.getName() + " price: $" + item.getPrice()); - System.out.println("Do you want to " + item.getVariant() + System.out.println("Do you want to add " + item.getVariant() + " " + item.getName() +" to the basket? (yes/no): "); Scanner scanner = new Scanner(System.in); diff --git a/src/test/java/com/booleanuk/core/InventoryTest.java b/src/test/java/com/booleanuk/core/InventoryTest.java index 4b67d33d3..74df5631d 100644 --- a/src/test/java/com/booleanuk/core/InventoryTest.java +++ b/src/test/java/com/booleanuk/core/InventoryTest.java @@ -1,4 +1,22 @@ package com.booleanuk.core; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + public class InventoryTest { + + @Test + public voidAddStockItem(){ + Inventory inventory = new Inventory(); + inventory.addStockItem("BGLP", 1); + inventory.addStockItem("FILE", 1); + Assertions.assertEquals(2, inventory.stock.size()); + } + + @Test + public void testCheckStock(){ + Inventory inventory = new Inventory(); + Assertions.assertEquals(1, inventory.checkStock()); + + } } From 0c5c2822c6140a742798dc5ca886211b64cc5e26 Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Mon, 13 Jan 2025 10:13:35 +0100 Subject: [PATCH 12/17] added inventory tests --- src/test/java/com/booleanuk/core/InventoryTest.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/booleanuk/core/InventoryTest.java b/src/test/java/com/booleanuk/core/InventoryTest.java index 74df5631d..9447eb29b 100644 --- a/src/test/java/com/booleanuk/core/InventoryTest.java +++ b/src/test/java/com/booleanuk/core/InventoryTest.java @@ -6,13 +6,24 @@ public class InventoryTest { @Test - public voidAddStockItem(){ + public void testAddStockItem(){ Inventory inventory = new Inventory(); inventory.addStockItem("BGLP", 1); inventory.addStockItem("FILE", 1); Assertions.assertEquals(2, inventory.stock.size()); } + @Test + public void testRemoveStockItem(){ + Inventory inventory = new Inventory(); + inventory.addStockItem("BGLP", 1); + inventory.addStockItem("FILE", 1); + Assertions.assertEquals(2, inventory.stock.size()); + + inventory.removeStockItem("FILE", 1); + Assertions.assertEquals(1, inventory.stock.size()); + } + @Test public void testCheckStock(){ Inventory inventory = new Inventory(); From bdfe3ac1e47bff782cf90c7c7aac5d7eec5b0dec Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Mon, 13 Jan 2025 10:44:08 +0100 Subject: [PATCH 13/17] add and remove methods for inventory --- .../java/com/booleanuk/core/Inventory.java | 37 +++++++++++++++++++ .../com/booleanuk/core/InventoryTest.java | 22 +++++------ 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java index 375cdb479..b3d592565 100644 --- a/src/main/java/com/booleanuk/core/Inventory.java +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -1,4 +1,41 @@ package com.booleanuk.core; +import java.util.HashMap; + public class Inventory { + private HashMap stock = new HashMap<>(); + + + public Inventory(){ + + } + + public int getStockSize(){ + return this.stock.size(); + } + + public int getItemStock(String sku){ + return this.stock.get(sku); + } + + public void addStockItem(String sku, int amount){ + if (!stock.containsKey(sku)){ + stock.put(sku, amount); + return; + } + stock.put(sku, stock.get(sku) + amount); + } + + public void removeStockItem(String sku, int amount){ + if (stock.containsKey(sku) && stock.get(sku) >= amount){ + stock.put(sku, stock.get(sku) - amount); + if (stock.get(sku) == 0){ + stock.remove(sku); + } + return; + } + System.out.println("Not enough stock in inventory!"); + } + + } diff --git a/src/test/java/com/booleanuk/core/InventoryTest.java b/src/test/java/com/booleanuk/core/InventoryTest.java index 9447eb29b..f2a653c60 100644 --- a/src/test/java/com/booleanuk/core/InventoryTest.java +++ b/src/test/java/com/booleanuk/core/InventoryTest.java @@ -9,25 +9,23 @@ public class InventoryTest { public void testAddStockItem(){ Inventory inventory = new Inventory(); inventory.addStockItem("BGLP", 1); - inventory.addStockItem("FILE", 1); - Assertions.assertEquals(2, inventory.stock.size()); + inventory.addStockItem("FILE", 3); + Assertions.assertEquals(2, inventory.getStockSize()); + Assertions.assertEquals(3, inventory.getItemStock("FILE")); + Assertions.assertEquals(1, inventory.getItemStock("BGLP")); } @Test public void testRemoveStockItem(){ Inventory inventory = new Inventory(); - inventory.addStockItem("BGLP", 1); + inventory.addStockItem("BGLP", 3); inventory.addStockItem("FILE", 1); - Assertions.assertEquals(2, inventory.stock.size()); + Assertions.assertEquals(2, inventory.getStockSize()); inventory.removeStockItem("FILE", 1); - Assertions.assertEquals(1, inventory.stock.size()); - } - - @Test - public void testCheckStock(){ - Inventory inventory = new Inventory(); - Assertions.assertEquals(1, inventory.checkStock()); - + inventory.removeStockItem("BGLP", 2); + Assertions.assertEquals(1, inventory.getStockSize()); + Assertions.assertEquals(1, inventory.getItemStock("BGLP")); } + } From cd3f5587717cc7c908dd70c7223a89c0ed0115d0 Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Tue, 14 Jan 2025 09:00:50 +0100 Subject: [PATCH 14/17] core done --- src/main/java/com/booleanuk/core/Basket.java | 11 +++++++++++ .../java/com/booleanuk/core/BasketTest.java | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 68f6ffc25..670819bbb 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -7,11 +7,16 @@ public class Basket { private ArrayList items = new ArrayList<>(); private int capacity = 10; private boolean isFull; + private Inventory inventory = new Inventory(); public Basket(){ this.isFull = false; } + public Inventory getInventory(){ + return this.inventory; + } + public ArrayList getItems(){ return items; } @@ -47,6 +52,10 @@ public void addItem(String itemSku){ System.out.println("Your basket is full, cant add item!"); return; } + if (inventory.getItemStock(itemSku) == 0){ + System.out.println("No stock left for chosen item!"); + return; + } Item item = new Item(itemSku); System.out.println(item.getVariant() + " " + item.getName() + " price: $" + item.getPrice()); System.out.println("Do you want to add " + item.getVariant() @@ -57,6 +66,7 @@ public void addItem(String itemSku){ if (userInput.equals("yes")) { items.add(item); + inventory.removeStockItem(itemSku, 1); System.out.println(item.getVariant() + " " + item.getName() + " added to the basket."); } else { System.out.println(item.getVariant() + " " + item.getName() + " not added to the basket."); @@ -67,6 +77,7 @@ public void removeItem(String itemSku){ for (Item item : items){ if (item.getSku().equals(itemSku)){ items.remove(item); + inventory.addStockItem(itemSku, 1); return; } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 2e16389e2..9d0aac8eb 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -10,6 +10,9 @@ public class BasketTest { @Test public void testContainsItem(){ Basket basket = new Basket(); + basket.getInventory().addStockItem("BGLP", 1); + basket.getInventory().addStockItem("FILE", 1); + // To simulate customer responses String inputYes = "yes\n"; @@ -21,11 +24,14 @@ public void testContainsItem(){ Assertions.assertTrue(basket.containsItem("BGLP")); Assertions.assertTrue(basket.containsItem("FILE")); + Assertions.assertEquals(0, basket.getInventory().getStockSize()); } @Test public void testAddItem(){ Basket basket = new Basket(); + basket.getInventory().addStockItem("BGLP", 1); + basket.getInventory().addStockItem("FILE", 1); String inputYes = "yes\n"; System.setIn(new ByteArrayInputStream(inputYes.getBytes())); @@ -41,6 +47,9 @@ public void testAddItem(){ @Test public void testRemoveItem(){ Basket basket = new Basket(); + basket.getInventory().addStockItem("BGLP", 1); + basket.getInventory().addStockItem("FILE", 1); + String inputYes = "yes\n"; System.setIn(new ByteArrayInputStream(inputYes.getBytes())); @@ -53,12 +62,16 @@ public void testRemoveItem(){ Assertions.assertTrue(basket.containsItem("FILE")); basket.removeItem("FILE"); Assertions.assertFalse(basket.containsItem("FILE")); + Assertions.assertEquals(1, basket.getInventory().getStockSize()); } @Test public void testCheckCapacity(){ Basket basket = new Basket(); + basket.getInventory().addStockItem("BGLP", 5); + basket.getInventory().addStockItem("FILE", 5); + basket.checkCapacity(); Assertions.assertFalse(basket.getIsFull()); @@ -98,6 +111,10 @@ public void testChangeCapacity(){ @Test public void testTotalCost(){ Basket basket = new Basket(); + basket.getInventory().addStockItem("BGLP", 1); + basket.getInventory().addStockItem("FILE", 1); + basket.getInventory().addStockItem("COFB", 1); + String inputYes = "yes\n"; System.setIn(new ByteArrayInputStream(inputYes.getBytes())); @@ -109,6 +126,7 @@ public void testTotalCost(){ Assertions.assertEquals(1.5f, basket.totalCost()); Basket basket2 = new Basket(); + basket2.getInventory().addStockItem("COFB", 3); System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket2.addItem("COFB"); From 604aea8e1e157156a631fa7ae588e21adcb6c03c Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Tue, 14 Jan 2025 09:03:46 +0100 Subject: [PATCH 15/17] small fix domain model --- domain-model.md | 1 - 1 file changed, 1 deletion(-) diff --git a/domain-model.md b/domain-model.md index 65ef2d3e6..2d2076a17 100644 --- a/domain-model.md +++ b/domain-model.md @@ -41,7 +41,6 @@ | Methods | Variables | Scenario | Output | |---------------------------------------|----------------------------------------------|------------------------------------|---------------------------------| | | `HashMap inventory ` | | | -| `boolean checkStock(String itemSku) ` | | Want to check if there is stock | Returns if item in stock or not | | `void addItem(String itemSku) ` | | Want to add item to inventory | Updates inventory | | `void removeItem(String itemSku) ` | | Want to remove item from inventory | Updates inventory | From ef889fd8b017ee7040b3eadbd7e97e701868fac7 Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Tue, 14 Jan 2025 13:06:30 +0100 Subject: [PATCH 16/17] added inventory to basket constructur so multiple baskets can access same inventory --- src/main/java/com/booleanuk/core/Basket.java | 3 ++- .../java/com/booleanuk/core/BasketTest.java | 23 +++++++++++-------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 670819bbb..7ae3df128 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -9,8 +9,9 @@ public class Basket { private boolean isFull; private Inventory inventory = new Inventory(); - public Basket(){ + public Basket(Inventory inventory){ this.isFull = false; + this.inventory = inventory; } public Inventory getInventory(){ diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 9d0aac8eb..a2c72afb3 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -9,7 +9,8 @@ public class BasketTest { @Test public void testContainsItem(){ - Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory); basket.getInventory().addStockItem("BGLP", 1); basket.getInventory().addStockItem("FILE", 1); @@ -29,7 +30,8 @@ public void testContainsItem(){ @Test public void testAddItem(){ - Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory); basket.getInventory().addStockItem("BGLP", 1); basket.getInventory().addStockItem("FILE", 1); @@ -46,7 +48,8 @@ public void testAddItem(){ @Test public void testRemoveItem(){ - Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory); basket.getInventory().addStockItem("BGLP", 1); basket.getInventory().addStockItem("FILE", 1); @@ -68,7 +71,8 @@ public void testRemoveItem(){ @Test public void testCheckCapacity(){ - Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory); basket.getInventory().addStockItem("BGLP", 5); basket.getInventory().addStockItem("FILE", 5); @@ -102,7 +106,8 @@ public void testCheckCapacity(){ @Test public void testChangeCapacity(){ - Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory); Assertions.assertEquals(10, basket.getCapacity()); basket.changeCapacity(20); Assertions.assertEquals(20, basket.getCapacity()); @@ -110,10 +115,11 @@ public void testChangeCapacity(){ @Test public void testTotalCost(){ - Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory); basket.getInventory().addStockItem("BGLP", 1); basket.getInventory().addStockItem("FILE", 1); - basket.getInventory().addStockItem("COFB", 1); + basket.getInventory().addStockItem("COFB", 4); String inputYes = "yes\n"; @@ -125,8 +131,7 @@ public void testTotalCost(){ basket.addItem("COFB"); Assertions.assertEquals(1.5f, basket.totalCost()); - Basket basket2 = new Basket(); - basket2.getInventory().addStockItem("COFB", 3); + Basket basket2 = new Basket(inventory); System.setIn(new ByteArrayInputStream(inputYes.getBytes())); basket2.addItem("COFB"); From 2b031b7bfc0a6d247b85c3b2467ef294a234e939 Mon Sep 17 00:00:00 2001 From: Robin Kaga Date: Sat, 18 Jan 2025 21:31:12 +0100 Subject: [PATCH 17/17] completed extensions (1 and 2) for discount and receipt --- .../java/com/booleanuk/extension/Basket.java | 166 +++++++++++++++++ .../com/booleanuk/extension/Inventory.java | 41 +++++ .../java/com/booleanuk/extension/Item.java | 80 ++++++++ .../com/booleanuk/extension/BasketTest.java | 174 ++++++++++++++++++ .../booleanuk/extension/InventoryTest.java | 32 ++++ .../com/booleanuk/extension/ItemTest.java | 48 +++++ 6 files changed, 541 insertions(+) create mode 100644 src/main/java/com/booleanuk/extension/Basket.java create mode 100644 src/main/java/com/booleanuk/extension/Inventory.java create mode 100644 src/main/java/com/booleanuk/extension/Item.java create mode 100644 src/test/java/com/booleanuk/extension/BasketTest.java create mode 100644 src/test/java/com/booleanuk/extension/InventoryTest.java create mode 100644 src/test/java/com/booleanuk/extension/ItemTest.java diff --git a/src/main/java/com/booleanuk/extension/Basket.java b/src/main/java/com/booleanuk/extension/Basket.java new file mode 100644 index 000000000..b276ea077 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Basket.java @@ -0,0 +1,166 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Scanner; + +public class Basket { + private ArrayList items = new ArrayList<>(); + private int capacity = 10; + private boolean isFull; + private Inventory inventory = new Inventory(); + + public Basket(Inventory inventory){ + this.isFull = false; + this.inventory = inventory; + } + + public Inventory getInventory(){ + return this.inventory; + } + + public ArrayList getItems(){ + return items; + } + + public boolean getIsFull(){ + return isFull; + } + + public int getCapacity(){ + return capacity; + } + + public void checkCapacity(){ + if (items.size() == capacity){ + isFull = true; + return; + } + isFull = false; + } + + public boolean containsItem(String itemSku){ + for (Item item : items){ + if (item.getSku().equals(itemSku)){ + return true; + } + } + return false; + } + + public void addItem(String itemSku){ + checkCapacity(); + if (isFull){ + System.out.println("Your basket is full, cant add item!"); + return; + } + if (inventory.getItemStock(itemSku) == 0){ + System.out.println("No stock left for chosen item!"); + return; + } + Item item = new Item(itemSku); + System.out.println(item.getVariant() + " " + item.getName() + " price: $" + item.getPrice()); + System.out.println("Do you want to add " + item.getVariant() + + " " + item.getName() +" to the basket? (yes/no): "); + + Scanner scanner = new Scanner(System.in); + String userInput = scanner.nextLine().trim().toLowerCase(); + + if (userInput.equals("yes")) { + items.add(item); + inventory.removeStockItem(itemSku, 1); + System.out.println(item.getVariant() + " " + item.getName() + " added to the basket."); + } else { + System.out.println(item.getVariant() + " " + item.getName() + " not added to the basket."); + } + } + + public void removeItem(String itemSku){ + for (Item item : items){ + if (item.getSku().equals(itemSku)){ + items.remove(item); + inventory.addStockItem(itemSku, 1); + return; + } + } + System.out.println("This item does not exist in the basket!"); + } + + public void changeCapacity(int newCap){ + this.capacity = newCap; + } + + public float totalCost(){ + int bagelAmount = 0; + int blackCoffeeAmount = 0; + float total = 0; + + for (Item i : items){ + if (i.getSku().charAt(0) == 'B'){ + bagelAmount++; + } else if (i.getSku().equals("COFB")){ + blackCoffeeAmount++; + } + } + + if (bagelAmount >= 12){ + total += 3.99f; + bagelAmount -= 12; + } else if (bagelAmount >= 6){ + total += 2.49f; + bagelAmount -= 6; + } + + while (bagelAmount > 0 && blackCoffeeAmount > 0){ + total += 1.25f; + bagelAmount--; + blackCoffeeAmount--; + } + + for (int i = items.size() -1; i >= 0; i--){ + Item item = items.get(i); + if (item.getSku().charAt(0) == 'B' && bagelAmount > 0){ + total += item.getPrice(); + bagelAmount--; + }else if (item.getSku().charAt(0) == 'C' && !item.getSku().equals("COFB")){ + total += item.getPrice(); + } else if (item.getSku().charAt(0) == 'F'){ + total += item.getPrice(); + } + } + + total += blackCoffeeAmount * 0.99f; + + total = Math.round(total * 100) / 100.0f; + return total; + } + + public String getReceipt(){ + HashMap amounts = new HashMap<>(); + for (Item i : items){ + if (!amounts.containsKey(i)){ + amounts.put(i, 1); + } else { + amounts.put(i, amounts.get(i) + 1); + } + } + StringBuilder receipt = new StringBuilder(); + String title = String.format("%15s%-20s%5s", "", "Bobs Bagels", ""); + receipt.append("\n"); + receipt.append(title).append("\n"); + receipt.append("-".repeat(40)); + receipt.append("\n"); + for (Item key : amounts.keySet()){ + String item = String.format("%-20s%-10s%-10s", + key.getVariant() + " " + key.getName(), amounts.get(key), key.getPrice() * amounts.get(key)); + receipt.append(item).append("\n"); + } + receipt.append("-".repeat(40)); + receipt.append("\n"); + String total = String.format("%-10s%20s%-10s", "Total", "", this.totalCost()); + receipt.append(total); + receipt.append("\n"); + + return receipt.toString(); + } +} diff --git a/src/main/java/com/booleanuk/extension/Inventory.java b/src/main/java/com/booleanuk/extension/Inventory.java new file mode 100644 index 000000000..d38fece19 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Inventory.java @@ -0,0 +1,41 @@ +package com.booleanuk.extension; + +import java.util.HashMap; + +public class Inventory { + private HashMap stock = new HashMap<>(); + + + public Inventory(){ + + } + + public int getStockSize(){ + return this.stock.size(); + } + + public int getItemStock(String sku){ + return this.stock.get(sku); + } + + public void addStockItem(String sku, int amount){ + if (!stock.containsKey(sku)){ + stock.put(sku, amount); + return; + } + stock.put(sku, stock.get(sku) + amount); + } + + public void removeStockItem(String sku, int amount){ + if (stock.containsKey(sku) && stock.get(sku) >= amount){ + stock.put(sku, stock.get(sku) - amount); + if (stock.get(sku) == 0){ + stock.remove(sku); + } + return; + } + System.out.println("Not enough stock in inventory!"); + } + + +} diff --git a/src/main/java/com/booleanuk/extension/Item.java b/src/main/java/com/booleanuk/extension/Item.java new file mode 100644 index 000000000..72b76d6de --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Item.java @@ -0,0 +1,80 @@ +package com.booleanuk.extension; + +public class Item { + private String sku; + private String name; + private String variant; + private float price; + + public Item(String sku) { + this.sku = sku; + + if (sku.equals("BGLO")) { + this.name = "Bagel"; + this.variant = "Onion"; + this.price = 0.49f; + } else if (sku.equals("BGLP")) { + this.name = "Bagel"; + this.variant = "Plain"; + this.price = 0.39f; + } else if (sku.equals("BGLE")) { + this.name = "Bagel"; + this.variant = "Everything"; + this.price = 0.49f; + } else if (sku.equals("BGLS")) { + this.name = "Bagel"; + this.variant = "Sesame"; + this.price = 0.49f; + } else if (sku.equals("COFB")) { + this.name = "Coffee"; + this.variant = "Black"; + this.price = 0.99f; + } else if (sku.equals("COFW")) { + this.name = "Coffee"; + this.variant = "White"; + this.price = 1.19f; + } else if (sku.equals("COFC")) { + this.name = "Coffee"; + this.variant = "Capuccino"; + this.price = 1.29f; + } else if (sku.equals("COFL")) { + this.name = "Coffee"; + this.variant = "Latte"; + this.price = 1.29f; + } else if (sku.equals("FILB")) { + this.name = "Filling"; + this.variant = "Bacon"; + this.price = 0.12f; + } else if (sku.equals("FILE")) { + this.name = "Filling"; + this.variant = "Egg"; + this.price = 0.12f; + } else if (sku.equals("FILC")) { + this.name = "Filling"; + this.variant = "Cheese"; + this.price = 0.12f; + } else if (sku.equals("FILX")) { + this.name = "Filling"; + this.variant = "Cream Cheese"; + this.price = 0.12f; + } else if (sku.equals("FILS")) { + this.name = "Filling"; + this.variant = "Smoked Salmon"; + this.price = 0.12f; + } else if (sku.equals("FILH")) { + this.name = "Filling"; + this.variant = "Ham"; + this.price = 0.12f; + } else { + throw new IllegalArgumentException("Invalid SKU: " + sku); + } + } + + public String getSku() {return sku;} + + public String getName() {return name;} + + public String getVariant() {return variant;} + + public float getPrice() {return price;} +} diff --git a/src/test/java/com/booleanuk/extension/BasketTest.java b/src/test/java/com/booleanuk/extension/BasketTest.java new file mode 100644 index 000000000..5daad6018 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/BasketTest.java @@ -0,0 +1,174 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; + +public class BasketTest { + + @Test + public void testContainsItem(){ + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory); + basket.getInventory().addStockItem("BGLP", 1); + basket.getInventory().addStockItem("FILE", 1); + + + // To simulate customer responses + String inputYes = "yes\n"; + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("BGLP"); + + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("FILE"); + + Assertions.assertTrue(basket.containsItem("BGLP")); + Assertions.assertTrue(basket.containsItem("FILE")); + Assertions.assertEquals(0, basket.getInventory().getStockSize()); + } + + @Test + public void testAddItem(){ + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory); + basket.getInventory().addStockItem("BGLP", 1); + basket.getInventory().addStockItem("FILE", 1); + + String inputYes = "yes\n"; + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("BGLP"); + + String inputNo = "no\n"; + System.setIn(new ByteArrayInputStream(inputNo.getBytes())); + basket.addItem("FILE"); + + Assertions.assertEquals(1, basket.getItems().size()); + } + + @Test + public void testRemoveItem(){ + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory); + basket.getInventory().addStockItem("BGLP", 1); + basket.getInventory().addStockItem("FILE", 1); + + + String inputYes = "yes\n"; + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("BGLP"); + + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("FILE"); + + Assertions.assertTrue(basket.containsItem("BGLP")); + Assertions.assertTrue(basket.containsItem("FILE")); + basket.removeItem("FILE"); + Assertions.assertFalse(basket.containsItem("FILE")); + Assertions.assertEquals(1, basket.getInventory().getStockSize()); + + } + + @Test + public void testCheckCapacity(){ + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory); + basket.getInventory().addStockItem("BGLP", 5); + basket.getInventory().addStockItem("FILE", 5); + + basket.checkCapacity(); + Assertions.assertFalse(basket.getIsFull()); + + String inputYes = "yes\n"; + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("BGLP"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("FILE"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("BGLP"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("FILE"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("BGLP"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("FILE"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("BGLP"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("FILE"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("BGLP"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("FILE"); + basket.checkCapacity(); + Assertions.assertTrue(basket.getIsFull()); + } + + @Test + public void testChangeCapacity(){ + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory); + Assertions.assertEquals(10, basket.getCapacity()); + basket.changeCapacity(20); + Assertions.assertEquals(20, basket.getCapacity()); + } + + @Test + public void testTotalCost(){ + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory); + basket.getInventory().addStockItem("BGLP", 1); + basket.getInventory().addStockItem("FILE", 1); + basket.getInventory().addStockItem("COFB", 1); + + + String inputYes = "yes\n"; + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("BGLP"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("FILE"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("COFB"); + Assertions.assertEquals(1.37f, basket.totalCost()); + + Basket basket2 = new Basket(inventory); + basket2.changeCapacity(20); + inventory.addStockItem("BGLP", 15); + inventory.addStockItem("FILE", 1); + inventory.addStockItem("COFB", 2); + + for (int i = 0; i < 15; i++){ + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket2.addItem("BGLP"); + } + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket2.addItem("FILE"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket2.addItem("COFB"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket2.addItem("COFB"); + + Assertions.assertEquals(7f, basket2.totalCost()); + } + + @Test + public void testGetReceipt(){ + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory); + basket.getInventory().addStockItem("BGLP", 1); + basket.getInventory().addStockItem("FILE", 1); + basket.getInventory().addStockItem("COFB", 1); + + String inputYes = "yes\n"; + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("BGLP"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("FILE"); + System.setIn(new ByteArrayInputStream(inputYes.getBytes())); + basket.addItem("COFB"); + + String receipt = basket.getReceipt(); + System.out.println(receipt); + } + +} diff --git a/src/test/java/com/booleanuk/extension/InventoryTest.java b/src/test/java/com/booleanuk/extension/InventoryTest.java new file mode 100644 index 000000000..97d2e7c13 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/InventoryTest.java @@ -0,0 +1,32 @@ +package com.booleanuk.extension; + +import com.booleanuk.core.Inventory; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class InventoryTest { + + @Test + public void testAddStockItem(){ + com.booleanuk.core.Inventory inventory = new com.booleanuk.core.Inventory(); + inventory.addStockItem("BGLP", 1); + inventory.addStockItem("FILE", 3); + Assertions.assertEquals(2, inventory.getStockSize()); + Assertions.assertEquals(3, inventory.getItemStock("FILE")); + Assertions.assertEquals(1, inventory.getItemStock("BGLP")); + } + + @Test + public void testRemoveStockItem(){ + com.booleanuk.core.Inventory inventory = new Inventory(); + inventory.addStockItem("BGLP", 3); + inventory.addStockItem("FILE", 1); + Assertions.assertEquals(2, inventory.getStockSize()); + + inventory.removeStockItem("FILE", 1); + inventory.removeStockItem("BGLP", 2); + Assertions.assertEquals(1, inventory.getStockSize()); + Assertions.assertEquals(1, inventory.getItemStock("BGLP")); + } + +} diff --git a/src/test/java/com/booleanuk/extension/ItemTest.java b/src/test/java/com/booleanuk/extension/ItemTest.java new file mode 100644 index 000000000..f48f418c8 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/ItemTest.java @@ -0,0 +1,48 @@ +package com.booleanuk.extension; + +import com.booleanuk.core.Item; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ItemTest { + + @Test + public void testGetSku(){ + com.booleanuk.core.Item item1 = new com.booleanuk.core.Item("BGLP"); + com.booleanuk.core.Item item2 = new com.booleanuk.core.Item("COFB"); + com.booleanuk.core.Item item3 = new com.booleanuk.core.Item("FILE"); + Assertions.assertEquals("BGLP", item1.getSku()); + Assertions.assertEquals("COFB", item2.getSku()); + Assertions.assertEquals("FILE", item3.getSku()); + } + + @Test + public void testGetName(){ + com.booleanuk.core.Item item1 = new com.booleanuk.core.Item("BGLP"); + com.booleanuk.core.Item item2 = new com.booleanuk.core.Item("COFB"); + com.booleanuk.core.Item item3 = new com.booleanuk.core.Item("FILE"); + Assertions.assertEquals("Bagel", item1.getName()); + Assertions.assertEquals("Coffee", item2.getName()); + Assertions.assertEquals("Filling", item3.getName()); + } + + @Test + public void testGetVariant(){ + com.booleanuk.core.Item item1 = new com.booleanuk.core.Item("BGLP"); + com.booleanuk.core.Item item2 = new com.booleanuk.core.Item("COFB"); + com.booleanuk.core.Item item3 = new com.booleanuk.core.Item("FILE"); + Assertions.assertEquals("Plain", item1.getVariant()); + Assertions.assertEquals("Black", item2.getVariant()); + Assertions.assertEquals("Egg", item3.getVariant()); + } + + @Test + public void testGetPrice(){ + com.booleanuk.core.Item item1 = new com.booleanuk.core.Item("BGLP"); + com.booleanuk.core.Item item2 = new com.booleanuk.core.Item("COFB"); + com.booleanuk.core.Item item3 = new Item("FILE"); + Assertions.assertEquals(0.39f, item1.getPrice()); + Assertions.assertEquals(0.99f, item2.getPrice()); + Assertions.assertEquals(0.12f, item3.getPrice()); + } +}