def test_acciones_en_horario(self): def lapso(desde, hasta): return Rango(diaN(desde), diaN(hasta)) def acciones(desde, hasta): # el 'hasta' está incluído n = len(_lista) if hasta < 0 or desde >= n: return set() if desde < 0: desde = 0 if hasta >= n: hasta = n - 1 return set([aP[1] for aP in _lista[desde:hasta + 1]]) def chk_acciones(p, desde, hasta): s = set(p.accionesEnHorario(lapso(desde, hasta))) self.assertEqual(s, acciones(desde, hasta)) # ahora sí, iniciamos una pequeña batería de tests p = ProgramaDeSuministro(_lapso) for fecha_accion in _lista: p.programarAccion(*fecha_accion) s = set(p.accionesEnHorario(p.lapso())) self.assertEqual(s, acciones(0, len(_lista) - 1)) chk_acciones(p, 0, 2) chk_acciones(p, 4, 20) chk_acciones(p, -1, 2) chk_acciones(p, -2, -1)
def test_acciones_removidas(self): # en este test verificamos que las acciones sean correctamente # removidas del programa de suministro. Vamos a usar cualquier # fruta como los datos del programa de suministro porque no # interesa ya demasiado el tema de las fechas y hora (eso ya # lo probamos antes). p = ProgramaDeSuministro(Rango(1, 10)) for i in range(1, 7): p.programarAccion(i, str(i)) # pequeño sanity check antes de empezar self.assertEqual(set(p.accionesEnHorario(p.lapso())), {'1', '2', '3', '4', '5', '6'}) def chk_remove(rango, accionesRemovidas, accionesRestantes): """verifica que dado un rango, el programa de suministro encuentre las acciones removidas, las remueva y finalmente se quede sólo con las acciones finales (ambos argumentos son conjuntos) """ self.assertEqual(set(p.retirarAccionesEnHorario(rango)), accionesRemovidas) self.assertEqual( set([aP.accion() for aP in p.accionesProgramadas()]), accionesRestantes ) # removemos '3' y '4' chk_remove(Rango(3, 4), {'3', '4'}, {'1', '2', '5', '6'}) # removemos '6,' chk_remove(Rango(5.5, 100), {'6'}, {'1', '2', '5'}) # removemos '1' y '2,' chk_remove(Rango(-10, 2.8), {'1', '2'}, {'5'}) # removemos '5', queda vacío chk_remove(Rango(-10, 10), {'5'}, set())
def test_inicializacion(self): """este test prueba varias formas alternativas de construir un mismo programa de suministro. """ # primera ('programar()') p = ProgramaDeSuministro(_lapso) l = _lista for x in l: p.programar(AccionProgramada(*x)) self.chk_accionesProgramadas(p, l) # segunda ('programarAccion') p = ProgramaDeSuministro(_lapso) for x in l: p.programarAccion(*x) self.chk_accionesProgramadas(p, l)
def demo(): ahora = FechaYHora(date(1998, 7, 10), time(17, 0, 0)) # modificar a gusto! class CentralMeteorologicaMock: def __init__(self, fechaYHora=ahora): self.redefinirFechaYHora(fechaYHora) def redefinirFechaYHora(self, FechaYHora): self._ahora = FechaYHora def obtenerFechaYHora(self): return self._ahora def mostrar(gps, cm): print("==== Programa de Suministro ====") print("A partir de fecha/hora : %s" % cm.obtenerFechaYHora()) aps = programa.accionesProgramadas() for ap in aps: fh = ap.fechaYHora() print("%s : %s %s" % (fh.fecha(), fh.hora(), ap.accion().nombre())) print("%d acciones en total" % len(aps)) cm = CentralMeteorologicaMock() programa = ProgramaDeSuministro( Rango(ahora, ahora.agregarDuracion(DuracionEnHoras(24)))) gps = GeneradorDeProgramaDeSuministroFijo24(planMaestro=None, estadoDePlanta=None, centralMeteorologica=cm, programaDeSuministro=programa) gps.generar() mostrar(gps, cm) cm.redefinirFechaYHora( ahora.agregarDuracion(DuracionEnMinutos(60 * 10 + 15))) gps.generar() mostrar(gps, cm)
def test_acciones_removidas(self): # en este test verificamos que las acciones sean correctamente # removidas del programa de suministro. Vamos a usar cualquier # fruta como los datos del programa de suministro porque no # interesa ya demasiado el tema de las fechas y hora (eso ya # lo probamos antes). p = ProgramaDeSuministro(Rango(1, 10)) for i in range(1, 7): p.programarAccion(i, str(i)) # pequeño sanity check antes de empezar self.assertEqual(set(p.accionesEnHorario(p.lapso())), {'1', '2', '3', '4', '5', '6'}) def chk_remove(rango, accionesRemovidas, accionesRestantes): """verifica que dado un rango, el programa de suministro encuentre las acciones removidas, las remueva y finalmente se quede sólo con las acciones finales (ambos argumentos son conjuntos) """ self.assertEqual(set(p.retirarAccionesEnHorario(rango)), accionesRemovidas) self.assertEqual( set([aP.accion() for aP in p.accionesProgramadas()]), accionesRestantes) # removemos '3' y '4' chk_remove(Rango(3, 4), {'3', '4'}, {'1', '2', '5', '6'}) # removemos '6,' chk_remove(Rango(5.5, 100), {'6'}, {'1', '2', '5'}) # removemos '1' y '2,' chk_remove(Rango(-10, 2.8), {'1', '2'}, {'5'}) # removemos '5', queda vacío chk_remove(Rango(-10, 10), {'5'}, set())
def test_planificador_planifica_ejecucion_hora_por_hora(self): hora = FechaYHora(date(1998, 7, 10), time(17, 0, 0)) kit = KitEjecucion() # inicializamos un programa de suministro vacío programa = ProgramaDeSuministro( Rango(hora, hora.agregarDuracion(DuracionEnHoras(3)))) # programamos las acciones que entran en la primer hora programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(15)), AccionRegado(LiquidoEnMililitros(200))) programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(20)), AccionLuz(LuzEnLux(800))) programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(35)), AccionFertilizante(LiquidoEnMililitros(100))) programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(40)), AccionRegado(LiquidoEnMililitros(20))) programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(50)), AccionAntibiotico(LiquidoEnMililitros(10))) # programamos las acciones que entran en la segunda hora programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(75)), AccionRegado(LiquidoEnMililitros(100))) programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(90)), AccionLuz(LuzEnLux(500))) # programamos las acciones que entran en la tercer hora programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(130)), AccionAntibiotico(LiquidoEnMililitros(10))) # ok, está cargado el programa. Creamos entonces el # planificador, lo configuramos para que ejecute sobre el kit # con el programa dado a intervalos de una hora. Obviamente no # hay temporizadores acá así que vamos a llamarlo manualmente # por cada hora. planificador = PlanificadorDeEjecucion(DuracionEnHoras(1), programa, kit.ejecutor) # WARNING. los números están clavados. si se cambian arriba, # deben cambiarse acá abajo (sumando todo con cuidado). # ejecutamos la primer hora cuantasAntes = len(programa.accionesProgramadas()) planificador.planificarAcciones(hora) self.assertEqual(kit.fertilizante(), 100) self.assertEqual(kit.luz(), 800) self.assertEqual(kit.agua(), 220) self.assertEqual(kit.antibiotico(), 10) cuantasDespues = len(programa.accionesProgramadas()) self.assertEqual(cuantasAntes - cuantasDespues, 5) # ejecutamos la segunda hora cuantasAntes = len(programa.accionesProgramadas()) planificador.planificarAcciones( hora.agregarDuracion(DuracionEnHoras(1))) self.assertEqual(kit.fertilizante(), 100 + 0) self.assertEqual(kit.luz(), 800 + 500) self.assertEqual(kit.agua(), 220 + 100) self.assertEqual(kit.antibiotico(), 10 + 0) cuantasDespues = len(programa.accionesProgramadas()) self.assertEqual(cuantasAntes - cuantasDespues, 2) # ejecutamos la tercer hora cuantasAntes = len(programa.accionesProgramadas()) planificador.planificarAcciones( hora.agregarDuracion(DuracionEnHoras(2))) self.assertEqual(kit.fertilizante(), 100 + 0 + 0) self.assertEqual(kit.luz(), 800 + 500 + 0) self.assertEqual(kit.agua(), 220 + 100 + 0) self.assertEqual(kit.antibiotico(), 10 + 0 + 10) cuantasDespues = len(programa.accionesProgramadas()) self.assertEqual(cuantasAntes - cuantasDespues, 1) # verificamos que el programa esté vacío self.assertEqual(programa.accionesProgramadas(), [])
def generar(self): ahora = self._ahora() programa = ProgramaDeSuministro( Rango(ahora, ahora.agregarDuracion(DuracionEnHoras(24)))) # regar 100 mililitros una vez por hora for i in range(24): programa.programarAccion(self._shift(DuracionEnHoras(i), ahora), AccionRegado(LiquidoEnMililitros(100))) # poner la lámpara a 800 lux a las 5:15 y en 1000 lux a las 10:15 programa.programarAccion( self._shift(DuracionEnMinutos(60 * 5 + 15), ahora), AccionLuz(LuzEnLux(800))) programa.programarAccion( self._shift(DuracionEnMinutos(60 * 10 + 15), ahora), AccionLuz(LuzEnLux(1000))) # aplicar fertilizante a cada 4 horas for i in range(6): programa.programarAccion( self._shift(DuracionEnMinutos(60 * i * 4 + 25), ahora), AccionFertilizante(LiquidoEnMililitros(50))) # aplicar antibiótico a las 12 programa.programarAccion(self._shift(DuracionEnHoras(12), ahora), AccionAntibiotico(LiquidoEnMililitros(10))) self._programaDeSuministro.copiar(programa) self._programaDeSuministro.notificarObservers()
def test_planificador_planifica_ejecucion_hora_por_hora(self): hora = FechaYHora(date(1998, 7, 10), time(17, 0, 0)) kit = KitEjecucion() # inicializamos un programa de suministro vacío programa = ProgramaDeSuministro( Rango(hora, hora.agregarDuracion(DuracionEnHoras(3)))) # programamos las acciones que entran en la primer hora programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(15)), AccionRegado(LiquidoEnMililitros(200))) programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(20)), AccionLuz(LuzEnLux(800))) programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(35)), AccionFertilizante(LiquidoEnMililitros(100))) programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(40)), AccionRegado(LiquidoEnMililitros(20))) programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(50)), AccionAntibiotico(LiquidoEnMililitros(10))) # programamos las acciones que entran en la segunda hora programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(75)), AccionRegado(LiquidoEnMililitros(100))) programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(90)), AccionLuz(LuzEnLux(500))) # programamos las acciones que entran en la tercer hora programa.programarAccion(hora.agregarDuracion(DuracionEnMinutos(130)), AccionAntibiotico(LiquidoEnMililitros(10))) # ok, está cargado el programa. Creamos entonces el # planificador, lo configuramos para que ejecute sobre el kit # con el programa dado a intervalos de una hora. Obviamente no # hay temporizadores acá así que vamos a llamarlo manualmente # por cada hora. planificador = PlanificadorDeEjecucion( DuracionEnHoras(1), programa, kit.ejecutor) # WARNING. los números están clavados. si se cambian arriba, # deben cambiarse acá abajo (sumando todo con cuidado). # ejecutamos la primer hora cuantasAntes = len(programa.accionesProgramadas()) planificador.planificarAcciones(hora) self.assertEqual(kit.fertilizante(), 100) self.assertEqual(kit.luz(), 800) self.assertEqual(kit.agua(), 220) self.assertEqual(kit.antibiotico(), 10) cuantasDespues = len(programa.accionesProgramadas()) self.assertEqual(cuantasAntes - cuantasDespues, 5) # ejecutamos la segunda hora cuantasAntes = len(programa.accionesProgramadas()) planificador.planificarAcciones(hora.agregarDuracion(DuracionEnHoras(1))) self.assertEqual(kit.fertilizante(), 100 + 0) self.assertEqual(kit.luz(), 800 + 500) self.assertEqual(kit.agua(), 220 + 100) self.assertEqual(kit.antibiotico(), 10 + 0) cuantasDespues = len(programa.accionesProgramadas()) self.assertEqual(cuantasAntes - cuantasDespues, 2) # ejecutamos la tercer hora cuantasAntes = len(programa.accionesProgramadas()) planificador.planificarAcciones(hora.agregarDuracion(DuracionEnHoras(2))) self.assertEqual(kit.fertilizante(), 100 + 0 + 0) self.assertEqual(kit.luz(), 800 + 500 + 0) self.assertEqual(kit.agua(), 220 + 100 + 0) self.assertEqual(kit.antibiotico(), 10 + 0 + 10) cuantasDespues = len(programa.accionesProgramadas()) self.assertEqual(cuantasAntes - cuantasDespues, 1) # verificamos que el programa esté vacío self.assertEqual(programa.accionesProgramadas(), [])
def generar(self): ahora = self._ahora() programa = ProgramaDeSuministro( Rango(ahora, ahora.agregarDuracion(DuracionEnHoras(24)))) # regar 100 mililitros una vez por hora for i in range(24): programa.programarAccion(self._shift(DuracionEnHoras(i), ahora), AccionRegado(LiquidoEnMililitros(100))) # poner la lámpara a 800 lux a las 5:15 y en 1000 lux a las 10:15 programa.programarAccion(self._shift(DuracionEnMinutos(60 * 5 + 15), ahora), AccionLuz(LuzEnLux(800))) programa.programarAccion(self._shift(DuracionEnMinutos(60 * 10 + 15), ahora), AccionLuz(LuzEnLux(1000))) # aplicar fertilizante a cada 4 horas for i in range(6): programa.programarAccion(self._shift(DuracionEnMinutos(60 * i * 4 + 25), ahora), AccionFertilizante(LiquidoEnMililitros(50))) # aplicar antibiótico a las 12 programa.programarAccion(self._shift(DuracionEnHoras(12), ahora), AccionAntibiotico(LiquidoEnMililitros(10))) self._programaDeSuministro.copiar(programa) self._programaDeSuministro.notificarObservers()