Skip to content

Commit

Permalink
Agregada misión parcial
Browse files Browse the repository at this point in the history
  • Loading branch information
nrainhart committed Nov 25, 2017
1 parent ff98d49 commit 62d413f
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 8 deletions.
4 changes: 2 additions & 2 deletions src/model/Equipo.scala
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@ case class Equipo(val nombre: String, val pozoComun: Int = 0, val heroes: List[H
.sortWith((mision1, mision2) => criterio(mision1.serRealizadaPor(this).get, mision2.serRealizadaPor(this).get))
.headOption

def entrenar(misiones: TablonDeAnuncios, criterio: CriterioMision): Try[Equipo] = {
def entrenar(misiones: TablonDeAnuncios, criterio: CriterioMision): EstadoEquipo = {
elegirMision(misiones, criterio).map { mejorMision =>
val equipoLuegoDeMision = mejorMision.serRealizadaPor(this)
equipoLuegoDeMision.flatMap {_.entrenar(misiones.filter(!_.equals(mejorMision)), criterio)}
}.getOrElse(Success(this))//TANTO SI NO HAY MISIONES COMO SI QUEDAN PERO NINGUNA SE PUEDE REALIZAR, DEVUELVE EL EQUIPO ORIGINAL (!!!)
}.getOrElse(SinFallos(this))//TANTO SI NO HAY MISIONES COMO SI QUEDAN PERO NINGUNA SE PUEDE REALIZAR, DEVUELVE EL EQUIPO ORIGINAL (!!!)
}

}
32 changes: 29 additions & 3 deletions src/model/Mision.scala
Original file line number Diff line number Diff line change
@@ -1,11 +1,37 @@
package model
import scala.util.{Try, Success, Failure}

abstract class EstadoEquipo (equipo: Equipo){
def realizar(tarea: Tarea): EstadoEquipo
def flatMap(f: Equipo => EstadoEquipo): EstadoEquipo = f(equipo)//PUEDE CAMBIAR LIBREMENTE DE ESTADO (!!!)
def map(f: Equipo => Equipo): EstadoEquipo
def get = equipo
def isSuccess = true
}

case class SinFallos(equipo: Equipo) extends EstadoEquipo(equipo){
def realizar(tarea: Tarea) = tarea.realizarsePor(equipo).map{ e => SinFallos(e) }.getOrElse(ParcialmenteFallido(equipo, tarea))
def map(f: Equipo => Equipo) = copy(equipo = f(equipo))
}

case class ParcialmenteFallido(equipo: Equipo, tareaFallada: Tarea) extends EstadoEquipo(equipo){
def realizar(tarea: Tarea): EstadoEquipo = tarea.realizarsePor(equipo).map{ e => ParcialmenteFallido(e,tareaFallada) }
.getOrElse(Fallido(equipo, tarea))
def map(f: Equipo => Equipo) = copy(equipo = f(equipo))
}

case class Fallido(equipo: Equipo, tareaFallada: Tarea) extends EstadoEquipo(equipo){
def realizar(tarea: Tarea) = this
override def flatMap(f: Equipo => EstadoEquipo) = this
def map(f: Equipo => Equipo) = this
override def isSuccess = false
}

class Mision(val tareas: List[Tarea] = List(), val recompensa: Recompensa) {

def serRealizadaPor(equipo: Equipo): Try[Equipo] = {
val equipoLuegoDeMision = tareas.foldLeft(Try(equipo)) {(equipo, tarea) =>
equipo.flatMap(unEquipo => tarea.realizarsePor(unEquipo))
def serRealizadaPor(equipo: Equipo): EstadoEquipo = {
val equipoLuegoDeMision = tareas.foldLeft(SinFallos(equipo): EstadoEquipo) {(equipo, tarea) =>
equipo.realizar(tarea)
}
equipoLuegoDeMision.map(equipo => cobrarRecompensa(equipo))
}
Expand Down
6 changes: 3 additions & 3 deletions test/model/MisionesTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ class MisionesTests {
Assert.assertTrue(robarTalisman.facilidad(gollum, comunidadDelAnillo).isEmpty)
}

@Test(expected = classOf[TareaFallidaError])
def intentarQueLaComunidadDelAnilloCompleteElArgumentoDeLOTRFallaPorqueNadiePuedeRobarTalisman() {
argumentoDeLotr.serRealizadaPor(comunidadDelAnillo).get
@Test
def laComunidadDelAnilloCompletaParcialmenteElArgumentoDeLOTRPorqueNadiePuedeRobarTalisman() {
Assert.assertTrue(argumentoDeLotr.serRealizadaPor(comunidadDelAnillo).isInstanceOf[ParcialmenteFallido])
}

@Test
Expand Down

0 comments on commit 62d413f

Please sign in to comment.