From 2e94444bac854c7311e9360d920424631bcc0427 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Wed, 8 Jan 2020 15:31:13 +0100 Subject: [PATCH 1/7] Specs! --- .../pl/edu/agh/mwo/invoice/InvoiceTest.java | 107 ++++++++++++++++++ .../agh/mwo/invoice/product/ProductTest.java | 57 ++++++++++ 2 files changed, 164 insertions(+) create mode 100644 src/test/java/pl/edu/agh/mwo/invoice/InvoiceTest.java create mode 100644 src/test/java/pl/edu/agh/mwo/invoice/product/ProductTest.java diff --git a/src/test/java/pl/edu/agh/mwo/invoice/InvoiceTest.java b/src/test/java/pl/edu/agh/mwo/invoice/InvoiceTest.java new file mode 100644 index 000000000..720f0c9a5 --- /dev/null +++ b/src/test/java/pl/edu/agh/mwo/invoice/InvoiceTest.java @@ -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); + } +} diff --git a/src/test/java/pl/edu/agh/mwo/invoice/product/ProductTest.java b/src/test/java/pl/edu/agh/mwo/invoice/product/ProductTest.java new file mode 100644 index 000000000..832ae2c96 --- /dev/null +++ b/src/test/java/pl/edu/agh/mwo/invoice/product/ProductTest.java @@ -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")); + } +} From 9a6ea4d5895aa4fe41c7531719589d42f273e367 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ja=C5=82owik?= <57842170+MichalJalowik@users.noreply.github.com> Date: Sat, 18 Jan 2020 18:40:58 +0100 Subject: [PATCH 2/7] ClassDiagram_Invoice.pdf --- Untitled Diagram.pdf | Bin 0 -> 24580 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Untitled Diagram.pdf diff --git a/Untitled Diagram.pdf b/Untitled Diagram.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8718ed6a8e78807b608d36652ba580c8a27f5158 GIT binary patch literal 24580 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 Ar~m)} literal 0 HcmV?d00001 From bd9718b76f0cf85fe466fb0463c52e8a5119fd00 Mon Sep 17 00:00:00 2001 From: MJ Date: Sun, 19 Jan 2020 13:37:51 +0100 Subject: [PATCH 3/7] second commit --- src/main/java/pl/edu/agh/mwo/invoice/product/Product.java | 2 +- src/test/java/pl/edu/agh/mwo/invoice/product/ProductTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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 b75785935..8e6e548bb 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 @@ -16,7 +16,7 @@ protected Product(String name, BigDecimal price, BigDecimal tax) { } public String getName() { - return null; + return name; } public BigDecimal getPrice() { diff --git a/src/test/java/pl/edu/agh/mwo/invoice/product/ProductTest.java b/src/test/java/pl/edu/agh/mwo/invoice/product/ProductTest.java index 832ae2c96..2088a2462 100644 --- a/src/test/java/pl/edu/agh/mwo/invoice/product/ProductTest.java +++ b/src/test/java/pl/edu/agh/mwo/invoice/product/ProductTest.java @@ -13,6 +13,7 @@ public class ProductTest { public void testProductNameIsCorrect() { Product product = new OtherProduct("buty", new BigDecimal("100.0")); Assert.assertEquals("buty", product.getName()); + System.out.println("changing for making commit"); } @Test From 81d7e172bc7e61d79cd475a647316df8b61727be Mon Sep 17 00:00:00 2001 From: MJ Date: Sun, 19 Jan 2020 13:51:22 +0100 Subject: [PATCH 4/7] naprawilem 2 kolejne testy --- src/main/java/pl/edu/agh/mwo/invoice/product/Product.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 8e6e548bb..5a5c84742 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 @@ -20,11 +20,11 @@ public String getName() { } public BigDecimal getPrice() { - return null; + return price; } public BigDecimal getTaxPercent() { - return null; + return taxPercent; } public BigDecimal getPriceWithTax() { From f326601cd58e41f0f4d8d1d71eeb34108d48aff2 Mon Sep 17 00:00:00 2001 From: MJ Date: Sun, 19 Jan 2020 14:21:24 +0100 Subject: [PATCH 5/7] kolejne 2 metody pokryte --- .../java/pl/edu/agh/mwo/invoice/product/OtherProduct.java | 4 ++++ src/main/java/pl/edu/agh/mwo/invoice/product/Product.java | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/pl/edu/agh/mwo/invoice/product/OtherProduct.java b/src/main/java/pl/edu/agh/mwo/invoice/product/OtherProduct.java index c90153ddf..b158a3477 100644 --- a/src/main/java/pl/edu/agh/mwo/invoice/product/OtherProduct.java +++ b/src/main/java/pl/edu/agh/mwo/invoice/product/OtherProduct.java @@ -3,7 +3,11 @@ import java.math.BigDecimal; public class OtherProduct extends Product { + + public OtherProduct(String name, BigDecimal price) { + super(name, price, new BigDecimal("0.23")); + } } 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 5a5c84742..d859f4de0 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 @@ -10,6 +10,10 @@ public abstract class Product { private final BigDecimal taxPercent; protected Product(String name, BigDecimal price, BigDecimal tax) { + + if(name == null){ + throw new IllegalArgumentException("poduct name cannot be null"); + } this.name = name; this.price = price; this.taxPercent = tax; @@ -28,6 +32,6 @@ public BigDecimal getTaxPercent() { } public BigDecimal getPriceWithTax() { - return null; + return this.price.add(this.price.multiply(this.taxPercent)); } } From a6c153ef1935938c26cac5db8db8eb0325ba1910 Mon Sep 17 00:00:00 2001 From: MJ Date: Sun, 19 Jan 2020 14:48:27 +0100 Subject: [PATCH 6/7] poprawiony test linia 50 z product --- src/main/java/pl/edu/agh/mwo/invoice/product/Product.java | 5 +++-- .../java/pl/edu/agh/mwo/invoice/product/ProductTest.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) 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 d859f4de0..cd51d9236 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 @@ -9,9 +9,9 @@ public abstract class Product { private final BigDecimal taxPercent; - protected Product(String name, BigDecimal price, BigDecimal tax) { + protected Product(String name, BigDecimal price, BigDecimal tax) throws RuntimeException{ - if(name == null){ + if(name == null || name.trim().isEmpty()){ throw new IllegalArgumentException("poduct name cannot be null"); } this.name = name; @@ -20,6 +20,7 @@ protected Product(String name, BigDecimal price, BigDecimal tax) { } public String getName() { + return name; } diff --git a/src/test/java/pl/edu/agh/mwo/invoice/product/ProductTest.java b/src/test/java/pl/edu/agh/mwo/invoice/product/ProductTest.java index 2088a2462..7712b363f 100644 --- a/src/test/java/pl/edu/agh/mwo/invoice/product/ProductTest.java +++ b/src/test/java/pl/edu/agh/mwo/invoice/product/ProductTest.java @@ -43,7 +43,7 @@ public void testProductWithNullName() { @Test(expected = IllegalArgumentException.class) public void testProductWithEmptyName() { - new TaxFreeProduct("", new BigDecimal("100.0")); + new TaxFreeProduct(" ", new BigDecimal("100.0")); } @Test(expected = IllegalArgumentException.class) From 72dc4e11b60fe811b6bb26bf86c62b383925ecd0 Mon Sep 17 00:00:00 2001 From: MJ Date: Sun, 19 Jan 2020 14:52:00 +0100 Subject: [PATCH 7/7] testy jednostkowe zakonczone dla klady product --- src/main/java/pl/edu/agh/mwo/invoice/product/Product.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cd51d9236..3afc3ba58 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 @@ -11,7 +11,7 @@ public abstract class Product { protected Product(String name, BigDecimal price, BigDecimal tax) throws RuntimeException{ - if(name == null || name.trim().isEmpty()){ + if(name == null || price == null || name.trim().isEmpty() || tax.compareTo(BigDecimal.ZERO) <= 0){ throw new IllegalArgumentException("poduct name cannot be null"); } this.name = name;