Skip to content

ProductTest complete #44

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
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
25 changes: 17 additions & 8 deletions src/main/java/pl/edu/agh/mwo/invoice/Invoice.java
Original file line number Diff line number Diff line change
@@ -1,30 +1,39 @@
package pl.edu.agh.mwo.invoice;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;

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

public class Invoice {
private Collection<Product> products;
private Map<Product, Integer> products = new LinkedHashMap<>();

public void addProduct(Product product) {
// TODO: implement
this.products.put(product, 1);
}

public void addProduct(Product product, Integer quantity) {
// TODO: implement
this.products.put(product, quantity);
}

public BigDecimal getSubtotal() {
return null;
public BigDecimal getSubtotal() {
BigDecimal sum = BigDecimal.ZERO;

for (Product product : this.products.keySet()) {
Integer quantity = this.products.get(product);
sum = sum.add(product.getPrice().multiply(new BigDecimal(quantity)));
}

return sum;
}


public BigDecimal getTax() {
return null;
return BigDecimal.ZERO;
}

public BigDecimal getTotal() {
return null;
return BigDecimal.ZERO;
}
}
23 changes: 18 additions & 5 deletions src/main/java/pl/edu/agh/mwo/invoice/product/Product.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,37 @@ public abstract class Product {
private final BigDecimal taxPercent;

protected Product(String name, BigDecimal price, BigDecimal tax) {
this.name = name;
if(name == null) {
throw new IllegalArgumentException ("You cannot create product with null name");
}
if(name.equals("")) {
throw new IllegalArgumentException ("You cannot create product with empty name");
}
this.name = name;
if(price == null) {
throw new IllegalArgumentException ("You cannot create product with null price");
}
if(price.signum() == -1) {
throw new IllegalArgumentException ("You cannot create product with negative price");
}
this.price = price;

this.taxPercent = tax;
}

public String getName() {
return null;
return this.name;
}

public BigDecimal getPrice() {
return null;
return this.price;
}

public BigDecimal getTaxPercent() {
return null;
return this.taxPercent;
}

public BigDecimal getPriceWithTax() {
return null;
return this.price.multiply(this.taxPercent).add(this.price);
}
}
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"));
}
}