c1.put(new PropertySimple("one", null));
c2.put(new PropertySimple("one", null));
assert c1.equals(c2); // null property matches a null property
assert c2.equals(c1);
PropertyList list1 = new PropertyList("listA");
list1.setList(new ArrayList<Property>());
c1.put(list1);
PropertyList list2 = new PropertyList("listA");
list2.setList(null);
c2.put(list2);
em.flush();
em.refresh(c2);
assert c1.equals(c2); // empty list is the same as a null list
assert c2.equals(c1);
list1.add(new PropertySimple("x", "y"));
assert !c1.equals(c2);
assert !c2.equals(c1);
list2.add(new PropertySimple("x", "y"));
em.flush();
em.refresh(c2);
assert c1.equals(c2);
assert c2.equals(c1);
PropertyMap map1 = new PropertyMap("mapB");
map1.setMap(new HashMap<String, Property>());
c1.put(map1);
PropertyMap map2 = new PropertyMap("mapB");
map1.setMap(null);
c2.put(map2);
em.flush();
em.refresh(c2);
assert c1.equals(c2); // empty map is the same as a null map
assert c2.equals(c1);
map1.put(new PropertySimple("m", "n"));
assert !c1.equals(c2);
assert !c2.equals(c1);
map2.put(new PropertySimple("m", "n"));
em.flush();
em.refresh(c2);
assert c1.equals(c2);
assert c2.equals(c1);
map1.put(list1);
map2.put(list2);
em.flush();
em.refresh(c2);
assert c1.equals(c2); // innerList is empty, so its same as a null
assert c2.equals(c1);
list1.add(new PropertySimple("x", "z"));
assert !c1.equals(c2);
assert !c2.equals(c1);
list2.add(new PropertySimple("x", "z"));
em.flush();
em.refresh(c2);
assert c1.equals(c2);
assert c2.equals(c1);