From aa9099d5abfd395f481f420a4062cb8c1b9759bc Mon Sep 17 00:00:00 2001
From: Javier Calvo <javiercalvoporro@gmail.com>
Date: Tue, 17 Dec 2024 21:14:11 +0100
Subject: [PATCH] Trayectos creados. Falta consultar lo de varios trayectos en
 packs

---
 src/es/markse/TBarco.java            | 36 ++++++++++++++++++++
 src/es/markse/TCamion.java           | 37 ++++++++++++++++++++
 src/es/markse/TPackCamionBarco.java  | 47 +++++++++++++++++++++++++
 src/es/markse/TPackCamionTren.java   | 45 ++++++++++++++++++++++++
 src/es/markse/TTren.java             | 37 ++++++++++++++++++++
 src/es/markse/Trayecto.java          | 51 ++++++++++------------------
 src/es/markse/TrayectoCombinado.java | 31 +++++++++++++++++
 src/es/markse/TrayectoSimple.java    | 41 ++++++++++++++++++++++
 uses/es/markse/TrayectoTest.java     |  5 ++-
 9 files changed, 294 insertions(+), 36 deletions(-)
 create mode 100644 src/es/markse/TBarco.java
 create mode 100644 src/es/markse/TCamion.java
 create mode 100644 src/es/markse/TPackCamionBarco.java
 create mode 100644 src/es/markse/TPackCamionTren.java
 create mode 100644 src/es/markse/TTren.java
 create mode 100644 src/es/markse/TrayectoCombinado.java
 create mode 100644 src/es/markse/TrayectoSimple.java

diff --git a/src/es/markse/TBarco.java b/src/es/markse/TBarco.java
new file mode 100644
index 0000000..564cab5
--- /dev/null
+++ b/src/es/markse/TBarco.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright Universidad de Valladolid 2024
+ */
+package es.markse;
+
+/**
+ * Implementacion de la clase TBarco, que representa un trayecto por barco.
+ * @author javcalv
+ * @author victorm
+ */
+public class TBarco extends TrayectoSimple {
+    private static final double COSTE_DIARIO = 4000;
+
+    /**
+     * Constructor de la clase TBarco
+     * @param muelleOrigen Muelle desde el que empieza el Trayecto
+     * @param puertoOrigen Puerto desde el que empieza el Trayecto
+     * @param fechaInicioTrayecto Fecha en la que comienza el Trayecto
+     * @param muelleDestino Muelle en el que finaliza un Trayecto
+     * @param puertoDestino Puerto en el que finaliza un Trayecto
+     * @param fechaFinTrayecto Fecha en la que finaliza un Trayecto
+     */
+    public TBarco(Muelle muelleOrigen, Puerto puertoOrigen, Fecha fechaInicioTrayecto, Muelle muelleDestino, Puerto puertoDestino, Fecha fechaFinTrayecto) {
+        super(muelleOrigen, puertoOrigen, fechaInicioTrayecto, muelleDestino, puertoDestino, fechaFinTrayecto);
+    }
+
+    /**
+     * Método que calcula el coste del trayecto por barco
+     * @return Coste del trayecto en euros
+     */
+    @Override
+    public double costeTrayecto() {
+        int dias = numeroDeDiasDeTrayecto();
+        return dias * COSTE_DIARIO;
+    }
+}
\ No newline at end of file
diff --git a/src/es/markse/TCamion.java b/src/es/markse/TCamion.java
new file mode 100644
index 0000000..96535c8
--- /dev/null
+++ b/src/es/markse/TCamion.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright Universidad de Valladolid 2024
+ */
+package es.markse;
+
+/**
+ * Implementacion de la clase TCamion, que representa un trayecto por camión.
+ * @author javcalv
+ * @author victorm
+ */
+public class TCamion extends TrayectoSimple {
+
+    private static final double COSTE_FIJO = 200; 
+    private static final double COSTE_POR_KILOMETRO = 4.5;
+
+    /**
+     * Constructor de la clase TCamion
+     * @param muelleOrigen Muelle desde el que empieza el Trayecto
+     * @param puertoOrigen Puerto desde el que empieza el Trayecto
+     * @param fechaInicioTrayecto Fecha en la que comienza el Trayecto
+     * @param muelleDestino Muelle en el que finaliza un Trayecto
+     * @param puertoDestino Puerto en el que finaliza un Trayecto
+     * @param fechaFinTrayecto Fecha en la que finaliza un Trayecto
+     */
+    public TCamion(Muelle muelleOrigen, Puerto puertoOrigen, Fecha fechaInicioTrayecto, Muelle muelleDestino, Puerto puertoDestino, Fecha fechaFinTrayecto) {
+        super(muelleOrigen, puertoOrigen, fechaInicioTrayecto, muelleDestino, puertoDestino, fechaFinTrayecto);
+    }
+
+    /**
+     * Método que calcula el coste del trayecto por camión
+     * @return Coste del trayecto en euros
+     */
+    @Override
+    public double costeTrayecto() {
+        return COSTE_FIJO + (this.distanciaKilometros * COSTE_POR_KILOMETRO);
+    }
+}
\ No newline at end of file
diff --git a/src/es/markse/TPackCamionBarco.java b/src/es/markse/TPackCamionBarco.java
new file mode 100644
index 0000000..bb6046c
--- /dev/null
+++ b/src/es/markse/TPackCamionBarco.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright Universidad de Valladolid 2024
+ */
+package es.markse;
+
+/**
+ * Implementacion de la clase PackCamionBarco, que representa un trayecto combinado de camión y barco.
+ * @author javcalv
+ * @author victorm
+ */
+public class TPackCamionBarco extends TrayectoCombinado {
+	
+	//POSIBLE CAMBIO --> PUEDEN SER VARIOS TRAYECTOS DE BARCOS Y VARIOS DE CAMIONES
+    private TCamion camion;
+    private TBarco barco;
+    private final double DESCUENTO = 0.85;
+
+    /**
+     * Constructor de la clase PackCamionBarco
+     * @param muelleOrigen Muelle desde el que empieza el Trayecto
+     * @param puertoOrigen Puerto desde el que empieza el Trayecto
+     * @param fechaInicioTrayecto Fecha en la que comienza el Trayecto
+     * @param muelleDestino Muelle en el que finaliza un Trayecto
+     * @param puertoDestino Puerto en el que finaliza un Trayecto
+     * @param fechaFinTrayecto Fecha en la que finaliza un Trayecto
+     * @param camion Trayecto de camión
+     * @param barco Trayecto de barco
+     */
+    public TPackCamionBarco(Muelle muelleOrigen, Puerto puertoOrigen, Fecha fechaInicioTrayecto, Muelle muelleDestino, Puerto puertoDestino, Fecha fechaFinTrayecto, TCamion camion, TBarco barco) {
+        super(muelleOrigen, puertoOrigen, fechaInicioTrayecto, muelleDestino, puertoDestino, fechaFinTrayecto);
+        this.camion = camion;
+        this.barco = barco;
+        this.trayectosSimples.add(camion);
+        this.trayectosSimples.add(barco);
+    }
+
+    /**
+     * Método que calcula el coste del trayecto combinado de camión y barco
+     * @return Coste del trayecto en euros
+     */
+    @Override
+    public double costeTrayecto() {
+        double costeBarco = this.barco.costeTrayecto() * DESCUENTO;
+        double costeCamion = this.camion.costeTrayecto();
+        return costeBarco + costeCamion;
+    }
+}
\ No newline at end of file
diff --git a/src/es/markse/TPackCamionTren.java b/src/es/markse/TPackCamionTren.java
new file mode 100644
index 0000000..731d9bc
--- /dev/null
+++ b/src/es/markse/TPackCamionTren.java
@@ -0,0 +1,45 @@
+/**
+ * Copyright Universidad de Valladolid 2024
+ */
+package es.markse;
+
+/**
+ * Implementacion de la clase PackCamionTren, que representa un trayecto combinado de camión y tren.
+ * @author javcalv
+ * @author victorm
+ */
+public class TPackCamionTren extends TrayectoCombinado {
+	
+	//POSIBLES CAMBIOS --> Arraylist de trayectos ??? Cosultar
+    private TCamion camion;
+    private TTren tren;
+
+    /**
+     * Constructor de la clase PackCamionTren
+     * @param muelleOrigen Muelle desde el que empieza el Trayecto
+     * @param puertoOrigen Puerto desde el que empieza el Trayecto
+     * @param fechaInicioTrayecto Fecha en la que comienza el Trayecto
+     * @param muelleDestino Muelle en el que finaliza un Trayecto
+     * @param puertoDestino Puerto en el que finaliza un Trayecto
+     * @param fechaFinTrayecto Fecha en la que finaliza un Trayecto
+     * @param camion Trayecto de camión
+     * @param tren Trayecto de tren
+     */
+    public TPackCamionTren(Muelle muelleOrigen, Puerto puertoOrigen, Fecha fechaInicioTrayecto, Muelle muelleDestino, Puerto puertoDestino, Fecha fechaFinTrayecto, TCamion camion, TTren tren) {
+        super(muelleOrigen, puertoOrigen, fechaInicioTrayecto, muelleDestino, puertoDestino, fechaFinTrayecto);
+        this.camion = camion;
+        this.tren = tren;
+        trayectosSimples.add(camion);
+        trayectosSimples.add(tren);
+    }
+
+    /**
+     * Método que calcula el coste del trayecto combinado de camión y tren
+     * @return Coste del trayecto en euros
+     */
+    @Override
+    public double costeTrayecto() {
+        double distanciaTotal = camion.distanciaKilometros + tren.distanciaKilometros;
+        return distanciaTotal * 10;
+    }
+}
\ No newline at end of file
diff --git a/src/es/markse/TTren.java b/src/es/markse/TTren.java
new file mode 100644
index 0000000..a642a09
--- /dev/null
+++ b/src/es/markse/TTren.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright Universidad de Valladolid 2024
+ */
+package es.markse;
+
+/**
+ * Implementacion de la clase TTren, que representa un trayecto por tren.
+ * @author javcalv
+ * @author victorm
+ */
+public class TTren extends TrayectoSimple {
+	
+    private static final double COSTE_FIJO = 20;
+    private static final double COSTE_POR_KILOMETRO = 12.5;
+
+    /**
+     * Constructor de la clase TTren
+     * @param muelleOrigen Muelle desde el que empieza el Trayecto
+     * @param puertoOrigen Puerto desde el que empieza el Trayecto
+     * @param fechaInicioTrayecto Fecha en la que comienza el Trayecto
+     * @param muelleDestino Muelle en el que finaliza un Trayecto
+     * @param puertoDestino Puerto en el que finaliza un Trayecto
+     * @param fechaFinTrayecto Fecha en la que finaliza un Trayecto
+     */
+    public TTren(Muelle muelleOrigen, Puerto puertoOrigen, Fecha fechaInicioTrayecto, Muelle muelleDestino, Puerto puertoDestino, Fecha fechaFinTrayecto) {
+        super(muelleOrigen, puertoOrigen, fechaInicioTrayecto, muelleDestino, puertoDestino, fechaFinTrayecto);
+    }
+
+    /**
+     * Método que calcula el coste del trayecto por tren
+     * @return Coste del trayecto en euros
+     */
+    @Override
+    public double costeTrayecto() {
+        return COSTE_FIJO + (this.distanciaKilometros * COSTE_POR_KILOMETRO);
+    }
+}
\ No newline at end of file
diff --git a/src/es/markse/Trayecto.java b/src/es/markse/Trayecto.java
index d136592..ba3f09e 100644
--- a/src/es/markse/Trayecto.java
+++ b/src/es/markse/Trayecto.java
@@ -3,20 +3,20 @@
  */
 package es.markse;
 
-import java.io.Serializable;
-
 /**
  * Implementacion de la clase Trayecto
  * @author vicmtorm
  * @author javcalv
  */
-public class Trayecto {
+public abstract class Trayecto{
+	
 	private Muelle muelleOrigen;
 	private Puerto puertoOrigen;
 	private Fecha fechaInicioTrayecto;
 	private Muelle muelleDestino;
 	private Puerto puertoDestino;
 	private Fecha fechaFinTrayecto;
+	
 	/**
 	 * Constructor del objeto Trayecto.
 	 * @param muelleOrigen Muelle desde el que se e mpieza el Trayecto
@@ -43,9 +43,9 @@ public class Trayecto {
 		
 		//Comprobamos si los muelles pertenecen al puerto
 		if (!puertoOrigen.comprobarMuelleEnPuerto(muelleOrigen))
-			throw new MuelleNoPerteneceAlPuertoException("El muelle no pertenece al puerto");
+			throw new IllegalStateException("El muelle no pertenece al puerto");
 		if (!puertoDestino.comprobarMuelleEnPuerto(muelleDestino))
-			throw new MuelleNoPerteneceAlPuertoException("El muelle no pertenece al puerto");
+			throw new IllegalStateException("El muelle no pertenece al puerto");
 		
 		if (!comprobacionMuellesDistintos(muelleOrigen, muelleDestino, puertoOrigen, puertoDestino))
 			throw new IllegalArgumentException("El muelle de origen no puede ser igual al de destino");
@@ -93,22 +93,18 @@ public class Trayecto {
 	
 	/**
 	 * 1.1.22. Metodo que, introduciendo el coste diario y el coste por milla, devuelve el precio calculado en Euros de un Trayecto
-	 * @param costeDiarioTrayecto Valor en Euros del Coste Diario de un Trayecto
-	 * @param costePorMilla Valor en Euros del Coste por Milla de un Trayecto
 	 * @return Precio del Trayecto Calculado en Euros
 	 */
-	public double precioTrayectoEnEuros(double costeDiarioTrayecto, double costePorMilla) {
-		if (costeDiarioTrayecto <= 0) {
-			throw new IllegalArgumentException ("El Coste Diario del Trayecto no es válido");
-		}
-		else if(costePorMilla <= 0) {
-			throw new IllegalArgumentException ("El Coste por Milla del Trayecto no es válido");
-		}
-		int dias = numeroDeDiasDeTrayceto();
-		double dist = distanciaMillasMarinas();
-		return ((dias*costeDiarioTrayecto)+(dist*costePorMilla));
+	public double precioTrayectoEnEuros() {
+		return this.costeTrayecto();
 	}
 	
+	/**
+	 * Metodo abstracto para calcular el nuevo coste de 
+	 * @return
+	 */
+	public abstract double costeTrayecto();
+	
 	/**
 	 * 1.1.23 Método que devuelve la Distancia calculada en Millas Marinas entre 2 Muelles Distintos
 	 * @return Distancia entre 2 Muelles Distintos calculada en Millas Marinas
@@ -130,7 +126,8 @@ public class Trayecto {
 		String FechaFin = this.fechaFinTrayecto.aCadena();
 		return"INFORMACION SOBRE EL ORIGEN: \nCiudad Origen: "+ciudadOrig+"\nPais Origen: "+paisOrig+"\nInicio del Trayecto: "+FechaInicio+
 				"\n\nINFORMACION SOBRE EL DESTINO: \nCiudad Destino: "+ciudadDest+"\nPais Destino: "+paisDest+"\nFin del Trayecto: "+FechaFin+"\n";
-	}
+	}	
+
 	
 	/*************************
 	 * OTRAS FUNCIONALIDADES *
@@ -139,9 +136,9 @@ public class Trayecto {
 	/**
 	 * Metodo que devuelve el numero de dias de un trayecto
 	 */
-	private int numeroDeDiasDeTrayceto(){
-		return (this.fechaFinTrayecto.getDiasDesdeEpoch()- this.fechaInicioTrayecto.getDiasDesdeEpoch()) +1;
-	}
+	public int numeroDeDiasDeTrayecto() {
+        return (this.fechaFinTrayecto.getDiasDesdeEpoch() - this.fechaInicioTrayecto.getDiasDesdeEpoch()) + 1;
+    }
 	
 	/**
 	 * Método que Devuelve el Muelle de Origen
@@ -189,16 +186,4 @@ public class Trayecto {
 	public Fecha getFechaFinTrayecto() {
 		return this.fechaFinTrayecto;
 	}
-	
-	/**
-	 * Excpcion lanzada para indicar que un muelle no pertenece al puerto
-	 * @author javcalv
-	 * @author victorm
-	 */
-	public class MuelleNoPerteneceAlPuertoException extends RuntimeException implements Serializable{
-		private static final long serialVersionUID = 1L;
-		public MuelleNoPerteneceAlPuertoException(String m) {
-	        super(m);
-	    }
-	}
 }
\ No newline at end of file
diff --git a/src/es/markse/TrayectoCombinado.java b/src/es/markse/TrayectoCombinado.java
new file mode 100644
index 0000000..9481516
--- /dev/null
+++ b/src/es/markse/TrayectoCombinado.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright Universidad de Valladolid 2024
+ */
+package es.markse;
+import java.util.ArrayList;
+
+/**
+ * Implementacion de la clase abstracta TrayectoSimple
+ * @author javcalv
+ * @author victorm
+ */
+public abstract class TrayectoCombinado extends Trayecto {
+	
+	//POSIBLE CAMBIO --> ARRAYLIST DE ARRAYLISTS
+    protected final ArrayList<TrayectoSimple> trayectosSimples;
+    
+    /**
+     * Constructor de la clase abstracta TrayectoCombinado
+     * @param muelleOrigen Muelle desde el que empieza el Trayecto
+	 * @param puertoOrigen Puerto desde el que empieza el Trayecto
+	 * @param fechaInicioTrayecto Fecha en la que comienza el Trayecto
+	 * @param muelleDestino Muelle en el que finaliza un Trayecto
+	 * @param puertoDestino Puerto en el que finaliza un Trayecto
+	 * @param fechaFinTrayecto Fecha en la que finaliza un Trayecto
+     */
+    public TrayectoCombinado(Muelle muelleOrigen, Puerto puertoOrigen, Fecha fechaInicioTrayecto, Muelle muelleDestino, Puerto puertoDestino, Fecha fechaFinTrayecto) {
+        super(muelleOrigen, puertoOrigen, fechaInicioTrayecto, muelleDestino, puertoDestino, fechaFinTrayecto);
+        
+        this.trayectosSimples = new ArrayList<>();
+    }
+}
diff --git a/src/es/markse/TrayectoSimple.java b/src/es/markse/TrayectoSimple.java
new file mode 100644
index 0000000..4a5af2e
--- /dev/null
+++ b/src/es/markse/TrayectoSimple.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright Universidad de Valladolid 2024
+ */
+package es.markse;
+
+/**
+ * Implementacion de la clase abstracta TrayectoSimple
+ * @author javcalv
+ * @author victorm
+ */
+public abstract class TrayectoSimple extends Trayecto {
+	
+    protected double distanciaKilometros;
+    private final float MILLAS_A_KILOMETROS = 1.852f;
+    
+    /**
+     * Constructor del TrayectoSimple
+     * @param muelleOrigen Muelle desde el que empieza el Trayecto
+	 * @param puertoOrigen Puerto desde el que empieza el Trayecto
+	 * @param fechaInicioTrayecto Fecha en la que comienza el Trayecto
+	 * @param muelleDestino Muelle en el que finaliza un Trayecto
+	 * @param puertoDestino Puerto en el que finaliza un Trayecto
+	 * @param fechaFinTrayecto Fecha en la que finaliza un Trayecto
+     */
+    public TrayectoSimple(Muelle muelleOrigen, Puerto puertoOrigen, Fecha fechaInicioTrayecto, Muelle muelleDestino, Puerto puertoDestino, Fecha fechaFinTrayecto) {
+        super(muelleOrigen, puertoOrigen, fechaInicioTrayecto, muelleDestino, puertoDestino, fechaFinTrayecto);
+        
+        //Obtenemos la distancia en millas marinas del trayecto y las convertimos en kilometros
+        this.distanciaKilometros = convertirMillasAKilometros(distanciaMillasMarinas());
+    }
+    
+    /**
+     * Metodo que sirve para convertir las Millas marinas a Kilometros
+     * @param millas Millas de un trayecto
+     * @return Kilometros de un trayecto
+     */
+    private double convertirMillasAKilometros(double millas) {
+        return millas * this.MILLAS_A_KILOMETROS;
+    }
+}
+
diff --git a/uses/es/markse/TrayectoTest.java b/uses/es/markse/TrayectoTest.java
index bd40ad4..e0a73e6 100644
--- a/uses/es/markse/TrayectoTest.java
+++ b/uses/es/markse/TrayectoTest.java
@@ -3,7 +3,6 @@ package es.markse;
 import static org.junit.Assert.*;
 import org.junit.Test;
 import es.markse.Muelle.estado;
-import es.markse.Trayecto.MuelleNoPerteneceAlPuertoException;
 import es.uva.inf.poo.maps.GPSCoordinate;
 public class TrayectoTest {
 
@@ -110,7 +109,7 @@ public class TrayectoTest {
 		new Trayecto(m1,p1,f1,m2,p2,f2);
 	}
 	
-	@Test (expected = MuelleNoPerteneceAlPuertoException.class)
+	@Test (expected = IllegalStateException.class)
 	public void testTrayectoMuelleOrigenNoEstaEnPuerto() {
 		Puerto p1 = new Puerto("ES" , "BAR");
 		Puerto p2 = new Puerto("IT" , "NAP");
@@ -122,7 +121,7 @@ public class TrayectoTest {
 		new Trayecto(m1,p1,f1,m2,p2,f2);
 	}
 	
-	@Test (expected = MuelleNoPerteneceAlPuertoException.class)
+	@Test (expected = IllegalStateException.class)
 	public void testTrayectoMuelleDestinoNoEstaEnPuerto() {
 		Puerto p1 = new Puerto("ES" , "BAR");
 		Puerto p2 = new Puerto("IT" , "NAP");
-- 
GitLab