diff --git a/pom.xml b/pom.xml index 3fd1e81..82c2eb3 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,7 @@ + org.junit.jupiter junit-jupiter-api @@ -28,6 +29,13 @@ junit-jupiter-engine ${junit.version} + + + org.easymock + easymock + 3.6 + test + org.junit.platform diff --git a/src/main/java/br/pro/diegoquirino/calculadora/model/CarrinhoDeCompras.java b/src/main/java/br/pro/diegoquirino/calculadora/model/CarrinhoDeCompras.java new file mode 100644 index 0000000..92fbc0e --- /dev/null +++ b/src/main/java/br/pro/diegoquirino/calculadora/model/CarrinhoDeCompras.java @@ -0,0 +1,55 @@ +package br.pro.diegoquirino.calculadora.model; + +import br.pro.diegoquirino.calculadora.util.DescontoUtils; + +import java.util.HashMap; +import java.util.Map; + + +public class CarrinhoDeCompras { + + private Map produtos; + + private Cliente cliente; + + public CarrinhoDeCompras() { + super(); + this.produtos = new HashMap<>(); + } + + public Map getProdutos() { + return produtos; + } + + public void setProdutos(Map produtos) { + this.produtos = produtos; + } + + public Cliente getCliente() { + return cliente; + } + + public void setCliente(Cliente cliente) { + this.cliente = cliente; + } + + public void addProduto(Produto p, int quant) { + if(!this.produtos.containsKey(p)) { + this.produtos.put(p, quant); + } + } + + public double calcularValorComDesconto(Produto p) { + DescontoUtils du = new DescontoUtils(); + double valorComDesconto = 0; + for(Produto prod: this.produtos.keySet()) { + if(p.equals(prod)) { + valorComDesconto = prod.getValor() * + du.calcularFatorDeDesconto(this.cliente.getTipoCliente(), + produtos.get(prod).intValue()); + } + } + return valorComDesconto; + } + +} diff --git a/src/main/java/br/pro/diegoquirino/calculadora/model/Cliente.java b/src/main/java/br/pro/diegoquirino/calculadora/model/Cliente.java new file mode 100644 index 0000000..eb6a29b --- /dev/null +++ b/src/main/java/br/pro/diegoquirino/calculadora/model/Cliente.java @@ -0,0 +1,9 @@ +package br.pro.diegoquirino.calculadora.model; + +public interface Cliente { + + public String getTipoCliente(); + + public void setTipoCliente(String tipo); + +} diff --git a/src/main/java/br/pro/diegoquirino/calculadora/model/Produto.java b/src/main/java/br/pro/diegoquirino/calculadora/model/Produto.java new file mode 100644 index 0000000..491c50c --- /dev/null +++ b/src/main/java/br/pro/diegoquirino/calculadora/model/Produto.java @@ -0,0 +1,13 @@ +package br.pro.diegoquirino.calculadora.model; + +public interface Produto { + + public double getValor(); + + public void setValor(double valor); + + public double getQuantEmEstoque(); + + public void setQuantEmEstoque(int quant); + +} diff --git a/src/main/java/br/pro/diegoquirino/calculadora/util/DescontoUtils.java b/src/main/java/br/pro/diegoquirino/calculadora/util/DescontoUtils.java index b0ab7c3..040bf03 100644 --- a/src/main/java/br/pro/diegoquirino/calculadora/util/DescontoUtils.java +++ b/src/main/java/br/pro/diegoquirino/calculadora/util/DescontoUtils.java @@ -6,30 +6,30 @@ public double calcularFatorDeDesconto(String tipoCliente, int quant) { double desc = 0; switch(tipoCliente) { case "A": - if(quant < 10) { - desc = 1.00; - } else if (quant >= 10 && quant < 100) { + if(quant < 100) { + desc = 0.90; + } else if (quant >= 100 && quant < 1000) { desc = 0.95; } else { - desc = 0.90; + desc = 1.00; } break; case "B": - if(quant < 10) { - desc = 0.95; - } else if (quant >= 10 && quant < 100) { + if(quant < 100) { desc = 0.85; + } else if (quant >= 100 && quant < 1000) { + desc = 0.90; } else { - desc = 0.75; + desc = 0.95; } break; case "C": - if(quant < 10) { - desc = 1.00; - } else if (quant >= 10 && quant < 100) { + if(quant < 100) { desc = 0.80; + } else if (quant >= 100 && quant < 1000) { + desc = 0.85; } else { - desc = 0.75; + desc = 0.90; } break; } diff --git a/src/test/java/br/pro/diegoquirino/calculadora/model/CarrinhoDeComprasTests.java b/src/test/java/br/pro/diegoquirino/calculadora/model/CarrinhoDeComprasTests.java new file mode 100644 index 0000000..35e6aa7 --- /dev/null +++ b/src/test/java/br/pro/diegoquirino/calculadora/model/CarrinhoDeComprasTests.java @@ -0,0 +1,45 @@ +package br.pro.diegoquirino.calculadora.model; + +import org.easymock.EasyMock; +import org.easymock.EasyMockSupport; +import org.easymock.Mock; +import org.easymock.TestSubject; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@ExtendWith(EasyMockExtension.class) +public class CarrinhoDeComprasTests extends EasyMockSupport{ + + // 1. Criar os Mocks + @Mock + private Produto produto; + @Mock + private Cliente cliente; + + @TestSubject // 2. Escolher a classe que sera testada (alvo do teste) + private final CarrinhoDeCompras driver = new CarrinhoDeCompras(); + + @Test + @DisplayName("Calcular o VALOR DO PRODUTO após aplicado o fator de desconto para o Cliente A, menor que 100 unidades") + @Tag("ClienteA") + public void testCalcularValorComDescontoDoProduto_QuandoClienteAMenor100() { + // 3. Configurar o estado inicial dos objetos + EasyMock.expect(this.cliente.getTipoCliente()).andReturn("A"); + EasyMock.expect(this.produto.getValor()).andReturn(1000.00); + // 4. Gravar os estados atuais dos objetos + replayAll(); + + // 5. Testar + this.driver.setCliente(this.cliente); + this.driver.addProduto(this.produto, 99); + double valorComDesconto = this.driver.calcularValorComDesconto(this.produto); + assertEquals(900.00, valorComDesconto); + // 6. Verificar que tudo o que era necess�rio para testar foi chamado + verifyAll(); + } + +} \ No newline at end of file diff --git a/src/test/java/br/pro/diegoquirino/calculadora/model/EasyMockExtension.java b/src/test/java/br/pro/diegoquirino/calculadora/model/EasyMockExtension.java new file mode 100644 index 0000000..e7bdf7c --- /dev/null +++ b/src/test/java/br/pro/diegoquirino/calculadora/model/EasyMockExtension.java @@ -0,0 +1,14 @@ +package br.pro.diegoquirino.calculadora.model; + +import org.easymock.EasyMockSupport; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.TestInstancePostProcessor; + +public class EasyMockExtension implements TestInstancePostProcessor { + + @Override + public void postProcessTestInstance(Object testInstance, ExtensionContext context) throws Exception { + EasyMockSupport.injectMocks(testInstance); + } + +} \ No newline at end of file diff --git a/src/test/java/br/pro/diegoquirino/calculadora/util/ClienteAStub.java b/src/test/java/br/pro/diegoquirino/calculadora/util/ClienteAStub.java new file mode 100644 index 0000000..5a607b0 --- /dev/null +++ b/src/test/java/br/pro/diegoquirino/calculadora/util/ClienteAStub.java @@ -0,0 +1,17 @@ +package br.pro.diegoquirino.calculadora.util; + +import br.pro.diegoquirino.calculadora.model.Cliente; + +public class ClienteAStub implements Cliente { + + @Override + public String getTipoCliente() { + return "A"; + } + + @Override + public void setTipoCliente(String tipo) { + ; + } + +} diff --git a/src/test/java/br/pro/diegoquirino/calculadora/util/DescontoUtilsTest.java b/src/test/java/br/pro/diegoquirino/calculadora/util/DescontoUtilsTest.java deleted file mode 100644 index 2903e66..0000000 --- a/src/test/java/br/pro/diegoquirino/calculadora/util/DescontoUtilsTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package br.pro.diegoquirino.calculadora.util; - -import org.junit.jupiter.api.*; - -import static org.junit.jupiter.api.Assertions.*; - -public class DescontoUtilsTest { - - private DescontoUtils driver; - - @BeforeEach - void setUp() { - this.driver = new DescontoUtils(); - } - - @AfterEach - void tearDown() { - this.driver = null; - } - - @Test - @DisplayName("Calcular o fator de desconto para o Cliente A, menor que 100 unidades") - @Tag("ClienteA") - void testCalcularFatorDeDescontoClienteAMenor100() { - double fator = this.driver.calcularFatorDeDesconto("A",99); - assertEquals(0.90, fator); - } - - @Test - @DisplayName("Calcular o fator de desconto para o Cliente B, menor que 100 unidades") - @Tag("ClienteB") - void testCalcularFatorDeDescontoClienteBMenor100() { - double fator = this.driver.calcularFatorDeDesconto("B",99); - assertEquals(0.85, fator); - } - - @Test - @DisplayName("Calcular o fator de desconto para o Cliente C, menor que 100 unidades") - @Tag("ClienteC") - void testCalcularFatorDeDescontoClienteCMenor100() { - double fator = this.driver.calcularFatorDeDesconto("C",99); - assertEquals(0.80, fator); - } - -} \ No newline at end of file diff --git a/src/test/java/br/pro/diegoquirino/calculadora/util/DescontoUtilsTests.java b/src/test/java/br/pro/diegoquirino/calculadora/util/DescontoUtilsTests.java new file mode 100644 index 0000000..3c20de2 --- /dev/null +++ b/src/test/java/br/pro/diegoquirino/calculadora/util/DescontoUtilsTests.java @@ -0,0 +1,97 @@ +package br.pro.diegoquirino.calculadora.util; + +import br.pro.diegoquirino.calculadora.model.Cliente; +import org.junit.jupiter.api.*; + +import static org.junit.jupiter.api.Assertions.*; + +public class DescontoUtilsTests { + + private DescontoUtils driver; + private Cliente cli; + + @BeforeEach + void setUp() { + this.driver = new DescontoUtils(); + this.cli = new ClienteAStub(); + } + + @AfterEach + void tearDown() { + this.driver = null; + this.cli = null; + } + + @Test + @DisplayName("Calcular o fator de desconto para o Cliente A, menor que 100 unidades") + @Tag("ClienteA") + void testCalcularFatorDeDescontoClienteAMenor100() { + double fator = this.driver.calcularFatorDeDesconto(this.cli.getTipoCliente(),99); + assertEquals(0.90, fator); + } + + @Test + @DisplayName("Calcular o fator de desconto para o Cliente A, maior ou igual a 100 e menor que 1000 unidades") + @Tag("ClienteA") + void testCalcularFatorDeDescontoClienteAEntre100e1000() { + double fator = this.driver.calcularFatorDeDesconto(this.cli.getTipoCliente(),100); + assertEquals(0.95, fator); + } + + @Test + @DisplayName("Calcular o fator de desconto para o Cliente A, maior ou igual 1000 unidades") + @Tag("ClienteA") + void testCalcularFatorDeDescontoClienteAMaior1000() { + double fator = this.driver.calcularFatorDeDesconto(this.cli.getTipoCliente(),1000); + assertEquals(1.00, fator); + } + + @Test + @DisplayName("Calcular o fator de desconto para o Cliente B, menor que 100 unidades") + @Tag("ClienteB") + void testCalcularFatorDeDescontoClienteBMenor100() { + double fator = this.driver.calcularFatorDeDesconto("B",99); + assertEquals(0.85, fator); + } + + @Test + @DisplayName("Calcular o fator de desconto para o Cliente B, maior ou igual a 100 e menor que 1000 unidades") + @Tag("ClienteB") + void testCalcularFatorDeDescontoClienteBEntre100e1000() { + double fator = this.driver.calcularFatorDeDesconto("B",100); + assertEquals(0.90, fator); + } + + @Test + @DisplayName("Calcular o fator de desconto para o Cliente B, maior ou igual 1000 unidades") + @Tag("ClienteB") + void testCalcularFatorDeDescontoClienteBMaior1000() { + double fator = this.driver.calcularFatorDeDesconto("B",1000); + assertEquals(0.95, fator); + } + + @Test + @DisplayName("Calcular o fator de desconto para o Cliente C, menor que 100 unidades") + @Tag("ClienteC") + void testCalcularFatorDeDescontoClienteCMenor100() { + double fator = this.driver.calcularFatorDeDesconto("C",99); + assertEquals(0.80, fator); + } + + @Test + @DisplayName("Calcular o fator de desconto para o Cliente C, maior ou igual a 100 e menor que 1000 unidades") + @Tag("ClienteC") + void testCalcularFatorDeDescontoClienteCEntre100e1000() { + double fator = this.driver.calcularFatorDeDesconto("C",100); + assertEquals(0.85, fator); + } + + @Test + @DisplayName("Calcular o fator de desconto para o Cliente C, maior ou igual 1000 unidades") + @Tag("ClienteC") + void testCalcularFatorDeDescontoClienteCMaior1000() { + double fator = this.driver.calcularFatorDeDesconto("C",1000); + assertEquals(0.90, fator); + } + +} \ No newline at end of file diff --git a/src/test/java/br/pro/diegoquirino/calculadora/util/SuiteTipoClienteA.java b/src/test/java/br/pro/diegoquirino/calculadora/util/SuiteTipoClienteA.java index 24d1675..c9f5099 100644 --- a/src/test/java/br/pro/diegoquirino/calculadora/util/SuiteTipoClienteA.java +++ b/src/test/java/br/pro/diegoquirino/calculadora/util/SuiteTipoClienteA.java @@ -6,7 +6,6 @@ import org.junit.platform.suite.api.SelectPackages; import org.junit.platform.suite.api.SuiteDisplayName; import org.junit.runner.RunWith; -import org.junit.runners.Suite; @RunWith(JUnitPlatform.class) @SuiteDisplayName("Suíte de testes para os clientes do tipo A") @@ -14,4 +13,5 @@ @IncludeTags("ClienteA") @ExcludeTags({"ClienteB","ClienteC"}) public class SuiteTipoClienteA { + } diff --git a/src/test/java/br/pro/diegoquirino/calculadora/util/SuiteTipoClienteB.java b/src/test/java/br/pro/diegoquirino/calculadora/util/SuiteTipoClienteB.java new file mode 100644 index 0000000..c976854 --- /dev/null +++ b/src/test/java/br/pro/diegoquirino/calculadora/util/SuiteTipoClienteB.java @@ -0,0 +1,17 @@ +package br.pro.diegoquirino.calculadora.util; + +import org.junit.platform.runner.JUnitPlatform; +import org.junit.platform.suite.api.ExcludeTags; +import org.junit.platform.suite.api.IncludeTags; +import org.junit.platform.suite.api.SelectPackages; +import org.junit.platform.suite.api.SuiteDisplayName; +import org.junit.runner.RunWith; + +@RunWith(JUnitPlatform.class) +@SuiteDisplayName("Suíte de testes para os clientes do tipo A") +@SelectPackages({"br.pro.diegoquirino.calculadora"}) +@IncludeTags("ClienteB") +@ExcludeTags({"ClienteA","ClienteC"}) +public class SuiteTipoClienteB { + +} diff --git a/src/test/java/br/pro/diegoquirino/calculadora/util/SuiteTipoClienteC.java b/src/test/java/br/pro/diegoquirino/calculadora/util/SuiteTipoClienteC.java new file mode 100644 index 0000000..4c768ff --- /dev/null +++ b/src/test/java/br/pro/diegoquirino/calculadora/util/SuiteTipoClienteC.java @@ -0,0 +1,17 @@ +package br.pro.diegoquirino.calculadora.util; + +import org.junit.platform.runner.JUnitPlatform; +import org.junit.platform.suite.api.ExcludeTags; +import org.junit.platform.suite.api.IncludeTags; +import org.junit.platform.suite.api.SelectPackages; +import org.junit.platform.suite.api.SuiteDisplayName; +import org.junit.runner.RunWith; + +@RunWith(JUnitPlatform.class) +@SuiteDisplayName("Suíte de testes para os clientes do tipo A") +@SelectPackages({"br.pro.diegoquirino.calculadora"}) +@IncludeTags("ClienteC") +@ExcludeTags({"ClienteA","ClienteB"}) +public class SuiteTipoClienteC { + +}