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
79 changes: 79 additions & 0 deletions Invoice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package pl.edu.agh.mwo.invoice;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;

import pl.edu.agh.mwo.invoice.product.Product;

public class Invoice {
private Collection<Product> products;
private BigDecimal subTotal;
private BigDecimal total;
private BigDecimal tax;


Invoice() {
subTotal = new BigDecimal("0");
total = new BigDecimal("0");
tax = new BigDecimal("0");
products = new ArrayList<Product>();

}

public void addProduct(Product product) {
products.add(product);
update();
}

public void addProduct(Product product, Integer quantity) {
if (quantity <= 0) {
throw new IllegalArgumentException();
}
for (int i = 0; i < quantity; i++) {
products.add(product);
}
update();
}
public BigDecimal getSubtotal() {
return subTotal;
}
public void setSubtotal() {
subTotal = BigDecimal.ZERO;
for (Product product : products) {
subTotal = subTotal.add(product.getPrice());
}
}

public BigDecimal getTax() {
return tax;
}

public void setTax() {
tax = total.subtract(subTotal);
}

public BigDecimal getTotal() {
return total;
}
public void setTotal() {
total = BigDecimal.ZERO;
for (Product product : products) {
total = total.add(product.getPriceWithTax());
}
}

public static Invoice create() {
return new Invoice();
}

public void update() {
setSubtotal();
setTotal();
setTax();
}



}

37 changes: 37 additions & 0 deletions Product.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
public abstract class Product {
private final String name;

private final BigDecimal price;

private final BigDecimal taxPercent;

protected Product(String name, BigDecimal price, BigDecimal tax) {
if (name == null || name.equals("")) {
throw new IllegalArgumentException("Product name cannot be null");
}
if (price == null || price.compareTo(BigDecimal.ZERO) < 0) {
throw new IllegalArgumentException("Product cannot be null");
}
this.name = name;
this.price = price;
this.taxPercent = tax;
}

public String getName() {
return name;
}

public BigDecimal getPrice() {
return price;
}

public BigDecimal getTaxPercent() {
return taxPercent;
}

public BigDecimal getPriceWithTax() {
return this.price.add(this.taxPercent.multiply(this.price));
}

}

1 change: 1 addition & 0 deletions java-invoice
Submodule java-invoice added at c9f6e9
107 changes: 107 additions & 0 deletions src/test/java/pl/edu/agh/mwo/invoice/InvoiceTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package pl.edu.agh.mwo.invoice;

import java.math.BigDecimal;

import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import pl.edu.agh.mwo.invoice.Invoice;
import pl.edu.agh.mwo.invoice.product.DairyProduct;
import pl.edu.agh.mwo.invoice.product.OtherProduct;
import pl.edu.agh.mwo.invoice.product.Product;
import pl.edu.agh.mwo.invoice.product.TaxFreeProduct;

public class InvoiceTest {
private Invoice invoice;

@Before
public void createEmptyInvoiceForTheTest() {
invoice = new Invoice();
}

@Test
public void testEmptyInvoiceHasEmptySubtotal() {
Assert.assertThat(BigDecimal.ZERO, Matchers.comparesEqualTo(invoice.getSubtotal()));
}

@Test
public void testEmptyInvoiceHasEmptyTaxAmount() {
Assert.assertThat(BigDecimal.ZERO, Matchers.comparesEqualTo(invoice.getTax()));
}

@Test
public void testEmptyInvoiceHasEmptyTotal() {
Assert.assertThat(BigDecimal.ZERO, Matchers.comparesEqualTo(invoice.getTotal()));
}

@Test
public void testInvoiceHasTheSameSubtotalAndTotalIfTaxIsZero() {
Product taxFreeProduct = new TaxFreeProduct("Warzywa", new BigDecimal("199.99"));
invoice.addProduct(taxFreeProduct);
Assert.assertThat(invoice.getTotal(), Matchers.comparesEqualTo(invoice.getSubtotal()));
}

@Test
public void testInvoiceHasProperSubtotalForManyProducts() {
invoice.addProduct(new TaxFreeProduct("Owoce", new BigDecimal("200")));
invoice.addProduct(new DairyProduct("Maslanka", new BigDecimal("100")));
invoice.addProduct(new OtherProduct("Wino", new BigDecimal("10")));
Assert.assertThat(new BigDecimal("310"), Matchers.comparesEqualTo(invoice.getSubtotal()));
}

@Test
public void testInvoiceHasProperTaxValueForManyProduct() {
// tax: 0
invoice.addProduct(new TaxFreeProduct("Pampersy", new BigDecimal("200")));
// tax: 8
invoice.addProduct(new DairyProduct("Kefir", new BigDecimal("100")));
// tax: 2.30
invoice.addProduct(new OtherProduct("Piwko", new BigDecimal("10")));
Assert.assertThat(new BigDecimal("10.30"), Matchers.comparesEqualTo(invoice.getTax()));
}

@Test
public void testInvoiceHasProperTotalValueForManyProduct() {
// price with tax: 200
invoice.addProduct(new TaxFreeProduct("Maskotki", new BigDecimal("200")));
// price with tax: 108
invoice.addProduct(new DairyProduct("Maslo", new BigDecimal("100")));
// price with tax: 12.30
invoice.addProduct(new OtherProduct("Chipsy", new BigDecimal("10")));
Assert.assertThat(new BigDecimal("320.30"), Matchers.comparesEqualTo(invoice.getTotal()));
}

@Test
public void testInvoiceHasPropoerSubtotalWithQuantityMoreThanOne() {
// 2x kubek - price: 10
invoice.addProduct(new TaxFreeProduct("Kubek", new BigDecimal("5")), 2);
// 3x kozi serek - price: 30
invoice.addProduct(new DairyProduct("Kozi Serek", new BigDecimal("10")), 3);
// 1000x pinezka - price: 10
invoice.addProduct(new OtherProduct("Pinezka", new BigDecimal("0.01")), 1000);
Assert.assertThat(new BigDecimal("50"), Matchers.comparesEqualTo(invoice.getSubtotal()));
}

@Test
public void testInvoiceHasPropoerTotalWithQuantityMoreThanOne() {
// 2x chleb - price with tax: 10
invoice.addProduct(new TaxFreeProduct("Chleb", new BigDecimal("5")), 2);
// 3x chedar - price with tax: 32.40
invoice.addProduct(new DairyProduct("Chedar", new BigDecimal("10")), 3);
// 1000x pinezka - price with tax: 12.30
invoice.addProduct(new OtherProduct("Pinezka", new BigDecimal("0.01")), 1000);
Assert.assertThat(new BigDecimal("54.70"), Matchers.comparesEqualTo(invoice.getTotal()));
}

@Test(expected = IllegalArgumentException.class)
public void testInvoiceWithZeroQuantity() {
invoice.addProduct(new TaxFreeProduct("Tablet", new BigDecimal("1678")), 0);
}

@Test(expected = IllegalArgumentException.class)
public void testInvoiceWithNegativeQuantity() {
invoice.addProduct(new DairyProduct("Zsiadle mleko", new BigDecimal("5.55")), -1);
}
}
57 changes: 57 additions & 0 deletions src/test/java/pl/edu/agh/mwo/invoice/product/ProductTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package pl.edu.agh.mwo.invoice.product;

import java.math.BigDecimal;

import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Test;

import pl.edu.agh.mwo.invoice.product.Product;

public class ProductTest {
@Test
public void testProductNameIsCorrect() {
Product product = new OtherProduct("buty", new BigDecimal("100.0"));
Assert.assertEquals("buty", product.getName());
}

@Test
public void testProductPriceAndTaxWithDefaultTax() {
Product product = new OtherProduct("Ogorki", new BigDecimal("100.0"));
Assert.assertThat(new BigDecimal("100"), Matchers.comparesEqualTo(product.getPrice()));
Assert.assertThat(new BigDecimal("0.23"), Matchers.comparesEqualTo(product.getTaxPercent()));
}

@Test
public void testProductPriceAndTaxWithDairyProduct() {
Product product = new DairyProduct("Szarlotka", new BigDecimal("100.0"));
Assert.assertThat(new BigDecimal("100"), Matchers.comparesEqualTo(product.getPrice()));
Assert.assertThat(new BigDecimal("0.08"), Matchers.comparesEqualTo(product.getTaxPercent()));
}

@Test
public void testPriceWithTax() {
Product product = new DairyProduct("Oscypek", new BigDecimal("100.0"));
Assert.assertThat(new BigDecimal("108"), Matchers.comparesEqualTo(product.getPriceWithTax()));
}

@Test(expected = IllegalArgumentException.class)
public void testProductWithNullName() {
new OtherProduct(null, new BigDecimal("100.0"));
}

@Test(expected = IllegalArgumentException.class)
public void testProductWithEmptyName() {
new TaxFreeProduct("", new BigDecimal("100.0"));
}

@Test(expected = IllegalArgumentException.class)
public void testProductWithNullPrice() {
new DairyProduct("Banany", null);
}

@Test(expected = IllegalArgumentException.class)
public void testProductWithNegativePrice() {
new TaxFreeProduct("Mandarynki", new BigDecimal("-1.00"));
}
}