/** Testing that using path validator that accepts all requests finds full paths. */
  public void testAllowAll() {
    int size = 5;
    SimpleGraph<String, DefaultEdge> clique = buildCliqueGraph(size);
    for (int i = 0; i < size; i++) {
      KShortestPaths<String, DefaultEdge> ksp =
          new KShortestPaths<String, DefaultEdge>(
              clique,
              String.valueOf(i),
              30,
              Integer.MAX_VALUE,
              new PathValidator<String, DefaultEdge>() {

                @Override
                public boolean isValidPath(
                    AbstractPathElement<String, DefaultEdge> prevPathElement, DefaultEdge edge) {
                  // block all paths
                  return true;
                }
              });

      for (int j = 0; j < size; j++) {
        if (j == i) {
          continue;
        }
        List<GraphPath<String, DefaultEdge>> paths = ksp.getPaths(String.valueOf(j));
        assertNotNull(paths);
        assertEquals(16, paths.size());
      }
    }
  }
  /** Testing a ring with only single path allowed between two vertices. */
  public void testRing() {
    int size = 10;
    SimpleGraph<Integer, DefaultEdge> ring = buildRingGraph(size);
    for (int i = 0; i < size; i++) {
      KShortestPaths<Integer, DefaultEdge> ksp =
          new KShortestPaths<Integer, DefaultEdge>(
              ring,
              i,
              2,
              Integer.MAX_VALUE,
              new PathValidator<Integer, DefaultEdge>() {

                @Override
                public boolean isValidPath(
                    AbstractPathElement<Integer, DefaultEdge> prevPathElement, DefaultEdge edge) {
                  if (prevPathElement == null) {
                    return true;
                  }
                  return Math.abs(
                          prevPathElement.getVertex()
                              - Graphs.getOppositeVertex(ring, edge, prevPathElement.getVertex()))
                      == 1;
                }
              });

      for (int j = 0; j < size; j++) {
        if (j == i) {
          continue;
        }
        List<GraphPath<Integer, DefaultEdge>> paths = ksp.getPaths(j);
        assertNotNull(paths);
        assertEquals(1, paths.size());
      }
    }
  }
  /**
   * Testing a graph where the validator denies the request to go on an edge which cutting it makes
   * the graph disconnected
   */
  public void testDisconnected() {
    int cliqueSize = 5;
    // generate graph of two cliques connected by single edge
    SimpleGraph<Integer, DefaultEdge> graph = buildGraphForTestDisconnected(cliqueSize);
    for (int i = 0; i < graph.vertexSet().size(); i++) {
      KShortestPaths<Integer, DefaultEdge> ksp =
          new KShortestPaths<Integer, DefaultEdge>(
              graph,
              i,
              100,
              Integer.MAX_VALUE,
              new PathValidator<Integer, DefaultEdge>() {

                @Override
                public boolean isValidPath(
                    AbstractPathElement<Integer, DefaultEdge> prevPathElement, DefaultEdge edge) {
                  // accept all requests but the one to pass through the edge connecting
                  // the two cliques.
                  DefaultEdge connectingEdge = graph.getEdge(cliqueSize - 1, cliqueSize);
                  return connectingEdge != edge;
                }
              });

      for (int j = 0; j < graph.vertexSet().size(); j++) {
        if (j == i) {
          continue;
        }
        List<GraphPath<Integer, DefaultEdge>> paths = ksp.getPaths(j);
        if ((i < cliqueSize && j < cliqueSize) || (i >= cliqueSize && j >= cliqueSize)) {
          // within the clique - path should exist
          assertNotNull(paths);
          assertTrue(paths.size() > 0);
        } else {
          // else - should not
          assertNull(paths);
        }
      }
    }
  }