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)
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)
def generar_camionetas(configuracion): from models.Camioneta import Camioneta return [ Camioneta(configuracion.hornosPorCamioneta, configuracion.pizzasPorHorno) for i in range(configuracion.cantidadCamionetas) ]
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)
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)
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)
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)
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)
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)
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), })
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)
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)]