def test_find_love(self):
        '''
        Función encargada de probar la función find love.
        :return:
        '''
        # Primer test
        start, goal = 0, 4
        arcs = [(0, 1), (0, 2), (0, 3), (3, 4)]

        g = Graph(goal + 1)
        for arc in arcs:
            g.add_edge(arc[0], arc[1])
        self.assertEqual(g.find_love(start, goal), (2, ['3', '4']))

        # Segundo test
        start, goal = 0, 9
        arcs = [(0, 1), (0, 2), (0, 3), (1, 5), (2, 4), (3, 7), (4, 9), (5, 6),
                (7, 8), (6, 9), (8, 9)]

        g = Graph(goal + 1)
        for arc in arcs:
            g.add_edge(arc[0], arc[1])
        self.assertEqual(g.find_love(start, goal), (3, ['2', '4', '9']))

        # Tercer test
        start, goal = 0, 4
        arcs = [(0, 1), (0, 2), (0, 3), (1, 3), (2, 3), (2, 4)]

        g = Graph(goal + 1)
        for arc in arcs:
            g.add_edge(arc[0], arc[1])
        self.assertEqual(g.find_love(start, goal), (2, ['2', '4']))
Example #2
0
class GraphApi(Resource):
    def __init__(self):
        # Arcos
        self._arcs = []

        # Nodo inicial
        self._start = None

        # Nodo final
        self._goal = None

        # Instancia de la clase 'Graph'
        self._g_instance = None

        # Mensaje de respuesta al usuario
        self._data = None

    # Getters y setters
    @property
    def arcs(self):
        '''
        Getter de la variable 'arcs'.
        :return: La variable 'arcs'
        '''
        return self._arcs

    @arcs.setter
    def arcs(self, arcs):
        '''
            Setter de la variable 'arcs'.
            :return: None
        '''
        self._arcs = arcs

    @property
    def start(self):
        '''
            Getter de la variable 'start'.
            :return: La variable 'start'
        '''
        return self._start

    @start.setter
    def start(self, start):
        '''
            Setter de la variable 'start'.
            :return: None
        '''
        self._start = start

    @property
    def goal(self):
        '''
            Getter de la variable 'goal'.
            :return: La variable 'goal'
        '''
        return self._goal

    @goal.setter
    def goal(self, goal):
        '''
            Setter de la variable 'goal'.
            :return: None
        '''
        self._goal = goal

    @property
    def g_instance(self):
        '''
            Getter de la variable 'g_instance'.
            :return: La variable 'g_instance'
        '''
        return self._g_instance

    @g_instance.setter
    def g_instance(self, g_instance):
        '''
            Setter de la variable 'g_instance'.
            :return: None
        '''
        self._g_instance = g_instance

    @property
    def data(self):
        '''
            Getter de la variable 'data'.
            :return: La variable 'data'
        '''
        return self._data

    @data.setter
    def data(self, data):
        '''
            Setter de la variable 'data'.
            :return: None
        '''
        self._data = data

    def get(self):
        '''
        Función que devuelve la lista de arcos del árbol (si la hay) al hacer
        una petición GET al endpoint '/graph'.
        :return: Un JSON con los arcos del grafo.
        '''

        return {"data": "Graph API working..."}

    def put(self):
        '''
        Función encargada de recibir los datos necesarios para crear un grafo.
        Los recibe en formato JSON cuando se hace una petición PUT al endpoint.
        :return: Una tupla de la forma (num_personas_necesarias, [lista_de_personas_necesarias])
        '''
        # Verificamos que cumpla con los datos que necesitamos
        args = graph_put_args.parse_args()

        # Función encargada de tratar la entrada
        self.clean_data(args)

        # Iniciamos el grafo
        self.start_graph()

        # Le damos formato al JSON de respuesta
        self.data = {"distance": self.data[0], "nodes": self.data[1]}

        return self.data, 201

    def clean_data(self, args):
        # Guardamos el inicio y el objetivo
        self.start = args['start']
        self.goal = args['goal']

        # Separamos los arcos por parejas
        edges = args['edges'].split(',')

        # Separamos cada pareja
        edges = [tuple(map(int, edge.split('-'))) for edge in edges]

        # Guardamos los arcos en su variable respectiva
        self.arcs = edges

        # Modificamos la variable global
        for el in self.arcs:
            temp_graph.append(el)

    def delete(self):
        temp_graph.clear()
        return {"message": "Arcos borrados satisfactoriamente"}

    def are_arcs_empty(self):
        if len(temp_graph) == 0:
            abort(404, message="No se puede consultar un grafo sin nodos")

    def start_graph(self):
        self.g_instance = Graph(self.goal + 1)

        # Agregamos los arcos al grafo
        for pair in self.arcs:
            self.g_instance.add_edge(pair[0], pair[1])

        # Buscamos la cantidad de personas necesarias para llegar de 'start' a 'goal'
        self.data = self.g_instance.find_love(self.start, self.goal)