def test_central_meteorologica_devuelve_pronostico(self): desde = FechaYHora(date(2014, 9, 21), time(10, 45, 50)) hasta = FechaYHora(date(2014, 9, 21), time(12, 45, 50)) predictor = PredictorMeteorologicoMock( TemperaturaEnCelsius(25), Porcentaje(40), HumedadRelativa(Porcentaje(10)), LuzEnLux(800)) central = CentralMeteorologica(predictor, None) self.assertIsNone(central.ultimoPronostico()) pronostico = central.obtenerPronostico(desdeFechaYHora=desde, cantidadDeHs=2) self.assertEqual(desde, pronostico.fechaInicio()) self.assertEqual(hasta, pronostico.fechaFin()) prediccion1 = pronostico.prediccionPara( FechaYHora(date(2014, 9, 21), time(11, 40, 50))) self.assertEqual(Rango(desde, desde.agregarDuracion(DuracionEnHoras(1))), prediccion1.lapso()) self.assertEqual(TemperaturaEnCelsius(25), prediccion1.temperatura()) self.assertEqual(Porcentaje(40), prediccion1.probabilidadDeLluvia()) self.assertEqual(HumedadRelativa(Porcentaje(10)), prediccion1.humedad()) self.assertEqual(LuzEnLux(800), prediccion1.luzAmbiente()) prediccion2 = pronostico.prediccionPara( FechaYHora(date(2014, 9, 21), time(12, 40, 50))) self.assertEqual(Rango(desde.agregarDuracion(DuracionEnHoras(1)), hasta), prediccion2.lapso()) self.assertEqual(TemperaturaEnCelsius(25), prediccion2.temperatura()) self.assertEqual(Porcentaje(40), prediccion2.probabilidadDeLluvia()) self.assertEqual(HumedadRelativa(Porcentaje(10)), prediccion2.humedad()) self.assertEqual(LuzEnLux(800), prediccion2.luzAmbiente())
def _shift(self, duracionRelativaCero, ahora): """computa una fechaYHora a partir de una duración relativa a las cero horas del día indicado por 'ahora', pero asegurando que si el resultado cayera el día anterior, se desplaza para la misma hora pero del día siguiente. """ cero = FechaYHora(ahora.fecha(), time(0, 0, 0)) ajustada = cero.agregarDuracion(duracionRelativaCero) if ajustada < ahora: ajustada = ajustada.agregarDuracion(DuracionEnHoras(24)) return ajustada
def test_central_meteorologica_devuelve_pronostico(self): desde = FechaYHora(date(2014, 9, 21), time(10, 45, 50)) hasta = FechaYHora(date(2014, 9, 21), time(12, 45, 50)) predictor = PredictorMeteorologicoMock(TemperaturaEnCelsius(25), Porcentaje(40), HumedadRelativa(Porcentaje(10)), LuzEnLux(800)) central = CentralMeteorologica(predictor, None) self.assertIsNone(central.ultimoPronostico()) pronostico = central.obtenerPronostico(desdeFechaYHora=desde, cantidadDeHs=2) self.assertEqual(desde, pronostico.fechaInicio()) self.assertEqual(hasta, pronostico.fechaFin()) prediccion1 = pronostico.prediccionPara( FechaYHora(date(2014, 9, 21), time(11, 40, 50))) self.assertEqual( Rango(desde, desde.agregarDuracion(DuracionEnHoras(1))), prediccion1.lapso()) self.assertEqual(TemperaturaEnCelsius(25), prediccion1.temperatura()) self.assertEqual(Porcentaje(40), prediccion1.probabilidadDeLluvia()) self.assertEqual(HumedadRelativa(Porcentaje(10)), prediccion1.humedad()) self.assertEqual(LuzEnLux(800), prediccion1.luzAmbiente()) prediccion2 = pronostico.prediccionPara( FechaYHora(date(2014, 9, 21), time(12, 40, 50))) self.assertEqual( Rango(desde.agregarDuracion(DuracionEnHoras(1)), hasta), prediccion2.lapso()) self.assertEqual(TemperaturaEnCelsius(25), prediccion2.temperatura()) self.assertEqual(Porcentaje(40), prediccion2.probabilidadDeLluvia()) self.assertEqual(HumedadRelativa(Porcentaje(10)), prediccion2.humedad()) self.assertEqual(LuzEnLux(800), prediccion2.luzAmbiente())
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 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_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 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(), [])