@Test
  public void optimalCandidateTest() {
    for (int historySize : new int[] {0, 1, 5, Integer.MAX_VALUE}) {
      for (int candidatesSize : new int[] {1, 10, 100}) {
        for (int length : new int[] {10000}) {
          for (boolean duplicates : new boolean[] {true, false}) {
            for (int parameters : new int[] {1, 2, 5}) {
              for (int choices : new int[] {1, 2, 5}) {
                try {
                  AdaptiveRandomAlgorithm<String> algorithm =
                      new AdaptiveRandomAlgorithm<String>(
                          historySize, candidatesSize, length, duplicates);
                  algorithm.initialize(
                      GeneratorTestUtils.prepareInput(parameters, choices), EMPTY_CONSTRAINTS);

                  List<List<String>> candidates = algorithm.getCandidates();
                  List<List<String>> history = algorithm.getCandidates();
                  List<String> optimalCandidate =
                      algorithm.getOptimalCandidate(candidates, history);

                  int optimalCandidateDistance = Integer.MAX_VALUE;
                  for (List<String> event : history) {
                    optimalCandidateDistance =
                        Math.min(
                            algorithm.distance(event, optimalCandidate), optimalCandidateDistance);
                  }
                  for (List<String> candidate : candidates) {
                    int candidateDistance = Integer.MAX_VALUE;
                    for (List<String> event : history) {
                      int eventDistance = algorithm.distance(candidate, event);
                      candidateDistance = Math.min(candidateDistance, eventDistance);
                    }
                    assertTrue(candidateDistance <= optimalCandidateDistance);
                  }
                } catch (GeneratorException e) {
                  fail("Unexpected GeneratorException: " + e.getMessage());
                }
              }
            }
          }
        }
      }
    }
  }
  @Test
  public void distanceTest() {
    AdaptiveRandomAlgorithm<String> algorithm = new AdaptiveRandomAlgorithm<String>(0, 0, 0, false);

    List<String> v1 = new ArrayList<String>();
    List<String> v2 = new ArrayList<String>();

    for (int i = 0; i < 10; ++i) {
      String s = GeneratorTestUtils.randomString(10);
      v1.add(s);
      v2.add(s);
    }

    int distance = algorithm.distance(v1, v2);
    assertEquals(0, distance);
    for (int i = 0; i < 10; ++i) {
      v1.set(
          i,
          "some string that is unlikely to occure by random and is also longer than those generated");
      assertEquals(i + 1, algorithm.distance(v1, v2));
    }
  }