/**
   * Tests {@link GeneratorSetDocReader#getGeneratorSet getGeneratorSet()} using the following
   * inputs.
   *
   * <p>
   *
   * <TABLE border="1" cellpadding="8">
   * <TR align="left"><TH colspan=2> 1.   getGeneratorSet (Success) </TH></TR>
   * <TR align="left"><TH> Input Choice </TH> <TH> Value </TH></TR>
   * <TR><TD> TupleGenerator.Count </TD> <TD> One </TD></TR>
   * <TR><TD> TupleGenerator.Function </TD> <TD> Defined </TD></TR>
   * <TR><TD> TupleGenerator.Seed </TD> <TD> Defined </TD></TR>
   * <TR><TD> TupleGenerator.Tuples </TD> <TD> Defined </TD></TR>
   * <TR><TD> Combiner.Count </TD> <TD> One </TD></TR>
   * <TR><TD> Combiner.Tuples </TD> <TD> Default </TD></TR>
   * <TR><TD> Include.Count </TD> <TD> None </TD></TR>
   * <TR><TD> Include.Var </TD> <TD> NA </TD></TR>
   * <TR><TD> Exclude.Count </TD> <TD> Many </TD></TR>
   * <TR><TD> Exclude.Var </TD> <TD> Valid </TD></TR>
   * </TABLE>
   */
  @Test
  public void testGetGeneratorSet_1() {
    IGeneratorSet generatorSet = generatorSetResources_.read("generator-set-1.xml");
    ITestCaseGenerator[] generators =
        IteratorUtils.toArray(generatorSet.getGenerators(), ITestCaseGenerator.class);
    assertEquals("Generators", 1, generators.length);

    TupleGenerator tupleGenerator;
    String functionName;
    TupleCombiner[] combiners;
    TupleCombiner combiner;
    VarSet varSet;
    IVarDef varDef;

    tupleGenerator = (TupleGenerator) generators[0];
    assertEquals("Generator 0, seed", new Long(1234L), tupleGenerator.getRandomSeed());
    assertEquals("Generator 0, defaultTupleSize", 3, tupleGenerator.getDefaultTupleSize());

    functionName = "F1";
    assertEquals(
        "getGenerator, function=" + functionName,
        tupleGenerator,
        generatorSet.getGenerator(functionName));

    functionName = null;
    assertEquals(
        "getGenerator, function=" + functionName, null, generatorSet.getGenerator(functionName));

    combiners =
        tupleGenerator
            .getCombiners()
            .toArray(new TupleCombiner[tupleGenerator.getCombiners().size()]);
    assertEquals("Generator 0, combiners", 1, combiners.length);

    combiner = combiners[0];

    varSet = new VarSet("include1").addMember(new VarSet("B").addMember(new VarDef("C")));

    varDef = varSet.getDescendant("B.C");
    assertEquals("Combiner[0], var=" + varDef + ", eligible", true, combiner.isEligible(varDef));

    varDef = new VarDef("include2");
    assertEquals("Combiner[0], var=" + varDef + ", eligible", true, combiner.isEligible(varDef));

    varSet = new VarSet("exclude1").addMember(new VarDef("var")).addMember(new VarDef("var2"));

    varDef = varSet.getDescendant("var");
    assertEquals("Combiner[0], var=" + varDef + ", eligible", false, combiner.isEligible(varDef));

    varDef = varSet.getDescendant("var2");
    assertEquals("Combiner[0], var=" + varDef + ", eligible", true, combiner.isEligible(varDef));

    varSet =
        new VarSet("exclude2")
            .addMember(new VarSet("var").addMember(new VarSet("A").addMember(new VarDef("B"))))
            .addMember(new VarDef("var2"));

    varDef = varSet.getDescendant("var.A.B");
    assertEquals("Combiner[0], var=" + varDef + ", eligible", false, combiner.isEligible(varDef));
  }
  @Test
  public void testOnceTuples() {
    IGeneratorSet generatorSet = generatorSetResources_.read("generator-set-once.xml");
    ITestCaseGenerator[] generators =
        IteratorUtils.toArray(generatorSet.getGenerators(), ITestCaseGenerator.class);
    assertEquals("Generators", 1, generators.length);

    TupleGenerator tupleGenerator;
    TupleCombiner[] combiners;
    TupleCombiner combiner;

    tupleGenerator = (TupleGenerator) generators[0];
    combiners =
        tupleGenerator
            .getCombiners()
            .toArray(new TupleCombiner[tupleGenerator.getCombiners().size()]);
    assertEquals("Default generator, combiners", 1, tupleGenerator.getCombiners().size());

    combiner = combiners[0];
    assertSetEquals(
        "Other tuples",
        new TupleRef[] {
          new TupleRef()
              .addVarBinding(new VarBinding("X1", "V1"))
              .addVarBinding(new VarBinding("X2", "V2"))
              .addVarBinding(new VarBinding("X3", "V3")),
          new TupleRef()
              .addVarBinding(new VarBinding("X4", "V4"))
              .addVarBinding(new VarBinding("X5", "V5"))
              .addVarBinding(new VarBinding("X6", "V6"))
        },
        combiner.getOnceTuples());
  }
  /**
   * Tests {@link GeneratorSetDocReader#getGeneratorSet getGeneratorSet()} using the following
   * inputs.
   *
   * <p>
   *
   * <TABLE border="1" cellpadding="8">
   * <TR align="left"><TH colspan=2> 2.   getGeneratorSet (Success) </TH></TR>
   * <TR align="left"><TH> Input Choice </TH> <TH> Value </TH></TR>
   * <TR><TD> TupleGenerator.Count </TD> <TD> Many </TD></TR>
   * <TR><TD> TupleGenerator.Function </TD> <TD> Default </TD></TR>
   * <TR><TD> TupleGenerator.Seed </TD> <TD> Default </TD></TR>
   * <TR><TD> TupleGenerator.Tuples </TD> <TD> Default </TD></TR>
   * <TR><TD> Combiner.Count </TD> <TD> None </TD></TR>
   * <TR><TD> Combiner.Tuples </TD> <TD> NA </TD></TR>
   * <TR><TD> Include.Count </TD> <TD> NA </TD></TR>
   * <TR><TD> Include.Var </TD> <TD> NA </TD></TR>
   * <TR><TD> Exclude.Count </TD> <TD> NA </TD></TR>
   * <TR><TD> Exclude.Var </TD> <TD> NA </TD></TR>
   * </TABLE>
   */
  @Test
  public void testGetGeneratorSet_2() {
    IGeneratorSet generatorSet = generatorSetResources_.read("generator-set-2.xml");
    ITestCaseGenerator[] generators =
        IteratorUtils.toArray(generatorSet.getGenerators(), ITestCaseGenerator.class);
    assertEquals("Generators", 4, generators.length);

    TupleGenerator tupleGenerator;
    String functionName;

    functionName = "F1";
    tupleGenerator = (TupleGenerator) generatorSet.getGenerator(functionName);
    assertEquals("getGenerator, function=" + functionName, true, tupleGenerator != null);
    assertEquals("Generator(" + functionName + "), seed", null, tupleGenerator.getRandomSeed());
    assertEquals(
        "Generator(" + functionName + "), defaultTupleSize",
        1,
        tupleGenerator.getDefaultTupleSize());
    assertEquals(
        "Generator(" + functionName + "), combiners", 0, tupleGenerator.getCombiners().size());

    functionName = "F2";
    tupleGenerator = (TupleGenerator) generatorSet.getGenerator(functionName);
    assertEquals("getGenerator, function=" + functionName, true, tupleGenerator != null);
    assertEquals("Generator(" + functionName + "), seed", null, tupleGenerator.getRandomSeed());
    assertEquals(
        "Generator(" + functionName + "), defaultTupleSize",
        1,
        tupleGenerator.getDefaultTupleSize());
    assertEquals(
        "Generator(" + functionName + "), combiners", 0, tupleGenerator.getCombiners().size());

    functionName = "F3";
    tupleGenerator = (TupleGenerator) generatorSet.getGenerator(functionName);
    assertEquals("getGenerator, function=" + functionName, true, tupleGenerator != null);
    assertEquals("Generator(" + functionName + "), seed", null, tupleGenerator.getRandomSeed());
    assertEquals(
        "Generator(" + functionName + "), defaultTupleSize",
        1,
        tupleGenerator.getDefaultTupleSize());
    assertEquals(
        "Generator(" + functionName + "), combiners", 0, tupleGenerator.getCombiners().size());

    functionName = null;
    tupleGenerator = (TupleGenerator) generatorSet.getGenerator(functionName);
    assertEquals("getGenerator, function=" + functionName, true, tupleGenerator != null);
    assertEquals("Generator(" + functionName + "), seed", null, tupleGenerator.getRandomSeed());
    assertEquals(
        "Generator(" + functionName + "), defaultTupleSize",
        1,
        tupleGenerator.getDefaultTupleSize());
    assertEquals(
        "Generator(" + functionName + "), combiners", 0, tupleGenerator.getCombiners().size());

    functionName = "F4";
    assertEquals(
        "Found default generator for function=" + functionName,
        true,
        tupleGenerator == generatorSet.getGenerator(functionName));
  }
  /**
   * Tests {@link GeneratorSetDocReader#getGeneratorSet getGeneratorSet()} using the following
   * inputs.
   *
   * <p>
   *
   * <TABLE border="1" cellpadding="8">
   * <TR align="left"><TH colspan=2> 4.   getGeneratorSet (Success) </TH></TR>
   * <TR align="left"><TH> Input Choice </TH> <TH> Value </TH></TR>
   * <TR><TD> TupleGenerator.Count </TD> <TD> One </TD></TR>
   * <TR><TD> TupleGenerator.Function </TD> <TD> Default </TD></TR>
   * <TR><TD> TupleGenerator.Seed </TD> <TD> Defined </TD></TR>
   * <TR><TD> TupleGenerator.Tuples </TD> <TD> Defined </TD></TR>
   * <TR><TD> Combiner.Count </TD> <TD> One </TD></TR>
   * <TR><TD> Combiner.Tuples </TD> <TD> Default </TD></TR>
   * <TR><TD> Include.Count </TD> <TD> One </TD></TR>
   * <TR><TD> Include.Var </TD> <TD> Valid </TD></TR>
   * <TR><TD> Exclude.Count </TD> <TD> None </TD></TR>
   * <TR><TD> Exclude.Var </TD> <TD> NA </TD></TR>
   * </TABLE>
   */
  @Test
  public void testGetGeneratorSet_4() {
    IGeneratorSet generatorSet = generatorSetResources_.read("generator-set-4.xml");
    ITestCaseGenerator[] generators =
        IteratorUtils.toArray(generatorSet.getGenerators(), ITestCaseGenerator.class);
    assertEquals("Generators", 1, generators.length);

    TupleGenerator tupleGenerator;
    String functionName;
    TupleCombiner[] combiners;
    TupleCombiner combiner;
    VarSet varSet;
    IVarDef varDef;

    tupleGenerator = (TupleGenerator) generators[0];
    functionName = "F4";
    assertEquals(
        "Found default generator for function=" + functionName,
        true,
        tupleGenerator == generatorSet.getGenerator(functionName));
    assertEquals("Default generator, seed", new Long(12345L), tupleGenerator.getRandomSeed());
    assertEquals("Default generator, defaultTupleSize", 3, tupleGenerator.getDefaultTupleSize());

    combiners =
        tupleGenerator
            .getCombiners()
            .toArray(new TupleCombiner[tupleGenerator.getCombiners().size()]);
    assertEquals("Default generator, combiners", 1, tupleGenerator.getCombiners().size());

    combiner = combiners[0];
    assertEquals(
        "Combiner[0], tupleSize", tupleGenerator.getDefaultTupleSize(), combiner.getTupleSize());

    varSet = new VarSet("A").addMember(new VarSet("X").addMember(new VarDef("Y")));

    varDef = varSet.getDescendant("X");
    assertEquals("Combiner[0], var=" + varDef + ", eligible", false, combiner.isEligible(varDef));

    varDef = new VarDef("B");
    assertEquals("Combiner[0], var=" + varDef + ", eligible", false, combiner.isEligible(varDef));

    varDef = new VarDef("X");
    assertEquals("Combiner[0], var=" + varDef + ", eligible", true, combiner.isEligible(varDef));
  }