public void testNormalBoundary() {
    EntityPersister persister = sfi().getEntityPersister(Entity.class.getName());
    assertClassAssignability(TableGenerator.class, persister.getIdentifierGenerator().getClass());
    TableGenerator generator = (TableGenerator) persister.getIdentifierGenerator();
    assertClassAssignability(
        OptimizerFactory.HiLoOptimizer.class, generator.getOptimizer().getClass());
    OptimizerFactory.HiLoOptimizer optimizer =
        (OptimizerFactory.HiLoOptimizer) generator.getOptimizer();

    int increment = optimizer.getIncrementSize();
    Entity[] entities = new Entity[increment + 1];
    Session s = openSession();
    s.beginTransaction();
    for (int i = 0; i < increment; i++) {
      entities[i] = new Entity("" + (i + 1));
      s.save(entities[i]);
      assertEquals(1, generator.getTableAccessCount()); // initialization
      assertEquals(
          1, ((BasicHolder) optimizer.getLastSourceValue()).getActualLongValue()); // initialization
      assertEquals(i + 1, ((BasicHolder) optimizer.getLastValue()).getActualLongValue());
      assertEquals(increment + 1, ((BasicHolder) optimizer.getHiValue()).getActualLongValue());
    }
    // now force a "clock over"
    entities[increment] = new Entity("" + increment);
    s.save(entities[increment]);
    assertEquals(2, generator.getTableAccessCount()); // initialization
    assertEquals(
        2, ((BasicHolder) optimizer.getLastSourceValue()).getActualLongValue()); // initialization
    assertEquals(increment + 1, ((BasicHolder) optimizer.getLastValue()).getActualLongValue());
    assertEquals((increment * 2) + 1, ((BasicHolder) optimizer.getHiValue()).getActualLongValue());

    s.getTransaction().commit();

    s.beginTransaction();
    for (int i = 0; i < entities.length; i++) {
      assertEquals(i + 1, entities[i].getId().intValue());
      s.delete(entities[i]);
    }
    s.getTransaction().commit();
    s.close();
  }