示例#1
0
    def test_debe_tratar_de_convencer_al_cliente_si_no_hay_camioneta_con_tipo(
            self):
        class TestableUtils(Utils):
            @staticmethod
            def convencer_al_cliente():
                return True

        simulacion = self.get_simulacion()
        simulacion.camionetas = [
            Camioneta(), Camioneta(),
            Camioneta(), Camioneta()
        ]
        simulacion.utils = TestableUtils()
        simulacion.camionetas[2].pizzas.append(
            Pizza(TipoPizza.MOZZARELLA, simulacion.time))
        simulacion.camionetas[2].pizzas.append(
            Pizza(TipoPizza.ANANA, simulacion.time))
        simulacion.camionetas[3].pizzas.append(
            Pizza(TipoPizza.ANANA, simulacion.time))
        tipos_disponibles_en_camionetas = simulacion.get_tipos_disponibles_en_camionetas(
        )

        cliente = self.generar_cliente_en_rango()
        evento = self.generar_evento(cliente, TipoPizza.NAPOLITANA)
        evento.notify()

        simulacion = Simulacion()
        camioneta = simulacion.get_camioneta_by_cliente(cliente)
        pedido = camioneta.get_pedido_by_cliente(cliente)

        self.assertEqual(2, len(tipos_disponibles_en_camionetas))
        self.assertEqual(pedido.tipo_pizza, tipos_disponibles_en_camionetas[0])
        self.assertEqual(pedido.hora_toma, evento.hora)
示例#2
0
    def test_debe_entregarse_una_pizza_cuando_cliente_esta_en_rango(self):

        simulacion = self.get_simulacion()
        simulacion.camionetas += [Camioneta()]
        camioneta = simulacion.camionetas[0]
        pizza = simulacion.generar_pizza(TipoPizza.ANANA)
        camioneta.pizzas.append(pizza)

        cliente = self.generar_cliente_en_rango()
        self.generar_evento(cliente, TipoPizza.ANANA)

        pizza_vence_event = list(
            filter(lambda x: isinstance(x, PizzaVenceEvent),
                   simulacion.fel))[0]
        self.assertIsInstance(pizza_vence_event, PizzaVenceEvent)
        self.assertTrue(len(camioneta.pizzas) == 1)
        self.assertTrue(len(simulacion.pedidos) == 0)

        simulacion.run()

        eventos = list(
            filter(lambda x: isinstance(x, PizzaVenceEvent), simulacion.fel))
        self.assertEqual(len(eventos), 0)
        self.assertTrue(len(camioneta.pizzas) == 0)
        self.assertTrue(len(simulacion.pedidos) == 1)
        self.assertTrue(simulacion.pedidos[0].entregado)
        self.assertTrue(camioneta.pedido_en_curso is None)
示例#3
0
def generar_camionetas(configuracion):
    from models.Camioneta import Camioneta
    return [
        Camioneta(configuracion.hornosPorCamioneta,
                  configuracion.pizzasPorHorno)
        for i in range(configuracion.cantidadCamionetas)
    ]
示例#4
0
    def test_debe_asignar_el_pedido_a_la_camioneta_mas_cercana(self):
        simulacion = self.get_simulacion()
        configuracion = Configuracion.get_default_configuration()
        simulacion.camionetas += [
            Camioneta(configuracion['hornosPorCamioneta'],
                      configuracion['pizzasPorHorno'])
            for i in range(configuracion['cantidadCamionetas'])
        ]

        simulacion.camionetas[2].pizzas.append(
            Pizza(TipoPizza.ANANA, simulacion.time))
        simulacion.camionetas[3].pizzas.append(
            Pizza(TipoPizza.ANANA, simulacion.time))

        cliente = self.generar_cliente_en_rango()
        evento = self.generar_evento(cliente, TipoPizza.ANANA)
        simulacion.camionetas[3].ubicacion = evento.cliente.ubicacion
        evento.notify()

        camioneta = simulacion.get_camioneta_by_cliente(cliente)
        pedido = camioneta.get_pedido_by_cliente(cliente)

        self.assertEqual(camioneta, simulacion.camionetas[3])
        self.assertEqual(pedido.tipo_pizza, evento.tipo_pizza)
        self.assertEqual(pedido.hora_toma, evento.hora)
示例#5
0
    def test_debe_retornar_pedidos_perdidos(self):
        simulacion = self.get_simulacion()
        cliente13 = self.generar_cliente_en_rango()

        camioneta13 = Camioneta()
        camioneta13.cargar_pizzas()

        pedido13 = Pedido(cliente13, 10, camioneta13,
                          camioneta13.pizzas[0].tipo)
        pedido13.hora_entrega = 15
        pedido13.pizza = camioneta13.pizzas[0]
        pedido13.entregado = True
        simulacion.pedidos.append(pedido13)

        pedido23 = Pedido(cliente13, 10, camioneta13,
                          camioneta13.pizzas[1].tipo)
        pedido23.hora_entrega = 15
        pedido23.pizza = camioneta13.pizzas[1]
        pedido23.entregado = True
        simulacion.pedidos.append(pedido23)

        pedido33 = Pedido(cliente13, 10, camioneta13,
                          camioneta13.pizzas[2].tipo)
        pedido33.hora_entrega = 15
        pedido33.pizza = camioneta13.pizzas[2]
        pedido33.entregado = False
        simulacion.pedidos.append(pedido33)

        pedido43 = Pedido(cliente13, 10, camioneta13,
                          camioneta13.pizzas[3].tipo)
        pedido43.hora_entrega = 15
        pedido43.pizza = camioneta13.pizzas[3]
        pedido43.entregado = False
        simulacion.pedidos.append(pedido43)

        pedido53 = Pedido(cliente13, 10, camioneta13,
                          camioneta13.pizzas[4].tipo)
        pedido53.hora_entrega = 15
        pedido53.pizza = camioneta13.pizzas[4]
        pedido53.entregado = False
        simulacion.pedidos.append(pedido53)

        pedidos = simulacion.pedidos_perdidos()

        self.assertEqual(len(pedidos), 3)
示例#6
0
    def test_debe_retornar_el_tiempo_promedio_de_espera(self):
        simulacion = self.get_simulacion()
        cliente12 = self.generar_cliente_en_rango()

        camioneta12 = Camioneta()
        camioneta12.cargar_pizzas()

        pedido12 = Pedido(cliente12, simulacion.time, camioneta12,
                          camioneta12.pizzas[0].tipo)
        pedido12.hora_entrega = simulacion.time + timedelta(minutes=15)
        pedido12.pizza = camioneta12.pizzas[0]
        pedido12.entregado = True
        simulacion.pedidos.append(pedido12)

        pedido22 = Pedido(cliente12, simulacion.time, camioneta12,
                          camioneta12.pizzas[1].tipo)
        pedido22.hora_entrega = simulacion.time + timedelta(minutes=15)
        pedido22.pizza = camioneta12.pizzas[1]
        pedido22.entregado = True
        simulacion.pedidos.append(pedido22)

        pedido32 = Pedido(cliente12, simulacion.time, camioneta12,
                          camioneta12.pizzas[2].tipo)
        pedido32.hora_entrega = simulacion.time + timedelta(minutes=15)
        pedido32.pizza = camioneta12.pizzas[2]
        simulacion.pedidos.append(pedido32)

        pedido42 = Pedido(cliente12, simulacion.time, camioneta12,
                          camioneta12.pizzas[3].tipo)
        pedido42.hora_entrega = simulacion.time + timedelta(minutes=15)
        pedido42.pizza = camioneta12.pizzas[3]
        simulacion.pedidos.append(pedido42)

        pedido52 = Pedido(cliente12, simulacion.time, camioneta12,
                          camioneta12.pizzas[4].tipo)
        pedido52.hora_entrega = simulacion.time + timedelta(minutes=15)
        pedido52.pizza = camioneta12.pizzas[4]
        simulacion.pedidos.append(pedido52)

        tiempo_espera = simulacion.tiempo_espera()

        self.assertEqual(tiempo_espera, 15)
示例#7
0
    def test_debe_asignar_el_pedido_a_la_camioneta_mas_cercana(self):

        simulacion = self.get_simulacion()
        simulacion.camionetas += [Camioneta(), Camioneta()]

        simulacion.camionetas[0].pizzas.append(
            Pizza(TipoPizza.ANANA, simulacion.dia))
        simulacion.camionetas[1].pizzas.append(
            Pizza(TipoPizza.ANANA, simulacion.dia))
        simulacion.camionetas[1].pizzas.append(
            Pizza(TipoPizza.ANANA, simulacion.dia))

        cliente = self.generar_cliente_en_rango()
        simulacion.camionetas[1].ubicacion = cliente.ubicacion

        self.generar_evento(cliente, TipoPizza.ANANA)

        simulacion.run()

        self.assertEqual(simulacion.camionetas[1],
                         simulacion.pedidos[0].camioneta)
        self.assertTrue(simulacion.pedidos[0].entregado)
示例#8
0
    def test_debe_regresar_camioneta_mas_cercana_cuando_cliente_no_convencido(
            self):
        class TestableUtils(Utils):
            @staticmethod
            def convencer_al_cliente():
                return False

        simulacion = self.get_simulacion()
        simulacion.camionetas += [
            Camioneta(), Camioneta(),
            Camioneta(), Camioneta()
        ]
        self.assertFalse(simulacion.volver_al_terminar_todos_los_pedidos)

        simulacion.utils = TestableUtils()
        for k, camioneta in enumerate(simulacion.camionetas):
            camioneta.pizzas = []
            self.asignar_pedido_a_camioneta(TipoPizza.ANANA, k)

        for evento in list(
                filter(lambda x: isinstance(x, EnviarPedidoEvent),
                       simulacion.fel)):
            evento.notify()

        simulacion.camionetas[3].pedido_en_curso.cliente.ubicacion = [0, 0]

        cliente = self.generar_cliente_en_rango()
        evento = self.generar_evento(cliente, TipoPizza.NAPOLITANA)
        evento.notify()

        eventos = list(
            filter(lambda x: isinstance(x, CamionetaRegresaABuscarPedidoEvent),
                   simulacion.fel))
        self.assertFalse(len(eventos) == 0)
        self.assertIsInstance(eventos[0], CamionetaRegresaABuscarPedidoEvent)

        expected = simulacion.camionetas[3]
        actual = eventos[0].camioneta
        self.assertTrue(expected == actual)
示例#9
0
    def test_debe_retornar_la_cantidad_de_pizzas_vendidas_segun_tipo(self):
        simulacion = self.get_simulacion()

        cliente1 = self.generar_cliente_en_rango()

        camioneta1 = Camioneta()
        camioneta1.cargar_pizzas()

        pedido1 = Pedido(cliente1, 10, camioneta1, camioneta1.pizzas[0].tipo)
        pedido1.pizza = camioneta1.pizzas[0]
        pedido1.entregado = True
        simulacion.pedidos.append(pedido1)

        pedido2 = Pedido(cliente1, 10, camioneta1, camioneta1.pizzas[1].tipo)
        pedido2.pizza = camioneta1.pizzas[1]
        pedido2.entregado = True
        simulacion.pedidos.append(pedido2)

        pedido3 = Pedido(cliente1, 10, camioneta1, camioneta1.pizzas[2].tipo)
        pedido3.pizza = camioneta1.pizzas[2]
        pedido3.entregado = True
        simulacion.pedidos.append(pedido3)

        pedido4 = Pedido(cliente1, 10, camioneta1, camioneta1.pizzas[3].tipo)
        pedido4.pizza = camioneta1.pizzas[3]
        pedido4.entregado = True
        simulacion.pedidos.append(pedido4)

        pedido5 = Pedido(cliente1, 10, camioneta1, camioneta1.pizzas[4].tipo)
        pedido5.pizza = camioneta1.pizzas[4]
        pedido5.entregado = True
        simulacion.pedidos.append(pedido5)

        cantidad_de_pizzas_por_tipo = simulacion.pizzas_pedidas_por_tipo()

        self.assertIsInstance(cantidad_de_pizzas_por_tipo, dict)
示例#10
0
    def configurate(self, configuracion):
        self.dias_a_simular = (configuracion['fin'] -
                               configuracion['inicio']).days
        self.tiempo_inicio = configuracion['inicio']
        self.tiempo_fin = configuracion['fin']
        self.experimentos = configuracion['cantidadExperimentos']
        self.pedidos_por_hora = configuracion['pedidosPorHora']
        from models.Camioneta import Camioneta
        self.camionetas += [
            Camioneta(configuracion['hornosPorCamioneta'],
                      configuracion['pizzasPorHorno'])
            for i in range(configuracion['cantidadCamionetas'])
        ]
        self._tipos_de_pizza_disponibles = configuracion['tipos_de_pizza']
        self.nombre_experimento = configuracion['nombre_experimento']
        self.rango_de_atencion = configuracion['rangoAtencion']

        self.reloj.configurate({
            'dia':
            self.tiempo_inicio,
            'hora_cierre':
            time(self.HORA_DE_CIERRE, self.MINUTOS_DE_CIERRE),
        })
示例#11
0
    def test_debe_retornar_distancia_recorrida_por_camionetas(self):
        simulacion = self.get_simulacion()
        cliente14 = self.generar_cliente_en_rango()

        camioneta14 = Camioneta()
        camioneta14.cargar_pizzas()

        pedido14 = Pedido(cliente14, 10, camioneta14,
                          camioneta14.pizzas[0].tipo)
        pedido14.hora_entrega = 15
        pedido14.pizza = camioneta14.pizzas[0]
        pedido14.entregado = True
        camioneta14.generar_evento_enviar_pedido(pedido14)

        simulacion.camionetas.append(camioneta14)
        distancia = simulacion.distacia_recorrida()

        self.assertEqual(distancia, 1999.6979771955564)
示例#12
0
 def setUp(self):
     from Simulacion import Simulacion
     self.simulacion = Simulacion()
     self.evento = LlamoClienteEvent(10, Cliente(), self.simulacion.generar_tipo_de_pizza())
     self.camionetas = [Camioneta() for i in range(4)]