@Test
 public void testCompareWithEmptyLists() {
   final List<String> working = Collections.emptyList();
   final List<String> base = Collections.emptyList();
   final CollectionNode node = differ.compare(working, base);
   assertThat(node.hasChanges(), is(false));
   assertThat(node.hasChildren(), is(false));
 }
  @Test
  public void testCompareWithRemovedItem() throws Exception {
    final Collection<String> working = new LinkedList<String>();
    final Collection<String> base = new LinkedList<String>(Arrays.asList("foo"));

    final CollectionNode node = differ.compare(working, base);

    assertThat(node.hasChanges(), is(true));

    final Node child =
        node.getChild(PropertyPath.createBuilder().withRoot().withCollectionItem("foo").build());
    assertThat(child.getState(), is(Node.State.REMOVED));
  }
  @Test
  public void testCompareWithChangedItem() throws Exception {
    final List<ObjectWithHashCodeAndEquals> working =
        Arrays.asList(new ObjectWithHashCodeAndEquals("foo", "1"));
    final List<ObjectWithHashCodeAndEquals> base =
        Arrays.asList(new ObjectWithHashCodeAndEquals("foo", "2"));

    final CollectionNode node = differ.compare(working, base);

    assertThat(node.hasChanges(), is(true));

    final PropertyPath propertyPath =
        PropertyPath.createBuilder()
            .withRoot()
            .withCollectionItem(new ObjectWithHashCodeAndEquals("foo"))
            .build();
    final Node child = node.getChild(propertyPath);
    assertThat(child.getState(), is(Node.State.CHANGED));
  }