verifyMetadata(mds, entity, metadata);
change = mds.apply(new Remove(entity, USER));
Metadata newMetadata = filterBy(metadata, SYSTEM, null);
Assert.assertEquals(new MetadataChange(entity, metadata, newMetadata), change);
verifyMetadata(mds, entity, newMetadata);
verifyMetadata(mds, entity, metadata);
change = mds.apply(new Remove(entity, SYSTEM));
newMetadata = filterBy(metadata, USER, null);
Assert.assertEquals(new MetadataChange(entity, metadata, newMetadata), change);
verifyMetadata(mds, entity, newMetadata);
verifyMetadata(mds, entity, metadata);
change = mds.apply(new Remove(entity, TAG));
newMetadata = filterBy(metadata, null, PROPERTY);
Assert.assertEquals(new MetadataChange(entity, metadata, newMetadata), change);
verifyMetadata(mds, entity, newMetadata);
verifyMetadata(mds, entity, metadata);
change = mds.apply(new Remove(entity, PROPERTY));
newMetadata = filterBy(metadata, null, TAG);
Assert.assertEquals(new MetadataChange(entity, metadata, newMetadata), change);
verifyMetadata(mds, entity, newMetadata);
verifyMetadata(mds, entity, metadata);
change = mds.apply(new Remove(entity, SYSTEM, PROPERTY));
newMetadata = union(filterBy(metadata, SYSTEM, TAG), filterBy(metadata, USER, null));
Assert.assertEquals(new MetadataChange(entity, metadata, newMetadata), change);
verifyMetadata(mds, entity, newMetadata);