From d86f89bee6c97c07c36eecc5710ac502ab80768e Mon Sep 17 00:00:00 2001 From: Jessica Silvia Vidal Date: Sat, 25 May 2019 22:12:50 -0400 Subject: [PATCH 1/6] first commit --- .gitignore | 4 + pom.xml | 19 +++++ src/main/java/Basket.java | 35 ++++++++ src/main/java/Item.java | 62 +++++++++++++++ src/main/java/Promotion.java | 36 +++++++++ src/test/java/CheckoutTest.java | 132 +++++++++++++++++++++++++++++++ src/test/java/CheckoutTest2.java | 132 +++++++++++++++++++++++++++++++ 7 files changed, 420 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/Basket.java create mode 100644 src/main/java/Item.java create mode 100644 src/main/java/Promotion.java create mode 100644 src/test/java/CheckoutTest.java create mode 100644 src/test/java/CheckoutTest2.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f01843d --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea/* +.out/ +*.iml +target/ \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..8ef66b7 --- /dev/null +++ b/pom.xml @@ -0,0 +1,19 @@ + + + 4.0.0 + + qa-recruting + hsa + 1.0-SNAPSHOT + + + junit + junit + 4.12 + test + + + + \ No newline at end of file diff --git a/src/main/java/Basket.java b/src/main/java/Basket.java new file mode 100644 index 0000000..4c527ed --- /dev/null +++ b/src/main/java/Basket.java @@ -0,0 +1,35 @@ +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public class Basket { + + private HashMap basketList = new HashMap(); + private double total = 0; + + public void addItems(Item i, Integer quantity){ + basketList.put(i,quantity); + } + + public double checkTotal(){ + + Iterator> it = basketList.entrySet().iterator(); + + while (it.hasNext()) { + Map.Entry pair = it.next(); + Item item = pair.getKey(); + + int quantity = pair.getValue(); + + if (item.getPromotions()!=null){ + total = total + item.checkPromotion(quantity); + }else { + total = total + (quantity * item.getPrice()); + } + } + + return total; + } + + +} diff --git a/src/main/java/Item.java b/src/main/java/Item.java new file mode 100644 index 0000000..f2ae80b --- /dev/null +++ b/src/main/java/Item.java @@ -0,0 +1,62 @@ +public class Item { + + private String name; + private double price; + private Promotion promotions; + + public Item(String name, double price) { + this.name = name; + this.price = price; + } + + public Item(String name, double price, Promotion promotion) { + this.name = name; + this.price = price; + this.promotions = promotion; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + + public Promotion getPromotions() { + return promotions; + } + + public void setPromotions(Promotion promotions) { + this.promotions = promotions; + } + + public double checkPromotion(int quantity){ + + double total = 0; + + if (quantity < this.promotions.getNro_items()){ + total = total + (quantity * this.price); + }else{ + while (quantity >= this.promotions.getNro_items()){ + if(quantity>=this.promotions.getNro_items()){ + total = total + this.promotions.getPrice(); + }else{ + total = total + (quantity * this.price); + } + quantity = quantity-this.promotions.getNro_items(); + } + total = total + (quantity * this.price); + } + + return total; + } +} diff --git a/src/main/java/Promotion.java b/src/main/java/Promotion.java new file mode 100644 index 0000000..c491046 --- /dev/null +++ b/src/main/java/Promotion.java @@ -0,0 +1,36 @@ +public class Promotion { + + private String name; + private int nro_items; + private double price; + + public Promotion(String name, int nro_items, double price) { + this.name = name; + this.nro_items = nro_items; + this.price = price; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNro_items() { + return nro_items; + } + + public void setNro_items(int nro_items) { + this.nro_items = nro_items; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } +} diff --git a/src/test/java/CheckoutTest.java b/src/test/java/CheckoutTest.java new file mode 100644 index 0000000..af9efb9 --- /dev/null +++ b/src/test/java/CheckoutTest.java @@ -0,0 +1,132 @@ +import org.junit.Assert; +import org.junit.Test; + +public class CheckoutTest { + + Promotion promoA = new Promotion("promoA",3,130); + Promotion promoB = new Promotion("promoB",2,45); + + Item itemA = new Item("A",50,promoA); + Item itemB = new Item("B",30,promoB); + Item itemC = new Item("C",20); + Item itemD = new Item("D",15); + + @Test + public void checkPriceA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,1); + + Assert.assertEquals(50,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAB(){ + Basket basket = new Basket(); + + basket.addItems(itemA,1); + basket.addItems(itemB,1); + + Assert.assertEquals(80,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceCDBA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,1); + basket.addItems(itemB,1); + basket.addItems(itemC,1); + basket.addItems(itemD,1); + + Assert.assertEquals(115,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,2); + + Assert.assertEquals(100,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAAA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,3); + + Assert.assertEquals(130,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAAAA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,4 ); + + Assert.assertEquals(180,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAAAAA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,5 ); + + Assert.assertEquals(230,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAAAAAA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,6 ); + + Assert.assertEquals(260,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAAAB(){ + Basket basket = new Basket(); + + basket.addItems(itemA,3 ); + basket.addItems(itemB,1 ); + + Assert.assertEquals(160,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAAABB(){ + Basket basket = new Basket(); + + basket.addItems(itemA,3 ); + basket.addItems(itemB,2 ); + + Assert.assertEquals(175,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAAABBD(){ + Basket basket = new Basket(); + + basket.addItems(itemA,3 ); + basket.addItems(itemB,2 ); + basket.addItems(itemD,1 ); + + Assert.assertEquals(190,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceDABABA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,3 ); + basket.addItems(itemB,2 ); + basket.addItems(itemD,1 ); + + Assert.assertEquals(190,basket.checkTotal(),0.0d); + } + +} diff --git a/src/test/java/CheckoutTest2.java b/src/test/java/CheckoutTest2.java new file mode 100644 index 0000000..a235bbe --- /dev/null +++ b/src/test/java/CheckoutTest2.java @@ -0,0 +1,132 @@ +import org.junit.Assert; +import org.junit.Test; + +public class CheckoutTest2 { + + Promotion promoA = new Promotion("promoA",3,160); + Promotion promoB = new Promotion("promoB",2,175); + + Item itemA = new Item("A",50,promoA); + Item itemB = new Item("B",30,promoB); + Item itemC = new Item("C",20); + Item itemD = new Item("D",15); + + @Test + public void checkPriceA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,1); + + Assert.assertEquals(50,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAB(){ + Basket basket = new Basket(); + + basket.addItems(itemA,1); + basket.addItems(itemB,1); + + Assert.assertEquals(80,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceCDBA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,1); + basket.addItems(itemB,1); + basket.addItems(itemC,1); + basket.addItems(itemD,1); + + Assert.assertEquals(115,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,2); + + Assert.assertEquals(100,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAAA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,3); + + Assert.assertEquals(130,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAAAA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,4 ); + + Assert.assertEquals(180,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAAAAA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,5 ); + + Assert.assertEquals(230,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAAAAAA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,6 ); + + Assert.assertEquals(260,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAAAB(){ + Basket basket = new Basket(); + + basket.addItems(itemA,3 ); + basket.addItems(itemB,1 ); + + Assert.assertEquals(160,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAAABB(){ + Basket basket = new Basket(); + + basket.addItems(itemA,3 ); + basket.addItems(itemB,2 ); + + Assert.assertEquals(175,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceAAABBD(){ + Basket basket = new Basket(); + + basket.addItems(itemA,3 ); + basket.addItems(itemB,2 ); + basket.addItems(itemD,1 ); + + Assert.assertEquals(190,basket.checkTotal(),0.0d); + } + + @Test + public void checkPriceDABABA(){ + Basket basket = new Basket(); + + basket.addItems(itemA,3 ); + basket.addItems(itemB,2 ); + basket.addItems(itemD,1 ); + + Assert.assertEquals(190,basket.checkTotal(),0.0d); + } + +} From 6815aa54aef384167e890c6492088e575cf950e3 Mon Sep 17 00:00:00 2001 From: Jessica Silvia Vidal Date: Mon, 27 May 2019 16:19:22 -0400 Subject: [PATCH 2/6] load promotions by file --- pom.xml | 18 ++++++++ src/main/java/Basket.java | 15 ++----- src/main/java/ListOfItems.java | 60 ++++++++++++++++++++++++++ src/main/resources/listItems.conf | 30 +++++++++++++ src/test/java/CheckoutTest.java | 58 ++++++++++++------------- src/test/java/CheckoutTest2.java | 69 ++++++++++++++---------------- src/test/resources/listItems.conf | 30 +++++++++++++ src/test/resources/listItems2.conf | 30 +++++++++++++ 8 files changed, 232 insertions(+), 78 deletions(-) create mode 100644 src/main/java/ListOfItems.java create mode 100644 src/main/resources/listItems.conf create mode 100644 src/test/resources/listItems.conf create mode 100644 src/test/resources/listItems2.conf diff --git a/pom.xml b/pom.xml index 8ef66b7..a48701a 100644 --- a/pom.xml +++ b/pom.xml @@ -7,6 +7,7 @@ qa-recruting hsa 1.0-SNAPSHOT + junit @@ -14,6 +15,23 @@ 4.12 test + + com.typesafe + config + 1.3.2 + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + \ No newline at end of file diff --git a/src/main/java/Basket.java b/src/main/java/Basket.java index 4c527ed..e6eb9aa 100644 --- a/src/main/java/Basket.java +++ b/src/main/java/Basket.java @@ -1,10 +1,8 @@ import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; public class Basket { - private HashMap basketList = new HashMap(); + private HashMap basketList = new HashMap<>(); private double total = 0; public void addItems(Item i, Integer quantity){ @@ -13,20 +11,13 @@ public void addItems(Item i, Integer quantity){ public double checkTotal(){ - Iterator> it = basketList.entrySet().iterator(); - - while (it.hasNext()) { - Map.Entry pair = it.next(); - Item item = pair.getKey(); - - int quantity = pair.getValue(); - + basketList.forEach((item,quantity) -> { if (item.getPromotions()!=null){ total = total + item.checkPromotion(quantity); }else { total = total + (quantity * item.getPrice()); } - } + }); return total; } diff --git a/src/main/java/ListOfItems.java b/src/main/java/ListOfItems.java new file mode 100644 index 0000000..098e216 --- /dev/null +++ b/src/main/java/ListOfItems.java @@ -0,0 +1,60 @@ +import com.typesafe.config.Config; +import com.typesafe.config.ConfigFactory; +import com.typesafe.config.ConfigObject; +import com.typesafe.config.ConfigValue; + +import java.util.HashMap; + +public class ListOfItems { + + private static Config defaultConfig; + private static HashMap listOfItems; + + private static Config getConfig(String file) { + if (defaultConfig==null) { + defaultConfig = ConfigFactory.parseResources(file); + + } + return defaultConfig; + } + + public static HashMap getListOfItems(String file){ + + if (listOfItems==null) { + + defaultConfig = getConfig(file); + + final ConfigValue configItems = defaultConfig.getObject("products"); + + listOfItems = new HashMap<>(((ConfigObject) configItems).size()); + + ((ConfigObject) configItems).keySet().forEach(pname -> { + + ConfigObject productConfig = ((ConfigObject) configItems).toConfig().getObject(pname); + String productName = productConfig.get("productName").render().replaceAll("^\"|\"$", ""); + String productPrice = productConfig.get("productPrice").render(); + + Item item; + Promotion promotion; + + if (productConfig.containsKey("promotion")){ + ConfigObject promotionConfig = (ConfigObject) productConfig.get("promotion"); + String promoName = promotionConfig.get("promoName").render().replaceAll("^\"|\"$", ""); + String promoNroItems = promotionConfig.get("promoNroItems").render(); + String promoPrice = promotionConfig.get("promoPrice").render(); + promotion = new Promotion(promoName,Integer.parseInt(promoNroItems),Double.parseDouble(promoPrice)); + item = new Item(productName,Double.parseDouble(productPrice),promotion); + }else{ + item = new Item(productName,Double.parseDouble(productPrice)); + } + + listOfItems.put(item.getName(),item); + + }); + + } + return listOfItems; + } + + +} \ No newline at end of file diff --git a/src/main/resources/listItems.conf b/src/main/resources/listItems.conf new file mode 100644 index 0000000..9e74b75 --- /dev/null +++ b/src/main/resources/listItems.conf @@ -0,0 +1,30 @@ +{ + products: { + itemA: { + productName: itemA, + productPrice: 50, + promotion: { + promoName: promoA, + promoNroItems: 3, + promoPrice: 130 + } + }, + itemB: { + productName: itemB, + productPrice: 30, + promotion: { + promoName: promoB, + promoNroItems: 2, + promoPrice: 45 + } + }, + itemC: { + productName: itemC, + productPrice: 20 + }, + itemD: { + productName: itemD, + productPrice: 15 + } + } +} \ No newline at end of file diff --git a/src/test/java/CheckoutTest.java b/src/test/java/CheckoutTest.java index af9efb9..597af11 100644 --- a/src/test/java/CheckoutTest.java +++ b/src/test/java/CheckoutTest.java @@ -1,21 +1,19 @@ import org.junit.Assert; import org.junit.Test; -public class CheckoutTest { +import java.util.HashMap; + - Promotion promoA = new Promotion("promoA",3,130); - Promotion promoB = new Promotion("promoB",2,45); +public class CheckoutTest { - Item itemA = new Item("A",50,promoA); - Item itemB = new Item("B",30,promoB); - Item itemC = new Item("C",20); - Item itemD = new Item("D",15); + HashMap config = ListOfItems.getListOfItems("listItems.conf"); @Test public void checkPriceA(){ - Basket basket = new Basket(); - basket.addItems(itemA,1); + Basket basket = new Basket(); + + basket.addItems(config.get("itemA"),1); Assert.assertEquals(50,basket.checkTotal(),0.0d); } @@ -24,8 +22,8 @@ public void checkPriceA(){ public void checkPriceAB(){ Basket basket = new Basket(); - basket.addItems(itemA,1); - basket.addItems(itemB,1); + basket.addItems(config.get("itemA"),1); + basket.addItems(config.get("itemB"),1); Assert.assertEquals(80,basket.checkTotal(),0.0d); } @@ -34,10 +32,10 @@ public void checkPriceAB(){ public void checkPriceCDBA(){ Basket basket = new Basket(); - basket.addItems(itemA,1); - basket.addItems(itemB,1); - basket.addItems(itemC,1); - basket.addItems(itemD,1); + basket.addItems(config.get("itemA"),1); + basket.addItems(config.get("itemB"),1); + basket.addItems(config.get("itemC"),1); + basket.addItems(config.get("itemD"),1); Assert.assertEquals(115,basket.checkTotal(),0.0d); } @@ -46,7 +44,7 @@ public void checkPriceCDBA(){ public void checkPriceAA(){ Basket basket = new Basket(); - basket.addItems(itemA,2); + basket.addItems(config.get("itemA"),2); Assert.assertEquals(100,basket.checkTotal(),0.0d); } @@ -55,7 +53,7 @@ public void checkPriceAA(){ public void checkPriceAAA(){ Basket basket = new Basket(); - basket.addItems(itemA,3); + basket.addItems(config.get("itemA"),3); Assert.assertEquals(130,basket.checkTotal(),0.0d); } @@ -64,7 +62,7 @@ public void checkPriceAAA(){ public void checkPriceAAAA(){ Basket basket = new Basket(); - basket.addItems(itemA,4 ); + basket.addItems(config.get("itemA"),4 ); Assert.assertEquals(180,basket.checkTotal(),0.0d); } @@ -73,7 +71,7 @@ public void checkPriceAAAA(){ public void checkPriceAAAAA(){ Basket basket = new Basket(); - basket.addItems(itemA,5 ); + basket.addItems(config.get("itemA"),5 ); Assert.assertEquals(230,basket.checkTotal(),0.0d); } @@ -82,7 +80,7 @@ public void checkPriceAAAAA(){ public void checkPriceAAAAAA(){ Basket basket = new Basket(); - basket.addItems(itemA,6 ); + basket.addItems(config.get("itemA"),6 ); Assert.assertEquals(260,basket.checkTotal(),0.0d); } @@ -91,8 +89,8 @@ public void checkPriceAAAAAA(){ public void checkPriceAAAB(){ Basket basket = new Basket(); - basket.addItems(itemA,3 ); - basket.addItems(itemB,1 ); + basket.addItems(config.get("itemA"),3 ); + basket.addItems(config.get("itemB"),1 ); Assert.assertEquals(160,basket.checkTotal(),0.0d); } @@ -101,8 +99,8 @@ public void checkPriceAAAB(){ public void checkPriceAAABB(){ Basket basket = new Basket(); - basket.addItems(itemA,3 ); - basket.addItems(itemB,2 ); + basket.addItems(config.get("itemA"),3 ); + basket.addItems(config.get("itemB"),2 ); Assert.assertEquals(175,basket.checkTotal(),0.0d); } @@ -111,9 +109,9 @@ public void checkPriceAAABB(){ public void checkPriceAAABBD(){ Basket basket = new Basket(); - basket.addItems(itemA,3 ); - basket.addItems(itemB,2 ); - basket.addItems(itemD,1 ); + basket.addItems(config.get("itemA"),3 ); + basket.addItems(config.get("itemB"),2 ); + basket.addItems(config.get("itemD"),1 ); Assert.assertEquals(190,basket.checkTotal(),0.0d); } @@ -122,9 +120,9 @@ public void checkPriceAAABBD(){ public void checkPriceDABABA(){ Basket basket = new Basket(); - basket.addItems(itemA,3 ); - basket.addItems(itemB,2 ); - basket.addItems(itemD,1 ); + basket.addItems(config.get("itemA"),3 ); + basket.addItems(config.get("itemB"),2 ); + basket.addItems(config.get("itemD"),1 ); Assert.assertEquals(190,basket.checkTotal(),0.0d); } diff --git a/src/test/java/CheckoutTest2.java b/src/test/java/CheckoutTest2.java index a235bbe..99c9772 100644 --- a/src/test/java/CheckoutTest2.java +++ b/src/test/java/CheckoutTest2.java @@ -1,21 +1,18 @@ import org.junit.Assert; import org.junit.Test; +import java.util.HashMap; + public class CheckoutTest2 { - Promotion promoA = new Promotion("promoA",3,160); - Promotion promoB = new Promotion("promoB",2,175); + HashMap config = ListOfItems.getListOfItems("listItems2.conf"); - Item itemA = new Item("A",50,promoA); - Item itemB = new Item("B",30,promoB); - Item itemC = new Item("C",20); - Item itemD = new Item("D",15); @Test public void checkPriceA(){ Basket basket = new Basket(); - basket.addItems(itemA,1); + basket.addItems(config.get("itemA"),1); Assert.assertEquals(50,basket.checkTotal(),0.0d); } @@ -24,8 +21,8 @@ public void checkPriceA(){ public void checkPriceAB(){ Basket basket = new Basket(); - basket.addItems(itemA,1); - basket.addItems(itemB,1); + basket.addItems(config.get("itemA"),1); + basket.addItems(config.get("itemB"),1); Assert.assertEquals(80,basket.checkTotal(),0.0d); } @@ -34,10 +31,10 @@ public void checkPriceAB(){ public void checkPriceCDBA(){ Basket basket = new Basket(); - basket.addItems(itemA,1); - basket.addItems(itemB,1); - basket.addItems(itemC,1); - basket.addItems(itemD,1); + basket.addItems(config.get("itemA"),1); + basket.addItems(config.get("itemB"),1); + basket.addItems(config.get("itemC"),1); + basket.addItems(config.get("itemD"),1); Assert.assertEquals(115,basket.checkTotal(),0.0d); } @@ -46,7 +43,7 @@ public void checkPriceCDBA(){ public void checkPriceAA(){ Basket basket = new Basket(); - basket.addItems(itemA,2); + basket.addItems(config.get("itemA"),2); Assert.assertEquals(100,basket.checkTotal(),0.0d); } @@ -55,78 +52,78 @@ public void checkPriceAA(){ public void checkPriceAAA(){ Basket basket = new Basket(); - basket.addItems(itemA,3); + basket.addItems(config.get("itemA"),3); - Assert.assertEquals(130,basket.checkTotal(),0.0d); + Assert.assertEquals(160,basket.checkTotal(),0.0d); } @Test public void checkPriceAAAA(){ Basket basket = new Basket(); - basket.addItems(itemA,4 ); + basket.addItems(config.get("itemA"),4 ); - Assert.assertEquals(180,basket.checkTotal(),0.0d); + Assert.assertEquals(210,basket.checkTotal(),0.0d); } @Test public void checkPriceAAAAA(){ Basket basket = new Basket(); - basket.addItems(itemA,5 ); + basket.addItems(config.get("itemA"),5 ); - Assert.assertEquals(230,basket.checkTotal(),0.0d); + Assert.assertEquals(260,basket.checkTotal(),0.0d); } @Test public void checkPriceAAAAAA(){ Basket basket = new Basket(); - basket.addItems(itemA,6 ); + basket.addItems(config.get("itemA"),6 ); - Assert.assertEquals(260,basket.checkTotal(),0.0d); + Assert.assertEquals(320,basket.checkTotal(),0.0d); } @Test public void checkPriceAAAB(){ Basket basket = new Basket(); - basket.addItems(itemA,3 ); - basket.addItems(itemB,1 ); + basket.addItems(config.get("itemA"),3 ); + basket.addItems(config.get("itemB"),1 ); - Assert.assertEquals(160,basket.checkTotal(),0.0d); + Assert.assertEquals(190,basket.checkTotal(),0.0d); } @Test public void checkPriceAAABB(){ Basket basket = new Basket(); - basket.addItems(itemA,3 ); - basket.addItems(itemB,2 ); + basket.addItems(config.get("itemA"),3 ); + basket.addItems(config.get("itemB"),2 ); - Assert.assertEquals(175,basket.checkTotal(),0.0d); + Assert.assertEquals(335,basket.checkTotal(),0.0d); } @Test public void checkPriceAAABBD(){ Basket basket = new Basket(); - basket.addItems(itemA,3 ); - basket.addItems(itemB,2 ); - basket.addItems(itemD,1 ); + basket.addItems(config.get("itemA"),3 ); + basket.addItems(config.get("itemB"),2 ); + basket.addItems(config.get("itemD"),1 ); - Assert.assertEquals(190,basket.checkTotal(),0.0d); + Assert.assertEquals(350,basket.checkTotal(),0.0d); } @Test public void checkPriceDABABA(){ Basket basket = new Basket(); - basket.addItems(itemA,3 ); - basket.addItems(itemB,2 ); - basket.addItems(itemD,1 ); + basket.addItems(config.get("itemA"),3 ); + basket.addItems(config.get("itemB"),2 ); + basket.addItems(config.get("itemD"),1 ); - Assert.assertEquals(190,basket.checkTotal(),0.0d); + Assert.assertEquals(350,basket.checkTotal(),0.0d); } } diff --git a/src/test/resources/listItems.conf b/src/test/resources/listItems.conf new file mode 100644 index 0000000..9e74b75 --- /dev/null +++ b/src/test/resources/listItems.conf @@ -0,0 +1,30 @@ +{ + products: { + itemA: { + productName: itemA, + productPrice: 50, + promotion: { + promoName: promoA, + promoNroItems: 3, + promoPrice: 130 + } + }, + itemB: { + productName: itemB, + productPrice: 30, + promotion: { + promoName: promoB, + promoNroItems: 2, + promoPrice: 45 + } + }, + itemC: { + productName: itemC, + productPrice: 20 + }, + itemD: { + productName: itemD, + productPrice: 15 + } + } +} \ No newline at end of file diff --git a/src/test/resources/listItems2.conf b/src/test/resources/listItems2.conf new file mode 100644 index 0000000..14b75ed --- /dev/null +++ b/src/test/resources/listItems2.conf @@ -0,0 +1,30 @@ +{ + products: { + itemA: { + productName: itemA, + productPrice: 50, + promotion: { + promoName: promoA, + promoNroItems: 3, + promoPrice: 160 + } + }, + itemB: { + productName: itemB, + productPrice: 30, + promotion: { + promoName: promoB, + promoNroItems: 2, + promoPrice: 175 + } + }, + itemC: { + productName: itemC, + productPrice: 20 + }, + itemD: { + productName: itemD, + productPrice: 15 + } + } +} \ No newline at end of file From 387efe096454df14e1d6e5f0a9b9cee708ad0212 Mon Sep 17 00:00:00 2001 From: Jessica Silvia Vidal Date: Tue, 28 May 2019 23:38:04 -0400 Subject: [PATCH 3/6] change product name and additems method --- src/main/java/Basket.java | 44 +++++- src/main/java/Catalog.java | 7 + .../{ListOfItems.java => ConfigCatalog.java} | 20 ++- src/main/java/Item.java | 2 +- src/main/java/Rules.java | 5 + src/test/java/CheckoutTest.java | 129 +++-------------- src/test/java/CheckoutTest2.java | 130 +++--------------- .../{listItems.conf => catalog.conf} | 8 +- .../{listItems2.conf => catalog2.conf} | 8 +- 9 files changed, 111 insertions(+), 242 deletions(-) create mode 100644 src/main/java/Catalog.java rename src/main/java/{ListOfItems.java => ConfigCatalog.java} (80%) create mode 100644 src/main/java/Rules.java rename src/test/resources/{listItems.conf => catalog.conf} (79%) rename src/test/resources/{listItems2.conf => catalog2.conf} (79%) diff --git a/src/main/java/Basket.java b/src/main/java/Basket.java index e6eb9aa..7a1f34f 100644 --- a/src/main/java/Basket.java +++ b/src/main/java/Basket.java @@ -2,15 +2,28 @@ public class Basket { - private HashMap basketList = new HashMap<>(); - private double total = 0; - - public void addItems(Item i, Integer quantity){ - basketList.put(i,quantity); + private HashMap config; + private HashMap basketList; + private double total; + + public Basket(HashMap config) { + this.config = config; + basketList = new HashMap<>(); + total = 0; } - public double checkTotal(){ + private void addItemsToBasket(String productName, Integer quantity){ + Item item = config.get(productName); + if(basketList.get(item) != null){ + int aux = basketList.get(item).intValue(); + basketList.put(item,++aux); + }else{ + quantity = 1; + basketList.put(item,quantity); + } + } + private double checkTotal(){ basketList.forEach((item,quantity) -> { if (item.getPromotions()!=null){ total = total + item.checkPromotion(quantity); @@ -22,5 +35,24 @@ public double checkTotal(){ return total; } + public double price(String listOfItems){ + + basketList = new HashMap<>(); + total = 0; + + char[] arrayItems = listOfItems.toCharArray(); + + int quantity = 1; + + if (arrayItems.length != 0){ + for (char sku:arrayItems) { + String productName = String.valueOf(sku); + addItemsToBasket(productName,quantity); + } + } + + return checkTotal(); + } + } diff --git a/src/main/java/Catalog.java b/src/main/java/Catalog.java new file mode 100644 index 0000000..5b04488 --- /dev/null +++ b/src/main/java/Catalog.java @@ -0,0 +1,7 @@ +import java.util.HashMap; + +interface Catalog { + + public HashMap getListOfItems(String file); + +} \ No newline at end of file diff --git a/src/main/java/ListOfItems.java b/src/main/java/ConfigCatalog.java similarity index 80% rename from src/main/java/ListOfItems.java rename to src/main/java/ConfigCatalog.java index 098e216..313d866 100644 --- a/src/main/java/ListOfItems.java +++ b/src/main/java/ConfigCatalog.java @@ -5,28 +5,28 @@ import java.util.HashMap; -public class ListOfItems { +public class ConfigCatalog implements Catalog { private static Config defaultConfig; - private static HashMap listOfItems; + private static HashMap catalog; private static Config getConfig(String file) { if (defaultConfig==null) { - defaultConfig = ConfigFactory.parseResources(file); + defaultConfig = ConfigFactory.parseResources(file); } return defaultConfig; } - public static HashMap getListOfItems(String file){ + public HashMap getListOfItems(String file){ - if (listOfItems==null) { + if (catalog ==null) { defaultConfig = getConfig(file); final ConfigValue configItems = defaultConfig.getObject("products"); - listOfItems = new HashMap<>(((ConfigObject) configItems).size()); + catalog = new HashMap<>(((ConfigObject) configItems).size()); ((ConfigObject) configItems).keySet().forEach(pname -> { @@ -48,13 +48,11 @@ public static HashMap getListOfItems(String file){ item = new Item(productName,Double.parseDouble(productPrice)); } - listOfItems.put(item.getName(),item); + catalog.put(item.getName(),item); }); } - return listOfItems; + return catalog; } - - -} \ No newline at end of file +} diff --git a/src/main/java/Item.java b/src/main/java/Item.java index f2ae80b..1f6997d 100644 --- a/src/main/java/Item.java +++ b/src/main/java/Item.java @@ -1,4 +1,4 @@ -public class Item { +public class Item implements Rules{ private String name; private double price; diff --git a/src/main/java/Rules.java b/src/main/java/Rules.java new file mode 100644 index 0000000..0f47b19 --- /dev/null +++ b/src/main/java/Rules.java @@ -0,0 +1,5 @@ +public interface Rules { + + double checkPromotion(int quantity); + +} diff --git a/src/test/java/CheckoutTest.java b/src/test/java/CheckoutTest.java index 597af11..9a8312d 100644 --- a/src/test/java/CheckoutTest.java +++ b/src/test/java/CheckoutTest.java @@ -1,4 +1,5 @@ import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; import java.util.HashMap; @@ -6,125 +7,37 @@ public class CheckoutTest { - HashMap config = ListOfItems.getListOfItems("listItems.conf"); + static Basket basket; - @Test - public void checkPriceA(){ - - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),1); - - Assert.assertEquals(50,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceAB(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),1); - basket.addItems(config.get("itemB"),1); - - Assert.assertEquals(80,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceCDBA(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),1); - basket.addItems(config.get("itemB"),1); - basket.addItems(config.get("itemC"),1); - basket.addItems(config.get("itemD"),1); - - Assert.assertEquals(115,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceAA(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),2); - - Assert.assertEquals(100,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceAAA(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),3); - - Assert.assertEquals(130,basket.checkTotal(),0.0d); - } + @BeforeClass + public static void beforeAllTestMethods() { - @Test - public void checkPriceAAAA(){ - Basket basket = new Basket(); + ConfigCatalog loadCatalog = new ConfigCatalog(); - basket.addItems(config.get("itemA"),4 ); + HashMap config = loadCatalog.getListOfItems("catalog.conf"); - Assert.assertEquals(180,basket.checkTotal(),0.0d); + basket = new Basket(config); } @Test - public void checkPriceAAAAA(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),5 ); - - Assert.assertEquals(230,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceAAAAAA(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),6 ); - - Assert.assertEquals(260,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceAAAB(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),3 ); - basket.addItems(config.get("itemB"),1 ); - - Assert.assertEquals(160,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceAAABB(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),3 ); - basket.addItems(config.get("itemB"),2 ); - - Assert.assertEquals(175,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceAAABBD(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),3 ); - basket.addItems(config.get("itemB"),2 ); - basket.addItems(config.get("itemD"),1 ); + public void checkPriceA(){ + Assert.assertEquals(0,basket.price(""),0.0d); - Assert.assertEquals(190,basket.checkTotal(),0.0d); - } + Assert.assertEquals(50,basket.price("A"),0.0d); + Assert.assertEquals(80,basket.price("AB"),0.0d); + Assert.assertEquals(115,basket.price("CDBA"),0.0d); - @Test - public void checkPriceDABABA(){ - Basket basket = new Basket(); + Assert.assertEquals(100,basket.price("AA"),0.0d); + Assert.assertEquals(130,basket.price("AAA"),0.0d); + Assert.assertEquals(180,basket.price("AAAA"),0.0d); + Assert.assertEquals(230,basket.price("AAAAA"),0.0d); + Assert.assertEquals(260,basket.price("AAAAAA"),0.0d); - basket.addItems(config.get("itemA"),3 ); - basket.addItems(config.get("itemB"),2 ); - basket.addItems(config.get("itemD"),1 ); + Assert.assertEquals(160,basket.price("AAAB"),0.0d); + Assert.assertEquals(175,basket.price("AAABB"),0.0d); + Assert.assertEquals(190,basket.price("AAABBD"),0.0d); + Assert.assertEquals(190,basket.price("DABABA"),0.0d); - Assert.assertEquals(190,basket.checkTotal(),0.0d); } } diff --git a/src/test/java/CheckoutTest2.java b/src/test/java/CheckoutTest2.java index 99c9772..0f9b8b2 100644 --- a/src/test/java/CheckoutTest2.java +++ b/src/test/java/CheckoutTest2.java @@ -1,129 +1,43 @@ import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; import java.util.HashMap; -public class CheckoutTest2 { - - HashMap config = ListOfItems.getListOfItems("listItems2.conf"); - - - @Test - public void checkPriceA(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),1); - - Assert.assertEquals(50,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceAB(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),1); - basket.addItems(config.get("itemB"),1); - - Assert.assertEquals(80,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceCDBA(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),1); - basket.addItems(config.get("itemB"),1); - basket.addItems(config.get("itemC"),1); - basket.addItems(config.get("itemD"),1); - - Assert.assertEquals(115,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceAA(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),2); - - Assert.assertEquals(100,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceAAA(){ - Basket basket = new Basket(); - basket.addItems(config.get("itemA"),3); - - Assert.assertEquals(160,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceAAAA(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),4 ); - - Assert.assertEquals(210,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceAAAAA(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),5 ); - - Assert.assertEquals(260,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceAAAAAA(){ - Basket basket = new Basket(); +public class CheckoutTest2 { - basket.addItems(config.get("itemA"),6 ); + static Basket basket; - Assert.assertEquals(320,basket.checkTotal(),0.0d); - } + @BeforeClass + public static void beforeAllTestMethods() { - @Test - public void checkPriceAAAB(){ - Basket basket = new Basket(); + ConfigCatalog loadCatalog = new ConfigCatalog(); - basket.addItems(config.get("itemA"),3 ); - basket.addItems(config.get("itemB"),1 ); + HashMap config = loadCatalog.getListOfItems("catalog2.conf"); - Assert.assertEquals(190,basket.checkTotal(),0.0d); + basket = new Basket(config); } @Test - public void checkPriceAAABB(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),3 ); - basket.addItems(config.get("itemB"),2 ); - - Assert.assertEquals(335,basket.checkTotal(),0.0d); - } - - @Test - public void checkPriceAAABBD(){ - Basket basket = new Basket(); - - basket.addItems(config.get("itemA"),3 ); - basket.addItems(config.get("itemB"),2 ); - basket.addItems(config.get("itemD"),1 ); + public void checkPriceA(){ + Assert.assertEquals(0,basket.price(""),0.0d); - Assert.assertEquals(350,basket.checkTotal(),0.0d); - } + Assert.assertEquals(50,basket.price("A"),0.0d); + Assert.assertEquals(80,basket.price("AB"),0.0d); + Assert.assertEquals(115,basket.price("CDBA"),0.0d); - @Test - public void checkPriceDABABA(){ - Basket basket = new Basket(); + Assert.assertEquals(100,basket.price("AA"),0.0d); + Assert.assertEquals(160,basket.price("AAA"),0.0d); + Assert.assertEquals(210,basket.price("AAAA"),0.0d); + Assert.assertEquals(260,basket.price("AAAAA"),0.0d); + Assert.assertEquals(320,basket.price("AAAAAA"),0.0d); - basket.addItems(config.get("itemA"),3 ); - basket.addItems(config.get("itemB"),2 ); - basket.addItems(config.get("itemD"),1 ); + Assert.assertEquals(190,basket.price("AAAB"),0.0d); + Assert.assertEquals(335,basket.price("AAABB"),0.0d); + Assert.assertEquals(350,basket.price("AAABBD"),0.0d); + Assert.assertEquals(350,basket.price("DABABA"),0.0d); - Assert.assertEquals(350,basket.checkTotal(),0.0d); } } diff --git a/src/test/resources/listItems.conf b/src/test/resources/catalog.conf similarity index 79% rename from src/test/resources/listItems.conf rename to src/test/resources/catalog.conf index 9e74b75..ae5d4aa 100644 --- a/src/test/resources/listItems.conf +++ b/src/test/resources/catalog.conf @@ -1,7 +1,7 @@ { products: { itemA: { - productName: itemA, + productName: A, productPrice: 50, promotion: { promoName: promoA, @@ -10,7 +10,7 @@ } }, itemB: { - productName: itemB, + productName: B, productPrice: 30, promotion: { promoName: promoB, @@ -19,11 +19,11 @@ } }, itemC: { - productName: itemC, + productName: C, productPrice: 20 }, itemD: { - productName: itemD, + productName: D, productPrice: 15 } } diff --git a/src/test/resources/listItems2.conf b/src/test/resources/catalog2.conf similarity index 79% rename from src/test/resources/listItems2.conf rename to src/test/resources/catalog2.conf index 14b75ed..dd9df99 100644 --- a/src/test/resources/listItems2.conf +++ b/src/test/resources/catalog2.conf @@ -1,7 +1,7 @@ { products: { itemA: { - productName: itemA, + productName: A, productPrice: 50, promotion: { promoName: promoA, @@ -10,7 +10,7 @@ } }, itemB: { - productName: itemB, + productName: B, productPrice: 30, promotion: { promoName: promoB, @@ -19,11 +19,11 @@ } }, itemC: { - productName: itemC, + productName: C, productPrice: 20 }, itemD: { - productName: itemD, + productName: D, productPrice: 15 } } From 144eaee883d1aef9f29193e92cfe6ab29e663aa1 Mon Sep 17 00:00:00 2001 From: Jessica Silvia Vidal Date: Wed, 29 May 2019 21:31:22 -0400 Subject: [PATCH 4/6] add new rules and whatsapp scenarios --- WhatsApp.md | 53 +++++++++ pom.xml | 20 ++++ .../{Basket.java => BasketFromConfig.java} | 24 ++-- src/main/java/BasketFromRulesApi.java | 112 ++++++++++++++++++ src/main/java/BasketFromRulesYML.java | 77 ++++++++++++ src/main/java/Catalog.java | 7 -- ...figCatalog.java => CatalogFromConfig.java} | 2 +- src/main/java/Item.java | 15 ++- src/main/java/Rules.java | 5 - src/main/java/RulesPromotion.java | 7 ++ .../{listItems.conf => catalog.conf} | 8 +- src/main/resources/catalog2.conf | 30 +++++ src/main/resources/rules.yml | 41 +++++++ src/test/java/CheckoutTest.java | 42 +++---- src/test/java/CheckoutTest2.java | 40 +++---- src/test/java/CheckoutTest3.java | 38 ++++++ src/test/java/CheckoutTest4.java | 38 ++++++ src/test/resources/rules.yml | 35 ++++++ 18 files changed, 524 insertions(+), 70 deletions(-) create mode 100644 WhatsApp.md rename src/main/java/{Basket.java => BasketFromConfig.java} (63%) create mode 100644 src/main/java/BasketFromRulesApi.java create mode 100644 src/main/java/BasketFromRulesYML.java delete mode 100644 src/main/java/Catalog.java rename src/main/java/{ConfigCatalog.java => CatalogFromConfig.java} (97%) delete mode 100644 src/main/java/Rules.java create mode 100644 src/main/java/RulesPromotion.java rename src/main/resources/{listItems.conf => catalog.conf} (79%) create mode 100644 src/main/resources/catalog2.conf create mode 100644 src/main/resources/rules.yml create mode 100644 src/test/java/CheckoutTest3.java create mode 100644 src/test/java/CheckoutTest4.java create mode 100644 src/test/resources/rules.yml diff --git a/WhatsApp.md b/WhatsApp.md new file mode 100644 index 0000000..a399f27 --- /dev/null +++ b/WhatsApp.md @@ -0,0 +1,53 @@ +### WhatsAPP ### + +Feature: Mute notification for + In order to test mute notification + As an user + I want to validate if we can mute the notifications. + + Scenario: Register Whatsapp Number + Given App Whatsapp installed on the Mobile Phone + When the user click on the app icon + And the mobile number is valid + Then enter the mobile number on the app + And receive the authentication code + + Scenario: Mute Notifications + Given A valid number with a channel group added before. + When the user click on chats tab + And click on the group chat + And the user click on the three dots right button + And click on Mute Notifications + Then enter the period of time to be muted + And click on OK button + +Feature: Starred Messages + In order to test starred messages + As an user + I want to validate if we can see the starred messages. + + Scenario: Starred Messages + Given App Whatsapp installed on the Mobile Phone and Registered + When the user click on chats tab + And click on the group chat + Then click on any message and hold the message + And click on the star icon + + Scenario: See Starred Messages + Given A user with starred messages + When the user click on the three dots right button + And the user click on Starred Messages + Then see the messages starred before. + +Feature: Search + In order to test search + As an user + I want to validate if we can get a list of words searched. + + Scenario: Search + Given App Whatsapp installed on the Mobile Phone and Registered + When the user click on search button on the right corner + Then enter any word to search + And while typing the word it should appear on the list. + + diff --git a/pom.xml b/pom.xml index a48701a..082d2c3 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,26 @@ config 1.3.2 + + org.jeasy + easy-rules-core + 3.3.0 + + + org.jeasy + easy-rules-mvel + 3.3.0 + + + org.slf4j + slf4j-api + 1.7.5 + + + org.slf4j + slf4j-simple + 1.6.4 + diff --git a/src/main/java/Basket.java b/src/main/java/BasketFromConfig.java similarity index 63% rename from src/main/java/Basket.java rename to src/main/java/BasketFromConfig.java index 7a1f34f..2fbade4 100644 --- a/src/main/java/Basket.java +++ b/src/main/java/BasketFromConfig.java @@ -1,29 +1,31 @@ import java.util.HashMap; -public class Basket { +public class BasketFromConfig implements RulesPromotion{ private HashMap config; private HashMap basketList; private double total; - public Basket(HashMap config) { + public BasketFromConfig(HashMap config) { this.config = config; basketList = new HashMap<>(); total = 0; } - private void addItemsToBasket(String productName, Integer quantity){ - Item item = config.get(productName); - if(basketList.get(item) != null){ - int aux = basketList.get(item).intValue(); - basketList.put(item,++aux); - }else{ - quantity = 1; - basketList.put(item,quantity); + public void addItemsToBasket(String productName, Integer quantity){ + if(!productName.equals("")){ + Item item = config.get(productName); + if(basketList.get(item) != null){ + int aux = basketList.get(item).intValue(); + basketList.put(item,++aux); + }else{ + quantity = 1; + basketList.put(item,quantity); + } } } - private double checkTotal(){ + public double checkTotal(){ basketList.forEach((item,quantity) -> { if (item.getPromotions()!=null){ total = total + item.checkPromotion(quantity); diff --git a/src/main/java/BasketFromRulesApi.java b/src/main/java/BasketFromRulesApi.java new file mode 100644 index 0000000..ff62d0a --- /dev/null +++ b/src/main/java/BasketFromRulesApi.java @@ -0,0 +1,112 @@ +import org.jeasy.rules.api.Facts; +import org.jeasy.rules.api.Rule; +import org.jeasy.rules.api.Rules; +import org.jeasy.rules.api.RulesEngine; +import org.jeasy.rules.core.DefaultRulesEngine; +import org.jeasy.rules.mvel.MVELRule; + +import java.util.HashMap; + + +public class BasketFromRulesApi implements RulesPromotion{ + + Rules rules; + private HashMap basketList; + private double total; + + public BasketFromRulesApi(){ + + basketList = new HashMap<>(); + total = 0; + + Rule itemA = new MVELRule() + .name("item A") + .description("1 item A for 50") + .when("item.getName() == 'A'") + .then("item.setPrice(item.getQuantity() * 50)"); + + Rule itemB = new MVELRule() + .name("item B") + .description("1 item B for 30") + .when("item.getName() == 'B'") + .then("item.setPrice(item.getQuantity() * 30)"); + + Rule itemC = new MVELRule() + .name("item C") + .description("1 item C for 20") + .when("item.getName() == 'C'") + .then("item.setPrice(item.getQuantity() * 20)"); + + Rule itemD = new MVELRule() + .name("item D") + .description("1 item D for 15") + .when("item.getName() == 'D'") + .then("item.setPrice(item.getQuantity() * 15)"); + + Rule promoA = new MVELRule() + .name("promo A") + .description("3 item A for 130") + .when("item.getName().equals('A') && item.getQuantity() / 3 >= 1") + .then("int q = item.getQuantity() / 3; item.setPrice(item.getPrice() - q * 20)"); + + Rule promoB = new MVELRule() + .name("promo B") + .description("2 item b for 45") + .when("item.getName().equals('B') && item.getQuantity() / 2 >= 1") + .then("int q = item.getQuantity() /2; item.setPrice(item.getPrice() - q * 15)"); + + + + rules = new Rules(); + rules.register(itemA); + rules.register(itemB); + rules.register(itemC); + rules.register(itemD); + rules.register(promoA); + rules.register(promoB); + + } + + private double calculatePrice(Item item){ + RulesEngine rulesEngine = new DefaultRulesEngine(); + Facts facts = new Facts(); + + facts.put("item", item); + rulesEngine.fire(rules, facts); + + return item.getPrice(); + } + + public void addItemToBasket(String productName) { + Item scannedItem = new Item(productName); + Item item = basketList.get(scannedItem.getName()); + if (item == null) { + scannedItem.setQuantity(1); + basketList.put(productName, scannedItem); + } else { + Integer quantity = item.getQuantity(); + item.setQuantity(++quantity); + } + + } + + public double checkTotal(){ + + for (Item item : basketList.values()) { + total = total + calculatePrice(item); + } + return total; + + } + + public double price(String productName) { + basketList = new HashMap<>(); + total = 0; + + for (int i = 0; i < productName.length(); i++) { + addItemToBasket(productName.substring(i, i + 1)); + } + return checkTotal(); + + } +} diff --git a/src/main/java/BasketFromRulesYML.java b/src/main/java/BasketFromRulesYML.java new file mode 100644 index 0000000..3468dc6 --- /dev/null +++ b/src/main/java/BasketFromRulesYML.java @@ -0,0 +1,77 @@ +import org.jeasy.rules.api.Facts; +import org.jeasy.rules.api.Rules; +import org.jeasy.rules.api.RulesEngine; +import org.jeasy.rules.core.DefaultRulesEngine; +import org.jeasy.rules.mvel.MVELRuleFactory; +import org.jeasy.rules.support.YamlRuleDefinitionReader; + +import java.io.FileReader; +import java.util.HashMap; + + +public class BasketFromRulesYML implements RulesPromotion{ + + Rules rules; + private HashMap basketList; + private double total; + + public BasketFromRulesYML(){ + + basketList = new HashMap<>(); + total = 0; + + MVELRuleFactory ruleFactory = new MVELRuleFactory(new YamlRuleDefinitionReader()); + + try { + + rules = ruleFactory.createRules(new FileReader("src/test/resources/rules.yml")); + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + private double calculatePrice(Item item){ + RulesEngine rulesEngine = new DefaultRulesEngine(); + Facts facts = new Facts(); + + facts.put("item", item); + rulesEngine.fire(rules, facts); + + return item.getPrice(); + } + + public void addItemToBasket(String productName) { + Item scannedItem = new Item(productName); + Item item = basketList.get(scannedItem.getName()); + if (item == null) { + scannedItem.setQuantity(1); + basketList.put(productName, scannedItem); + } else { + Integer quantity = item.getQuantity(); + item.setQuantity(++quantity); + } + + } + + public double checkTotal(){ + + for (Item item : basketList.values()) { + total = total + calculatePrice(item); + } + return total; + + } + + public double price(String productName) { + basketList = new HashMap<>(); + total = 0; + + for (int i = 0; i < productName.length(); i++) { + addItemToBasket(productName.substring(i, i + 1)); + } + return checkTotal(); + + } +} diff --git a/src/main/java/Catalog.java b/src/main/java/Catalog.java deleted file mode 100644 index 5b04488..0000000 --- a/src/main/java/Catalog.java +++ /dev/null @@ -1,7 +0,0 @@ -import java.util.HashMap; - -interface Catalog { - - public HashMap getListOfItems(String file); - -} \ No newline at end of file diff --git a/src/main/java/ConfigCatalog.java b/src/main/java/CatalogFromConfig.java similarity index 97% rename from src/main/java/ConfigCatalog.java rename to src/main/java/CatalogFromConfig.java index 313d866..606c26a 100644 --- a/src/main/java/ConfigCatalog.java +++ b/src/main/java/CatalogFromConfig.java @@ -5,7 +5,7 @@ import java.util.HashMap; -public class ConfigCatalog implements Catalog { +public class CatalogFromConfig { private static Config defaultConfig; private static HashMap catalog; diff --git a/src/main/java/Item.java b/src/main/java/Item.java index 1f6997d..388bbda 100644 --- a/src/main/java/Item.java +++ b/src/main/java/Item.java @@ -1,8 +1,9 @@ -public class Item implements Rules{ +public class Item { private String name; private double price; private Promotion promotions; + private int quantity; public Item(String name, double price) { this.name = name; @@ -15,6 +16,10 @@ public Item(String name, double price, Promotion promotion) { this.promotions = promotion; } + public Item(String productName) { + this.name = productName; + } + public String getName() { return name; } @@ -39,6 +44,14 @@ public void setPromotions(Promotion promotions) { this.promotions = promotions; } + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + public double checkPromotion(int quantity){ double total = 0; diff --git a/src/main/java/Rules.java b/src/main/java/Rules.java deleted file mode 100644 index 0f47b19..0000000 --- a/src/main/java/Rules.java +++ /dev/null @@ -1,5 +0,0 @@ -public interface Rules { - - double checkPromotion(int quantity); - -} diff --git a/src/main/java/RulesPromotion.java b/src/main/java/RulesPromotion.java new file mode 100644 index 0000000..b430244 --- /dev/null +++ b/src/main/java/RulesPromotion.java @@ -0,0 +1,7 @@ +public interface RulesPromotion { + + double checkTotal(); + + double price(String items); + +} diff --git a/src/main/resources/listItems.conf b/src/main/resources/catalog.conf similarity index 79% rename from src/main/resources/listItems.conf rename to src/main/resources/catalog.conf index 9e74b75..ae5d4aa 100644 --- a/src/main/resources/listItems.conf +++ b/src/main/resources/catalog.conf @@ -1,7 +1,7 @@ { products: { itemA: { - productName: itemA, + productName: A, productPrice: 50, promotion: { promoName: promoA, @@ -10,7 +10,7 @@ } }, itemB: { - productName: itemB, + productName: B, productPrice: 30, promotion: { promoName: promoB, @@ -19,11 +19,11 @@ } }, itemC: { - productName: itemC, + productName: C, productPrice: 20 }, itemD: { - productName: itemD, + productName: D, productPrice: 15 } } diff --git a/src/main/resources/catalog2.conf b/src/main/resources/catalog2.conf new file mode 100644 index 0000000..dd9df99 --- /dev/null +++ b/src/main/resources/catalog2.conf @@ -0,0 +1,30 @@ +{ + products: { + itemA: { + productName: A, + productPrice: 50, + promotion: { + promoName: promoA, + promoNroItems: 3, + promoPrice: 160 + } + }, + itemB: { + productName: B, + productPrice: 30, + promotion: { + promoName: promoB, + promoNroItems: 2, + promoPrice: 175 + } + }, + itemC: { + productName: C, + productPrice: 20 + }, + itemD: { + productName: D, + productPrice: 15 + } + } +} \ No newline at end of file diff --git a/src/main/resources/rules.yml b/src/main/resources/rules.yml new file mode 100644 index 0000000..0ed78a9 --- /dev/null +++ b/src/main/resources/rules.yml @@ -0,0 +1,41 @@ +name: "Item A for 50" +description: "Item A for 50" +priority: 1 +condition: "item.name == 'A'" +actions: + - "item.setPrice(item.quantity * 50);" +--- +name: "Item B for 30" +description: "Item B for 30" +priority: 1 +condition: "item.name == 'B'" +actions: + - "item.setPrice(item.quantity * 30);" +--- +name: "Item C for 20" +description: "Item C for 20" +priority: 1 +condition: "item.name == 'C'" +actions: + - "item.setPrice(item.quantity * 20);" +--- +name: "Item D for 15" +description: "Item D for 15" +priority: 1 +condition: "item.name == 'D'" +actions: + - "item.setPrice(item.quantity * 15);" +--- +name: "Item A: 3 for 130" +description: "buy three ‘A’s and they’ll cost you $130" +priority: 2 +condition: "item.getName().equals('A') && item.getQuantity() / 3 >= 1" +actions: + - "int quotient = item.getQuantity() / 3; item.setPrice(item.getPrice() - quotient * 20)" +--- +name: "Item B: 2 for 45" +description: "buy two ‘B’s and they’ll cost you $45" +priority: 2 +condition: "item.getName().equals('B') && item.getQuantity() / 2 >= 1" +actions: + - "int quotient = item.getQuantity() / 2; item.setPrice(item.getPrice() - quotient * 15)" \ No newline at end of file diff --git a/src/test/java/CheckoutTest.java b/src/test/java/CheckoutTest.java index 9a8312d..50e1dc3 100644 --- a/src/test/java/CheckoutTest.java +++ b/src/test/java/CheckoutTest.java @@ -7,36 +7,36 @@ public class CheckoutTest { - static Basket basket; + static BasketFromConfig basketFromConfig; @BeforeClass public static void beforeAllTestMethods() { - ConfigCatalog loadCatalog = new ConfigCatalog(); + CatalogFromConfig loadCatalog = new CatalogFromConfig(); - HashMap config = loadCatalog.getListOfItems("catalog.conf"); + HashMap config = loadCatalog.getListOfItems("catalog.conf"); - basket = new Basket(config); + basketFromConfig = new BasketFromConfig(config); } @Test - public void checkPriceA(){ - Assert.assertEquals(0,basket.price(""),0.0d); - - Assert.assertEquals(50,basket.price("A"),0.0d); - Assert.assertEquals(80,basket.price("AB"),0.0d); - Assert.assertEquals(115,basket.price("CDBA"),0.0d); - - Assert.assertEquals(100,basket.price("AA"),0.0d); - Assert.assertEquals(130,basket.price("AAA"),0.0d); - Assert.assertEquals(180,basket.price("AAAA"),0.0d); - Assert.assertEquals(230,basket.price("AAAAA"),0.0d); - Assert.assertEquals(260,basket.price("AAAAAA"),0.0d); - - Assert.assertEquals(160,basket.price("AAAB"),0.0d); - Assert.assertEquals(175,basket.price("AAABB"),0.0d); - Assert.assertEquals(190,basket.price("AAABBD"),0.0d); - Assert.assertEquals(190,basket.price("DABABA"),0.0d); + public void test_totals(){ + Assert.assertEquals(0, basketFromConfig.price(""),0.0d); + + Assert.assertEquals(50, basketFromConfig.price("A"),0.0d); + Assert.assertEquals(80, basketFromConfig.price("AB"),0.0d); + Assert.assertEquals(115, basketFromConfig.price("CDBA"),0.0d); + + Assert.assertEquals(100, basketFromConfig.price("AA"),0.0d); + Assert.assertEquals(130, basketFromConfig.price("AAA"),0.0d); + Assert.assertEquals(180, basketFromConfig.price("AAAA"),0.0d); + Assert.assertEquals(230, basketFromConfig.price("AAAAA"),0.0d); + Assert.assertEquals(260, basketFromConfig.price("AAAAAA"),0.0d); + + Assert.assertEquals(160, basketFromConfig.price("AAAB"),0.0d); + Assert.assertEquals(175, basketFromConfig.price("AAABB"),0.0d); + Assert.assertEquals(190, basketFromConfig.price("AAABBD"),0.0d); + Assert.assertEquals(190, basketFromConfig.price("DABABA"),0.0d); } diff --git a/src/test/java/CheckoutTest2.java b/src/test/java/CheckoutTest2.java index 0f9b8b2..841afd9 100644 --- a/src/test/java/CheckoutTest2.java +++ b/src/test/java/CheckoutTest2.java @@ -7,36 +7,36 @@ public class CheckoutTest2 { - static Basket basket; + static BasketFromConfig basketFromConfig; @BeforeClass public static void beforeAllTestMethods() { - ConfigCatalog loadCatalog = new ConfigCatalog(); + CatalogFromConfig loadCatalog = new CatalogFromConfig(); HashMap config = loadCatalog.getListOfItems("catalog2.conf"); - basket = new Basket(config); + basketFromConfig = new BasketFromConfig(config); } @Test - public void checkPriceA(){ - Assert.assertEquals(0,basket.price(""),0.0d); - - Assert.assertEquals(50,basket.price("A"),0.0d); - Assert.assertEquals(80,basket.price("AB"),0.0d); - Assert.assertEquals(115,basket.price("CDBA"),0.0d); - - Assert.assertEquals(100,basket.price("AA"),0.0d); - Assert.assertEquals(160,basket.price("AAA"),0.0d); - Assert.assertEquals(210,basket.price("AAAA"),0.0d); - Assert.assertEquals(260,basket.price("AAAAA"),0.0d); - Assert.assertEquals(320,basket.price("AAAAAA"),0.0d); - - Assert.assertEquals(190,basket.price("AAAB"),0.0d); - Assert.assertEquals(335,basket.price("AAABB"),0.0d); - Assert.assertEquals(350,basket.price("AAABBD"),0.0d); - Assert.assertEquals(350,basket.price("DABABA"),0.0d); + public void test_totals(){ + Assert.assertEquals(0, basketFromConfig.price(""),0.0d); + + Assert.assertEquals(50, basketFromConfig.price("A"),0.0d); + Assert.assertEquals(80, basketFromConfig.price("AB"),0.0d); + Assert.assertEquals(115, basketFromConfig.price("CDBA"),0.0d); + + Assert.assertEquals(100, basketFromConfig.price("AA"),0.0d); + Assert.assertEquals(160, basketFromConfig.price("AAA"),0.0d); + Assert.assertEquals(210, basketFromConfig.price("AAAA"),0.0d); + Assert.assertEquals(260, basketFromConfig.price("AAAAA"),0.0d); + Assert.assertEquals(320, basketFromConfig.price("AAAAAA"),0.0d); + + Assert.assertEquals(190, basketFromConfig.price("AAAB"),0.0d); + Assert.assertEquals(335, basketFromConfig.price("AAABB"),0.0d); + Assert.assertEquals(350, basketFromConfig.price("AAABBD"),0.0d); + Assert.assertEquals(350, basketFromConfig.price("DABABA"),0.0d); } diff --git a/src/test/java/CheckoutTest3.java b/src/test/java/CheckoutTest3.java new file mode 100644 index 0000000..0ad609f --- /dev/null +++ b/src/test/java/CheckoutTest3.java @@ -0,0 +1,38 @@ +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + + +public class CheckoutTest3 { + + static BasketFromRulesApi rules; + + @BeforeClass + public static void beforeAllTestMethods() { + + rules = new BasketFromRulesApi(); + + } + + @Test + public void test_totals(){ + Assert.assertEquals(0,rules.price(""),0.0d); + + Assert.assertEquals(50,rules.price("A"),0.0d); + Assert.assertEquals(80,rules.price("AB"),0.0d); + Assert.assertEquals(115,rules.price("CDBA"),0.0d); + + Assert.assertEquals(100,rules.price("AA"),0.0d); + Assert.assertEquals(130,rules.price("AAA"),0.0d); + Assert.assertEquals(180,rules.price("AAAA"),0.0d); + Assert.assertEquals(230,rules.price("AAAAA"),0.0d); + Assert.assertEquals(260,rules.price("AAAAAA"),0.0d); + + Assert.assertEquals(160,rules.price("AAAB"),0.0d); + Assert.assertEquals(175,rules.price("AAABB"),0.0d); + Assert.assertEquals(190,rules.price("AAABBD"),0.0d); + Assert.assertEquals(190,rules.price("DABABA"),0.0d); + + } + +} diff --git a/src/test/java/CheckoutTest4.java b/src/test/java/CheckoutTest4.java new file mode 100644 index 0000000..85039a0 --- /dev/null +++ b/src/test/java/CheckoutTest4.java @@ -0,0 +1,38 @@ +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + + +public class CheckoutTest4 { + + static BasketFromRulesYML rules; + + @BeforeClass + public static void beforeAllTestMethods() { + + rules = new BasketFromRulesYML(); + + } + + @Test + public void test_totals(){ + Assert.assertEquals(0,rules.price(""),0.0d); + + Assert.assertEquals(50,rules.price("A"),0.0d); + Assert.assertEquals(80,rules.price("AB"),0.0d); + Assert.assertEquals(115,rules.price("CDBA"),0.0d); + + Assert.assertEquals(100,rules.price("AA"),0.0d); + Assert.assertEquals(130,rules.price("AAA"),0.0d); + Assert.assertEquals(180,rules.price("AAAA"),0.0d); + Assert.assertEquals(230,rules.price("AAAAA"),0.0d); + Assert.assertEquals(260,rules.price("AAAAAA"),0.0d); + + Assert.assertEquals(160,rules.price("AAAB"),0.0d); + Assert.assertEquals(175,rules.price("AAABB"),0.0d); + Assert.assertEquals(190,rules.price("AAABBD"),0.0d); + Assert.assertEquals(190,rules.price("DABABA"),0.0d); + + } + +} diff --git a/src/test/resources/rules.yml b/src/test/resources/rules.yml new file mode 100644 index 0000000..34aa419 --- /dev/null +++ b/src/test/resources/rules.yml @@ -0,0 +1,35 @@ +name: "item A" +description: "1 item A for 50" +condition: "item.getName() == 'A'" +actions: + - "item.setPrice(item.getQuantity() * 50);" +--- +name: "item B" +description: "1 item B for 30" +condition: "item.getName() == 'B'" +actions: + - "item.setPrice(item.getQuantity() * 30);" +--- +name: "item C" +description: "1 item C for 20" +condition: "item.getName() == 'C'" +actions: + - "item.setPrice(item.getQuantity() * 20);" +--- +name: "item D" +description: "1 item D for 15" +condition: "item.getName() == 'D'" +actions: + - "item.setPrice(item.getQuantity() * 15);" +--- +name: "promo A" +description: "3 item A for 130" +condition: "item.getName().equals('A') && item.getQuantity() / 3 >= 1" +actions: + - "int quotient = item.getQuantity() / 3; item.setPrice(item.getPrice() - quotient * 20)" +--- +name: "promo B" +description: "2 item b for 45" +condition: "item.getName().equals('B') && item.getQuantity() / 2 >= 1" +actions: + - "int quotient = item.getQuantity() / 2; item.setPrice(item.getPrice() - quotient * 15)" \ No newline at end of file From 03fec7b152042a9f4171a67e49f8f5b685c33309 Mon Sep 17 00:00:00 2001 From: Jessica Silvia Vidal Date: Fri, 7 Jun 2019 19:39:28 -0300 Subject: [PATCH 5/6] add missing test for rules implementation --- src/main/java/BasketFromRules.java | 142 ++++++++++++++++++++++++++ src/main/java/BasketFromRulesApi.java | 112 -------------------- src/main/java/BasketFromRulesYML.java | 77 -------------- src/test/java/CheckoutTest3.java | 62 ++++++++--- src/test/java/CheckoutTest4.java | 59 ++++++++--- 5 files changed, 231 insertions(+), 221 deletions(-) create mode 100644 src/main/java/BasketFromRules.java delete mode 100644 src/main/java/BasketFromRulesApi.java delete mode 100644 src/main/java/BasketFromRulesYML.java diff --git a/src/main/java/BasketFromRules.java b/src/main/java/BasketFromRules.java new file mode 100644 index 0000000..e2853c7 --- /dev/null +++ b/src/main/java/BasketFromRules.java @@ -0,0 +1,142 @@ +import org.jeasy.rules.api.Facts; +import org.jeasy.rules.api.Rule; +import org.jeasy.rules.api.Rules; +import org.jeasy.rules.api.RulesEngine; +import org.jeasy.rules.core.DefaultRulesEngine; +import org.jeasy.rules.mvel.MVELRule; +import org.jeasy.rules.mvel.MVELRuleFactory; +import org.jeasy.rules.support.YamlRuleDefinitionReader; + +import java.io.FileReader; +import java.util.HashMap; + + +public class BasketFromRules implements RulesPromotion{ + + private HashMap basketList; + private double total; + + private static Rules rules; + + public static Rules getRulesYML() { + + if (rules==null) { + + MVELRuleFactory ruleFactory = new MVELRuleFactory(new YamlRuleDefinitionReader()); + + try { + + rules = ruleFactory.createRules(new FileReader("src/test/resources/rules.yml")); + + } catch (Exception e) { + e.printStackTrace(); + } + } + return rules; + } + public static Rules getRulesAPI() { + + if (rules==null) { + + Rule itemA = new MVELRule() + .name("item A") + .description("1 item A for 50") + .when("item.getName() == 'A'") + .then("item.setPrice(item.getQuantity() * 50)"); + + Rule itemB = new MVELRule() + .name("item B") + .description("1 item B for 30") + .when("item.getName() == 'B'") + .then("item.setPrice(item.getQuantity() * 30)"); + + Rule itemC = new MVELRule() + .name("item C") + .description("1 item C for 20") + .when("item.getName() == 'C'") + .then("item.setPrice(item.getQuantity() * 20)"); + + Rule itemD = new MVELRule() + .name("item D") + .description("1 item D for 15") + .when("item.getName() == 'D'") + .then("item.setPrice(item.getQuantity() * 15)"); + + Rule promoA = new MVELRule() + .name("promo A") + .description("3 item A for 130") + .when("item.getName().equals('A') && item.getQuantity() / 3 >= 1") + .then("int q = item.getQuantity() / 3; item.setPrice(item.getPrice() - q * 20)"); + + Rule promoB = new MVELRule() + .name("promo B") + .description("2 item b for 45") + .when("item.getName().equals('B') && item.getQuantity() / 2 >= 1") + .then("int q = item.getQuantity() /2; item.setPrice(item.getPrice() - q * 15)"); + + + + rules = new Rules(); + rules.register(itemA); + rules.register(itemB); + rules.register(itemC); + rules.register(itemD); + rules.register(promoA); + rules.register(promoB); + } + return rules; + } + + + public BasketFromRules(){ + + basketList = new HashMap<>(); + total = 0; + + } + + private double calculatePrice(Item item){ + RulesEngine rulesEngine = new DefaultRulesEngine(); + Facts facts = new Facts(); + + facts.put("item", item); + rulesEngine.fire(rules, facts); + + return item.getPrice(); + } + + public void addItemToBasket(String productName) { + if (productName.length() != 0){ + Item scannedItem = new Item(productName); + Item item = basketList.get(scannedItem.getName()); + if (item == null) { + scannedItem.setQuantity(1); + basketList.put(productName, scannedItem); + } else { + Integer quantity = item.getQuantity(); + item.setQuantity(++quantity); + } + } + + } + + public double checkTotal(){ + total = 0; + for (Item item : basketList.values()) { + total = total + calculatePrice(item); + } + return total; + + } + + public double price(String productName) { + basketList = new HashMap<>(); + total = 0; + + for (int i = 0; i < productName.length(); i++) { + addItemToBasket(productName.substring(i, i + 1)); + } + return checkTotal(); + + } +} diff --git a/src/main/java/BasketFromRulesApi.java b/src/main/java/BasketFromRulesApi.java deleted file mode 100644 index ff62d0a..0000000 --- a/src/main/java/BasketFromRulesApi.java +++ /dev/null @@ -1,112 +0,0 @@ -import org.jeasy.rules.api.Facts; -import org.jeasy.rules.api.Rule; -import org.jeasy.rules.api.Rules; -import org.jeasy.rules.api.RulesEngine; -import org.jeasy.rules.core.DefaultRulesEngine; -import org.jeasy.rules.mvel.MVELRule; - -import java.util.HashMap; - - -public class BasketFromRulesApi implements RulesPromotion{ - - Rules rules; - private HashMap basketList; - private double total; - - public BasketFromRulesApi(){ - - basketList = new HashMap<>(); - total = 0; - - Rule itemA = new MVELRule() - .name("item A") - .description("1 item A for 50") - .when("item.getName() == 'A'") - .then("item.setPrice(item.getQuantity() * 50)"); - - Rule itemB = new MVELRule() - .name("item B") - .description("1 item B for 30") - .when("item.getName() == 'B'") - .then("item.setPrice(item.getQuantity() * 30)"); - - Rule itemC = new MVELRule() - .name("item C") - .description("1 item C for 20") - .when("item.getName() == 'C'") - .then("item.setPrice(item.getQuantity() * 20)"); - - Rule itemD = new MVELRule() - .name("item D") - .description("1 item D for 15") - .when("item.getName() == 'D'") - .then("item.setPrice(item.getQuantity() * 15)"); - - Rule promoA = new MVELRule() - .name("promo A") - .description("3 item A for 130") - .when("item.getName().equals('A') && item.getQuantity() / 3 >= 1") - .then("int q = item.getQuantity() / 3; item.setPrice(item.getPrice() - q * 20)"); - - Rule promoB = new MVELRule() - .name("promo B") - .description("2 item b for 45") - .when("item.getName().equals('B') && item.getQuantity() / 2 >= 1") - .then("int q = item.getQuantity() /2; item.setPrice(item.getPrice() - q * 15)"); - - - - rules = new Rules(); - rules.register(itemA); - rules.register(itemB); - rules.register(itemC); - rules.register(itemD); - rules.register(promoA); - rules.register(promoB); - - } - - private double calculatePrice(Item item){ - RulesEngine rulesEngine = new DefaultRulesEngine(); - Facts facts = new Facts(); - - facts.put("item", item); - rulesEngine.fire(rules, facts); - - return item.getPrice(); - } - - public void addItemToBasket(String productName) { - Item scannedItem = new Item(productName); - Item item = basketList.get(scannedItem.getName()); - if (item == null) { - scannedItem.setQuantity(1); - basketList.put(productName, scannedItem); - } else { - Integer quantity = item.getQuantity(); - item.setQuantity(++quantity); - } - - } - - public double checkTotal(){ - - for (Item item : basketList.values()) { - total = total + calculatePrice(item); - } - return total; - - } - - public double price(String productName) { - basketList = new HashMap<>(); - total = 0; - - for (int i = 0; i < productName.length(); i++) { - addItemToBasket(productName.substring(i, i + 1)); - } - return checkTotal(); - - } -} diff --git a/src/main/java/BasketFromRulesYML.java b/src/main/java/BasketFromRulesYML.java deleted file mode 100644 index 3468dc6..0000000 --- a/src/main/java/BasketFromRulesYML.java +++ /dev/null @@ -1,77 +0,0 @@ -import org.jeasy.rules.api.Facts; -import org.jeasy.rules.api.Rules; -import org.jeasy.rules.api.RulesEngine; -import org.jeasy.rules.core.DefaultRulesEngine; -import org.jeasy.rules.mvel.MVELRuleFactory; -import org.jeasy.rules.support.YamlRuleDefinitionReader; - -import java.io.FileReader; -import java.util.HashMap; - - -public class BasketFromRulesYML implements RulesPromotion{ - - Rules rules; - private HashMap basketList; - private double total; - - public BasketFromRulesYML(){ - - basketList = new HashMap<>(); - total = 0; - - MVELRuleFactory ruleFactory = new MVELRuleFactory(new YamlRuleDefinitionReader()); - - try { - - rules = ruleFactory.createRules(new FileReader("src/test/resources/rules.yml")); - - } catch (Exception e) { - e.printStackTrace(); - } - - } - - private double calculatePrice(Item item){ - RulesEngine rulesEngine = new DefaultRulesEngine(); - Facts facts = new Facts(); - - facts.put("item", item); - rulesEngine.fire(rules, facts); - - return item.getPrice(); - } - - public void addItemToBasket(String productName) { - Item scannedItem = new Item(productName); - Item item = basketList.get(scannedItem.getName()); - if (item == null) { - scannedItem.setQuantity(1); - basketList.put(productName, scannedItem); - } else { - Integer quantity = item.getQuantity(); - item.setQuantity(++quantity); - } - - } - - public double checkTotal(){ - - for (Item item : basketList.values()) { - total = total + calculatePrice(item); - } - return total; - - } - - public double price(String productName) { - basketList = new HashMap<>(); - total = 0; - - for (int i = 0; i < productName.length(); i++) { - addItemToBasket(productName.substring(i, i + 1)); - } - return checkTotal(); - - } -} diff --git a/src/test/java/CheckoutTest3.java b/src/test/java/CheckoutTest3.java index 0ad609f..de5cad8 100644 --- a/src/test/java/CheckoutTest3.java +++ b/src/test/java/CheckoutTest3.java @@ -1,38 +1,66 @@ +import org.jeasy.rules.api.Rules; import org.junit.Assert; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; public class CheckoutTest3 { - static BasketFromRulesApi rules; - + static Rules rules; + BasketFromRules basket; + @BeforeClass public static void beforeAllTestMethods() { - rules = new BasketFromRulesApi(); - + rules = BasketFromRules.getRulesAPI(); } + @Before + public void beforeEachMethod() { + + basket = new BasketFromRules(); + + } @Test public void test_totals(){ - Assert.assertEquals(0,rules.price(""),0.0d); + Assert.assertEquals(0,basket.price(""),0.0d); - Assert.assertEquals(50,rules.price("A"),0.0d); - Assert.assertEquals(80,rules.price("AB"),0.0d); - Assert.assertEquals(115,rules.price("CDBA"),0.0d); + Assert.assertEquals(50,basket.price("A"),0.0d); + Assert.assertEquals(80,basket.price("AB"),0.0d); + Assert.assertEquals(115,basket.price("CDBA"),0.0d); - Assert.assertEquals(100,rules.price("AA"),0.0d); - Assert.assertEquals(130,rules.price("AAA"),0.0d); - Assert.assertEquals(180,rules.price("AAAA"),0.0d); - Assert.assertEquals(230,rules.price("AAAAA"),0.0d); - Assert.assertEquals(260,rules.price("AAAAAA"),0.0d); + Assert.assertEquals(100,basket.price("AA"),0.0d); + Assert.assertEquals(130,basket.price("AAA"),0.0d); + Assert.assertEquals(180,basket.price("AAAA"),0.0d); + Assert.assertEquals(230,basket.price("AAAAA"),0.0d); + Assert.assertEquals(260,basket.price("AAAAAA"),0.0d); - Assert.assertEquals(160,rules.price("AAAB"),0.0d); - Assert.assertEquals(175,rules.price("AAABB"),0.0d); - Assert.assertEquals(190,rules.price("AAABBD"),0.0d); - Assert.assertEquals(190,rules.price("DABABA"),0.0d); + Assert.assertEquals(160,basket.price("AAAB"),0.0d); + Assert.assertEquals(175,basket.price("AAABB"),0.0d); + Assert.assertEquals(190,basket.price("AAABBD"),0.0d); + Assert.assertEquals(190,basket.price("DABABA"),0.0d); } + @Test + public void test_incremental(){ + basket.addItemToBasket(""); + Assert.assertEquals(0,basket.checkTotal(),0.0d); + + basket.addItemToBasket("A"); + Assert.assertEquals(50,basket.checkTotal(),0.0d); + + basket.addItemToBasket("B"); + Assert.assertEquals(80,basket.checkTotal(),0.0d); + + basket.addItemToBasket("A"); + Assert.assertEquals(130,basket.checkTotal(),0.0d); + + basket.addItemToBasket("A"); + Assert.assertEquals(160,basket.checkTotal(),0.0d); + + basket.addItemToBasket("B"); + Assert.assertEquals(175,basket.checkTotal(),0.0d); + } } diff --git a/src/test/java/CheckoutTest4.java b/src/test/java/CheckoutTest4.java index 85039a0..53fe38a 100644 --- a/src/test/java/CheckoutTest4.java +++ b/src/test/java/CheckoutTest4.java @@ -1,38 +1,67 @@ +import org.jeasy.rules.api.Rules; import org.junit.Assert; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; public class CheckoutTest4 { - static BasketFromRulesYML rules; + static Rules rules; + BasketFromRules basket; @BeforeClass public static void beforeAllTestMethods() { - rules = new BasketFromRulesYML(); + rules = BasketFromRules.getRulesYML(); + } + + @Before + public void beforeEachMethod() { + + basket = new BasketFromRules(); } @Test public void test_totals(){ - Assert.assertEquals(0,rules.price(""),0.0d); + Assert.assertEquals(0,basket.price(""),0.0d); - Assert.assertEquals(50,rules.price("A"),0.0d); - Assert.assertEquals(80,rules.price("AB"),0.0d); - Assert.assertEquals(115,rules.price("CDBA"),0.0d); + Assert.assertEquals(50,basket.price("A"),0.0d); + Assert.assertEquals(80,basket.price("AB"),0.0d); + Assert.assertEquals(115,basket.price("CDBA"),0.0d); - Assert.assertEquals(100,rules.price("AA"),0.0d); - Assert.assertEquals(130,rules.price("AAA"),0.0d); - Assert.assertEquals(180,rules.price("AAAA"),0.0d); - Assert.assertEquals(230,rules.price("AAAAA"),0.0d); - Assert.assertEquals(260,rules.price("AAAAAA"),0.0d); + Assert.assertEquals(100,basket.price("AA"),0.0d); + Assert.assertEquals(130,basket.price("AAA"),0.0d); + Assert.assertEquals(180,basket.price("AAAA"),0.0d); + Assert.assertEquals(230,basket.price("AAAAA"),0.0d); + Assert.assertEquals(260,basket.price("AAAAAA"),0.0d); - Assert.assertEquals(160,rules.price("AAAB"),0.0d); - Assert.assertEquals(175,rules.price("AAABB"),0.0d); - Assert.assertEquals(190,rules.price("AAABBD"),0.0d); - Assert.assertEquals(190,rules.price("DABABA"),0.0d); + Assert.assertEquals(160,basket.price("AAAB"),0.0d); + Assert.assertEquals(175,basket.price("AAABB"),0.0d); + Assert.assertEquals(190,basket.price("AAABBD"),0.0d); + Assert.assertEquals(190,basket.price("DABABA"),0.0d); } + @Test + public void test_incremental(){ + basket.addItemToBasket(""); + Assert.assertEquals(0,basket.checkTotal(),0.0d); + + basket.addItemToBasket("A"); + Assert.assertEquals(50,basket.checkTotal(),0.0d); + + basket.addItemToBasket("B"); + Assert.assertEquals(80,basket.checkTotal(),0.0d); + + basket.addItemToBasket("A"); + Assert.assertEquals(130,basket.checkTotal(),0.0d); + + basket.addItemToBasket("A"); + Assert.assertEquals(160,basket.checkTotal(),0.0d); + + basket.addItemToBasket("B"); + Assert.assertEquals(175,basket.checkTotal(),0.0d); + } } From c66dd76896e9e98bacef6a964b93b4cb715130b0 Mon Sep 17 00:00:00 2001 From: Jessica Silvia Vidal Date: Fri, 7 Jun 2019 20:19:02 -0300 Subject: [PATCH 6/6] add missing test for config implementation --- src/main/java/BasketFromConfig.java | 32 ++++++++------- src/test/java/CheckoutTest.java | 59 +++++++++++++++++++-------- src/test/java/CheckoutTest2.java | 63 +++++++++++++++++++++-------- 3 files changed, 108 insertions(+), 46 deletions(-) diff --git a/src/main/java/BasketFromConfig.java b/src/main/java/BasketFromConfig.java index 2fbade4..72e2559 100644 --- a/src/main/java/BasketFromConfig.java +++ b/src/main/java/BasketFromConfig.java @@ -2,31 +2,37 @@ public class BasketFromConfig implements RulesPromotion{ - private HashMap config; - private HashMap basketList; + private HashMap catalog; + private HashMap basketList; private double total; public BasketFromConfig(HashMap config) { - this.config = config; + this.catalog = config; basketList = new HashMap<>(); total = 0; } - public void addItemsToBasket(String productName, Integer quantity){ + public void addItemToBasket(String productName){ if(!productName.equals("")){ - Item item = config.get(productName); - if(basketList.get(item) != null){ - int aux = basketList.get(item).intValue(); - basketList.put(item,++aux); + Item item = catalog.get(productName); + if(basketList.get(productName) != null){ + int aux = basketList.get(productName).getQuantity(); + item.setQuantity(++aux); + basketList.put(productName,item); }else{ - quantity = 1; - basketList.put(item,quantity); + int quantity = 1; + item.setQuantity(quantity); + basketList.put(productName,item); } } } public double checkTotal(){ - basketList.forEach((item,quantity) -> { + + total = 0; + + basketList.forEach((name,item) -> { + int quantity = item.getQuantity(); if (item.getPromotions()!=null){ total = total + item.checkPromotion(quantity); }else { @@ -44,12 +50,10 @@ public double price(String listOfItems){ char[] arrayItems = listOfItems.toCharArray(); - int quantity = 1; - if (arrayItems.length != 0){ for (char sku:arrayItems) { String productName = String.valueOf(sku); - addItemsToBasket(productName,quantity); + addItemToBasket(productName); } } diff --git a/src/test/java/CheckoutTest.java b/src/test/java/CheckoutTest.java index 50e1dc3..2967518 100644 --- a/src/test/java/CheckoutTest.java +++ b/src/test/java/CheckoutTest.java @@ -1,4 +1,5 @@ import org.junit.Assert; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -7,37 +8,63 @@ public class CheckoutTest { - static BasketFromConfig basketFromConfig; + static BasketFromConfig basket; + static HashMap config; @BeforeClass public static void beforeAllTestMethods() { CatalogFromConfig loadCatalog = new CatalogFromConfig(); + config = loadCatalog.getListOfItems("catalog.conf"); - HashMap config = loadCatalog.getListOfItems("catalog.conf"); + } + + @Before + public void beforeEachMethod() { + + basket = new BasketFromConfig(config); - basketFromConfig = new BasketFromConfig(config); } @Test public void test_totals(){ - Assert.assertEquals(0, basketFromConfig.price(""),0.0d); + Assert.assertEquals(0, basket.price(""),0.0d); - Assert.assertEquals(50, basketFromConfig.price("A"),0.0d); - Assert.assertEquals(80, basketFromConfig.price("AB"),0.0d); - Assert.assertEquals(115, basketFromConfig.price("CDBA"),0.0d); + Assert.assertEquals(50, basket.price("A"),0.0d); + Assert.assertEquals(80, basket.price("AB"),0.0d); + Assert.assertEquals(115, basket.price("CDBA"),0.0d); - Assert.assertEquals(100, basketFromConfig.price("AA"),0.0d); - Assert.assertEquals(130, basketFromConfig.price("AAA"),0.0d); - Assert.assertEquals(180, basketFromConfig.price("AAAA"),0.0d); - Assert.assertEquals(230, basketFromConfig.price("AAAAA"),0.0d); - Assert.assertEquals(260, basketFromConfig.price("AAAAAA"),0.0d); + Assert.assertEquals(100, basket.price("AA"),0.0d); + Assert.assertEquals(130, basket.price("AAA"),0.0d); + Assert.assertEquals(180, basket.price("AAAA"),0.0d); + Assert.assertEquals(230, basket.price("AAAAA"),0.0d); + Assert.assertEquals(260, basket.price("AAAAAA"),0.0d); - Assert.assertEquals(160, basketFromConfig.price("AAAB"),0.0d); - Assert.assertEquals(175, basketFromConfig.price("AAABB"),0.0d); - Assert.assertEquals(190, basketFromConfig.price("AAABBD"),0.0d); - Assert.assertEquals(190, basketFromConfig.price("DABABA"),0.0d); + Assert.assertEquals(160, basket.price("AAAB"),0.0d); + Assert.assertEquals(175, basket.price("AAABB"),0.0d); + Assert.assertEquals(190, basket.price("AAABBD"),0.0d); + Assert.assertEquals(190, basket.price("DABABA"),0.0d); } + @Test + public void test_incremental(){ + basket.addItemToBasket(""); + Assert.assertEquals(0,basket.checkTotal(),0.0d); + + basket.addItemToBasket("A"); + Assert.assertEquals(50,basket.checkTotal(),0.0d); + + basket.addItemToBasket("B"); + Assert.assertEquals(80,basket.checkTotal(),0.0d); + + basket.addItemToBasket("A"); + Assert.assertEquals(130,basket.checkTotal(),0.0d); + + basket.addItemToBasket("A"); + Assert.assertEquals(160,basket.checkTotal(),0.0d); + + basket.addItemToBasket("B"); + Assert.assertEquals(175,basket.checkTotal(),0.0d); + } } diff --git a/src/test/java/CheckoutTest2.java b/src/test/java/CheckoutTest2.java index 841afd9..403dc2f 100644 --- a/src/test/java/CheckoutTest2.java +++ b/src/test/java/CheckoutTest2.java @@ -1,4 +1,5 @@ import org.junit.Assert; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -7,37 +8,67 @@ public class CheckoutTest2 { - static BasketFromConfig basketFromConfig; + static BasketFromConfig basket; + static HashMap config; @BeforeClass public static void beforeAllTestMethods() { CatalogFromConfig loadCatalog = new CatalogFromConfig(); + config = loadCatalog.getListOfItems("catalog2.conf"); - HashMap config = loadCatalog.getListOfItems("catalog2.conf"); + } + + @Before + public void beforeEachMethod() { + + basket = new BasketFromConfig(config); - basketFromConfig = new BasketFromConfig(config); } @Test public void test_totals(){ - Assert.assertEquals(0, basketFromConfig.price(""),0.0d); + Assert.assertEquals(0, basket.price(""),0.0d); + + Assert.assertEquals(50, basket.price("A"),0.0d); + Assert.assertEquals(80, basket.price("AB"),0.0d); + Assert.assertEquals(115, basket.price("CDBA"),0.0d); + + Assert.assertEquals(100, basket.price("AA"),0.0d); + Assert.assertEquals(160, basket.price("AAA"),0.0d); + Assert.assertEquals(210, basket.price("AAAA"),0.0d); + Assert.assertEquals(260, basket.price("AAAAA"),0.0d); + Assert.assertEquals(320, basket.price("AAAAAA"),0.0d); + + Assert.assertEquals(190, basket.price("AAAB"),0.0d); + Assert.assertEquals(335, basket.price("AAABB"),0.0d); + Assert.assertEquals(350, basket.price("AAABBD"),0.0d); + Assert.assertEquals(350, basket.price("DABABA"),0.0d); + + } + + @Test + public void test_incremental(){ + basket.addItemToBasket(""); + Assert.assertEquals(0,basket.checkTotal(),0.0d); + + basket.addItemToBasket("A"); + Assert.assertEquals(50,basket.checkTotal(),0.0d); - Assert.assertEquals(50, basketFromConfig.price("A"),0.0d); - Assert.assertEquals(80, basketFromConfig.price("AB"),0.0d); - Assert.assertEquals(115, basketFromConfig.price("CDBA"),0.0d); + basket.addItemToBasket("B"); + Assert.assertEquals(80,basket.checkTotal(),0.0d); - Assert.assertEquals(100, basketFromConfig.price("AA"),0.0d); - Assert.assertEquals(160, basketFromConfig.price("AAA"),0.0d); - Assert.assertEquals(210, basketFromConfig.price("AAAA"),0.0d); - Assert.assertEquals(260, basketFromConfig.price("AAAAA"),0.0d); - Assert.assertEquals(320, basketFromConfig.price("AAAAAA"),0.0d); + basket.addItemToBasket("A"); + Assert.assertEquals(130,basket.checkTotal(),0.0d); - Assert.assertEquals(190, basketFromConfig.price("AAAB"),0.0d); - Assert.assertEquals(335, basketFromConfig.price("AAABB"),0.0d); - Assert.assertEquals(350, basketFromConfig.price("AAABBD"),0.0d); - Assert.assertEquals(350, basketFromConfig.price("DABABA"),0.0d); + basket.addItemToBasket("A"); + //Promotion A 3 x 160 + Assert.assertEquals(190,basket.checkTotal(),0.0d); + basket.addItemToBasket("B"); + //Promotion A 3 x 160 + //Promotion B 2 x 175 + Assert.assertEquals(335,basket.checkTotal(),0.0d); } }