From fd5c6d97123f8b94cca4d6015235e307054d2d31 Mon Sep 17 00:00:00 2001 From: Afag Mamedova Date: Thu, 15 May 2025 00:13:45 +0200 Subject: [PATCH 1/8] =?UTF-8?q?Implementerade=20addProduct=20med=20tillh?= =?UTF-8?q?=C3=B6rande=20test=20(TDD=20steg=201)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/shoppingcart/Product.java | 20 +++++++++++++++++++ .../example/shoppingcart/ShoppingCart.java | 16 +++++++++++++++ .../shoppingcart/ShoppingCartTest.java | 17 ++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 src/main/java/com/example/shoppingcart/Product.java create mode 100644 src/main/java/com/example/shoppingcart/ShoppingCart.java create mode 100644 src/test/java/com/example/shoppingcart/ShoppingCartTest.java diff --git a/src/main/java/com/example/shoppingcart/Product.java b/src/main/java/com/example/shoppingcart/Product.java new file mode 100644 index 00000000..d697ddc7 --- /dev/null +++ b/src/main/java/com/example/shoppingcart/Product.java @@ -0,0 +1,20 @@ +package com.example.shoppingcart; + +public class Product { + private final String name; + private final double price; + + public Product(String name, double price) { + this.name = name; + this.price = price; + } + + public String getName() { + return name; + } + + public double getPrice() { + return price; + } +} + diff --git a/src/main/java/com/example/shoppingcart/ShoppingCart.java b/src/main/java/com/example/shoppingcart/ShoppingCart.java new file mode 100644 index 00000000..461a81e0 --- /dev/null +++ b/src/main/java/com/example/shoppingcart/ShoppingCart.java @@ -0,0 +1,16 @@ +package com.example.shoppingcart; + +import java.util.HashMap; +import java.util.Map; + +public class ShoppingCart { + private final Map items = new HashMap<>(); + + public void addProduct(Product product, int quantity) { + items.put(product, items.getOrDefault(product, 0) + quantity); + } + + public Map getItems() { + return items; + } +} diff --git a/src/test/java/com/example/shoppingcart/ShoppingCartTest.java b/src/test/java/com/example/shoppingcart/ShoppingCartTest.java new file mode 100644 index 00000000..00814d27 --- /dev/null +++ b/src/test/java/com/example/shoppingcart/ShoppingCartTest.java @@ -0,0 +1,17 @@ +package com.example.shoppingcart; + +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.*; + +public class ShoppingCartTest { + + @Test + void shouldAddProductToCart() { + ShoppingCart cart = new ShoppingCart(); + Product product = new Product("Apple", 10.0); + + cart.addProduct(product, 1); + + assertThat(cart.getItems()).containsEntry(product, 1); + } +} From 5979b17844f13588e2c42dbc0baf69c620464043 Mon Sep 17 00:00:00 2001 From: Afag Mamedova Date: Thu, 15 May 2025 00:22:35 +0200 Subject: [PATCH 2/8] =?UTF-8?q?Implementerat=20removeProduct=20i=20Shoppin?= =?UTF-8?q?gCart=20f=C3=B6r=20att=20st=C3=B6dja=20borttagning=20av=20produ?= =?UTF-8?q?kter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/shoppingcart/ShoppingCart.java | 4 ++++ .../com/example/shoppingcart/ShoppingCartTest.java | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/main/java/com/example/shoppingcart/ShoppingCart.java b/src/main/java/com/example/shoppingcart/ShoppingCart.java index 461a81e0..bea14ba3 100644 --- a/src/main/java/com/example/shoppingcart/ShoppingCart.java +++ b/src/main/java/com/example/shoppingcart/ShoppingCart.java @@ -13,4 +13,8 @@ public void addProduct(Product product, int quantity) { public Map getItems() { return items; } + public void removeProduct(Product product) { + items.remove(product); + } + } diff --git a/src/test/java/com/example/shoppingcart/ShoppingCartTest.java b/src/test/java/com/example/shoppingcart/ShoppingCartTest.java index 00814d27..83fdb1de 100644 --- a/src/test/java/com/example/shoppingcart/ShoppingCartTest.java +++ b/src/test/java/com/example/shoppingcart/ShoppingCartTest.java @@ -14,4 +14,15 @@ void shouldAddProductToCart() { assertThat(cart.getItems()).containsEntry(product, 1); } + @Test + void shouldRemoveProductFromCart() { + ShoppingCart cart = new ShoppingCart(); + Product product = new Product("Banana", 5.0); + + cart.addProduct(product, 2); + cart.removeProduct(product); + + assertThat(cart.getItems()).doesNotContainKey(product); + } + } From 36e031121ffd4564786fbea51ec7f36cf137fa1d Mon Sep 17 00:00:00 2001 From: Afag Mamedova Date: Thu, 15 May 2025 00:26:45 +0200 Subject: [PATCH 3/8] =?UTF-8?q?ett=20misslyckat=20test=20f=C3=B6r=20att=20?= =?UTF-8?q?kalkulera=20priset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/shoppingcart/ShoppingCartTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/test/java/com/example/shoppingcart/ShoppingCartTest.java b/src/test/java/com/example/shoppingcart/ShoppingCartTest.java index 83fdb1de..351418cc 100644 --- a/src/test/java/com/example/shoppingcart/ShoppingCartTest.java +++ b/src/test/java/com/example/shoppingcart/ShoppingCartTest.java @@ -24,5 +24,18 @@ void shouldRemoveProductFromCart() { assertThat(cart.getItems()).doesNotContainKey(product); } + @Test + void shouldCalculateTotalPrice() { + ShoppingCart cart = new ShoppingCart(); + Product apple = new Product("Apple", 10.0); + Product banana = new Product("Banana", 5.0); + + cart.addProduct(apple, 2); // 2 x 10 = 20 + cart.addProduct(banana, 3); // 3 x 5 = 15 + + double total = cart.getTotalPrice(); + + assertThat(total).isEqualTo(35.0); + } } From b417b5d3c2de2b1cacf982b1ed3782afbdcc5aea Mon Sep 17 00:00:00 2001 From: Afag Mamedova Date: Thu, 15 May 2025 00:30:14 +0200 Subject: [PATCH 4/8] =?UTF-8?q?Implementerade=20totalprisber=C3=A4kning=20?= =?UTF-8?q?i=20ShoppingCart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/shoppingcart/ShoppingCart.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/example/shoppingcart/ShoppingCart.java b/src/main/java/com/example/shoppingcart/ShoppingCart.java index bea14ba3..19469a7b 100644 --- a/src/main/java/com/example/shoppingcart/ShoppingCart.java +++ b/src/main/java/com/example/shoppingcart/ShoppingCart.java @@ -16,5 +16,10 @@ public Map getItems() { public void removeProduct(Product product) { items.remove(product); } + public double getTotalPrice() { + return items.entrySet().stream() + .mapToDouble(entry -> entry.getKey().getPrice() * entry.getValue()) + .sum(); + } } From ea788d144b2b1c790f5f86579155f640366ce975 Mon Sep 17 00:00:00 2001 From: Afag Mamedova Date: Thu, 15 May 2025 00:50:38 +0200 Subject: [PATCH 5/8] Verifiera korrekt totalpris utan rabatt (Green) --- .../example/shoppingcart/ShoppingCart.java | 25 ++++++++++----- .../shoppingcart/ShoppingCartTest.java | 32 ++++++++++++++++++- 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/example/shoppingcart/ShoppingCart.java b/src/main/java/com/example/shoppingcart/ShoppingCart.java index 19469a7b..a5f53847 100644 --- a/src/main/java/com/example/shoppingcart/ShoppingCart.java +++ b/src/main/java/com/example/shoppingcart/ShoppingCart.java @@ -4,22 +4,31 @@ import java.util.Map; public class ShoppingCart { + private final Map items = new HashMap<>(); + private double discount = 0.0; public void addProduct(Product product, int quantity) { - items.put(product, items.getOrDefault(product, 0) + quantity); + items.merge(product, quantity, Integer::sum); } - public Map getItems() { - return items; - } public void removeProduct(Product product) { items.remove(product); } - public double getTotalPrice() { - return items.entrySet().stream() - .mapToDouble(entry -> entry.getKey().getPrice() * entry.getValue()) - .sum(); + + public Map getItems() { + return items; + } + + public void applyDiscount(double discount) { + this.discount = discount; } + public double calculateTotal() { + double total = 0.0; + for (Map.Entry entry : items.entrySet()) { + total += entry.getKey().getPrice() * entry.getValue(); + } + return total * (1 - discount); // stöd för rabatt + } } diff --git a/src/test/java/com/example/shoppingcart/ShoppingCartTest.java b/src/test/java/com/example/shoppingcart/ShoppingCartTest.java index 351418cc..f5da3091 100644 --- a/src/test/java/com/example/shoppingcart/ShoppingCartTest.java +++ b/src/test/java/com/example/shoppingcart/ShoppingCartTest.java @@ -14,6 +14,7 @@ void shouldAddProductToCart() { assertThat(cart.getItems()).containsEntry(product, 1); } + @Test void shouldRemoveProductFromCart() { ShoppingCart cart = new ShoppingCart(); @@ -24,6 +25,7 @@ void shouldRemoveProductFromCart() { assertThat(cart.getItems()).doesNotContainKey(product); } + @Test void shouldCalculateTotalPrice() { ShoppingCart cart = new ShoppingCart(); @@ -33,9 +35,37 @@ void shouldCalculateTotalPrice() { cart.addProduct(apple, 2); // 2 x 10 = 20 cart.addProduct(banana, 3); // 3 x 5 = 15 - double total = cart.getTotalPrice(); + double total = cart.calculateTotal(); // FIXAT HÄR assertThat(total).isEqualTo(35.0); } + @Test + void shouldApplyPercentageDiscountToTotalPrice() { + ShoppingCart cart = new ShoppingCart(); + Product product1 = new Product("Apple", 10.0); + Product product2 = new Product("Banana", 5.0); + + cart.addProduct(product1, 2); // 20 kr + cart.addProduct(product2, 4); // 20 kr + cart.applyDiscount(0.10); // 10% rabatt + + double total = cart.calculateTotal(); + + assertThat(total).isEqualTo(36.0); // 40 - 10% = 36 + } + + @Test + void shouldCalculateTotalPriceWithNoDiscount() { + ShoppingCart cart = new ShoppingCart(); + Product apple = new Product("Apple", 10.0); + Product banana = new Product("Banana", 5.0); + + cart.addProduct(apple, 2); // 20.0 + cart.addProduct(banana, 3); // 15.0 + + double total = cart.calculateTotal(); + + assertThat(total).isEqualTo(35.0); + } } From fb1f72d5b0295aba392501b8903d2e25cc3c7532 Mon Sep 17 00:00:00 2001 From: Afag Mamedova Date: Thu, 15 May 2025 00:52:53 +0200 Subject: [PATCH 6/8] =?UTF-8?q?L=C3=A4gg=20till=20test=20f=C3=B6r=20att=20?= =?UTF-8?q?uppdatera=20kvantitet=20p=C3=A5=20en=20produkt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/shoppingcart/ShoppingCartTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/java/com/example/shoppingcart/ShoppingCartTest.java b/src/test/java/com/example/shoppingcart/ShoppingCartTest.java index f5da3091..0d7c7b77 100644 --- a/src/test/java/com/example/shoppingcart/ShoppingCartTest.java +++ b/src/test/java/com/example/shoppingcart/ShoppingCartTest.java @@ -68,4 +68,15 @@ void shouldCalculateTotalPriceWithNoDiscount() { assertThat(total).isEqualTo(35.0); } + @Test + void shouldUpdateQuantityOfExistingProduct() { + ShoppingCart cart = new ShoppingCart(); + Product apple = new Product("Apple", 10.0); + + cart.addProduct(apple, 2); + cart.updateQuantity(apple, 5); // ändra direkt till 5 + + assertThat(cart.getItems()).containsEntry(apple, 5); + } + } From b5c96793e53d1e447a7528eba684ab7f32a75491 Mon Sep 17 00:00:00 2001 From: Afag Mamedova Date: Thu, 15 May 2025 00:55:15 +0200 Subject: [PATCH 7/8] =?UTF-8?q?Implementera=20updateQuantity=20f=C3=B6r=20?= =?UTF-8?q?att=20=C3=A4ndra=20kvantitet=20direkt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/shoppingcart/ShoppingCart.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/example/shoppingcart/ShoppingCart.java b/src/main/java/com/example/shoppingcart/ShoppingCart.java index a5f53847..ad5c9a8b 100644 --- a/src/main/java/com/example/shoppingcart/ShoppingCart.java +++ b/src/main/java/com/example/shoppingcart/ShoppingCart.java @@ -31,4 +31,12 @@ public double calculateTotal() { } return total * (1 - discount); // stöd för rabatt } + public void updateQuantity(Product product, int newQuantity) { + if (newQuantity <= 0) { + items.remove(product); + } else { + items.put(product, newQuantity); + } + } + } From 83442f1a66c9830f686d1e7efd64de0103155079 Mon Sep 17 00:00:00 2001 From: Afag Mamedova Date: Thu, 15 May 2025 00:57:10 +0200 Subject: [PATCH 8/8] Ta bort produkt om kvantitet uppdateras till noll --- .../com/example/shoppingcart/ShoppingCartTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/java/com/example/shoppingcart/ShoppingCartTest.java b/src/test/java/com/example/shoppingcart/ShoppingCartTest.java index 0d7c7b77..ada50501 100644 --- a/src/test/java/com/example/shoppingcart/ShoppingCartTest.java +++ b/src/test/java/com/example/shoppingcart/ShoppingCartTest.java @@ -78,5 +78,15 @@ void shouldUpdateQuantityOfExistingProduct() { assertThat(cart.getItems()).containsEntry(apple, 5); } + @Test + void shouldRemoveProductWhenQuantityIsZero() { + ShoppingCart cart = new ShoppingCart(); + Product apple = new Product("Apple", 10.0); + cart.addProduct(apple, 2); + + cart.updateQuantity(apple, 0); + + assertThat(cart.getItems()).doesNotContainKey(apple); + } }