public void testRemoveAllListChangeEvent() throws Exception {
    List elements = Arrays.asList(new String[] {"1", "2"});
    list.addAll(elements);
    list.addAll(elements);

    ListChangeEventTracker listener = new ListChangeEventTracker();
    list.addListChangeListener(listener);

    assertEquals(0, listener.count);
    list.removeAll(elements);

    ListChangeEvent event = listener.event;
    assertEquals(list, event.getObservableList());
    assertSame(list, event.getObservableList());

    assertDiff(
        event.diff, Arrays.asList(new Object[] {"1", "2", "1", "2"}), Collections.EMPTY_LIST);
  }
  public void testAddListChangeEvent() throws Exception {
    ListChangeEventTracker listener = new ListChangeEventTracker();
    list.addListChangeListener(listener);

    assertEquals(0, listener.count);
    String element = "1";

    list.add(element);

    assertEquals(1, listener.count);
    ListChangeEvent event = listener.event;

    assertSame(list, event.getObservableList());
    assertDiff(event.diff, Collections.EMPTY_LIST, Collections.singletonList("1"));
  }
  public void testSetListChangeEvent() throws Exception {
    String oldElement = "old";
    String newElement = "new";
    list.add(oldElement);

    ListChangeEventTracker listener = ListChangeEventTracker.observe(list);
    assertEquals(0, listener.count);

    list.set(0, newElement);

    assertEquals(1, listener.count);
    ListChangeEvent event = listener.event;
    assertSame(list, event.getObservableList());

    assertDiff(
        event.diff, Collections.singletonList(oldElement), Collections.singletonList(newElement));
  }
  public void testRetainAllListChangeEvent() throws Exception {
    List elements = Arrays.asList(new String[] {"0", "1", "2", "3"});
    list.addAll(elements);

    ListChangeEventTracker listener = new ListChangeEventTracker();
    list.addListChangeListener(listener);

    assertEquals(0, listener.count);
    list.retainAll(elements.subList(0, 2));

    assertEquals(1, listener.count);
    ListChangeEvent event = listener.event;
    assertSame(list, event.getObservableList());

    assertDiff(
        event.diff,
        Arrays.asList(new Object[] {"0", "1", "2", "3"}),
        Arrays.asList(new Object[] {"0", "1"}));
  }