@Test(expected = ConfigurationError.class)
 public void testIllegalSourceType() {
   ArrayTypeDescriptor descriptor = createArrayType("");
   descriptor.setSource("illegalSource");
   context.set("illegalSource", new File("txt.txt"));
   Generator<Object[]> generator =
       (Generator<Object[]>)
           arrayTypeGeneratorFactory.createGenerator(
               descriptor, "testIllegalSourceType", false, Uniqueness.NONE, context);
   generator.init(context);
 }
 @Test
 public void testXlsSource() {
   ArrayTypeDescriptor parent = createPersonDescriptor();
   ArrayTypeDescriptor descriptor = createArrayType("testXlsSource", parent);
   descriptor.setSource("org/databene/benerator/factory/person.ent.xls");
   Generator<Object[]> generator =
       (Generator<Object[]>)
           arrayTypeGeneratorFactory.createGenerator(
               descriptor, "testXlsSource", false, Uniqueness.NONE, context);
   context.set("otto_age", 89);
   generator.init(context);
   expectGeneratedSequence(generator, ALICE, OTTO).withCeasedAvailability();
 }
 @Test
 public void testGeneratorSource() {
   context.set("myGen", new PersonAttrArrayGenerator());
   ArrayTypeDescriptor parent = createPersonDescriptor();
   ArrayTypeDescriptor descriptor = createArrayType("testGeneratorSource", parent);
   descriptor.setSource("myGen");
   Generator<Object[]> generator =
       (Generator<Object[]>)
           arrayTypeGeneratorFactory.createGenerator(
               descriptor, "testGeneratorSource", false, Uniqueness.NONE, context);
   generator.init(context);
   for (int i = 0; i < 10; i++) assertEqualArrays(ALICE, GeneratorUtil.generateNonNull(generator));
 }
 @Test
 public void testCsvSource() {
   ArrayTypeDescriptor parent = createPersonDescriptor();
   ArrayTypeDescriptor descriptor = createArrayType("testCsvSource", parent);
   descriptor.setSource("org/databene/benerator/factory/person.ent.csv");
   Generator<Object[]> generator =
       (Generator<Object[]>)
           arrayTypeGeneratorFactory.createGenerator(
               descriptor, "testCsvSource", false, Uniqueness.NONE, context);
   context.set("ottos_age", 89);
   generator.init(context);
   assertEqualArrays(ALICE, GeneratorUtil.generateNonNull(generator));
   assertEqualArrays(OTTO, GeneratorUtil.generateNonNull(generator));
   assertUnavailable(generator);
 }
 @Test
 public void testEntitySource() {
   ArrayTypeDescriptor descriptor = createArrayType("testEntitySourceType");
   descriptor.setSource(PersonSource.class.getName());
   Generator<Object[]> generator =
       (Generator<Object[]>)
           arrayTypeGeneratorFactory.createGenerator(
               descriptor, "testEntitySource", false, Uniqueness.NONE, context);
   generator.init(context);
   for (int i = 0; i < 2; i++) {
     Object[] product = GeneratorUtil.generateNonNull(generator);
     assertTrue(
         "Found: " + ArrayFormat.format(product),
         Arrays.equals(ALICE, product) || Arrays.equals(BOB, product));
   }
   assertUnavailable(generator);
 }
 @Test
 public void testCsvDataset() {
   ArrayTypeDescriptor parent = createPersonDescriptor();
   ArrayTypeDescriptor descriptor = createArrayType("testCsvDataset", parent);
   descriptor.setSource("org/databene/benerator/factory/dataset_{0}.csv");
   descriptor.setNesting("org/databene/benerator/factory/testnesting");
   descriptor.setDataset("DACH");
   Generator<Object[]> generator =
       (Generator<Object[]>)
           arrayTypeGeneratorFactory.createGenerator(
               descriptor, "testCsvDataset", false, Uniqueness.SIMPLE, context);
   Generator<String> g =
       WrapperFactory.applyConverter(
           generator, new ArrayElementExtractor<String>(String.class, 0));
   generator.init(context);
   expectUniquelyGeneratedSet(g, "de", "at", "ch");
   assertUnavailable(generator);
 }
  @Test
  public void testDatabaseSource() throws Exception {
    // prepare DB
    DBSystem db =
        new DBSystem(
            "db",
            HSQLUtil.getInMemoryURL("benerator"),
            HSQLUtil.DRIVER,
            "sa",
            null,
            context.getDataModel());
    context.set("db", db);
    try {
      db.execute(
          "create table agft_person ("
              + "  id   int         NOT NULL,"
              + "  name varchar(30) NOT NULL,"
              + "  age  int         NOT NULL"
              + ")");
      db.execute("insert into agft_person (id, name, age) values (1, 'Alice', 23)");
      db.execute("insert into agft_person (id, name, age) values (2, 'Otto', 89)");

      // prepare descriptor
      ArrayTypeDescriptor parent = createPersonDescriptor();
      ArrayTypeDescriptor descriptor = createArrayType("testDatabaseSource", parent);
      descriptor.setSource("db");
      descriptor.setSelector("select name, age from agft_person");
      Generator<Object[]> generator =
          (Generator<Object[]>)
              arrayTypeGeneratorFactory.createGenerator(
                  descriptor, "testDatabaseSource", false, Uniqueness.NONE, context);
      generator.init(context);

      // verify results
      assertEqualArrays(ALICE, GeneratorUtil.generateNonNull(generator));
      Object[] p2 = GeneratorUtil.generateNonNull(generator);
      assertEqualArrays(OTTO, p2);
      assertUnavailable(generator);

    } finally {
      db.execute("drop table agft_person if exists");
      db.close();
    }
  }