private void check(
      CollectionHolder holder, CollectionHolder original1, CollectionHolder original2) {
    Assert.isTrue(holder != original1);
    Assert.isTrue(holder != original2);

    if (holder.name().equals("h1")) checkH1(holder);
    else checkH2(holder);
  }
  private void checkH2(CollectionHolder holder) {
    Assert.areEqual("h1", ((CollectionHolder) holder.map().get("key")).name());
    Assert.areEqual("h1", ((CollectionHolder) holder.map().get(holder)).name());

    Assert.areEqual("two", holder.list().get(0));
    Assert.areEqual("h1", ((CollectionHolder) holder.list().get(1)).name());
    Assert.areEqual(holder, holder.list().get(2));

    Assert.isTrue(holder.set().remove("two"));
    Assert.isTrue(holder.set().remove(holder));
    CollectionHolder remaining = nextCollectionHolder(holder.set().iterator());
    Assert.areEqual("h1", remaining.name());
  }
  private void checkH1(CollectionHolder holder) {
    Assert.areEqual("value", holder.map().get("key"));
    Assert.areEqual(holder, holder.map().get("key2"));
    Assert.areEqual("value2", holder.map().get(holder));

    Assert.areEqual("one", holder.list().get(0));
    Assert.areEqual(holder, holder.list().get(1));

    Assert.isTrue(holder.set().contains("one"));
    Assert.isTrue(holder.set().contains(holder));
  }
  protected void actualTest() {
    if (!a().provider().supportsHybridCollection()) return;
    if (!b().provider().supportsHybridCollection()) return;

    CollectionHolder h1 = new CollectionHolder("h1");
    CollectionHolder h2 = new CollectionHolder("h2");

    h1.map().put("key", "value");
    h1.map().put("key2", h1);
    h1.map().put(h1, "value2");

    h2.map().put("key", h1);
    h2.map().put(h2, h1);

    h1.list().add("one");
    h1.list().add(h1);

    h2.list().add("two");
    h2.list().add(h1);
    h2.list().add(h2);

    h1.set().add("one");
    h1.set().add(h1);

    h2.set().add("two");
    h2.set().add(h1);
    h2.set().add(h2);

    b().provider().storeNew(h2);
    b().provider().storeNew(h1);

    final ReplicationSession replication =
        new GenericReplicationSession(a().provider(), b().provider());

    replication.replicate(h2); // Traverses to h1.

    replication.commit();

    Iterator objects = a().provider().getStoredObjects(CollectionHolder.class).iterator();
    check(nextCollectionHolder(objects), h1, h2);
    check(nextCollectionHolder(objects), h1, h2);
  }