Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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())
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
    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())
Ejemplo n.º 8
0
    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(), [])
Ejemplo n.º 9
0
    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()
Ejemplo n.º 10
0
    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(), [])
Ejemplo n.º 11
0
    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()