Skip to content

Commit

Permalink
enums
Browse files Browse the repository at this point in the history
  • Loading branch information
vinicius committed Feb 19, 2021
1 parent 7233e37 commit e5c6f8e
Show file tree
Hide file tree
Showing 10 changed files with 122 additions and 30 deletions.
4 changes: 2 additions & 2 deletions Banco/LAB2.txt
@@ -1,4 +1,4 @@
1) Crie um método público em ContaCorrente que permita o saque de um determinado valor.
1) Crie um método público em Conta que permita o saque de um determinado valor.
Se não houver saldo suficiente para o valor desejado, o saque não deve ser efetuado.
Caso contrário, o saldo deverá ser diminuído de acordo com o valor sacado,
e uma entrada deve ser acrescentada no histórico de operações daquela conta.
Expand All @@ -7,4 +7,4 @@
(que você implementou no item anterior) está funcionando corretamente

3) Faça o teste testarTransferecia() passar. (Este teste foi escrito no estilo TDD).
Em outras palavras, é preciso implementar o método transferir() na classe ContaCorrente.
Em outras palavras, é preciso implementar o método transferir() na classe Conta.
2 changes: 1 addition & 1 deletion Banco/LAB3.txt
Expand Up @@ -16,7 +16,7 @@
- para sacar, idem
- para transferir, idem e também o número da conta de destino
- para cadastrar um correntista, deverá pedir os parâmetros requeridos pelo construtor de Pessoa
- para criar uma nova conta, deverá pedir os parâmetros requeridos pelo construtor de ContaCorrente,
- para criar uma nova conta, deverá pedir os parâmetros requeridos pelo construtor de Conta,
e deverá imprimir o número da conta recém-criada

3) A agência será a mesma (uma agência padrão criada no começo do main()) para todas as contas
Expand Down
4 changes: 2 additions & 2 deletions Banco/LAB8.txt
@@ -1,9 +1,9 @@
1) Termine de substituir os ToDos da classe ContaCorrente
1) Termine de substituir os ToDos da classe Conta
por lançamentos de checked exceptions

2) Verifique os chamadores dos métodos que você mexerá
para que ele se prepare para o caso em que tal ou qual checked
exception seja lançada

3) Escreva unit tests para todas as situações excepcionais que
podem acontecer dentro da classe ContaCorrente
podem acontecer dentro da classe Conta
9 changes: 5 additions & 4 deletions Banco/src/Banco.java
Expand Up @@ -5,7 +5,7 @@

public class Banco {

Map<Long, ContaCorrente> contaPorNumero;
Map<Long, Conta> contaPorNumero;
Map<Long, Pessoa> correntistaPorCpf;

Set<Pessoa> correntistasComSaldoNegativo;
Expand All @@ -32,7 +32,7 @@ public Pessoa cadastrarCorrentista(String nome, long cpf) {
return p;
}

public ContaCorrente cadastrarConta(Pessoa correntista) {
public Conta cadastrarConta(Pessoa correntista) {
// verifica correntista
if (localizarCorrentista(correntista.getCpf()) == null) {
// correntista não existe!!
Expand All @@ -42,7 +42,8 @@ public ContaCorrente cadastrarConta(Pessoa correntista) {

// aceitamos mais de uma conta para o mesmo correntista

ContaCorrente novaConta = new ContaCorrente(correntista, this.agenciaMatriz);
Conta novaConta = new Conta(correntista, this.agenciaMatriz,
TipoDeConta.CONTA_CORRENTE);
this.contaPorNumero.put(novaConta.getNumeroDaConta(), novaConta);

return novaConta;
Expand All @@ -52,7 +53,7 @@ public Pessoa localizarCorrentista(long cpf) {
return this.correntistaPorCpf.get(cpf);
}

public ContaCorrente localizarConta(long numeroDaConta) {
public Conta localizarConta(long numeroDaConta) {
return this.contaPorNumero.get(numeroDaConta);
}

Expand Down
4 changes: 2 additions & 2 deletions Banco/src/BancoTest.java
Expand Up @@ -13,10 +13,10 @@ public void setUp() {
}

@Test
public void testarCadastroDeUsuariosComSaldoNegativo() {
public void testarCadastroDeUsuariosComSaldoNegativo() throws SaldoInsuficienteException, SaqueDeValorNaoPositivoException {
Pessoa maria = banco.cadastrarCorrentista(
"Mariah", 123456L);
ContaCorrente contaDaMaria = banco.cadastrarConta(maria);
Conta contaDaMaria = banco.cadastrarConta(maria);
contaDaMaria.depositar(1000);
contaDaMaria.sacar(1100);

Expand Down
48 changes: 45 additions & 3 deletions Banco/src/ContaCorrente.java → Banco/src/Conta.java
@@ -1,14 +1,18 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;

public class ContaCorrente {
public class Conta {

// o banco já te dá algo como estímulo :-)
public static final float SALDO_INICIAL_DE_NOVAS_CONTAS = 10.0f;

//limite comum a todas as contas
public static final float LIMITE_CHEQUE_ESPECIAL = 200.0f;

// não é permitido investir em doses homeopáticas! :-)
public static final float APORTE_MINIMO_PARA_INVESTIMENTOS = 500.0f;

private final long numeroDaConta;

private final Agencia agencia;
Expand All @@ -21,21 +25,35 @@ public class ContaCorrente {

private Pessoa gerenteDaConta;

private final TipoDeConta tipo;

private ArrayList<String> historicoDeOperacoes;

static int numeroDeContasCriadas = 0;

public ContaCorrente(Pessoa correntista, Agencia agencia) {
/**
*
* @param correntista
* @param agencia
* @param tipo o tipo
*/
public Conta(Pessoa correntista, Agencia agencia, TipoDeConta tipo) {
this.historicoDeOperacoes = new ArrayList<>();
this.dataDeCriacao = new Date(); // data corrente
this.saldoEmReais = SALDO_INICIAL_DE_NOVAS_CONTAS;

this.tipo = tipo;

this.numeroDaConta = ++numeroDeContasCriadas;

this.correntista = correntista;
this.agencia = agencia;
}

public TipoDeConta getTipo() {
return this.tipo;
}

public long getNumeroDaConta() {
return numeroDaConta;
}
Expand All @@ -52,12 +70,36 @@ private void setSaldoEmReais(float novoSaldo) {
}
}

public void depositarEmDinheiro(Map<Dinheiro, Integer> contagemPorCedulaOuMoeda) {
float totalADepositar = 0;

// for (Dinheiro cedulaOuMoeda : contagemPorCedulaOuMoeda.keySet()) {
// int contagem = contagemPorCedulaOuMoeda.get(cedulaOuMoeda);
// totalADepositar += contagem * cedulaOuMoeda.getValorMonetario();
// }

/* jeito mais elegante (e performático!) de iterar pelas chaves
e valores de um mapa */
for (Map.Entry<Dinheiro, Integer> itemDoMapa : contagemPorCedulaOuMoeda.entrySet()) {
Dinheiro cedulaOuMoeda = itemDoMapa.getKey();
Integer contagem = itemDoMapa.getValue();
totalADepositar += contagem * cedulaOuMoeda.getValorMonetario();
}

depositar(totalADepositar);
}

public void depositar(float valor) {
// valida o parâmetro
if (valor <= 0) {
return; // ToDo lançar uma exceção!!!!
}

if (tipo == TipoDeConta.CONTA_INVESTIMENTO &&
valor < APORTE_MINIMO_PARA_INVESTIMENTOS) {
return; // ToDo lançar exceção específica (checked)
}

// altera o saldo
setSaldoEmReais(this.saldoEmReais + valor);

Expand Down Expand Up @@ -94,7 +136,7 @@ public void sacar(float valor)
* @param valor o valor desejado
* @param contaDestino a conta de destino
*/
public void transferir(float valor, ContaCorrente contaDestino) {
public void transferir(float valor, Conta contaDestino) {
// valida o parâmetro
if (valor <= 0) {
return; // ToDo lançar uma exceção!!!!
Expand Down
41 changes: 28 additions & 13 deletions Banco/src/ContaCorrenteTest.java → Banco/src/ContaTest.java
@@ -1,9 +1,12 @@
import org.junit.Before;
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

import static org.junit.Assert.*;

public class ContaCorrenteTest {
public class ContaTest {

private static final float ERRO_ACEITAVEL_NOS_FLOATS = 0.000001f;

Expand All @@ -14,8 +17,8 @@ public class ContaCorrenteTest {

private Agencia minhaAgencia;

private ContaCorrente contaDaMaria;
private ContaCorrente contaDoJoao;
private Conta contaDaMaria;
private Conta contaDoJoao;

@Before
public void setUp() {
Expand All @@ -28,24 +31,24 @@ public void setUp() {
// cria uma agencia
minhaAgencia = new Agencia(banco, 1, "Agência Principal");

ContaCorrente.numeroDeContasCriadas = 0; // reseta o static da classe
Conta.numeroDeContasCriadas = 0; // reseta o static da classe

// cria algumas contas
contaDaMaria = new ContaCorrente(maria, minhaAgencia);
contaDoJoao = new ContaCorrente(joao, minhaAgencia);
contaDaMaria = new Conta(maria, minhaAgencia, TipoDeConta.CONTA_CORRENTE);
contaDoJoao = new Conta(joao, minhaAgencia, TipoDeConta.CONTA_SALARIO);
}

@Test
public void testarNumerosAutomaticosDeContas() {
assertEquals(1, contaDaMaria.getNumeroDaConta());
assertEquals(2, contaDoJoao.getNumeroDaConta());
// ContaCorrente novaConta = new ContaCorrente(maria, minhaAgencia);
// Conta novaConta = new Conta(maria, minhaAgencia);
// long numeroDaConta = novaConta.getNumeroDaConta();
//
// assertEquals(numeroDaConta + 1,
// (new ContaCorrente(joao, minhaAgencia).getNumeroDaConta()));
// (new Conta(joao, minhaAgencia).getNumeroDaConta()));
// assertEquals(numeroDaConta + 2,
// (new ContaCorrente(joao, minhaAgencia).getNumeroDaConta());
// (new Conta(joao, minhaAgencia).getNumeroDaConta());
}

@Test
Expand All @@ -62,15 +65,27 @@ public void testarDeposito() {
assertFloatEquals(1510f, contaDaMaria.getSaldoEmReais()); // nada mudou,porque o depósito não foi feito
}

@Test
public void testarDepositoEmDinheiro() {
checarSaldoInicial(contaDaMaria);

Map<Dinheiro, Integer> contagemPorCedulaOuMoeda = new HashMap<>();
contagemPorCedulaOuMoeda.put(Dinheiro.MOEDA_DE_CINCO_CENTAVOS, 3);
contagemPorCedulaOuMoeda.put(Dinheiro.CEDULA_DE_DUZENTOS_REAIS, 1);

contaDaMaria.depositarEmDinheiro(contagemPorCedulaOuMoeda);
assertFloatEquals(210.15f, contaDaMaria.getSaldoEmReais());
}

@Test
public void testarSaque() {
public void testarSaque() throws SaldoInsuficienteException, SaqueDeValorNaoPositivoException {
checarSaldoInicial(contaDaMaria);
contaDaMaria.sacar(7);
assertEquals(3f, contaDaMaria.getSaldoEmReais(), ERRO_ACEITAVEL_NOS_FLOATS);
}

@Test
public void testarSaqueSemFundos() {
public void testarSaqueSemFundos() throws SaldoInsuficienteException, SaqueDeValorNaoPositivoException {
checarSaldoInicial(contaDaMaria);
contaDaMaria.sacar(17);
assertFloatEquals(10f, contaDaMaria.getSaldoEmReais());
Expand Down Expand Up @@ -101,10 +116,10 @@ public void testarTransfereciaSemFundosNaContaDeOrigem() {
// a transferência NÃO DEVE SER REALIZADA, porque não fundos na conta de origem (Maria).
}

private void checarSaldoInicial(ContaCorrente conta) {
private void checarSaldoInicial(Conta conta) {
// sanity check: as contas já começam com saldo 10 (regra de negócio)
assertFloatEquals(
ContaCorrente.SALDO_INICIAL_DE_NOVAS_CONTAS,
Conta.SALDO_INICIAL_DE_NOVAS_CONTAS,
conta.getSaldoEmReais());
}

Expand Down
26 changes: 26 additions & 0 deletions Banco/src/Dinheiro.java
@@ -0,0 +1,26 @@
public enum Dinheiro {

MOEDA_DE_CINCO_CENTAVOS(0.05f),
MOEDA_DE_DEZ_CENTAVOS(0.10f),
MOEDA_DE_VINTE_E_CINCO_CENTAVOS(0.25f),
MOEDA_DE_CINQUENTA_CENTAVOS(0.50f),
MOEDA_DE_UM_REAL(1),
CEDULA_DE_DOIS_REAIS(2),
CEDULA_DE_CINCO_REAIS(5),
CEDULA_DE_DEZ_REAIS(10),
CEDULA_DE_VINTE_REAIS(20),
CEDULA_DE_CINQUENTA_REAIS(50),
CEDULA_DE_CEM_REAIS(100),
CEDULA_DE_DUZENTOS_REAIS(200);

private float valorMonetario;

Dinheiro(float valorMonetario) {
this.valorMonetario = valorMonetario;
}

public float getValorMonetario() {
return this.valorMonetario;
}

}
6 changes: 3 additions & 3 deletions Banco/src/Principal.java
Expand Up @@ -22,7 +22,7 @@ public static void main(String[] args) {
System.out.print("Valor desejado: ");
float valor = Float.parseFloat(scanner.nextLine());

ContaCorrente contaCorrente = meuBanco.localizarConta(numeroDaConta);
Conta contaCorrente = meuBanco.localizarConta(numeroDaConta);
if (contaCorrente != null) {
contaCorrente.depositar(valor);
System.out.println(contaCorrente.getUltimoItemHistorico());
Expand Down Expand Up @@ -76,7 +76,7 @@ public static void main(String[] args) {
case "C":
System.out.print("Número da conta: ");
long numero = Long.parseLong(scanner.nextLine());
ContaCorrente conta = meuBanco.localizarConta(numero);
Conta conta = meuBanco.localizarConta(numero);
if (conta != null) {
System.out.println(String.format("Saldo = %.2f",
conta.getSaldoEmReais()));
Expand All @@ -101,7 +101,7 @@ public static void main(String[] args) {
cpf = Long.parseLong(scanner.nextLine());
Pessoa correntista = meuBanco.localizarCorrentista(cpf);
if (correntista != null) {
ContaCorrente novaConta = meuBanco.cadastrarConta(correntista);
Conta novaConta = meuBanco.cadastrarConta(correntista);
System.out.println("Conta criada com o número " + novaConta.getNumeroDaConta());
} else {
System.out.println("Correntista não existe!");
Expand Down
8 changes: 8 additions & 0 deletions Banco/src/TipoDeConta.java
@@ -0,0 +1,8 @@
public enum TipoDeConta {

CONTA_CORRENTE,
CONTA_POUPANCA,
CONTA_SALARIO,
CONTA_INVESTIMENTO;

}

0 comments on commit e5c6f8e

Please sign in to comment.