Skip to content

Commit

Permalink
Varias instancias de Loja no mesmo sistema
Browse files Browse the repository at this point in the history
  • Loading branch information
vigusmao committed Apr 26, 2021
1 parent ca01eb7 commit 1a06fdf
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 96 deletions.
73 changes: 33 additions & 40 deletions LojaVirtual/src/Loja.java
Expand Up @@ -10,57 +10,47 @@
*/
public class Loja {

private static final Loja instanciaUnica = new Loja();
private List<Produto> produtos;
private List<Integer> quantidades;
private List<Float> precos;

private List<Produto> estoque;
private List<Usuario> 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) {
Expand Down Expand Up @@ -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(
Expand All @@ -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;

Expand All @@ -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();
}
Expand Down
75 changes: 42 additions & 33 deletions LojaVirtual/src/LojaTest.java
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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();
}
}
}
38 changes: 15 additions & 23 deletions 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;
Expand All @@ -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);
}
}

0 comments on commit 1a06fdf

Please sign in to comment.