def test_pronosticoMeteorologico_se_parsea(self): s = ("2014-09-27 11:00:0.0\n" "2014-09-27 11:59:59.0\n" "20\n" "55\n" "60\n" "1010\n" "2014-09-27 12:00:00.0\n" "2014-09-27 12:59:59.0\n" "25\n" "50\n" "65\n" "1020\n") result = ParserPronosticoMeteorologico().parse(s) prediccionesEsperadas = [ PrediccionMeteorologica( Rango(FechaYHora(date(2014, 9, 27), time(11, 0, 0)), FechaYHora(date(2014, 9, 27), time(11, 59, 59))), TemperaturaEnCelsius(20), Porcentaje(55), HumedadRelativa(Porcentaje(60)), LuzEnLux(1010)), PrediccionMeteorologica( Rango(FechaYHora(date(2014, 9, 27), time(12, 0, 0)), FechaYHora(date(2014, 9, 27), time(12, 59, 59))), TemperaturaEnCelsius(25), Porcentaje(50), HumedadRelativa(Porcentaje(65)), LuzEnLux(1020)), ] expected = PronosticoMeteorologico(prediccionesEsperadas) self.assertEqual(expected, result)
def test_lapso_se_instancia_bien(self): desde = FechaYHora(date(2014, 9, 21), time(10, 45, 50)) hasta = FechaYHora(date(2014, 9, 22), time(10, 45, 50)) lapso = Rango(desde, hasta) self.assertEqual(desde, lapso.desde()) self.assertEqual(hasta, lapso.hasta())
def test_lapso_contiene_fechaYHora_contenida_en_el_lapso(self): desde = FechaYHora(date(2014, 9, 21), time(10, 45, 50)) hasta = FechaYHora(date(2014, 9, 22), time(10, 45, 50)) lapso = Rango(desde, hasta) unaFechaYHora = FechaYHora(date(2014, 9, 21), time(12, 45, 50)) self.assertTrue(lapso.contiene(unaFechaYHora))
def test_dos_lapsos_iguales_son_iguales(self): desde1 = FechaYHora(date(2014, 9, 21), time(10, 45, 50)) hasta1 = FechaYHora(date(2014, 9, 22), time(10, 45, 50)) lapso1 = Rango(desde1, hasta1) desde2 = FechaYHora(date(2014, 9, 21), time(10, 45, 50)) hasta2 = FechaYHora(date(2014, 9, 22), time(10, 45, 50)) lapso2 = Rango(desde2, hasta2) self.assertTrue(lapso1 == lapso2)
def test_prediccion_para_una_fecha_existente(self): pronostico = PronosticoMeteorologico( [self.prediccion1, self.prediccion2]) prediccion = pronostico.prediccionPara( FechaYHora(date(2014, 9, 21), time(11, 0, 0))) self.assertEqual(self.prediccion1, prediccion) prediccion = pronostico.prediccionPara( FechaYHora(date(2014, 9, 20), time(12, 0, 0))) self.assertEqual(self.prediccion2, prediccion)
def test_prediccion_se_construye_correctamente(self): desde = FechaYHora(date(2014, 9, 20), time(10, 45, 50)) hasta = FechaYHora(date(2014, 9, 20), time(13, 45, 50)) prediccion = PrediccionMeteorologica(Rango(desde, hasta), TemperaturaEnCelsius(25), Porcentaje(40), HumedadRelativa(Porcentaje(10)), LuzEnLux(800)) self.assertEqual(Rango(desde, hasta), prediccion.lapso()) self.assertEqual(TemperaturaEnCelsius(25), prediccion.temperatura()) self.assertEqual(Porcentaje(40), prediccion.probabilidadDeLluvia()) self.assertEqual(HumedadRelativa(Porcentaje(10)), prediccion.humedad()) self.assertEqual(LuzEnLux(800), prediccion.luzAmbiente())
def setUp(self): self.desdeLapso1 = FechaYHora(date(2014, 9, 21), time(10, 45, 50)) self.hastaLapso1 = FechaYHora(date(2014, 9, 21), time(13, 45, 50)) self.desdeLapso2 = FechaYHora(date(2014, 9, 20), time(10, 45, 50)) self.hastaLapso2 = FechaYHora(date(2014, 9, 20), time(13, 45, 50)) self.prediccion1 = PrediccionMeteorologica( Rango(self.desdeLapso1, self.hastaLapso1), TemperaturaEnCelsius(20), Porcentaje(80), HumedadRelativa(Porcentaje(50)), LuzEnLux(1000)) self.prediccion2 = PrediccionMeteorologica( Rango(self.desdeLapso2, self.hastaLapso2), TemperaturaEnCelsius(25), Porcentaje(40), HumedadRelativa(Porcentaje(10)), LuzEnLux(800))
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 test_comparacion_por_menor_es_correcta(self): unaFecha = FechaYHora(date(2014, 9, 22), time(10, 45, 55)) otraFecha = FechaYHora(date(2014, 9, 22), time(10, 45, 50)) self.assertLess(otraFecha, unaFecha) unaFecha = FechaYHora(date(2014, 9, 22), time(10, 45, 50)) otraFecha = FechaYHora(date(2014, 9, 20), time(10, 45, 50)) self.assertLess(otraFecha, unaFecha) unaFecha = FechaYHora(date(2014, 9, 22), time(10, 45, 55)) otraFecha = FechaYHora(date(2014, 9, 20), time(10, 45, 50)) self.assertLess(otraFecha, unaFecha) unaFecha = FechaYHora(date(2014, 9, 22), time(10, 45, 55)) otraFecha = FechaYHora(date(2014, 9, 20), time(13, 45, 55)) self.assertLess(otraFecha, unaFecha)
def main(argv): cmd = None try: opts, args = getopt.getopt(argv, "hc:") except getopt.GetoptError: mensajeAyuda() sys.exit() for opt, arg in opts: if opt == '-c' and arg in comandosValidos: cmd = arg else: mensajeAyuda() sys.exit() if cmd is None: mensajeAyuda() sys.exit() predictor = PredictorMeteorologicoPorArchivo( DispositivoDeLecturaArchivo("devices/pronostico")) reloj = ProveedorDeTiempoPorArchivo( DispositivoDeLecturaArchivo("devices/tiempo")) central = CentralMeteorologica(predictor, reloj) if cmd == 'pronostico': horas = 24 desdeFechaYHora = FechaYHora(datetime.date(2014, 9, 27), datetime.time(11, 0, 0)) pronostico = central.obtenerPronostico(desdeFechaYHora, horas) t = desdeFechaYHora for _ in range(0, horas): p = pronostico.prediccionPara(t) print(('El pronóstico para {4} es: \n' 'Temperatura: {0}, Humedad: {1}, ' 'Prob. de lluvia: {2}, Luz ambiente: {3}') .format(p.temperatura(), p.humedad(), p.probabilidadDeLluvia(), p.luzAmbiente(), p.lapso())) t = t.agregarHoras(1) elif cmd == 'sensores': # TODO print("No implementado.") elif cmd == 'tiempo': t = central.obtenerFechaYHora() print(t)
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_central_meteorologica_devuelve_fechaYHora(self): fechaYHora = FechaYHora(date(2014, 9, 21), time(10, 45, 50)) proveedorDeTiempo = ProveedorDeTiempoMock(fechaYHora) central = CentralMeteorologica(None, proveedorDeTiempo) self.assertEqual(fechaYHora, central.obtenerFechaYHora())
def test_prediccion_para_una_fecha_no_existente(self): pronostico = PronosticoMeteorologico( [self.prediccion1, self.prediccion2]) prediccion = pronostico.prediccionPara( FechaYHora(date(2014, 9, 25), time(11, 0, 0)))
def parse(self, unaCadena): fecha = datetime.datetime.strptime(unaCadena.split()[0], "%Y-%m-%d").date() hora = datetime.datetime.strptime(unaCadena.split()[1], "%H:%M:%S.%f").time() return FechaYHora(fecha, hora)
def test_fechaYHora_se_instancia_bien(self): fechaYHora = FechaYHora(date(2014, 9, 21), time(10, 45, 50)) self.assertEqual(date(2014, 9, 21), fechaYHora.fecha()) self.assertEqual(time(10, 45, 50), fechaYHora.hora())
def test_fechaYHora_se_parsea(self): s = '2014-09-27 11:18:31.0' result = CadenaAFechaYHora().parse(s) self.assertEqual(FechaYHora(date(2014, 9, 27), time(11, 18, 31)), result)
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 diaN(n): # contando desde 0 return FechaYHora(_dia0 + timedelta(days=n), _hora)
def test_dos_instancias_con_horas_no_iguales_no_son_iguales(self): unaFecha = FechaYHora(date(2014, 9, 22), time(10, 45, 55)) otraFecha = FechaYHora(date(2014, 9, 22), time(10, 45, 50)) self.assertNotEqual(unaFecha, otraFecha)