From 00321e75cacff362b9e6543f9636c73ea35b39b2 Mon Sep 17 00:00:00 2001 From: Tomas Date: Sun, 30 May 2021 22:37:35 -0300 Subject: [PATCH] feat: add monedero --- 03-lecture/monedero/README.md | 33 ++++ 03-lecture/monedero/pom.xml | 44 ++++++ .../MaximaCantidadDepositosException.java | 9 ++ .../MaximoExtraccionDiarioException.java | 7 + .../exceptions/MontoNegativoException.java | 7 + .../exceptions/SaldoMenorException.java | 7 + .../main/java/dds/monedero/model/Cuenta.java | 141 ++++++++++++++++++ .../java/dds/monedero/model/Deposito.java | 25 ++++ .../java/dds/monedero/model/Extraccion.java | 25 ++++ .../java/dds/monedero/model/Movimiento.java | 44 ++++++ .../java/dds/monedero/model/MonederoTest.java | 74 +++++++++ .../dds/monedero/model/MovimientoTest.java | 24 +++ .../target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 0 .../compile/default-compile/inputFiles.lst | 6 + .../default-testCompile/createdFiles.lst | 0 .../default-testCompile/inputFiles.lst | 1 + .../TEST-dds.monedero.model.MonederoTest.xml | 67 +++++++++ .../dds.monedero.model.MonederoTest.txt | 4 + 19 files changed, 523 insertions(+) create mode 100644 03-lecture/monedero/README.md create mode 100644 03-lecture/monedero/pom.xml create mode 100644 03-lecture/monedero/src/main/java/dds/monedero/exceptions/MaximaCantidadDepositosException.java create mode 100644 03-lecture/monedero/src/main/java/dds/monedero/exceptions/MaximoExtraccionDiarioException.java create mode 100644 03-lecture/monedero/src/main/java/dds/monedero/exceptions/MontoNegativoException.java create mode 100644 03-lecture/monedero/src/main/java/dds/monedero/exceptions/SaldoMenorException.java create mode 100644 03-lecture/monedero/src/main/java/dds/monedero/model/Cuenta.java create mode 100644 03-lecture/monedero/src/main/java/dds/monedero/model/Deposito.java create mode 100644 03-lecture/monedero/src/main/java/dds/monedero/model/Extraccion.java create mode 100644 03-lecture/monedero/src/main/java/dds/monedero/model/Movimiento.java create mode 100644 03-lecture/monedero/src/test/java/dds/monedero/model/MonederoTest.java create mode 100644 03-lecture/monedero/src/test/java/dds/monedero/model/MovimientoTest.java create mode 100644 03-lecture/monedero/target/maven-archiver/pom.properties create mode 100644 03-lecture/monedero/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 03-lecture/monedero/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 03-lecture/monedero/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst create mode 100644 03-lecture/monedero/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst create mode 100644 03-lecture/monedero/target/surefire-reports/TEST-dds.monedero.model.MonederoTest.xml create mode 100644 03-lecture/monedero/target/surefire-reports/dds.monedero.model.MonederoTest.txt diff --git a/03-lecture/monedero/README.md b/03-lecture/monedero/README.md new file mode 100644 index 0000000..1432b9e --- /dev/null +++ b/03-lecture/monedero/README.md @@ -0,0 +1,33 @@ +## Monedero + +### Contexto + +Este repositorio contiene el código de un _monedero virtual_, al que podemos agregarle y quitarle dinero, a través +de los métodos `Monedero.sacar` y `Monedero.poner`, respectivamente. +Pero hay algunos problemas: por un lado el código no está muy bien testeado, y por el otro, hay numeros _code smells_. + +### Consigna + +Tenés seis tareas: + + 1. :fork_and_knife: Hacé un _fork_ de este repositorio (presionando desde Github el botón Fork) + 2. :arrow_down: Descargalo y construí el proyecto, utilizando `maven` + 2. :nose: Identificá y anotá todos los _code smells_ que encuentres + 3. :test_tube: Agregá los tests faltantes y mejorá los existentes. + * :eyes: Ojo: ¡un test sin ningún tipo de aserción está incompleto! + 4. :rescue_worker_helmet: Corregí smells, de a un commit por vez. + 5. :arrow_up: Subí todos los cambios a tu _fork_ + +### Tecnologías usadas + +* Java 8. +* JUnit 5. :warning: La versión 5 de JUnit es la más nueva del framework y presenta algunas diferencias respecto a la versión "clásica" (JUnit 4). Para mayores detalles, ver: + * [Apunte de herramientas](https://docs.google.com/document/d/1VYBey56M0UU6C0689hAClAvF9ILE6E7nKIuOqrRJnWQ/edit#heading=h.dnwhvummp994) + * [Entrada de Blog (en inglés)](https://www.baeldung.com/junit-5-migration) + * [Entrada de Blog (en español)](https://www.paradigmadigital.com/dev/nos-espera-junit-5/) +* Maven 3.3 o superior + + + + + diff --git a/03-lecture/monedero/pom.xml b/03-lecture/monedero/pom.xml new file mode 100644 index 0000000..bbb54bd --- /dev/null +++ b/03-lecture/monedero/pom.xml @@ -0,0 +1,44 @@ + + 4.0.0 + + dds + dds.monedero + 1.0-SNAPSHOT + jar + + dds.monedero + https://github.com/dds-utn + + + UTF-8 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M5 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + + + + + org.junit.jupiter + junit-jupiter-engine + 5.7.0 + test + + + diff --git a/03-lecture/monedero/src/main/java/dds/monedero/exceptions/MaximaCantidadDepositosException.java b/03-lecture/monedero/src/main/java/dds/monedero/exceptions/MaximaCantidadDepositosException.java new file mode 100644 index 0000000..4c3af4c --- /dev/null +++ b/03-lecture/monedero/src/main/java/dds/monedero/exceptions/MaximaCantidadDepositosException.java @@ -0,0 +1,9 @@ +package dds.monedero.exceptions; + +public class MaximaCantidadDepositosException extends RuntimeException { + + public MaximaCantidadDepositosException(String message) { + super(message); + } + +} \ No newline at end of file diff --git a/03-lecture/monedero/src/main/java/dds/monedero/exceptions/MaximoExtraccionDiarioException.java b/03-lecture/monedero/src/main/java/dds/monedero/exceptions/MaximoExtraccionDiarioException.java new file mode 100644 index 0000000..99f0638 --- /dev/null +++ b/03-lecture/monedero/src/main/java/dds/monedero/exceptions/MaximoExtraccionDiarioException.java @@ -0,0 +1,7 @@ +package dds.monedero.exceptions; + +public class MaximoExtraccionDiarioException extends RuntimeException { + public MaximoExtraccionDiarioException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/03-lecture/monedero/src/main/java/dds/monedero/exceptions/MontoNegativoException.java b/03-lecture/monedero/src/main/java/dds/monedero/exceptions/MontoNegativoException.java new file mode 100644 index 0000000..7b7feb6 --- /dev/null +++ b/03-lecture/monedero/src/main/java/dds/monedero/exceptions/MontoNegativoException.java @@ -0,0 +1,7 @@ +package dds.monedero.exceptions; + +public class MontoNegativoException extends RuntimeException { + public MontoNegativoException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/03-lecture/monedero/src/main/java/dds/monedero/exceptions/SaldoMenorException.java b/03-lecture/monedero/src/main/java/dds/monedero/exceptions/SaldoMenorException.java new file mode 100644 index 0000000..028db94 --- /dev/null +++ b/03-lecture/monedero/src/main/java/dds/monedero/exceptions/SaldoMenorException.java @@ -0,0 +1,7 @@ +package dds.monedero.exceptions; + +public class SaldoMenorException extends RuntimeException { + public SaldoMenorException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/03-lecture/monedero/src/main/java/dds/monedero/model/Cuenta.java b/03-lecture/monedero/src/main/java/dds/monedero/model/Cuenta.java new file mode 100644 index 0000000..2b2c0a0 --- /dev/null +++ b/03-lecture/monedero/src/main/java/dds/monedero/model/Cuenta.java @@ -0,0 +1,141 @@ +package dds.monedero.model; + +import dds.monedero.exceptions.MaximaCantidadDepositosException; +import dds.monedero.exceptions.MaximoExtraccionDiarioException; +import dds.monedero.exceptions.MontoNegativoException; +import dds.monedero.exceptions.SaldoMenorException; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +public class Cuenta { + + private double limite = 1000; + private int maximosDepositos = 3; + private double saldo; + private List movimientos = new ArrayList<>(); + + /** + * Verfica si se supera el monto de extaccion diaria. + * + * @param cuanto el monto + * @param limite el limite de extaccion + * @throws MaximoExtraccionDiarioException si supera el límite + */ + private void verificarExtraccionDiaria(double cuanto) { + double limite = getLimiteActual(); + + if (cuanto > limite) { + throw new MaximoExtraccionDiarioException( + "No puede extraer mas de $ " + this.limite + " diarios, límite: " + limite); + } + } + + /** + * Valida si puede realizarse la extaccion. + * + * @param cuanto el monto + * @throws SaldoMenorException cuando se desea sacar mas que el el saldo. + */ + private void verificarSaldoMenor(double cuanto) { + if (getSaldo() - cuanto < 0) { + throw new SaldoMenorException("No puede sacar mas de " + getSaldo() + " $"); + } + } + + /** + * Valia si se encuentra dentro de la Maxima cantidad de depósitos. + * + * @throws MaximaCantidadDepositosException cuando excede cierto numeros. + */ + private void verificarMaximaCantidadDepositos() { + if (contarDepositos() >= this.maximosDepositos) { + throw new MaximaCantidadDepositosException( + "Ya excedio los " + this.maximosDepositos + " depositos diarios"); + } + } + + /** + * Verifica si el monto es negativo. + * + * @param cuanto el monto a verificar + * @throws MontoNegativoException si el monto es menor a 0. + */ + private void verificarMontoNegativo(double cuanto) { + if (cuanto <= 0) { + throw new MontoNegativoException(cuanto + ": el monto a ingresar debe ser un valor positivo"); + } + } + + public Cuenta() { + this(0); + } + + public Cuenta(double montoInicial) { + saldo = montoInicial; + } + + /** + * Cuenta la cantidad de movimientos que son depositos. + * + * @return la cantidad de depositos. + */ + public long contarDepositos() { + return getMovimientos().stream().filter(movimiento -> movimiento.fueDepositado(LocalDate.now())) + .count(); + } + + private void realizarOperacion(Movimiento movimiento, Runnable verificacion) { + verificarMontoNegativo(movimiento.getMonto()); + verificacion.run(); + agregarMovimiento(movimiento); + } + + public void poner(double cuanto) { + + realizarOperacion(new Deposito(LocalDate.now(), cuanto), + () -> verificarMaximaCantidadDepositos()); + } + + public void sacar(double cuanto) { + + realizarOperacion(new Extraccion(LocalDate.now(), cuanto), () -> { + verificarSaldoMenor(cuanto); + verificarExtraccionDiaria(cuanto); + }); + + } + + public void agregarMovimiento(Movimiento movimiento) { + movimientos.add(movimiento); + this.saldo += movimiento.getSaldo(); + } + + public double getMontoExtraidoA(LocalDate fecha) { + return getMovimientos().stream().filter(movimiento -> movimiento.fueExtraido(fecha)) + .mapToDouble(Movimiento::getMonto).sum(); + } + + public List getMovimientos() { + return movimientos; + } + + /** + * Obtiene el límite de extaccion restante + * + * @return el limite actual + */ + public double getLimiteActual() { + return this.limite - getMontoExtraidoA(LocalDate.now()); + } + + public double getSaldo() { + return saldo; + } + + public void setSaldo(double saldo) { + this.saldo = saldo; + } + +} diff --git a/03-lecture/monedero/src/main/java/dds/monedero/model/Deposito.java b/03-lecture/monedero/src/main/java/dds/monedero/model/Deposito.java new file mode 100644 index 0000000..66d4e0b --- /dev/null +++ b/03-lecture/monedero/src/main/java/dds/monedero/model/Deposito.java @@ -0,0 +1,25 @@ +package dds.monedero.model; + +import java.time.LocalDate; + +public class Deposito extends Movimiento { + + public Deposito(LocalDate fecha, double monto) { + super(fecha, monto); + } + + @Override + public boolean fueExtraido(LocalDate fecha) { + return false; + } + + @Override + public boolean fueDepositado(LocalDate fecha) { + return esDeLaFecha(fecha); + } + + @Override + public double getSaldo() { + return this.getMonto(); + } +} diff --git a/03-lecture/monedero/src/main/java/dds/monedero/model/Extraccion.java b/03-lecture/monedero/src/main/java/dds/monedero/model/Extraccion.java new file mode 100644 index 0000000..f4f4b2e --- /dev/null +++ b/03-lecture/monedero/src/main/java/dds/monedero/model/Extraccion.java @@ -0,0 +1,25 @@ +package dds.monedero.model; + +import java.time.LocalDate; + +public class Extraccion extends Movimiento { + + public Extraccion(LocalDate fecha, double monto) { + super(fecha, monto); + } + + @Override + public boolean fueExtraido(LocalDate fecha) { + return esDeLaFecha(fecha); + } + + @Override + public boolean fueDepositado(LocalDate fecha) { + return false; + } + + @Override + public double getSaldo() { + return -this.getMonto(); + } +} diff --git a/03-lecture/monedero/src/main/java/dds/monedero/model/Movimiento.java b/03-lecture/monedero/src/main/java/dds/monedero/model/Movimiento.java new file mode 100644 index 0000000..1167ae1 --- /dev/null +++ b/03-lecture/monedero/src/main/java/dds/monedero/model/Movimiento.java @@ -0,0 +1,44 @@ +package dds.monedero.model; + +import java.time.LocalDate; + +public abstract class Movimiento { + private LocalDate fecha; + // En ningún lenguaje de programación usen jamás doubles para modelar dinero en el mundo real + // siempre usen numeros de precision arbitraria, como BigDecimal en Java y similares + private double monto; + + public Movimiento(LocalDate fecha, double monto) { + this.fecha = fecha; + this.monto = monto; + } + + public double getMonto() { + return monto; + } + + public abstract double getSaldo(); + + public LocalDate getFecha() { + return fecha; + } + + public Movimiento setFecha(LocalDate fecha) { + this.fecha = fecha; + return this; + } + + public Movimiento setMonto(double monto) { + this.monto = monto; + return this; + } + + public abstract boolean fueDepositado(LocalDate fecha); + + public abstract boolean fueExtraido(LocalDate fecha); + + public boolean esDeLaFecha(LocalDate fecha) { + return this.fecha.equals(fecha); + } + +} diff --git a/03-lecture/monedero/src/test/java/dds/monedero/model/MonederoTest.java b/03-lecture/monedero/src/test/java/dds/monedero/model/MonederoTest.java new file mode 100644 index 0000000..0964b31 --- /dev/null +++ b/03-lecture/monedero/src/test/java/dds/monedero/model/MonederoTest.java @@ -0,0 +1,74 @@ +package dds.monedero.model; + +import dds.monedero.exceptions.MaximaCantidadDepositosException; +import dds.monedero.exceptions.MaximoExtraccionDiarioException; +import dds.monedero.exceptions.MontoNegativoException; +import dds.monedero.exceptions.SaldoMenorException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class MonederoTest { + private Cuenta cuenta; + + @BeforeEach + void init() { + cuenta = new Cuenta(); + } + + @Test + void Poner() { + assertDoesNotThrow(() -> { + cuenta.poner(1500); + }); + + assertEquals(1500, cuenta.getSaldo()); + } + + @Test + void PonerMontoNegativo() { + assertThrows(MontoNegativoException.class, () -> cuenta.poner(-1500)); + } + + @Test + void TresDepositos() { + cuenta.poner(1500); + cuenta.poner(456); + cuenta.poner(1900); + assertEquals(cuenta.contarDepositos(), 3); + } + + @Test + void MasDeTresDepositos() { + assertThrows(MaximaCantidadDepositosException.class, () -> { + cuenta.poner(1500); + cuenta.poner(456); + cuenta.poner(1900); + cuenta.poner(245); + }); + } + + @Test + void ExtraerMasQueElSaldo() { + assertThrows(SaldoMenorException.class, () -> { + cuenta.setSaldo(90); + cuenta.sacar(1001); + }); + } + + @Test + public void ExtraerMasDe1000() { + assertThrows(MaximoExtraccionDiarioException.class, () -> { + cuenta.setSaldo(5000); + cuenta.sacar(1001); + }); + } + + @Test + public void ExtraerMontoNegativo() { + assertThrows(MontoNegativoException.class, () -> cuenta.sacar(-500)); + } + +} diff --git a/03-lecture/monedero/src/test/java/dds/monedero/model/MovimientoTest.java b/03-lecture/monedero/src/test/java/dds/monedero/model/MovimientoTest.java new file mode 100644 index 0000000..5df4a6b --- /dev/null +++ b/03-lecture/monedero/src/test/java/dds/monedero/model/MovimientoTest.java @@ -0,0 +1,24 @@ +package dds.monedero.model; + +import java.time.LocalDate; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + + +public class MovimientoTest { + private Movimiento movimiento; + + + @BeforeEach + void init() { + this.movimiento = new Deposito(LocalDate.now(), 100); + } + + @Test + void getFecha() { + assertEquals(LocalDate.now(), movimiento.getFecha()); + } +} diff --git a/03-lecture/monedero/target/maven-archiver/pom.properties b/03-lecture/monedero/target/maven-archiver/pom.properties new file mode 100644 index 0000000..68cfc40 --- /dev/null +++ b/03-lecture/monedero/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Tue May 11 10:26:10 ART 2021 +groupId=dds +artifactId=dds.monedero +version=1.0-SNAPSHOT diff --git a/03-lecture/monedero/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/03-lecture/monedero/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/03-lecture/monedero/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/03-lecture/monedero/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..6ddad79 --- /dev/null +++ b/03-lecture/monedero/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,6 @@ +/home/tosanchez/Developer/dds-monedero-java8/src/main/java/dds/monedero/exceptions/SaldoMenorException.java +/home/tosanchez/Developer/dds-monedero-java8/src/main/java/dds/monedero/model/Movimiento.java +/home/tosanchez/Developer/dds-monedero-java8/src/main/java/dds/monedero/exceptions/MaximaCantidadDepositosException.java +/home/tosanchez/Developer/dds-monedero-java8/src/main/java/dds/monedero/model/Cuenta.java +/home/tosanchez/Developer/dds-monedero-java8/src/main/java/dds/monedero/exceptions/MaximoExtraccionDiarioException.java +/home/tosanchez/Developer/dds-monedero-java8/src/main/java/dds/monedero/exceptions/MontoNegativoException.java diff --git a/03-lecture/monedero/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/03-lecture/monedero/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/03-lecture/monedero/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/03-lecture/monedero/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..8620978 --- /dev/null +++ b/03-lecture/monedero/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1 @@ +/home/tosanchez/Developer/dds-monedero-java8/src/test/java/dds/monedero/model/MonederoTest.java diff --git a/03-lecture/monedero/target/surefire-reports/TEST-dds.monedero.model.MonederoTest.xml b/03-lecture/monedero/target/surefire-reports/TEST-dds.monedero.model.MonederoTest.xml new file mode 100644 index 0000000..ed928fc --- /dev/null +++ b/03-lecture/monedero/target/surefire-reports/TEST-dds.monedero.model.MonederoTest.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/03-lecture/monedero/target/surefire-reports/dds.monedero.model.MonederoTest.txt b/03-lecture/monedero/target/surefire-reports/dds.monedero.model.MonederoTest.txt new file mode 100644 index 0000000..8c24a18 --- /dev/null +++ b/03-lecture/monedero/target/surefire-reports/dds.monedero.model.MonederoTest.txt @@ -0,0 +1,4 @@ +------------------------------------------------------------------------------- +Test set: dds.monedero.model.MonederoTest +------------------------------------------------------------------------------- +Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.068 s - in dds.monedero.model.MonederoTest