From 1a06fdf074e5ca8362d1b68bfb0bb9d843b5d445 Mon Sep 17 00:00:00 2001 From: vigusmao Date: Mon, 26 Apr 2021 11:32:36 -0300 Subject: [PATCH] Varias instancias de Loja no mesmo sistema --- LojaVirtual/src/Loja.java | 73 +++++++++++++++------------------- LojaVirtual/src/LojaTest.java | 75 ++++++++++++++++++++--------------- LojaVirtual/src/Produto.java | 38 +++++++----------- 3 files changed, 90 insertions(+), 96 deletions(-) diff --git a/LojaVirtual/src/Loja.java b/LojaVirtual/src/Loja.java index f1aa2a1..9f3aa65 100644 --- a/LojaVirtual/src/Loja.java +++ b/LojaVirtual/src/Loja.java @@ -10,57 +10,47 @@ */ public class Loja { - private static final Loja instanciaUnica = new Loja(); + private List produtos; + private List quantidades; + private List precos; - private List estoque; private List usuarios; static { System.out.println("Estou subindo a classe Loja..."); } - protected Loja() { - // escrevo código normalmente para o construtor - this.estoque = new ArrayList<>(); - this.usuarios = new ArrayList<>(); - } - - public static Loja getInstanciaUnica() { - return instanciaUnica; - } + public Loja() { + this.produtos = new ArrayList<>(); + this.quantidades = new ArrayList<>(); + this.precos = new ArrayList<>(); - public void limparEstado() { - // recria os atributos, ou os limpa... + this.usuarios = new ArrayList<>(); } /** - * Inclui no estoque da loja a quantidade informado do produto. + * Inclui no produtos da loja a quantidade informado do produto. * * @param produto o produto a ser incluído * @param quantidadeAIncluir a quantidade que será acrescentada à quantidade existente. */ public void incluirProduto(Produto produto, int quantidadeAIncluir) { - Produto produtoEmEstoque = obterProdutoEmEstoque(produto); - if (produtoEmEstoque != null) { - produtoEmEstoque.setQuantidadeEmEstoque( - produtoEmEstoque.getQuantidadeEmEstoque() + quantidadeAIncluir); + int indice = obterIndiceProdutoEmEstoque(produto); + + if (indice != -1) { // produto já existe no estoque da loja + int novoValor = this.quantidades.get(indice) + quantidadeAIncluir; +// this.quantidades[indice] = novoValor; // se fosse array + this.quantidades.set(indice, novoValor); + } else { - this.estoque.add(produto); - produto.setQuantidadeEmEstoque(quantidadeAIncluir); + this.produtos.add(produto); + this.quantidades.add(quantidadeAIncluir); + this.precos.add(0f); } } - private Produto obterProdutoEmEstoque(Produto produto) { -// for (Produto produtoEmEstoque : this.estoque) { -// if (produtoEmEstoque.equals(produto)) { -// return produtoEmEstoque; -// } -// } -// return null; - - int indice = this.estoque.indexOf(produto); - return indice != -1 ? this.estoque.get(indice) : null; - + private int obterIndiceProdutoEmEstoque(Produto produto) { + return this.produtos.indexOf(produto); } public void cadastrarUsuario(Usuario usuario) { @@ -93,7 +83,7 @@ private Usuario obterUsuario(long cpf) { * @param quantidadeDesejada a quantidade * * @return um Recibo indicando a venda feita, se o produto existia (em quantidade suficiente) - * no estoque da loja; null, caso o usuário ou o produto sejam desconhecidos, + * no produtos da loja; null, caso o usuário ou o produto sejam desconhecidos, * ou não haja quantidade suficiente do produto desejado */ public Recibo efetuarVenda( @@ -105,17 +95,20 @@ public Recibo efetuarVenda( } // existe o produto? - Produto produtoEmEstoque = obterProdutoEmEstoque(produto); - if (produtoEmEstoque == null || - produtoEmEstoque.getQuantidadeEmEstoque() < quantidadeDesejada) { + int indiceProdutoEmEstoque = obterIndiceProdutoEmEstoque(produto); + if (indiceProdutoEmEstoque == -1) { + return null; // não efetua a venda + } + int quantidadeEmEstoque = this.quantidades.get(indiceProdutoEmEstoque); + if (quantidadeEmEstoque < quantidadeDesejada) { return null; // não efetua a venda } // vamos efetuar a venda - produtoEmEstoque.setQuantidadeEmEstoque( - produtoEmEstoque.getQuantidadeEmEstoque() - quantidadeDesejada); + int novaQuantidade = quantidadeEmEstoque - quantidadeDesejada; + this.quantidades.set(indiceProdutoEmEstoque, novaQuantidade); - Recibo recibo = new Recibo(quantidadeDesejada * produto.getPrecoEmReais(), + Recibo recibo = new Recibo(quantidadeDesejada * this.precos.get(indiceProdutoEmEstoque), usuario, produto, quantidadeDesejada); return recibo; @@ -124,12 +117,12 @@ public Recibo efetuarVenda( /** * @param produto o produto a ser consultado * - * @return a quantidade em estoque; + * @return a quantidade em produtos; * 0 se não houver nenhuma unidade; * -1 se o produto não é sequer vendido pela loja */ public int informarQuantidadeEmEstoque(Produto produto) { - Produto produtoEmEstoque = obterProdutoEmEstoque(produto); + int indiceProdutoEmEstoque = obterIndiceProdutoEmEstoque(produto); if (produtoEmEstoque != null) { return produtoEmEstoque.getQuantidadeEmEstoque(); } diff --git a/LojaVirtual/src/LojaTest.java b/LojaVirtual/src/LojaTest.java index 682b3e5..521a8f0 100644 --- a/LojaVirtual/src/LojaTest.java +++ b/LojaVirtual/src/LojaTest.java @@ -15,22 +15,20 @@ public class LojaTest { private static DecimalFormatSymbols symbols = format.getDecimalFormatSymbols(); private static char sep = symbols.getDecimalSeparator(); - private Loja loja; + private Loja loja1; + private Loja loja2; private Usuario comprador; private Livro guinessBook; private Brinquedo cuboMagico; @Before // roda antes de cada teste... public void setUp() { -// loja = new Loja(); // quebraria, porque implementamos o padrão singleton (c/ construtor privado) - loja = new LojaNaoSingletonParaTeste(); // quebraria, porque implementamos o padrão singleton (c/ construtor privado) - - // outra forma de fazer, usando ainda o singleton... -// loja = Loja.getInstanciaUnica(); -// loja.inicializar(); // apenas para limpar o estado do singleton + loja1 = new Loja(); + loja2 = new Loja(); comprador = new Usuario("Fulano", 123456, "Rua XYZ, 100"); - loja.cadastrarUsuario(comprador); + loja1.cadastrarUsuario(comprador); + loja2.cadastrarUsuario(comprador); guinessBook = new Livro("Guiness Book Of Records", "Editora Abril"); guinessBook.setPrecoEmReais(50); @@ -41,31 +39,49 @@ public void setUp() { @Test public void testarInclusaoDeProdutoNoEstoque() { - loja.incluirProduto(guinessBook, 100); + loja1.incluirProduto(guinessBook, 100); assertEquals("O estoque deve refletir a quantidade correta do produto", - 100, loja.informarQuantidadeEmEstoque(guinessBook)); + 100, loja1.informarQuantidadeEmEstoque(guinessBook)); + + loja1.incluirProduto(guinessBook, 6); + assertEquals("O estoque deve ser atualizado após cada inclusão", + 106, loja1.informarQuantidadeEmEstoque(guinessBook)); + + // vamos cadastrar o mesmo produto na segunda loja + loja2.incluirProduto(guinessBook, 20); + assertEquals("O estoque de cada loja deve ser independente", + 20, loja2.informarQuantidadeEmEstoque(guinessBook)); + + // agora vamos consultar novamente a quantidade daquele produto na primeira loja + assertEquals("O estoque deve ser atualizado após cada inclusão", + 106, loja1.informarQuantidadeEmEstoque(guinessBook)); + } + + @Test + public void testarConsultaDeProdutoUsandoOutroObjeto() { + loja1.incluirProduto(guinessBook, 100); -// Livro outroObjetoRepresentandoOMesmoLivro = new Livro( -// guinessBook.getNome(), guinessBook.getEditora()); + Livro outroObjetoRepresentandoOMesmoLivro = new Livro( + guinessBook.getNome(), guinessBook.getEditora()); - loja.incluirProduto(guinessBook, 6); assertEquals("O estoque deve ser atualizado após cada inclusão", - 106, loja.informarQuantidadeEmEstoque(guinessBook)); + 100, loja1.informarQuantidadeEmEstoque( + outroObjetoRepresentandoOMesmoLivro)); } @Test public void testarVendaParaUsuarioNaoCadastrado() { - loja.incluirProduto(guinessBook, 100); + loja1.incluirProduto(guinessBook, 100); Usuario compradorDesconhecido = new Usuario("Fantasma", 222, "Blah"); - assertNull("Apenas usuários cadastrados na loja podem comprar nela", - loja.efetuarVenda(guinessBook, 5, compradorDesconhecido)); + assertNull("Apenas usuários cadastrados na loja1 podem comprar nela", + loja1.efetuarVenda(guinessBook, 5, compradorDesconhecido)); } @Test public void testarVendaBemSucedida() { - loja.incluirProduto(guinessBook, 100); + loja1.incluirProduto(guinessBook, 100); - Recibo recibo = loja.efetuarVenda(guinessBook, 5, comprador); + Recibo recibo = loja1.efetuarVenda(guinessBook, 5, comprador); assertNotNull(recibo); assertEquals(comprador, recibo.getUsuario()); assertEquals(250, recibo.getValorTotalDaCompra(), FLOAT_DELTA); @@ -74,33 +90,26 @@ public void testarVendaBemSucedida() { recibo.toString()); assertEquals("O estoque deve ser atualizado após cada venda", - 95, loja.informarQuantidadeEmEstoque(guinessBook)); + 95, loja1.informarQuantidadeEmEstoque(guinessBook)); } @Test public void testarVendaParaProdutoEmQuantidadeInsuficiente() { - loja.incluirProduto(guinessBook, 100); + loja1.incluirProduto(guinessBook, 100); assertNull("A venda não deve ser efetuada se não houver quantidade suficiente", - loja.efetuarVenda(guinessBook, 101, comprador)); + loja1.efetuarVenda(guinessBook, 101, comprador)); } @Test public void testarVendaParaProdutoQueNaoEhVendidoPelaLoja() { - assertNull("A venda não deve ser efetuada se a loja não trabalhar com aquele produto", - loja.efetuarVenda(cuboMagico, 1, comprador)); + assertNull("A venda não deve ser efetuada se a loja1 não trabalhar com aquele produto", + loja1.efetuarVenda(cuboMagico, 1, comprador)); } @Test public void testarLojaVendendoProdutosDiversos() { - loja.incluirProduto(guinessBook, 1); - loja.incluirProduto(cuboMagico, 5); + loja1.incluirProduto(guinessBook, 1); + loja1.incluirProduto(cuboMagico, 5); // não é preciso asserts, apenas está aqui para ver que isso precisa compilar corretamente } - - private class LojaNaoSingletonParaTeste extends Loja { - - public LojaNaoSingletonParaTeste() { - super(); - } - } } \ No newline at end of file diff --git a/LojaVirtual/src/Produto.java b/LojaVirtual/src/Produto.java index bba6e01..7a156f3 100644 --- a/LojaVirtual/src/Produto.java +++ b/LojaVirtual/src/Produto.java @@ -1,10 +1,9 @@ +import java.util.Objects; + public class Produto { private String descricao; - - private int quantidadeEmEstoque = -1; // indica que o produto não é vendida - - private float precoEmReais; + private int pesoEmGramas; public Produto(String descricao) { this.descricao = descricao; @@ -18,39 +17,32 @@ public String getDescricao() { } public int getPesoEmGramas() { - return 0; // ToDo IMPLEMENT ME!!! + return this.pesoEmGramas; } public Dimensoes getDimensoes() { return null; // ToDo IMPLEMENT ME!!! } - public float precoEmReais() { - return this.precoEmReais; - } - - public float getPrecoEmReais() { - return this.precoEmReais; - } - - public void setPrecoEmReais(float preco) { - this.precoEmReais = preco; - } - public String getUrlDaImagem() { return null; // ToDo IMPLEMENT ME!!! } - int getQuantidadeEmEstoque() { - return this.quantidadeEmEstoque; + @Override + public String toString() { + return this.descricao; } - void setQuantidadeEmEstoque(int novaQuantidade) { - this.quantidadeEmEstoque = novaQuantidade; + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Produto produto = (Produto) o; + return Objects.equals(descricao, produto.descricao); } @Override - public String toString() { - return this.descricao; + public int hashCode() { + return Objects.hash(descricao); } }