public void testPropagatesDeeply() {
    PainterRegistryImpl r1 = new PainterRegistryImpl("a", "b", new AnnotationPainter(null));
    PainterRegistryImpl r2 = (PainterRegistryImpl) r1.createExtension();
    PainterRegistryImpl r3 = (PainterRegistryImpl) r2.createExtension();

    r1.registerBoundaryFunction(CollectionUtils.newStringSet("a"), b1);
    assertTrue(r3.getBoundaryFunctions().contains(b1));

    r1.registerPaintFunction(CollectionUtils.newStringSet("b"), p1);
    assertTrue(r3.getPaintFunctions().contains(p1));
  }
  /** Miscellaneous tests that depend on the previous state for convenience */
  public void testMiscellaneous() {
    PainterRegistryImpl r = new PainterRegistryImpl("a", "b", new AnnotationPainter(null));

    assertTrue(r.getPaintFunctions().isEmpty());

    // Test we get back the function we registered
    r.registerPaintFunction(CollectionUtils.newStringSet("a"), p1);
    assertSame(p1, r.getPaintFunctions().iterator().next());

    PainterRegistryImpl r2 = (PainterRegistryImpl) r.createExtension();

    // Test the extension contains the function
    assertSame(p1, r2.getPaintFunctions().iterator().next());
    assertEquals(r.debugGetVersion(), r2.debugGetKnownParentVersion());

    // Test propagation occurs
    r.registerPaintFunction(CollectionUtils.newStringSet("b"), p2);
    assertFalse(r.debugGetVersion() == r2.debugGetKnownParentVersion());
    assertTrue(r2.getPaintFunctions().contains(p2));
    assertEquals(r.debugGetVersion(), r2.debugGetKnownParentVersion());

    PainterRegistryImpl r3 = (PainterRegistryImpl) r2.createExtension();
    // ensure cache is filled
    r3.getPaintFunctions();

    // Test propagation occurs two levels deep after caching
    r.registerPaintFunction(CollectionUtils.newStringSet("c"), p3);
    assertFalse(r.debugGetVersion() == r2.debugGetKnownParentVersion());
    assertTrue(r2.getPaintFunctions().contains(p3));
    assertEquals(r.debugGetVersion(), r2.debugGetKnownParentVersion());

    assertFalse(r2.debugGetVersion() == r3.debugGetKnownParentVersion());
    assertTrue(r3.getPaintFunctions().contains(p3));
    assertEquals(r2.debugGetVersion(), r3.debugGetKnownParentVersion());
  }
  public void testInitialState() {
    PainterRegistryImpl r = new PainterRegistryImpl("a", "b", new AnnotationPainter(null));

    PainterRegistryImpl r2 = (PainterRegistryImpl) r.createExtension();
    r2.registerPaintFunction(CollectionUtils.newStringSet("b"), p2);
    assertTrue(r2.getPaintFunctions().contains(p2));
    assertTrue(r2.getKeys().contains("b"));

    r2.registerPaintFunction(CollectionUtils.newStringSet("d"), p4);
    assertTrue(r2.getPaintFunctions().contains(p4));
    assertTrue(r2.getKeys().contains("d"));
    r2.registerBoundaryFunction(CollectionUtils.newStringSet("e"), b1);
    assertTrue(r2.getBoundaryFunctions().contains(b1));
    assertTrue(r2.getKeys().contains("e"));
  }