From 037191fd46009870350435e6656cd0e6f1a582cf Mon Sep 17 00:00:00 2001 From: Natalia Karwala Date: Wed, 30 Apr 2025 23:28:51 +0200 Subject: [PATCH 1/5] Add test for list of products --- .../java/pl/edu/agh/mwo/invoice/Invoice.java | 22 ++++++++++++++----- .../edu/agh/mwo/invoice/product/Product.java | 16 +++++++++++++- .../pl/edu/agh/mwo/invoice/InvoiceTest.java | 18 +++++++++++++++ 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/main/java/pl/edu/agh/mwo/invoice/Invoice.java b/src/main/java/pl/edu/agh/mwo/invoice/Invoice.java index 8cf83918d..efab824fe 100644 --- a/src/main/java/pl/edu/agh/mwo/invoice/Invoice.java +++ b/src/main/java/pl/edu/agh/mwo/invoice/Invoice.java @@ -1,18 +1,19 @@ package pl.edu.agh.mwo.invoice; +import pl.edu.agh.mwo.invoice.product.Product; + import java.math.BigDecimal; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; -import pl.edu.agh.mwo.invoice.product.Product; - public class Invoice { - private Map products = new HashMap<>(); + private final Map products = new LinkedHashMap<>(); private static int nextNumber = 0; private final int number = ++nextNumber; public void addProduct(Product product) { - addProduct(product, 1); + int actualCount = products.getOrDefault(product, 0); + addProduct(product, actualCount + 1); } public void addProduct(Product product, Integer quantity) { @@ -47,4 +48,15 @@ public BigDecimal getGrossTotal() { public int getNumber() { return number; } + + public String getProductsList() { + StringBuilder productsList = new StringBuilder("Invoice: " + getNumber()).append("\n"); + for (Map.Entry entry : products.entrySet()) { + Product product = entry.getKey(); + productsList.append("%s, %d, %s\n".formatted(product.getName(), entry.getValue(), product.getPrice())); + } + productsList.append("-----\n"); + productsList.append("Liczba pozycji: ").append(products.values().stream().mapToInt(e -> e).sum()).append("\n"); + return productsList.toString(); + } } diff --git a/src/main/java/pl/edu/agh/mwo/invoice/product/Product.java b/src/main/java/pl/edu/agh/mwo/invoice/product/Product.java index de3c6739e..a8f89546e 100644 --- a/src/main/java/pl/edu/agh/mwo/invoice/product/Product.java +++ b/src/main/java/pl/edu/agh/mwo/invoice/product/Product.java @@ -1,6 +1,7 @@ package pl.edu.agh.mwo.invoice.product; import java.math.BigDecimal; +import java.util.Objects; public abstract class Product { private final String name; @@ -10,7 +11,7 @@ public abstract class Product { private final BigDecimal taxPercent; protected Product(String name, BigDecimal price, BigDecimal tax) { - if (name == null || name.equals("") + if (name == null || name.isEmpty() || price == null || tax == null || tax.compareTo(new BigDecimal(0)) < 0 || price.compareTo(new BigDecimal(0)) < 0) { throw new IllegalArgumentException(); @@ -35,4 +36,17 @@ public BigDecimal getTaxPercent() { public BigDecimal getPriceWithTax() { return price.multiply(taxPercent).add(price); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Product product = (Product) o; + return Objects.equals(name, product.name) && Objects.equals(price, product.price) && Objects.equals(taxPercent, product.taxPercent); + } + + @Override + public int hashCode() { + return Objects.hash(name, price, taxPercent); + } } diff --git a/src/test/java/pl/edu/agh/mwo/invoice/InvoiceTest.java b/src/test/java/pl/edu/agh/mwo/invoice/InvoiceTest.java index 506b5e0fe..8ca3bd7ea 100644 --- a/src/test/java/pl/edu/agh/mwo/invoice/InvoiceTest.java +++ b/src/test/java/pl/edu/agh/mwo/invoice/InvoiceTest.java @@ -150,4 +150,22 @@ public void testTheFirstInvoiceNumberIsLowerThanTheSecond() { int number2 = new Invoice().getNumber(); Assert.assertThat(number1, Matchers.lessThan(number2)); } + + @Test + public void testListOfProducts() { + invoice.addProduct(new TaxFreeProduct("Owoce", new BigDecimal("200"))); + invoice.addProduct(new TaxFreeProduct("Owoce", new BigDecimal("200"))); + invoice.addProduct(new DairyProduct("Maslanka", new BigDecimal("100"))); + invoice.addProduct(new OtherProduct("Wino", new BigDecimal("10"))); + String productsList = invoice.getProductsList(); + String expectedList = """ + Invoice: 1 + Owoce, 2, 200 + Maslanka, 1, 100 + Wino, 1, 10 + ----- + Liczba pozycji: 4 + """; + Assert.assertThat(productsList, Matchers.equalTo(expectedList)); + } } From b6832d2df92ab66107471b67c890493c5b0551a1 Mon Sep 17 00:00:00 2001 From: Natalia Karwala Date: Wed, 30 Apr 2025 23:46:34 +0200 Subject: [PATCH 2/5] Trigger GitHub Actions --- src/main/java/pl/edu/agh/mwo/invoice/product/TaxFreeProduct.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/pl/edu/agh/mwo/invoice/product/TaxFreeProduct.java b/src/main/java/pl/edu/agh/mwo/invoice/product/TaxFreeProduct.java index d370e7afb..7ccb90d5b 100644 --- a/src/main/java/pl/edu/agh/mwo/invoice/product/TaxFreeProduct.java +++ b/src/main/java/pl/edu/agh/mwo/invoice/product/TaxFreeProduct.java @@ -7,3 +7,4 @@ public TaxFreeProduct(String name, BigDecimal price) { super(name, price, BigDecimal.ZERO); } } +//komentarz From c49ba245e187e3bd0989942e5ecdaa0027723466 Mon Sep 17 00:00:00 2001 From: Natalia Karwala Date: Wed, 30 Apr 2025 23:50:08 +0200 Subject: [PATCH 3/5] Actions trigger --- .github/workflows/github-actions.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 13dd99089..5aa4b2ba0 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -1,5 +1,8 @@ name: CI for Java Invoice -on: [push] + +on: + push: + jobs: checkstyle: name: Lint with Checkstyle @@ -13,6 +16,7 @@ jobs: distribution: 'adopt' - name: Lint run: mvn checkstyle:check + test: name: Unit tests runs-on: ubuntu-latest From 4ff8840dcb127e4405ad99eba425fd87106587d1 Mon Sep 17 00:00:00 2001 From: Natalia Karwala Date: Wed, 30 Apr 2025 23:50:08 +0200 Subject: [PATCH 4/5] Actions trigger --- .github/workflows/github-actions.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 5aa4b2ba0..5f703d8ab 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -1,8 +1,5 @@ name: CI for Java Invoice - -on: - push: - +on: [push] jobs: checkstyle: name: Lint with Checkstyle From 894b2d1cd9d9f75bc1afa2ea0881d93717b44500 Mon Sep 17 00:00:00 2001 From: Natalia Karwala Date: Thu, 1 May 2025 00:07:59 +0200 Subject: [PATCH 5/5] Final version --- .../pl/edu/agh/mwo/invoice/InvoiceTest.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/src/test/java/pl/edu/agh/mwo/invoice/InvoiceTest.java b/src/test/java/pl/edu/agh/mwo/invoice/InvoiceTest.java index 8ca3bd7ea..1df2b2673 100644 --- a/src/test/java/pl/edu/agh/mwo/invoice/InvoiceTest.java +++ b/src/test/java/pl/edu/agh/mwo/invoice/InvoiceTest.java @@ -168,4 +168,76 @@ public void testListOfProducts() { """; Assert.assertThat(productsList, Matchers.equalTo(expectedList)); } + + @Test + public void testListOfProductsWhenEmptyInvoice() { + String expected = """ + Invoice: %d + ----- + Liczba pozycji: 0 + """.formatted(invoice.getNumber()); + + Assert.assertEquals(expected, invoice.getProductsList()); + } + + @Test + public void testListOfProductsMergesSameProduct() { + Product chleb = new TaxFreeProduct("Chleb", new BigDecimal("4.00")); + invoice.addProduct(chleb); + invoice.addProduct(chleb, 2); + String expected = """ + Invoice: %d + Chleb, 3, 4.00 + ----- + Liczba pozycji: 3 + """.formatted(invoice.getNumber()); + + Assert.assertEquals(expected, invoice.getProductsList()); + } + + @Test + public void testListOfProductsWithDecimalPrice() { + invoice.addProduct(new OtherProduct("Kawa", new BigDecimal("10.55"))); + + String expected = """ + Invoice: %d + Kawa, 1, 10.55 + ----- + Liczba pozycji: 1 + """.formatted(invoice.getNumber()); + Assert.assertEquals(expected, invoice.getProductsList()); + } + + + + @Test + public void testAddingSameProductMultipleTimesIsEquivalentToOneAddWithQuantity() { + Product długopis = new OtherProduct("Długopis", new BigDecimal("2.50")); + + Invoice invoiceA = new Invoice(); + invoiceA.addProduct(długopis); + invoiceA.addProduct(długopis, 2); + + Invoice invoiceB = new Invoice(); + invoiceB.addProduct(długopis, 3); + + Assert.assertEquals(invoiceA.getNetTotal(), invoiceB.getNetTotal()); + Assert.assertEquals(invoiceA.getGrossTotal(), invoiceB.getGrossTotal()); + } + + @Test + public void testProductIsNotDuplicatedInMap() { + Product długopis = new OtherProduct("Długopis", new BigDecimal("2.50")); + invoice.addProduct(długopis); + invoice.addProduct(długopis); + + String expected = """ + Invoice: %d + Długopis, 2, 2.50 + ----- + Liczba pozycji: 2 + """.formatted(invoice.getNumber()); + + Assert.assertEquals(expected, invoice.getProductsList()); + } }