/**
  * It is an error if the number of seed candidates is greater than the population size. In this
  * case an exception should be thrown. Not throwing an exception is wrong because it would permit
  * undetected bugs in programs that use the factory.
  */
 @Test(expectedExceptions = IllegalArgumentException.class)
 public void testTooManySeedCandidates() {
   CandidateFactory<String> factory = new StringFactory(alphabet, candidateLength);
   // The following call should cause an exception since the 3 seed candidates
   // won't fit into a population of size 2.
   factory.generateInitialPopulation(
       2, Arrays.asList("abcdefgh", "ijklmnop", "qrstuvwx"), FrameworkTestUtils.getRNG());
 }
  /**
   * Generate a completely random population. Checks to make sure that the correct number of
   * candidate solutions is generated and that each is valid.
   */
  @Test
  public void testUnseededPopulation() {
    CandidateFactory<String> factory = new StringFactory(alphabet, candidateLength);
    List<String> population =
        factory.generateInitialPopulation(populationSize, FrameworkTestUtils.getRNG());
    assert population.size() == populationSize
        : "Wrong size population generated: " + population.size();

    validatePopulation(population);
  }
 @Test
 public void testMaxDepth() {
   final int maxDepth = 3;
   CandidateFactory<Node> factory =
       new TreeFactory(2, maxDepth, new Probability(0.6), Probability.EVENS);
   List<Node> trees = factory.generateInitialPopulation(20, ExamplesTestUtils.getRNG());
   for (Node tree : trees) {
     // Make sure that each tree is no bigger than the maximum permitted.
     assert tree.getDepth() <= maxDepth : "Generated tree is too deep: " + tree.getDepth();
   }
 }
  /**
   * Generate a random population with some seed candidates. Checks to make sure that the correct
   * number of candidate solutions is generated and that each is valid.
   */
  @Test
  public void testSeededPopulation() {
    CandidateFactory<String> factory = new StringFactory(alphabet, candidateLength);

    String seed1 = "cdefghij";
    String seed2 = "bbbbbbbb";

    List<String> population =
        factory.generateInitialPopulation(
            populationSize, Arrays.asList(seed1, seed2), FrameworkTestUtils.getRNG());
    // Check that the seed candidates appear in the generated population.
    assert population.contains(seed1) : "Population does not contain seed candidate 1.";
    assert population.contains(seed2) : "Population does not contain seed candidate 2.";

    validatePopulation(population);
  }