@Test
  public void Put() throws Exception {
    final Map<String, String> base = new HashMap<String, String>();
    final ObservableMap<String, String> observable = new ObservableMap<String, String>(base);

    base.put("a", "1");
    base.put("b", "2");

    final EventLog log = new EventLog();
    observable.attach(log);

    observable.put("c", "3");

    assertEquals(MapFactory.start().add("a", "1").add("b", "2").add("c", "3").result(), base);
    assertEquals(1, log.size());

    log.clear();
    observable.put("b", "22");

    assertEquals(MapFactory.start().add("a", "1").add("b", "22").add("c", "3").result(), base);
    assertEquals(1, log.size());

    log.clear();
    observable.put("c", "3");

    assertEquals(MapFactory.start().add("a", "1").add("b", "22").add("c", "3").result(), base);
    assertEquals(0, log.size());
  }
  @Test
  public void EntrySet() throws Exception {
    final Map<String, String> base = new LinkedHashMap<String, String>();
    final ObservableMap<String, String> observable = new ObservableMap<String, String>(base);

    base.put("a", "1");
    base.put("b", "2");
    base.put("c", "3");

    final EventLog log = new EventLog();
    observable.attach(log);

    final Iterator<Map.Entry<String, String>> itr = observable.entrySet().iterator();

    assertTrue(itr.hasNext());

    final Map.Entry<String, String> a = itr.next();

    assertEquals("a", a.getKey());
    assertEquals("1", a.getValue());

    assertTrue(itr.hasNext());

    final Map.Entry<String, String> b = itr.next();

    assertEquals("b", b.getKey());
    assertEquals("2", b.getValue());

    itr.remove();

    assertEquals(MapFactory.start().add("a", "1").add("c", "3").result(), base);
    assertEquals(1, log.size());

    assertTrue(itr.hasNext());

    final Map.Entry<String, String> c = itr.next();

    assertEquals("c", c.getKey());
    assertEquals("3", c.getValue());

    assertFalse(itr.hasNext());
  }