Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/github-actions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ jobs:
distribution: 'adopt'
- name: Lint
run: mvn checkstyle:check

test:
name: Unit tests
runs-on: ubuntu-latest
Expand Down
22 changes: 17 additions & 5 deletions src/main/java/pl/edu/agh/mwo/invoice/Invoice.java
Original file line number Diff line number Diff line change
@@ -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<Product, Integer> products = new HashMap<>();
private final Map<Product, Integer> 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) {
Expand Down Expand Up @@ -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<Product, Integer> 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();
}
}
16 changes: 15 additions & 1 deletion src/main/java/pl/edu/agh/mwo/invoice/product/Product.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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();
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ public TaxFreeProduct(String name, BigDecimal price) {
super(name, price, BigDecimal.ZERO);
}
}
//komentarz
90 changes: 90 additions & 0 deletions src/test/java/pl/edu/agh/mwo/invoice/InvoiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -150,4 +150,94 @@ 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));
}

@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());
}
}